aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorGrazvydas Ignotas <notasas@gmail.com>2010-10-10 14:52:22 -0400
committerFelipe Balbi <balbi@ti.com>2010-11-05 07:48:09 -0400
commit120d074c58172cd44887d86c9acc44882818c7e7 (patch)
tree6b9978058af9e41b78b51af9730157883d2c8d47 /drivers/usb
parente2c3404523c5366c6cc1099d3237d363254adde0 (diff)
usb: musb: don't leave PHY enabled on shutdown()
Some actions like musb_platform_exit are only performed on module removal and not on shutdown, which results in PHY being left enabled on reboot at least. This is sometimes causing strange failures after reboot (observed on OMAP3 pandora board), when DEVCTL does not report VBUS state correctly due to unknown reasons (possibly because of communication issues between musb IP and PHY). Running musb_platform_exit before reset seems to resolve that issue. Move some exit code from musb_remove() to musb_shutdown() so that it is performed on both module removal and shutdown/reset. Also convert the host check so that it doesn't need #ifdef. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/musb/musb_core.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index c9f9024c5515..2f42a5d50a5a 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -1052,6 +1052,12 @@ static void musb_shutdown(struct platform_device *pdev)
1052 clk_put(musb->clock); 1052 clk_put(musb->clock);
1053 spin_unlock_irqrestore(&musb->lock, flags); 1053 spin_unlock_irqrestore(&musb->lock, flags);
1054 1054
1055 if (!is_otg_enabled(musb) && is_host_enabled(musb))
1056 usb_remove_hcd(musb_to_hcd(musb));
1057 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
1058 musb_platform_exit(musb);
1059 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
1060
1055 /* FIXME power down */ 1061 /* FIXME power down */
1056} 1062}
1057 1063
@@ -2244,13 +2250,6 @@ static int __exit musb_remove(struct platform_device *pdev)
2244 */ 2250 */
2245 musb_exit_debugfs(musb); 2251 musb_exit_debugfs(musb);
2246 musb_shutdown(pdev); 2252 musb_shutdown(pdev);
2247#ifdef CONFIG_USB_MUSB_HDRC_HCD
2248 if (musb->board_mode == MUSB_HOST)
2249 usb_remove_hcd(musb_to_hcd(musb));
2250#endif
2251 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2252 musb_platform_exit(musb);
2253 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2254 2253
2255 musb_free(musb); 2254 musb_free(musb);
2256 iounmap(ctrl_base); 2255 iounmap(ctrl_base);