usb: dwc3: shorten long delay in dwc3_gadget_set_link_state()
authorPaul Zimmerman <Paul.Zimmerman@synopsys.com>
Sat, 25 Feb 2012 01:32:15 +0000 (17:32 -0800)
committerFelipe Balbi <balbi@ti.com>
Fri, 2 Mar 2012 10:12:09 +0000 (12:12 +0200)
The loop in dwc3_gadget_set_link_state() was using a udelay(500),
which is a long time to delay in interrupt context. Change it to
udelay(5) and increase the loop count to match.

Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/gadget.c

index fac1149..e2633dd 100644 (file)
@@ -95,11 +95,11 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
  * @state: the state to put link into
  *
  * Caller should take care of locking. This function will
- * return 0 on success or -EINVAL.
+ * return 0 on success or -ETIMEDOUT.
  */
 int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
 {
-       int             retries = 100;
+       int             retries = 10000;
        u32             reg;
 
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
@@ -113,11 +113,10 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
        while (--retries) {
                reg = dwc3_readl(dwc->regs, DWC3_DSTS);
 
-               /* in HS, means ON */
                if (DWC3_DSTS_USBLNKST(reg) == state)
                        return 0;
 
-               udelay(500);
+               udelay(5);
        }
 
        dev_vdbg(dwc->dev, "link state change request timed out\n");