Hi, On Tue, Apr 10, 2012 at 9:48 PM, Felipe Balbi <balbi@xxxxxx> wrote: > From: Grazvydas Ignotas <notasas@xxxxxxxxx> > > When runtime_pm was originally added, it was done in rather confusing > way: omap2430_musb_init() (called from musb_init_controller) would do > runtime_pm_get_sync() and musb_init_controller() itself would do > runtime_pm_put to balance it out. This is not only confusing but also > wrong if non-omap2430 glue layer is used. > > This confusion resulted in commit 772aed45b604 "usb: musb: fix > pm_runtime mismatch", that removed runtime_pm_put() from > musb_init_controller as that looked unbalanced, and also happened to > fix unrelated isp1704_charger crash. However this broke runtime PM > functionality (musb is now always powered, even without gadget active). > > Avoid these confusing runtime pm dependences by making > musb_init_controller() and omap2430_musb_init() do their own runtime > get/put pairs; also cover error paths. Remove unneeded runtime_pm_put > in omap2430_remove too. isp1704_charger crash that motivated > 772aed45b604 will be fixed by following patch. > > Cc: Felipe Contreras <felipe.contreras@xxxxxxxxx> > Signed-off-by: Grazvydas Ignotas <notasas@xxxxxxxxx> > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > --- > drivers/usb/musb/musb_core.c | 9 ++++++++- > drivers/usb/musb/omap2430.c | 2 +- > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c > index 0f8b829..2392146 100644 > --- a/drivers/usb/musb/musb_core.c > +++ b/drivers/usb/musb/musb_core.c > @@ -1904,7 +1904,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) > > if (!musb->isr) { > status = -ENODEV; > - goto fail3; > + goto fail2; > } > > if (!musb->xceiv->io_ops) { > @@ -1912,6 +1912,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) > musb->xceiv->io_ops = &musb_ulpi_access; > } > > + pm_runtime_get_sync(musb->controller); > + Move this get_sync above musb_platform_init() and remove the get_sync in omap2430_musb_init(). > #ifndef CONFIG_MUSB_PIO_ONLY > if (use_dma && dev->dma_mask) { > struct dma_controller *c; > @@ -2023,6 +2025,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) > goto fail5; > #endif > > + pm_runtime_put(musb->controller); > + > dev_info(dev, "USB %s mode controller at %p using %s, IRQ %d\n", > ({char *s; > switch (musb->board_mode) { > @@ -2047,6 +2051,9 @@ fail4: > musb_gadget_cleanup(musb); > > fail3: > + pm_runtime_put_sync(musb->controller); > + > +fail2: > if (musb->irq_wake) > device_init_wakeup(dev, 0); > musb_platform_exit(musb); > diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c > index 11b571e..3dfd122 100644 > --- a/drivers/usb/musb/omap2430.c > +++ b/drivers/usb/musb/omap2430.c > @@ -333,6 +333,7 @@ static int omap2430_musb_init(struct musb *musb) > > setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); > > + pm_runtime_put_noidle(musb->controller); This is not needed if you move the get_sync above musb_platform_init() (musb_core.c) and remove the get_sync in omap2430_musb_init(). Though your patch doesn't do any harm, we can avoid redundant calls to runtime_get and runtime_put. Thanks Kishon -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html