From: Ye Li <ye...@nxp.com>

Since the i.MX8MM reuses the otg controllers on i.MX7D. We can use
CONFIG_USB_EHCI_MX7 for them.

Due the TCPC and load switch are used on Typec circuit. Add the
board_usb_init and board_usb_cleanup to ehci-mx6 DM driver. So
we can implement the TCPC settings in these board functions.

Signed-off-by: Ye Li <ye...@nxp.com>
Signed-off-by: Peng Fan <peng....@nxp.com>
---
 drivers/usb/host/Kconfig    |  2 +-
 drivers/usb/host/ehci-mx6.c | 33 +++++++++++++++++++++++++++------
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index f48547caa0..1e2c5006d4 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -147,7 +147,7 @@ config USB_EHCI_MX6
 
 config USB_EHCI_MX7
        bool "Support for i.MX7 on-chip EHCI USB controller"
-       depends on ARCH_MX7
+       depends on ARCH_MX7 || IMX8MM
        default y
        ---help---
          Enables support for the on-chip EHCI controller on i.MX7 SoCs.
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 0727aafc92..1db27949c6 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -277,7 +277,7 @@ struct usbnc_regs {
 };
 #endif
 
-#elif defined(CONFIG_MX7)
+#elif defined(CONFIG_USB_EHCI_MX7)
 struct usbnc_regs {
        u32 ctrl1;
        u32 ctrl2;
@@ -342,8 +342,8 @@ static void usb_oc_config(int index)
        struct usbnc_regs *usbnc = (struct usbnc_regs 
*)(uintptr_t)(USB_BASE_ADDR +
                        USB_OTHERREGS_OFFSET);
        void __iomem *ctrl = (void __iomem *)(&usbnc->ctrl[index]);
-#elif defined(CONFIG_MX7) || defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8)
-       struct usbnc_regs *usbnc = (struct usbnc_regs 
*)(uintptr_t)(USB_BASE_ADDR +
+#elif defined(CONFIG_USB_EHCI_MX7) || defined(CONFIG_MX7ULP) || 
defined(CONFIG_IMX8)
+       struct usbnc_regs *usbnc = (struct usbnc_regs *)(ulong)(USB_BASE_ADDR +
                        (0x10000 * index) + USBNC_OFFSET);
        void __iomem *ctrl = (void __iomem *)(&usbnc->ctrl1);
 #endif
@@ -445,7 +445,7 @@ int ehci_hcd_init(int index, enum usb_init_type init,
        enum usb_init_type type;
 #if defined(CONFIG_MX6)
        u32 controller_spacing = 0x200;
-#elif defined(CONFIG_MX7) || defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8)
+#elif defined(CONFIG_USB_EHCI_MX7) || defined(CONFIG_MX7ULP) || 
defined(CONFIG_IMX8)
        u32 controller_spacing = 0x10000;
 #endif
        struct usb_ehci *ehci = (struct usb_ehci *)(uintptr_t)(USB_BASE_ADDR +
@@ -513,6 +513,12 @@ static int mx6_init_after_reset(struct ehci_ctrl *dev)
        struct usb_ehci *ehci = priv->ehci;
        int ret;
 
+       ret = board_usb_init(priv->portnr, priv->init_type);
+       if (ret) {
+               printf("Failed to initialize board for USB\n");
+               return ret;
+       }
+
        ret = ehci_mx6_common_init(priv->ehci, priv->portnr);
        if (ret)
                return ret;
@@ -592,7 +598,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()) {
                phy_status = (void __iomem *)(addr +
                                              USBNC_PHY_STATUS_OFFSET);
                val = readl(phy_status);
@@ -689,6 +695,12 @@ static int ehci_usb_probe(struct udevice *dev)
        priv->portnr = dev->seq;
        priv->init_type = type;
 
+       ret = board_usb_init(priv->portnr, priv->init_type);
+       if (ret) {
+               printf("Failed to initialize board for USB\n");
+               return ret;
+       }
+
 #if CONFIG_IS_ENABLED(DM_REGULATOR)
        ret = device_get_supply_regulator(dev, "vbus-supply",
                                          &priv->vbus_supply);
@@ -726,6 +738,15 @@ static int ehci_usb_probe(struct udevice *dev)
        return ehci_register(dev, hccr, hcor, &mx6_ehci_ops, 0, 
priv->init_type);
 }
 
+int ehci_usb_remove(struct udevice *dev)
+{
+       struct ehci_mx6_priv_data *priv = dev_get_priv(dev);
+
+       ehci_deregister(dev);
+
+       return board_usb_cleanup(dev->seq, priv->init_type);
+}
+
 static const struct udevice_id mx6_usb_ids[] = {
        { .compatible = "fsl,imx27-usb" },
        { }
@@ -738,7 +759,7 @@ U_BOOT_DRIVER(usb_mx6) = {
        .ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
        .bind   = ehci_usb_bind,
        .probe  = ehci_usb_probe,
-       .remove = ehci_deregister,
+       .remove = ehci_usb_remove,
        .ops    = &ehci_usb_ops,
        .platdata_auto_alloc_size = sizeof(struct usb_platdata),
        .priv_auto_alloc_size = sizeof(struct ehci_mx6_priv_data),
-- 
2.28.0

Reply via email to