From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Kocialkowski Date: Sun, 18 Jan 2015 17:44:45 +0100 Subject: [U-Boot] [PATCH] usb: musb-new: omap2430: Reset the MUSB controller early Message-ID: <1421599485-31486-1-git-send-email-contact@paulk.fr> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 --- drivers/usb/musb-new/omap2430.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/usb/musb-new/omap2430.c b/drivers/usb/musb-new/omap2430.c index 98f4830..6b256bb 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; + int timeout = 10; #ifndef __UBOOT__ struct device *dev = musb->controller; struct omap2430_glue *glue = dev_get_drvdata(dev->parent); @@ -331,6 +332,22 @@ 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); + + while (timeout--) { + l = musb_readl(musb->mregs, OTG_SYSCONFIG); + + if (l & SOFTRST) + udelay(1); + else + break; + } + + if (timeout == 0) { + dev_err(musb->controller, "MUSB reset is taking too long\n"); + return -ENODEV; + } #ifndef __UBOOT__ /* We require some kind of external transceiver, hooked -- 1.9.1