Hi, [email protected] writes: > From: Andrew Bresticker <[email protected]> > > Enable runtime PM for the xhci-plat device so that the parent device > may implement runtime PM. > > Signed-off-by: Andrew Bresticker <[email protected]> > Tested-by: Robert Foss <[email protected]> > Signed-off-by: Robert Foss <[email protected]> > --- > 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
signature.asc
Description: PGP signature
