|
@@ -244,7 +244,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
|
do {
|
|
do {
|
|
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
|
|
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
|
|
if (!(reg & DWC3_DCTL_CSFTRST))
|
|
if (!(reg & DWC3_DCTL_CSFTRST))
|
|
- return 0;
|
|
|
|
|
|
+ goto done;
|
|
|
|
|
|
udelay(1);
|
|
udelay(1);
|
|
} while (--retries);
|
|
} while (--retries);
|
|
@@ -253,6 +253,17 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
|
phy_exit(dwc->usb2_generic_phy);
|
|
phy_exit(dwc->usb2_generic_phy);
|
|
|
|
|
|
return -ETIMEDOUT;
|
|
return -ETIMEDOUT;
|
|
|
|
+
|
|
|
|
+done:
|
|
|
|
+ /*
|
|
|
|
+ * For DWC_usb31 controller, once DWC3_DCTL_CSFTRST bit is cleared,
|
|
|
|
+ * we must wait at least 50ms before accessing the PHY domain
|
|
|
|
+ * (synchronization delay). DWC_usb31 programming guide section 1.3.2.
|
|
|
|
+ */
|
|
|
|
+ if (dwc3_is_usb31(dwc))
|
|
|
|
+ msleep(50);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|