|
@@ -594,19 +594,12 @@ static void dwc3_core_exit(struct dwc3 *dwc)
|
|
|
phy_power_off(dwc->usb3_generic_phy);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * dwc3_core_init - Low-level initialization of DWC3 Core
|
|
|
- * @dwc: Pointer to our controller context structure
|
|
|
- *
|
|
|
- * Returns 0 on success otherwise negative errno.
|
|
|
- */
|
|
|
-static int dwc3_core_init(struct dwc3 *dwc)
|
|
|
+static bool dwc3_core_is_valid(struct dwc3 *dwc)
|
|
|
{
|
|
|
- u32 hwparams4 = dwc->hwparams.hwparams4;
|
|
|
- u32 reg;
|
|
|
- int ret;
|
|
|
+ u32 reg;
|
|
|
|
|
|
reg = dwc3_readl(dwc->regs, DWC3_GSNPSID);
|
|
|
+
|
|
|
/* This should read as U3 followed by revision number */
|
|
|
if ((reg & DWC3_GSNPSID_MASK) == 0x55330000) {
|
|
|
/* Detected DWC_usb3 IP */
|
|
@@ -616,6 +609,25 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
|
|
dwc->revision = dwc3_readl(dwc->regs, DWC3_VER_NUMBER);
|
|
|
dwc->revision |= DWC3_REVISION_IS_DWC31;
|
|
|
} else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dwc3_core_init - Low-level initialization of DWC3 Core
|
|
|
+ * @dwc: Pointer to our controller context structure
|
|
|
+ *
|
|
|
+ * Returns 0 on success otherwise negative errno.
|
|
|
+ */
|
|
|
+static int dwc3_core_init(struct dwc3 *dwc)
|
|
|
+{
|
|
|
+ u32 hwparams4 = dwc->hwparams.hwparams4;
|
|
|
+ u32 reg;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!dwc3_core_is_valid(dwc)) {
|
|
|
dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n");
|
|
|
ret = -ENODEV;
|
|
|
goto err0;
|