On Mon, 22 May 2017, Tony Lindgren wrote: > This is needed in preparation of adding support for omap3 and > later OHCI. The runtime PM will only do something on platforms > that implement it. > > Cc: devicetree@xxxxxxxxxxxxxxx > Cc: Hans de Goede <hdegoede@xxxxxxxxxx> > Cc: Rob Herring <robh@xxxxxxxxxx> > Cc: Roger Quadros <rogerq@xxxxxx> > Cc: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx> > Cc: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx> > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > --- > > Alan, do you have some better ideas for the ohci_platform_remove() > path below? > > --- > drivers/usb/host/ohci-platform.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c > --- a/drivers/usb/host/ohci-platform.c > +++ b/drivers/usb/host/ohci-platform.c > @@ -24,6 +24,7 @@ > #include <linux/err.h> > #include <linux/phy/phy.h> > #include <linux/platform_device.h> > +#include <linux/pm_runtime.h> > #include <linux/reset.h> > #include <linux/usb/ohci_pdriver.h> > #include <linux/usb.h> > @@ -242,6 +243,8 @@ static int ohci_platform_probe(struct platform_device *dev) > } > #endif > > + pm_runtime_set_active(&dev->dev); > + pm_runtime_enable(&dev->dev); > if (pdata->power_on) { > err = pdata->power_on(dev); > if (err < 0) > @@ -271,6 +274,7 @@ static int ohci_platform_probe(struct platform_device *dev) > if (pdata->power_off) > pdata->power_off(dev); > err_reset: > + pm_runtime_disable(&dev->dev); > while (--rst >= 0) > reset_control_assert(priv->resets[rst]); > err_put_clks: > @@ -290,7 +294,14 @@ static int ohci_platform_remove(struct platform_device *dev) > struct usb_hcd *hcd = platform_get_drvdata(dev); > struct usb_ohci_pdata *pdata = dev_get_platdata(&dev->dev); > struct ohci_platform_priv *priv = hcd_to_ohci_priv(hcd); > - int clk, rst; > + int clk, rst, enabled; > + > + enabled = pm_runtime_get_sync(&dev->dev); > + if (enabled < 0) { > + dev_warn(&dev->dev, "pm_runtime_get failed: %i\n", > + enabled); > + pm_runtime_put_noidle(&dev->dev); > + } I wouldn't worry about checking the return value. There's no particular reason for this call to fail, is there? > > usb_remove_hcd(hcd); > > @@ -305,6 +316,10 @@ static int ohci_platform_remove(struct platform_device *dev) > > usb_put_hcd(hcd); > > + if (enabled >= 0) > + pm_runtime_put_sync(&dev->dev); > + pm_runtime_disable(&dev->dev); And here you could just do the put_sync, with no test. If the get_sync failed then this will probably fail too, but you won't be any worse off for the attempt. Alan Stern > + > if (pdata == &ohci_platform_defaults) > dev->dev.platform_data = NULL; -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html