Hi, robert.foss@xxxxxxxxxxxxx writes: > From: Andrew Bresticker <abrestic@xxxxxxxxxxxx> > > Enable runtime PM for the xhci-plat device so that the parent device > may implement runtime PM. > > Signed-off-by: Andrew Bresticker <abrestic@xxxxxxxxxxxx> > Tested-by: Robert Foss <robert.foss@xxxxxxxxxxxxx> > Signed-off-by: Robert Foss <robert.foss@xxxxxxxxxxxxx> > --- > drivers/usb/host/xhci-plat.c | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index ed56bf9..4f39d4e 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > @@ -246,6 +246,9 @@ static int xhci_plat_probe(struct platform_device *pdev) > if (ret) > goto dealloc_usb2_hcd; > > + pm_runtime_set_active(&pdev->dev); > + pm_runtime_enable(&pdev->dev); > + > return 0; > > > @@ -274,6 +277,8 @@ static int xhci_plat_remove(struct platform_device *dev) > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > struct clk *clk = xhci->clk; > > + pm_runtime_disable(&dev->dev); > + > usb_remove_hcd(xhci->shared_hcd); > usb_phy_shutdown(hcd->usb_phy); > > @@ -292,7 +297,11 @@ static int xhci_plat_suspend(struct device *dev) > { > struct usb_hcd *hcd = dev_get_drvdata(dev); > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + int ret; > > + ret = pm_runtime_get_sync(dev); > + if (ret < 0) > + return ret; you're leaving unbalanced PM usage_counter here. If pm_runtime_get*() fails, you still have to decrement usage_counter. > /* > * xhci_suspend() needs `do_wakeup` to know whether host is allowed > * to do wakeup during suspend. Since xhci_plat_suspend is currently > @@ -301,15 +310,26 @@ static int xhci_plat_suspend(struct device *dev) > * reconsider this when xhci_plat_suspend enlarges its scope, e.g., > * also applies to runtime suspend. > */ > - return xhci_suspend(xhci, device_may_wakeup(dev)); > + ret = xhci_suspend(xhci, device_may_wakeup(dev)); > + pm_runtime_put(dev); > + > + return ret; > } > > static int xhci_plat_resume(struct device *dev) > { > struct usb_hcd *hcd = dev_get_drvdata(dev); > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + int ret; > + > + ret = pm_runtime_get_sync(dev); > + if (ret < 0) > + return ret; ditto -- balbi
Attachment:
signature.asc
Description: PGP signature