From: Tim Harvey <thar...@gateworks.com>

There is no need to set and/or detect mode in of_to_plat and
accessing phy registers at that point before device power domain and
clock are enabled will cause hangs on platforms such as IMX8M Mini.

Move the mode set/detect from of_to_plat into the probe and remove
the unnecessary of_to_plat.

Signed-off-by: Tim Harvey <thar...@gateworks.com>
Signed-off-by: Fabio Estevam <feste...@denx.de>
---
 drivers/usb/host/ehci-mx6.c | 42 ++++++++++++++-----------------------
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index c3e4170513ec..ff23a5e35e64 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -539,28 +539,6 @@ static int ehci_usb_phy_mode(struct udevice *dev)
        return 0;
 }
 
-static int ehci_usb_of_to_plat(struct udevice *dev)
-{
-       struct usb_plat *plat = dev_get_plat(dev);
-       enum usb_dr_mode dr_mode;
-
-       dr_mode = usb_get_dr_mode(dev_ofnode(dev));
-
-       switch (dr_mode) {
-       case USB_DR_MODE_HOST:
-               plat->init_type = USB_INIT_HOST;
-               break;
-       case USB_DR_MODE_PERIPHERAL:
-               plat->init_type = USB_INIT_DEVICE;
-               break;
-       case USB_DR_MODE_OTG:
-       case USB_DR_MODE_UNKNOWN:
-               return ehci_usb_phy_mode(dev);
-       };
-
-       return 0;
-}
-
 static int mx6_parse_dt_addrs(struct udevice *dev)
 {
 #if !defined(CONFIG_PHY)
@@ -622,7 +600,6 @@ static int ehci_usb_probe(struct udevice *dev)
        struct usb_plat *plat = dev_get_plat(dev);
        struct usb_ehci *ehci = dev_read_addr_ptr(dev);
        struct ehci_mx6_priv_data *priv = dev_get_priv(dev);
-       enum usb_init_type type = plat->init_type;
        struct ehci_hccr *hccr;
        struct ehci_hcor *hcor;
        int ret;
@@ -640,7 +617,6 @@ static int ehci_usb_probe(struct udevice *dev)
                return ret;
 
        priv->ehci = ehci;
-       priv->init_type = type;
 
 #if CONFIG_IS_ENABLED(CLK)
        ret = clk_get_by_index(dev, 0, &priv->clk);
@@ -656,6 +632,21 @@ static int ehci_usb_probe(struct udevice *dev)
        mdelay(1);
 #endif
 
+       switch (usb_get_dr_mode(dev_ofnode(dev))) {
+       case USB_DR_MODE_HOST:
+               plat->init_type = USB_INIT_HOST;
+               break;
+       case USB_DR_MODE_PERIPHERAL:
+               plat->init_type = USB_INIT_DEVICE;
+               break;
+       case USB_DR_MODE_OTG:
+       case USB_DR_MODE_UNKNOWN:
+               ret = ehci_usb_phy_mode(dev);
+               if (ret)
+                       return ret;
+       };
+       priv->init_type = plat->init_type;
+
 #if CONFIG_IS_ENABLED(DM_REGULATOR)
        ret = device_get_supply_regulator(dev, "vbus-supply",
                                          &priv->vbus_supply);
@@ -679,7 +670,7 @@ static int ehci_usb_probe(struct udevice *dev)
 #if CONFIG_IS_ENABLED(DM_REGULATOR)
        if (priv->vbus_supply) {
                ret = regulator_set_enable(priv->vbus_supply,
-                                          (type == USB_INIT_DEVICE) ?
+                                          (priv->init_type == USB_INIT_DEVICE) 
?
                                           false : true);
                if (ret && ret != -ENOSYS) {
                        printf("Error enabling VBUS supply (ret=%i)\n", ret);
@@ -764,7 +755,6 @@ U_BOOT_DRIVER(usb_mx6) = {
        .name   = "ehci_mx6",
        .id     = UCLASS_USB,
        .of_match = mx6_usb_ids,
-       .of_to_plat = ehci_usb_of_to_plat,
        .probe  = ehci_usb_probe,
        .remove = ehci_usb_remove,
        .ops    = &ehci_usb_ops,
-- 
2.25.1

Reply via email to