Hi Lukasz,

On 6/10/25 10:02 AM, Lukasz Czechowski wrote:
Some of the onboard hubs require multiple power supplies, so extend
the driver to support them.
The implementation is inspired by the kernel driver, as introduced
by commit [1] in the v6.10 kernel.

[1] 
https://github.com/torvalds/linux/commit/ec1848cd5df426f57a7f6a8a6b95b69259c52cfc
Signed-off-by: Lukasz Czechowski <lukasz.czechow...@thaumatec.com>
---
  common/usb_onboard_hub.c | 67 ++++++++++++++++++++++++++++++++++++------------
  1 file changed, 50 insertions(+), 17 deletions(-)

diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c
index 046831d09668..273b626dbaee 100644
--- a/common/usb_onboard_hub.c
+++ b/common/usb_onboard_hub.c
@@ -20,14 +20,18 @@
  #define USB5744_CONFIG_REG_ACCESS     0x0037
  #define USB5744_CONFIG_REG_ACCESS_LSB 0x99
+#define MAX_SUPPLIES 2
+
  struct onboard_hub {
-       struct udevice *vdd;
+       struct udevice *vdd[MAX_SUPPLIES];
        struct gpio_desc *reset_gpio;
  };
struct onboard_hub_data {
        unsigned long reset_us;
        unsigned long power_on_delay_us;
+       unsigned int num_supplies;
+       const char * const supply_names[MAX_SUPPLIES];
        int (*init)(struct udevice *dev);
  };
@@ -139,30 +143,58 @@ int usb_onboard_hub_reset(struct udevice *dev)
        return 0;
  }
+static int usb_onboard_hub_power_off(struct udevice *dev)
+{
+       struct onboard_hub_data *data =
+               (struct onboard_hub_data *)dev_get_driver_data(dev);
+       struct onboard_hub *hub = dev_get_priv(dev);
+       int ret = 0, ret2;
+       int i;

Could be on the same line with ret and ret2.

I assume this was maybe due to using an unsigned int in the beginning but then the descending for-loop just below would never return because "i" would never be less than 0?

An option could be to have i represent the index + 1 and then whenever you use i to access an item in the array, you use i-1 instead.

So something like

for (i = data->num_supplies; i > 0; i--) {
    if (hub->vdd[i - 1]) {
        ret2 = regulator_set_enable_if_allowed(hub->vdd[i - 1], false);
        if (ret2 && ret2 != -ENOSYS) {
dev_err(dev, "can't disable %s: %d\n", data->supply_names[i - 1], ret2);
            ret |= ret2;
        }
    }
}

instead maybe? No strong opinion on my side on that. We could probably even go for an u8 instead since it's very unlikely we'll have more than 255 supplies for a given hub :)

+
+       for (i = data->num_supplies - 1; i >= 0; i--)
+               if (hub->vdd[i]) {
+                       ret2 = regulator_set_enable_if_allowed(hub->vdd[i], 
false);
+                       if (ret2 && ret2 != -ENOSYS) {
+                               dev_err(dev, "can't disable %s: %d\n", 
data->supply_names[i], ret2);
+                               ret |= ret2;
+                       }
+               }
+

Please have the for-loop have curly brackets.

Aside from those minor nitpicks, looks good to me so:

Reviewed-by: Quentin Schulz <quentin.sch...@cherry.de>

Thanks!
Quentin

Reply via email to