|
@@ -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;
|