usb: dwc3: workaround: metastability state on Run/Stop bit
authorFelipe Balbi <balbi@ti.com>
Fri, 23 Mar 2012 10:20:31 +0000 (12:20 +0200)
committerFelipe Balbi <balbi@ti.com>
Wed, 11 Apr 2012 10:12:17 +0000 (13:12 +0300)
All revisions prior to 2.20a have a known issue which
causes metastability state on Run/Stop bit if we
configure the core to work on any of the USB2-only
speeds.

The suggested workaround is just to never configure the
core to anything other than SuperSpeed.

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

index 5255fe975ea1c5aa9e2ffecccd80618d5ad4332b..dda56b8f8617637eccda96b428dc22fc1fca449e 100644 (file)
@@ -1356,7 +1356,24 @@ static int dwc3_gadget_start(struct usb_gadget *g,
 
        reg = dwc3_readl(dwc->regs, DWC3_DCFG);
        reg &= ~(DWC3_DCFG_SPEED_MASK);
-       reg |= dwc->maximum_speed;
+
+       /**
+        * WORKAROUND: DWC3 revision < 2.20a have an issue
+        * which would cause metastability state on Run/Stop
+        * bit if we try to force the IP to USB2-only mode.
+        *
+        * Because of that, we cannot configure the IP to any
+        * speed other than the SuperSpeed
+        *
+        * Refers to:
+        *
+        * STAR#9000525659: Clock Domain Crossing on DCTL in
+        * USB 2.0 Mode
+        */
+       if (dwc->revision < DWC3_REVISION_220A)
+               reg |= DWC3_DCFG_SUPERSPEED;
+       else
+               reg |= dwc->maximum_speed;
        dwc3_writel(dwc->regs, DWC3_DCFG, reg);
 
        dwc->start_config_issued = false;