[PATCH] usb: ehci-mx6: Enable OTG detection on imx8mm and imx8mn

Adam Ford aford173 at gmail.com
Wed Dec 22 13:52:13 CET 2021


The imx8mm and imx8mn appear compatible with imx7d-usb
flags in the OTG driver.  If the dr_mode is defined as
host or peripheral, the device appears to operate correctly,
however the auto host/peripheral detection results in an error.

Simply adding checks in ehci_usb_phy_mode for 8mm and
8mn in ehci_usb_phy_mode is not enough, because ehci_usb_of_to_plat
is run before the clock is enabled which results in a hang.

Enable the USB clock in ehci_usb_of_to_plat and add checks in
ehci_usb_phy_mode for 8mm and 8mn to enable auto detection of
the OTG mode on i.MX8M Mini and Nano.

Signed-off-by: Adam Ford <aford173 at gmail.com>

diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 1bd6147c76..fa0798171b 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -543,7 +543,7 @@ static int ehci_usb_phy_mode(struct udevice *dev)
 			plat->init_type = USB_INIT_DEVICE;
 		else
 			plat->init_type = USB_INIT_HOST;
-	} else if (is_mx7()) {
+	} else if (is_mx7() || is_imx8mm() || is_imx8mn()) {
 		phy_status = (void __iomem *)(addr +
 					      USBNC_PHY_STATUS_OFFSET);
 		val = readl(phy_status);
@@ -561,11 +561,30 @@ static int ehci_usb_phy_mode(struct udevice *dev)
 
 static int ehci_usb_of_to_plat(struct udevice *dev)
 {
+#if CONFIG_IS_ENABLED(CLK)
+	int ret = 0;
+	struct ehci_mx6_priv_data *priv = dev_get_priv(dev);
+
+	ret = clk_get_by_index(dev, 0, &priv->clk);
+	if (ret < 0)
+		return ret;
+
+	ret = clk_enable(&priv->clk);
+	if (ret)
+		return ret;
+#endif
+
 	struct usb_plat *plat = dev_get_plat(dev);
 	enum usb_dr_mode dr_mode;
 
 	dr_mode = usb_get_dr_mode(dev_ofnode(dev));
 
+#if CONFIG_IS_ENABLED(CLK)
+	ret = clk_disable(&priv->clk);
+	if (ret)
+		return ret;
+#endif
+
 	switch (dr_mode) {
 	case USB_DR_MODE_HOST:
 		plat->init_type = USB_INIT_HOST;
-- 
2.32.0



More information about the U-Boot mailing list