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

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

 



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


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

  Powered by Linux