mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 01:51:53 +00:00
usb: musb: core: Fix pm runtime for deferred probe
If musb_init_controller fails at musb_platform_init, we have already called pm_runtime_irq_safe for musb and that causes the pm runtime count to be enabled for parent before the parent has completed initialization. This causes pm to stop working as on unload nothing gets idled. This issue can be reproduced at least with: # modprobe omap2430 HS USB OTG: no transceiver configured musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517 # modprobe phy-twl4030-usb # rmmod omap2430 And after the steps above omap2430 will block deeper idle states on omap3. To fix this, let's not enable pm runtime until we need to and the parent has been initialized. Note that this does not fix the issue of PM being broken for musb during runtime. Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
928c75fbeb
commit
4d05591094
@ -2017,7 +2017,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
||||
/* We need musb_read/write functions initialized for PM */
|
||||
pm_runtime_use_autosuspend(musb->controller);
|
||||
pm_runtime_set_autosuspend_delay(musb->controller, 200);
|
||||
pm_runtime_irq_safe(musb->controller);
|
||||
pm_runtime_enable(musb->controller);
|
||||
|
||||
/* The musb_platform_init() call:
|
||||
@ -2218,6 +2217,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
||||
|
||||
pm_runtime_put(musb->controller);
|
||||
|
||||
/*
|
||||
* For why this is currently needed, see commit 3e43a0725637
|
||||
* ("usb: musb: core: add pm_runtime_irq_safe()")
|
||||
*/
|
||||
pm_runtime_irq_safe(musb->controller);
|
||||
|
||||
return 0;
|
||||
|
||||
fail5:
|
||||
|
Loading…
Reference in New Issue
Block a user