From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753409AbcLHHFB (ORCPT ); Thu, 8 Dec 2016 02:05:01 -0500 Received: from mail-yw0-f178.google.com ([209.85.161.178]:33950 "EHLO mail-yw0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751243AbcLHHE7 (ORCPT ); Thu, 8 Dec 2016 02:04:59 -0500 MIME-Version: 1.0 In-Reply-To: References: From: Baolin Wang Date: Thu, 8 Dec 2016 15:04:57 +0800 Message-ID: Subject: Re: [PATCH v4 1/2] usb: host: plat: Enable xhci plat runtime PM To: mathias.nyman@intel.com, Felipe Balbi 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 Hi Mathias and Felipe, On 28 November 2016 at 14:43, Baolin Wang wrote: > Enable the xhci plat runtime PM for parent device to suspend/resume xhci. > Also call pm_runtime_get_noresume() in probe() function in case the parent > device doesn't call suspend/resume callback by runtime PM now. > > Signed-off-by: Baolin Wang > --- > Changes since v3: > - Fix kbuild error. > > Changes since v2: > - Add pm_runtime_get_noresume() in probe() function. > - Add pm_runtime_set_suspended()/pm_runtime_put_noidle() in remove() function. > > Changes since v1: > - No updates. > --- > drivers/usb/host/xhci-plat.c | 41 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 36 insertions(+), 5 deletions(-) > > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index ed56bf9..5805c6a 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > @@ -246,6 +246,10 @@ static int xhci_plat_probe(struct platform_device *pdev) > if (ret) > goto dealloc_usb2_hcd; > > + pm_runtime_get_noresume(&pdev->dev); > + pm_runtime_set_active(&pdev->dev); > + pm_runtime_enable(&pdev->dev); > + > return 0; > > > @@ -274,6 +278,10 @@ static int xhci_plat_remove(struct platform_device *dev) > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > struct clk *clk = xhci->clk; > > + pm_runtime_set_suspended(&dev->dev); > + pm_runtime_put_noidle(&dev->dev); > + pm_runtime_disable(&dev->dev); > + > usb_remove_hcd(xhci->shared_hcd); > usb_phy_shutdown(hcd->usb_phy); > > @@ -311,14 +319,37 @@ 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); > +} > + > +static int xhci_plat_runtime_idle(struct device *dev) > +{ > + return 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, > + xhci_plat_runtime_idle) > }; > -#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 */ > @@ -332,7 +363,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), > }, > -- > 1.7.9.5 > Do you have any comments about this patch? Thanks. -- Baolin.wang Best Regards