Loading drivers/usb/host/xhci-plat.c +59 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,59 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif static ssize_t config_imod_store(struct device *pdev, struct device_attribute *attr, const char *buff, size_t size) { struct usb_hcd *hcd = dev_get_drvdata(pdev); struct xhci_hcd *xhci; u32 temp; u32 imod; unsigned long flags; if (kstrtouint(buff, 10, &imod) != 1) return 0; imod &= ER_IRQ_INTERVAL_MASK; xhci = hcd_to_xhci(hcd); if (xhci->shared_hcd->state == HC_STATE_SUSPENDED && hcd->state == HC_STATE_SUSPENDED) return -EACCES; spin_lock_irqsave(&xhci->lock, flags); temp = readl_relaxed(&xhci->ir_set->irq_control); temp &= ~ER_IRQ_INTERVAL_MASK; temp |= imod; writel_relaxed(temp, &xhci->ir_set->irq_control); spin_unlock_irqrestore(&xhci->lock, flags); return size; } static ssize_t config_imod_show(struct device *pdev, struct device_attribute *attr, char *buff) { struct usb_hcd *hcd = dev_get_drvdata(pdev); struct xhci_hcd *xhci; u32 temp; unsigned long flags; xhci = hcd_to_xhci(hcd); if (xhci->shared_hcd->state == HC_STATE_SUSPENDED && hcd->state == HC_STATE_SUSPENDED) return -EACCES; spin_lock_irqsave(&xhci->lock, flags); temp = readl_relaxed(&xhci->ir_set->irq_control) & ER_IRQ_INTERVAL_MASK; spin_unlock_irqrestore(&xhci->lock, flags); return snprintf(buff, PAGE_SIZE, "%08u\n", temp); } static DEVICE_ATTR(config_imod, 0644, config_imod_show, config_imod_store); static int xhci_plat_probe(struct platform_device *pdev) { const struct of_device_id *match; Loading Loading @@ -278,6 +331,11 @@ static int xhci_plat_probe(struct platform_device *pdev) if (ret) goto dealloc_usb2_hcd; ret = device_create_file(&pdev->dev, &dev_attr_config_imod); if (ret) dev_err(&pdev->dev, "%s: unable to create imod sysfs entry\n", __func__); pm_runtime_mark_last_busy(&pdev->dev); pm_runtime_put_autosuspend(&pdev->dev); Loading Loading @@ -312,6 +370,7 @@ static int xhci_plat_remove(struct platform_device *dev) pm_runtime_disable(&dev->dev); xhci->xhc_state |= XHCI_STATE_REMOVING; device_remove_file(&dev->dev, &dev_attr_config_imod); usb_remove_hcd(xhci->shared_hcd); usb_phy_shutdown(hcd->usb_phy); Loading Loading
drivers/usb/host/xhci-plat.c +59 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,59 @@ static const struct of_device_id usb_xhci_of_match[] = { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif static ssize_t config_imod_store(struct device *pdev, struct device_attribute *attr, const char *buff, size_t size) { struct usb_hcd *hcd = dev_get_drvdata(pdev); struct xhci_hcd *xhci; u32 temp; u32 imod; unsigned long flags; if (kstrtouint(buff, 10, &imod) != 1) return 0; imod &= ER_IRQ_INTERVAL_MASK; xhci = hcd_to_xhci(hcd); if (xhci->shared_hcd->state == HC_STATE_SUSPENDED && hcd->state == HC_STATE_SUSPENDED) return -EACCES; spin_lock_irqsave(&xhci->lock, flags); temp = readl_relaxed(&xhci->ir_set->irq_control); temp &= ~ER_IRQ_INTERVAL_MASK; temp |= imod; writel_relaxed(temp, &xhci->ir_set->irq_control); spin_unlock_irqrestore(&xhci->lock, flags); return size; } static ssize_t config_imod_show(struct device *pdev, struct device_attribute *attr, char *buff) { struct usb_hcd *hcd = dev_get_drvdata(pdev); struct xhci_hcd *xhci; u32 temp; unsigned long flags; xhci = hcd_to_xhci(hcd); if (xhci->shared_hcd->state == HC_STATE_SUSPENDED && hcd->state == HC_STATE_SUSPENDED) return -EACCES; spin_lock_irqsave(&xhci->lock, flags); temp = readl_relaxed(&xhci->ir_set->irq_control) & ER_IRQ_INTERVAL_MASK; spin_unlock_irqrestore(&xhci->lock, flags); return snprintf(buff, PAGE_SIZE, "%08u\n", temp); } static DEVICE_ATTR(config_imod, 0644, config_imod_show, config_imod_store); static int xhci_plat_probe(struct platform_device *pdev) { const struct of_device_id *match; Loading Loading @@ -278,6 +331,11 @@ static int xhci_plat_probe(struct platform_device *pdev) if (ret) goto dealloc_usb2_hcd; ret = device_create_file(&pdev->dev, &dev_attr_config_imod); if (ret) dev_err(&pdev->dev, "%s: unable to create imod sysfs entry\n", __func__); pm_runtime_mark_last_busy(&pdev->dev); pm_runtime_put_autosuspend(&pdev->dev); Loading Loading @@ -312,6 +370,7 @@ static int xhci_plat_remove(struct platform_device *dev) pm_runtime_disable(&dev->dev); xhci->xhc_state |= XHCI_STATE_REMOVING; device_remove_file(&dev->dev, &dev_attr_config_imod); usb_remove_hcd(xhci->shared_hcd); usb_phy_shutdown(hcd->usb_phy); Loading