Usb5744 & usb2244 are Microchip based usbhub and usb-2.0 based SD
controller devices. Integrate these devices into dwc3 driver to bind and
probe the respective drivers to get detected by usb controller.

Signed-off-by: T Karthik Reddy <[email protected]>
Signed-off-by: Venkatesh Yadav Abbarapu <[email protected]>
---
 drivers/usb/dwc3/dwc3-generic.c | 67 ++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 18 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 6fb2de8a5a..a2eb2c8e24 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -430,29 +430,49 @@ static int dwc3_glue_bind_common(struct udevice *parent, 
ofnode node)
 
        debug("%s: subnode name: %s\n", __func__, name);
 
+       if (!ofnode_device_is_compatible(node, "snps,dwc3")) {
+               if (ofnode_device_is_compatible(node,
+                                               "microchip,usb5744"))
+                               driver = "usb5744";
+               else if (ofnode_device_is_compatible
+                       (node, "microchip,usb2244"))
+                               driver = "usb2244";
+
+                       ret = device_bind_driver_to_node(parent, driver, name,
+                                                        node, &dev);
+                       if (ret) {
+                               printf("Failed to bind: %s, err: %d\n",
+                                      driver, ret);
+                               return ret;
+                       }
+       }
+
        /* if the parent node doesn't have a mode check the leaf */
        dr_mode = usb_get_dr_mode(dev_ofnode(parent));
        if (!dr_mode)
                dr_mode = usb_get_dr_mode(node);
 
-       if (CONFIG_IS_ENABLED(DM_USB_GADGET) &&
-           (dr_mode == USB_DR_MODE_PERIPHERAL || dr_mode == USB_DR_MODE_OTG)) {
-               debug("%s: dr_mode: OTG or Peripheral\n", __func__);
-               driver = "dwc3-generic-peripheral";
-       } else if (CONFIG_IS_ENABLED(USB_HOST) && dr_mode == USB_DR_MODE_HOST) {
-               debug("%s: dr_mode: HOST\n", __func__);
-               driver = "dwc3-generic-host";
-       } else {
-               debug("%s: unsupported dr_mode %d\n", __func__, dr_mode);
-               return -ENODEV;
-       }
+       if (ofnode_device_is_compatible(node, "snps,dwc3")) {
+               if (CONFIG_IS_ENABLED(DM_USB_GADGET) &&
+                   (dr_mode == USB_DR_MODE_PERIPHERAL || dr_mode == 
USB_DR_MODE_OTG)) {
+                       debug("%s: dr_mode: OTG or Peripheral\n", __func__);
+                       driver = "dwc3-generic-peripheral";
+               } else if (CONFIG_IS_ENABLED(USB_HOST) && dr_mode == 
USB_DR_MODE_HOST) {
+                       debug("%s: dr_mode: HOST\n", __func__);
+                       driver = "dwc3-generic-host";
+               } else {
+                       debug("%s: unsupported dr_mode %d\n", __func__, 
dr_mode);
+                       return -ENODEV;
+               }
 
-       ret = device_bind_driver_to_node(parent, driver, name,
-                                        node, &dev);
-       if (ret) {
-               debug("%s: not able to bind usb device mode\n",
-                     __func__);
-               return ret;
+               ret = device_bind_driver_to_node(parent, driver, name,
+                                                node, &dev);
+
+               if (ret) {
+                       debug("%s: not able to bind usb device mode\n",
+                             __func__);
+                       return ret;
+               }
        }
 
        return 0;
@@ -479,7 +499,6 @@ int dwc3_glue_bind(struct udevice *parent)
                if (ret)
                        return ret;
        }
-
        return 0;
 }
 
@@ -530,6 +549,7 @@ int dwc3_glue_probe(struct udevice *dev)
        struct dwc3_glue_ops *ops = (struct dwc3_glue_ops 
*)dev_get_driver_data(dev);
        struct dwc3_glue_data *glue = dev_get_plat(dev);
        struct udevice *child = NULL;
+       ofnode node;
        int index = 0;
        int ret;
        struct phy phy;
@@ -560,6 +580,17 @@ int dwc3_glue_probe(struct udevice *dev)
                        return ret;
        }
 
+       ofnode_for_each_subnode(node, dev_ofnode(dev)) {
+               if (!ofnode_device_is_compatible(node, "snps,dwc3")) {
+                       ret = uclass_get_device_by_ofnode(UCLASS_MISC, node, 
&child);
+                       if (ret) {
+                               printf("could not get device %s, err = %d\n",
+                                      node.np->name, ret);
+                               return ret;
+                       }
+               }
+       }
+
        device_find_first_child(dev, &child);
        if (!child)
                return 0;
-- 
2.25.1

Reply via email to