Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752866AbdDJH56 (ORCPT ); Mon, 10 Apr 2017 03:57:58 -0400 Received: from mail-oi0-f50.google.com ([209.85.218.50]:33274 "EHLO mail-oi0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752314AbdDJH54 (ORCPT ); Mon, 10 Apr 2017 03:57:56 -0400 MIME-Version: 1.0 In-Reply-To: <50a6c7681d2731a72d7488d4c362833ceeac8c8b.1490841752.git.baolin.wang@linaro.org> References: <50a6c7681d2731a72d7488d4c362833ceeac8c8b.1490841752.git.baolin.wang@linaro.org> From: Baolin Wang Date: Mon, 10 Apr 2017 15:57:55 +0800 Message-ID: Subject: Re: [PATCH] usb: host: plat: Enable xHCI plat runtime PM To: Mathias Nyman Cc: Greg KH , Mark Brown , USB , LKML , Baolin Wang Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3942 Lines: 124 Hi Mathias, On 30 March 2017 at 11:26, Baolin Wang 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 > --- > 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