Re: [PATCH 06/22] usb: musb: fix some runtime_pm issues

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Apr 13, 2012 at 03:09:41PM +0530, ABRAHAM, KISHON VIJAY wrote:
> 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.

pull request has already been sent, if you care enough, please send
another patch which will go into v3.5 merge window. Also, make sure to
test it to avoid regressions ;-)

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux