On 2/3/22 22:20, Adam Ford wrote:
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.

The solution isn't just adding checks for imx8mm and imx8mn to
the check for imx7, because the USB clock needs to be running
to read from the USBNC_PHY_STATUS_OFFSET register or it will hang.

Marek requested that I not enable the clocks in ehci_usb_of_to_plat,
so I modified that function to return an unknown state if the
device tree does not explicitly state whether it is a host
or a peripheral.

When the driver probes, it looks to see if it's in the unknown
state, and only then will it read the register to auto-detect.

Signed-off-by: Adam Ford <aford...@gmail.com>
Tested-by: Tim Harvey <thar...@gateworks.com>
---
V4:  Fix 'err_clk' reference, so it is not encapsulated in
      an ifdef making it available at all times.
V3:  Keep ehci_usb_of_to_plat but add the ability to return
      and unknown state instead of reading the register.
      If the probe determines the states is unknown, it will
      query the register after the clocks have been enabled.
      Because of the slight behavior change, I removed any
      review or tested tags.

V2:  Rename ehci_usb_of_to_plat to ehci_usb_dr_mode and call it
      from the probe after t

diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 1bd6147c76..060b02accc 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);

Is the USB GPCv2 power domain always ON at this point ? If it isn't, then this access will lock up the whole SoC.

You can check that easily by adding printf() into drivers/power/domain/imx8m-power-domain.c imx8m_power_domain_on() , and verify that printf() prints something before this ehci_usb_phy_mode() code is called.

Reply via email to