summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorPaul Kocialkowski <contact@paulk.fr>2015-01-19 18:33:43 +0100
committerMarek Vasut <marex@denx.de>2015-02-24 18:54:03 +0100
commit193d7d153024214f2906e34f2c8abd495be57696 (patch)
tree5b19847f293bbbcec4a86c2713a3e0e65e9a483a /drivers/usb
parent8f9f7be7af4e3662424da6fa0c3b7d1041c1b1d2 (diff)
downloadu-boot-imx-193d7d153024214f2906e34f2c8abd495be57696.zip
u-boot-imx-193d7d153024214f2906e34f2c8abd495be57696.tar.gz
u-boot-imx-193d7d153024214f2906e34f2c8abd495be57696.tar.bz2
usb: musb-new: omap2430: Reset the MUSB controller early
When booting from USB peripheral boot, the bootrom will not properly deinit the MUSB controller, which doesn't clearly indicate an USB disconnection to the host and leaves U-Boot to deal with the state of the previous USB session. On some host controller drivers (e.g. xhci_hcd), this ends up in a failure during set address, caused by the lack of proper disconnection notification. Resetting the controller early in U-Boot notifies the host of the disconnection and doesn't hurt other use cases. Signed-off-by: Paul Kocialkowski <contact@paulk.fr> Reviewed-by: Tom Rini <trini@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/musb-new/omap2430.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/usb/musb-new/omap2430.c b/drivers/usb/musb-new/omap2430.c
index 98f4830..31a280e 100644
--- a/drivers/usb/musb-new/omap2430.c
+++ b/drivers/usb/musb-new/omap2430.c
@@ -321,6 +321,7 @@ static int omap2430_musb_init(struct musb *musb)
{
u32 l;
int status = 0;
+ unsigned long int start;
#ifndef __UBOOT__
struct device *dev = musb->controller;
struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
@@ -331,6 +332,21 @@ static int omap2430_musb_init(struct musb *musb)
(struct omap_musb_board_data *)musb->controller;
#endif
+ /* Reset the controller */
+ musb_writel(musb->mregs, OTG_SYSCONFIG, SOFTRST);
+
+ start = get_timer(0);
+
+ while (1) {
+ l = musb_readl(musb->mregs, OTG_SYSCONFIG);
+ if ((l & SOFTRST) == 0)
+ break;
+
+ if (get_timer(start) > (CONFIG_SYS_HZ / 1000)) {
+ dev_err(musb->controller, "MUSB reset is taking too long\n");
+ return -ENODEV;
+ }
+ }
#ifndef __UBOOT__
/* We require some kind of external transceiver, hooked