summaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-07-02 16:46:43 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-07-03 07:06:28 +0200
commit4db5b72d0c8f7b7fc0d5d430a60c155c7220200c (patch)
tree7533d01f1f178b189afdade7e0727b28fa8042ae /drivers/usb/musb
parent69be27c14b43d319b636f2401476b83601ca929a (diff)
downloadbarebox-4db5b72d0c8f7b7fc0d5d430a60c155c7220200c.tar.gz
barebox-4db5b72d0c8f7b7fc0d5d430a60c155c7220200c.tar.xz
usb: musb: Use proper timeout loop
Poll for a well defined time in musb_init. The current counting loop takes too short for some devices. Tested on OMAP3 with a rather slowish memory stick. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/usb/musb')
-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 ccb702980f..84a05c4f96 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -119,8 +119,6 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
-#define MUSB_HOST_TIMEOUT 0x5fffff
-
/*-------------------------------------------------------------------------*/
#ifndef CONFIG_BLACKFIN
@@ -1025,17 +1023,18 @@ int musb_init(struct usb_host *host)
{
struct musb *musb = to_musb(host);
void *mbase;
- int timeout = MUSB_HOST_TIMEOUT;
+ u64 start;
u8 power;
musb_start(musb);
mbase = musb->mregs;
- do {
+ start = get_time_ns();
+ while (1) {
if (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_HM)
break;
- } while (--timeout);
- if (!timeout)
- return -ENODEV;
+ if (is_timeout(start, 4 * SECOND))
+ return -ENODEV;
+ }
power = musb_readb(mbase, MUSB_POWER);
musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);