Currently the check in usb_onboard_hub_bind is relying on specific
compatible string for the Michrochip USB5744. Replace this with
more generic approach that will allow to add new types of devices
to the of_match table. Because the driver only needs to bind one
"half" of the hub, the peer-hub node is used to find out if it
was already done. In case peer-hub was bound, -ENODEV is returned.

Signed-off-by: Lukasz Czechowski <lukasz.czechow...@thaumatec.com>
---
 common/usb_onboard_hub.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c
index 7fe62b043e6a..9f8c1a304cdf 100644
--- a/common/usb_onboard_hub.c
+++ b/common/usb_onboard_hub.c
@@ -9,6 +9,7 @@
 
 #include <asm/gpio.h>
 #include <dm.h>
+#include <dm/device.h>
 #include <dm/device_compat.h>
 #include <i2c.h>
 #include <linux/delay.h>
@@ -179,8 +180,8 @@ err:
 static int usb_onboard_hub_bind(struct udevice *dev)
 {
        struct ofnode_phandle_args phandle;
-       const void *fdt = gd->fdt_blob;
-       int ret, off;
+       struct udevice *peerdev;
+       int ret;
 
        ret = dev_read_phandle_with_args(dev, "peer-hub", NULL, 0, 0, &phandle);
        if (ret == -ENOENT) {
@@ -193,10 +194,14 @@ static int usb_onboard_hub_bind(struct udevice *dev)
                return ret;
        }
 
-       off = ofnode_to_offset(phandle.node);
-       ret = fdt_node_check_compatible(fdt, off, "usb424,5744");
-       if (!ret)
+       ret = device_find_global_by_ofnode(phandle.node, &peerdev);
+       if (ret) {
+               dev_dbg(dev, "binding before peer-hub %s\n",
+                       ofnode_get_name(phandle.node));
                return 0;
+       }
+
+       dev_dbg(dev, "peer-hub %s has been bound\n", peerdev->name);
 
        return -ENODEV;
 }

-- 
2.43.0

Reply via email to