[PATCH 1/3] usb: ehci-mx6: move mode set/detect to probe
Tim Harvey
tharvey at gateworks.com
Tue Apr 27 19:08:55 CEST 2021
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 <tharvey at gateworks.com>
---
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 06be9deaaa..c2dfe49012 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)
@@ -623,7 +601,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;
@@ -641,7 +618,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);
@@ -657,6 +633,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);
@@ -680,7 +671,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.17.1
More information about the U-Boot
mailing list