Hi Mathias, On 30 March 2017 at 11:26, Baolin Wang <baolin.wang@xxxxxxxxxx> wrote: > Enable the xHCI plat runtime PM for parent device to suspend/resume > xHCI. Also call pm_runtime_forbid() in probe() function to force users > to explicitly enable runtime pm using power/control in sysfs, in case > some parent devices didn't implement runtime PM callbacks. > > Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxx> > --- > drivers/usb/host/xhci-plat.c | 54 ++++++++++++++++++++++++++++++++++++------ > 1 file changed, 47 insertions(+), 7 deletions(-) > > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index bd02a6c..2036c24 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > @@ -179,9 +179,15 @@ static int xhci_plat_probe(struct platform_device *pdev) > return ret; > } > > + pm_runtime_set_active(&pdev->dev); > + pm_runtime_enable(&pdev->dev); > + pm_runtime_get_noresume(&pdev->dev); > + > hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); > - if (!hcd) > - return -ENOMEM; > + if (!hcd) { > + ret = -ENOMEM; > + goto disable_runtime; > + } > > res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > hcd->regs = devm_ioremap_resource(&pdev->dev, res); > @@ -258,6 +264,14 @@ static int xhci_plat_probe(struct platform_device *pdev) > if (ret) > goto dealloc_usb2_hcd; > > + pm_runtime_put_noidle(&pdev->dev); > + > + /* > + * Prevent runtime pm from being on as default, users should enable > + * runtime pm using power/control in sysfs. > + */ > + pm_runtime_forbid(&pdev->dev); > + > return 0; > > > @@ -277,6 +291,10 @@ static int xhci_plat_probe(struct platform_device *pdev) > put_hcd: > usb_put_hcd(hcd); > > +disable_runtime: > + pm_runtime_put_noidle(&pdev->dev); > + pm_runtime_disable(&pdev->dev); > + > return ret; > } > > @@ -298,6 +316,9 @@ static int xhci_plat_remove(struct platform_device *dev) > clk_disable_unprepare(clk); > usb_put_hcd(hcd); > > + pm_runtime_set_suspended(&dev->dev); > + pm_runtime_disable(&dev->dev); > + > return 0; > } > > @@ -325,14 +346,33 @@ static int xhci_plat_resume(struct device *dev) > > return xhci_resume(xhci, 0); > } > +#endif /* CONFIG_PM_SLEEP */ > + > +#ifdef CONFIG_PM > +static int xhci_plat_runtime_suspend(struct device *dev) > +{ > + struct usb_hcd *hcd = dev_get_drvdata(dev); > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + > + return xhci_suspend(xhci, device_may_wakeup(dev)); > +} > + > +static int xhci_plat_runtime_resume(struct device *dev) > +{ > + struct usb_hcd *hcd = dev_get_drvdata(dev); > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + > + return xhci_resume(xhci, 0); > +} > +#endif /* CONFIG_PM */ > > static const struct dev_pm_ops xhci_plat_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(xhci_plat_suspend, xhci_plat_resume) > + > + SET_RUNTIME_PM_OPS(xhci_plat_runtime_suspend, > + xhci_plat_runtime_resume, > + NULL) > }; > -#define DEV_PM_OPS (&xhci_plat_pm_ops) > -#else > -#define DEV_PM_OPS NULL > -#endif /* CONFIG_PM */ > > static const struct acpi_device_id usb_xhci_acpi_match[] = { > /* XHCI-compliant USB Controller */ > @@ -346,7 +386,7 @@ static int xhci_plat_resume(struct device *dev) > .remove = xhci_plat_remove, > .driver = { > .name = "xhci-hcd", > - .pm = DEV_PM_OPS, > + .pm = &xhci_plat_pm_ops, > .of_match_table = of_match_ptr(usb_xhci_of_match), > .acpi_match_table = ACPI_PTR(usb_xhci_acpi_match), > }, Any comments? -- Baolin.wang Best Regards -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html