|
@@ -394,10 +394,15 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
|
|
|
/**
|
|
|
* dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
|
|
|
* @dwc: Pointer to our controller context structure
|
|
|
+ *
|
|
|
+ * Returns 0 on success. The USB PHY interfaces are configured but not
|
|
|
+ * initialized. The PHY interfaces and the PHYs get initialized together with
|
|
|
+ * the core in dwc3_core_init.
|
|
|
*/
|
|
|
-static void dwc3_phy_setup(struct dwc3 *dwc)
|
|
|
+static int dwc3_phy_setup(struct dwc3 *dwc)
|
|
|
{
|
|
|
u32 reg;
|
|
|
+ int ret;
|
|
|
|
|
|
reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
|
|
|
|
|
@@ -443,13 +448,30 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
|
|
|
case DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI:
|
|
|
if (!strncmp(dwc->hsphy_interface, "utmi", 4)) {
|
|
|
reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI;
|
|
|
+ break;
|
|
|
} else if (!strncmp(dwc->hsphy_interface, "ulpi", 4)) {
|
|
|
reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI;
|
|
|
+ dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
|
|
|
} else {
|
|
|
dev_warn(dwc->dev, "HSPHY Interface not defined\n");
|
|
|
- break;
|
|
|
+
|
|
|
+ /* Relying on default value. */
|
|
|
+ if (!(reg & DWC3_GUSB2PHYCFG_ULPI_UTMI))
|
|
|
+ break;
|
|
|
}
|
|
|
/* FALLTHROUGH */
|
|
|
+ case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
|
|
|
+ /* Making sure the interface and PHY are operational */
|
|
|
+ ret = dwc3_soft_reset(dwc);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ udelay(1);
|
|
|
+
|
|
|
+ ret = dwc3_ulpi_init(dwc);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ /* FALLTHROUGH */
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -467,6 +489,8 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
|
|
|
reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
|
|
|
|
|
|
dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -906,7 +930,9 @@ static int dwc3_probe(struct platform_device *pdev)
|
|
|
platform_set_drvdata(pdev, dwc);
|
|
|
dwc3_cache_hwparams(dwc);
|
|
|
|
|
|
- dwc3_phy_setup(dwc);
|
|
|
+ ret = dwc3_phy_setup(dwc);
|
|
|
+ if (ret)
|
|
|
+ goto err0;
|
|
|
|
|
|
ret = dwc3_core_get_phy(dwc);
|
|
|
if (ret)
|
|
@@ -994,6 +1020,7 @@ err2:
|
|
|
|
|
|
err1:
|
|
|
dwc3_free_event_buffers(dwc);
|
|
|
+ dwc3_ulpi_exit(dwc);
|
|
|
|
|
|
err0:
|
|
|
/*
|
|
@@ -1029,6 +1056,7 @@ static int dwc3_remove(struct platform_device *pdev)
|
|
|
phy_power_off(dwc->usb3_generic_phy);
|
|
|
|
|
|
dwc3_core_exit(dwc);
|
|
|
+ dwc3_ulpi_exit(dwc);
|
|
|
|
|
|
pm_runtime_put_sync(&pdev->dev);
|
|
|
pm_runtime_disable(&pdev->dev);
|