]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
musb_hdrc: Make SRP reliable and fix timer value
authorTony Lindgren <tony@atomide.com>
Fri, 29 Jun 2007 09:24:12 +0000 (02:24 -0700)
committerTony Lindgren <tony@atomide.com>
Fri, 29 Jun 2007 09:24:12 +0000 (02:24 -0700)
Make SRP reliable and fix timer value

Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/usb/musb/musb_gadget.c

index ce389cdbb9f8625f7c0aee5ee33c801206119dda..1b2c8295a5e036b1f7861832c93ee85c71a02058 100644 (file)
@@ -1448,6 +1448,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)
        unsigned long   flags;
        int             status = -EINVAL;
        u8              power, devctl;
+       int             retries;
 
        spin_lock_irqsave(&musb->Lock, flags);
 
@@ -1462,14 +1463,27 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)
                goto done;
        case OTG_STATE_B_IDLE:
                /* Start SRP ... OTG not required. */
-               DBG(2, "Sending SRP\n");
                devctl = musb_readb(mregs, MGC_O_HDRC_DEVCTL);
+               DBG(2, "Sending SRP: devctl: %02x\n", devctl);
                devctl |= MGC_M_DEVCTL_SESSION;
                musb_writeb(mregs, MGC_O_HDRC_DEVCTL, devctl);
+               devctl = musb_readb(mregs, MGC_O_HDRC_DEVCTL);
+               retries = 100;
+               while (!(devctl & MGC_M_DEVCTL_SESSION)) {
+                       devctl = musb_readb(mregs, MGC_O_HDRC_DEVCTL);
+                       if (retries-- < 1)
+                               break;
+               }
+               retries = 10000;
+               while (devctl & MGC_M_DEVCTL_SESSION) {
+                       devctl = musb_readb(mregs, MGC_O_HDRC_DEVCTL);
+                       if (retries-- < 1)
+                               break;
+               }
 
                /* Block idling for at least 1s */
                musb_platform_try_idle(musb,
-                       msecs_to_jiffies(1 * HZ));
+                       jiffies + msecs_to_jiffies(1 * HZ));
 
                status = 0;
                goto done;