From: Johannes Kirchmair <johannes.kirchm...@skidata.com>

Some onboard-hub chips have external reset pins. This patch adds
handling of said pin to the onboard-hub driver. The naming for the
devicetree binding is done in the same way as in the Linux kernel to
ensure good compatibility between u-boot's and Linux's devicetrees.

Signed-off-by: Johannes Kirchmair <johannes.kirchm...@skidata.com>
---
 common/usb_onboard_hub.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c
index 68a04ac041..5b1bb79c55 100644
--- a/common/usb_onboard_hub.c
+++ b/common/usb_onboard_hub.c
@@ -10,9 +10,11 @@
 #include <dm.h>
 #include <dm/device_compat.h>
 #include <power/regulator.h>
+#include <asm/gpio.h>
 
 struct onboard_hub {
        struct udevice *vdd;
+       struct gpio_desc reset_pin;
 };
 
 static int usb_onboard_hub_probe(struct udevice *dev)
@@ -27,8 +29,23 @@ static int usb_onboard_hub_probe(struct udevice *dev)
        }
 
        ret = regulator_set_enable_if_allowed(hub->vdd, true);
-       if (ret)
+       if (ret) {
                dev_err(dev, "can't enable vdd-supply: %d\n", ret);
+               return ret;
+       }
+
+       ret = gpio_request_by_name(dev, "reset-gpios", 0, &hub->reset_pin,
+                                  GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
+       if (ret && ret != -ENOENT) {
+               dev_err(dev, "can't get reset-gpios 0: %d\n", ret);
+               return ret;
+       }
+
+       if (hub->reset_pin.dev) {
+               ret = dm_gpio_set_value(&hub->reset_pin, 0);
+               if (ret)
+                       dev_err(dev, "failed setting reset-gpios to 0: %d\n", 
ret);
+       }
 
        return ret;
 }
@@ -42,12 +59,25 @@ static int usb_onboard_hub_remove(struct udevice *dev)
        if (ret)
                dev_err(dev, "can't disable vdd-supply: %d\n", ret);
 
+       if (hub->reset_pin.dev) {
+               ret = dm_gpio_set_value(&hub->reset_pin, 1);
+               if (ret)
+                       dev_err(dev, "failed setting reset-gpios to 0: %d\n", 
ret);
+       }
+
+       if (hub->reset_pin.dev) {
+               ret = dm_gpio_free(dev, &hub->reset_pin);
+               if (ret)
+                       dev_err(dev, "can't free reset-gpios: %d\n", ret);
+       }
+
        return ret;
 }
 
 static const struct udevice_id usb_onboard_hub_ids[] = {
        /* Use generic usbVID,PID dt-bindings (usb-device.yaml) */
        { .compatible = "usb424,2514" }, /* USB2514B USB 2.0 */
+       { .compatible = "usb4b4,6504" },
        { }
 };
 
-- 
2.34.1

Reply via email to