Skip to content

Commit 8f2279d

Browse files
committed
usb: musb: omap2430: Fix regression caused by driver core change
Commit ddef08d ("Driver core: wakeup the parent device before trying probe") started automatically ensuring the parent device is enabled when the child gets probed. This however caused a regression for MUSB omap2430 interface as the runtime PM for the parent device needs the child initialized to access the MUSB hardware registers. Let's delay the enabling of PM runtime for the parent until the child has been properly initialized as suggested in an earlier patch by Grygorii Strashko <grygorii.strashko@ti.com>. In addition to delaying pm_runtime_enable, we now also need to make sure the parent is enabled during omap2430_musb_init. We also want to propagate an error from omap2430_runtime_resume if struct musb is not initialized. Note that we use pm_runtime_put_noidle here for both the child and parent to prevent an extra runtime_suspend/resume cycle. Let's also add some comments to avoid confusion between the two different devices. Fixes: ddef08d ("Driver core: wakeup the parent device before trying probe") Suggested-by: Grygorii Strashko <grygorii.strashko@ti.com> Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> Acked-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
1 parent 1bd5dfe commit 8f2279d

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

drivers/usb/musb/omap2430.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,9 +391,20 @@ static int omap2430_musb_init(struct musb *musb)
391391
}
392392
musb->isr = omap2430_musb_interrupt;
393393

394+
/*
395+
* Enable runtime PM for musb parent (this driver). We can't
396+
* do it earlier as struct musb is not yet allocated and we
397+
* need to touch the musb registers for runtime PM.
398+
*/
399+
pm_runtime_enable(glue->dev);
400+
status = pm_runtime_get_sync(glue->dev);
401+
if (status < 0)
402+
goto err1;
403+
394404
status = pm_runtime_get_sync(dev);
395405
if (status < 0) {
396406
dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
407+
pm_runtime_put_sync(glue->dev);
397408
goto err1;
398409
}
399410

@@ -426,6 +437,7 @@ static int omap2430_musb_init(struct musb *musb)
426437
phy_power_on(musb->phy);
427438

428439
pm_runtime_put_noidle(musb->controller);
440+
pm_runtime_put_noidle(glue->dev);
429441
return 0;
430442

431443
err1:
@@ -626,7 +638,11 @@ static int omap2430_probe(struct platform_device *pdev)
626638
goto err2;
627639
}
628640

629-
pm_runtime_enable(&pdev->dev);
641+
/*
642+
* Note that we cannot enable PM runtime yet for this
643+
* driver as we need struct musb initialized first.
644+
* See omap2430_musb_init above.
645+
*/
630646

631647
ret = platform_device_add(musb);
632648
if (ret) {
@@ -675,11 +691,12 @@ static int omap2430_runtime_resume(struct device *dev)
675691
struct omap2430_glue *glue = dev_get_drvdata(dev);
676692
struct musb *musb = glue_to_musb(glue);
677693

678-
if (musb) {
679-
omap2430_low_level_init(musb);
680-
musb_writel(musb->mregs, OTG_INTERFSEL,
681-
musb->context.otg_interfsel);
682-
}
694+
if (!musb)
695+
return -EPROBE_DEFER;
696+
697+
omap2430_low_level_init(musb);
698+
musb_writel(musb->mregs, OTG_INTERFSEL,
699+
musb->context.otg_interfsel);
683700

684701
return 0;
685702
}

0 commit comments

Comments
 (0)