[PATCH 0/7] Add the USB5744 hub driver as per new DT binding

Add the usb5744/usb2744 hub driver which does the reset gpio toggling and the i2c initialization sequence.
Tested the USB5744/USB2744 usb hub for usb0, usb1 with the DT nodes on KR260 board.
Venkatesh Yadav Abbarapu (7): usb: onboard-hub: Add reset-gpio support usb: onboard-hub: Fix the return values of regulator APIs usb: onboard-hub: add support for Microchip USB5744 usb: onboard-hub: Add i2c initialization for usb5744 hub usb: onboard-hub: Bail out if peer hub is already probed configs: zynqmp_kria: Enable the USB onboard hub arm64: zynqmp: Update the usb5744 hub node as per binding
arch/arm/dts/zynqmp-sck-kr-g-revA.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kr-g-revB.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kv-g-revA.dtso | 18 +++ arch/arm/dts/zynqmp-sck-kv-g-revB.dtso | 25 +++- common/usb_onboard_hub.c | 176 +++++++++++++++++++++++-- configs/xilinx_zynqmp_kria_defconfig | 1 + 6 files changed, 304 insertions(+), 12 deletions(-)

As part of the reset, sets the direction of the pin to output before toggling the pin. Delay of millisecond is added in between low and high to meet the setup and hold time requirement of the reset.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- common/usb_onboard_hub.c | 44 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 89e18a2ddad..2f6fb71935d 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -7,17 +7,26 @@ * Mostly inspired by Linux kernel v6.1 onboard_usb_hub driver */
+#include <asm/gpio.h> #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <linux/delay.h> #include <power/regulator.h>
struct onboard_hub { struct udevice *vdd; + struct gpio_desc *reset_gpio; +}; + +struct onboard_hub_data { + unsigned long reset_us; };
static int usb_onboard_hub_probe(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;
@@ -31,7 +40,24 @@ static int usb_onboard_hub_probe(struct udevice *dev) if (ret) dev_err(dev, "can't enable vdd-supply: %d\n", ret);
- return ret; + hub->reset_gpio = devm_gpiod_get_optional(dev, "reset", + GPIOD_IS_OUT | GPIOD_ACTIVE_LOW); + /* property is optional, don't return error! */ + if (hub->reset_gpio) { + ret = dm_gpio_set_value(hub->reset_gpio, 1); + if (ret) + return ret; + + udelay(data->reset_us); + + ret = dm_gpio_set_value(hub->reset_gpio, 0); + if (ret) + return ret; + + udelay(data->reset_us); + } + + return 0; }
static int usb_onboard_hub_remove(struct udevice *dev) @@ -39,6 +65,12 @@ static int usb_onboard_hub_remove(struct udevice *dev) struct onboard_hub *hub = dev_get_priv(dev); int ret;
+ if (hub->reset_gpio) { + struct gpio_desc *hub_reset_gpio = hub->reset_gpio; + + dm_gpio_free(hub_reset_gpio->dev, hub_reset_gpio); + } + ret = regulator_set_enable_if_allowed(hub->vdd, false); if (ret) dev_err(dev, "can't disable vdd-supply: %d\n", ret); @@ -46,10 +78,16 @@ static int usb_onboard_hub_remove(struct udevice *dev) return ret; }
+static const struct onboard_hub_data usb2514_data = { + /* TBD */ +}; + 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 = "usb424,2514", /* USB2514B USB 2.0 */ + .data = (ulong)&usb2514_data, + } };
U_BOOT_DRIVER(usb_onboard_hub) = {

On 6/5/24 12:02 PM, Venkatesh Yadav Abbarapu wrote:
As part of the reset, sets the direction of the pin to output before toggling the pin. Delay of millisecond is added in between low and high to meet the setup and hold time requirement of the reset.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
common/usb_onboard_hub.c | 44 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 89e18a2ddad..2f6fb71935d 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -7,17 +7,26 @@
- Mostly inspired by Linux kernel v6.1 onboard_usb_hub driver
*/
+#include <asm/gpio.h> #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <linux/delay.h> #include <power/regulator.h>
struct onboard_hub { struct udevice *vdd;
- struct gpio_desc *reset_gpio;
+};
+struct onboard_hub_data {
unsigned long reset_us; };
static int usb_onboard_hub_probe(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;
@@ -31,7 +40,24 @@ static int usb_onboard_hub_probe(struct udevice *dev) if (ret) dev_err(dev, "can't enable vdd-supply: %d\n", ret);
- return ret;
- hub->reset_gpio = devm_gpiod_get_optional(dev, "reset",
GPIOD_IS_OUT | GPIOD_ACTIVE_LOW);
- /* property is optional, don't return error! */
- if (hub->reset_gpio) {
ret = dm_gpio_set_value(hub->reset_gpio, 1);
if (ret)
return ret;
udelay(data->reset_us);
Where is this assigned ?
ret = dm_gpio_set_value(hub->reset_gpio, 0);
if (ret)
return ret;
udelay(data->reset_us);
- }
Is the reset asserted time and post-reset time identical for all USB HUBs ? I don't think it is.
return 0; }
static int usb_onboard_hub_remove(struct udevice *dev)
@@ -39,6 +65,12 @@ static int usb_onboard_hub_remove(struct udevice *dev) struct onboard_hub *hub = dev_get_priv(dev); int ret;
- if (hub->reset_gpio) {
struct gpio_desc *hub_reset_gpio = hub->reset_gpio;
dm_gpio_free(hub_reset_gpio->dev, hub_reset_gpio);
- }
- ret = regulator_set_enable_if_allowed(hub->vdd, false); if (ret) dev_err(dev, "can't disable vdd-supply: %d\n", ret);
@@ -46,10 +78,16 @@ static int usb_onboard_hub_remove(struct udevice *dev) return ret; }
+static const struct onboard_hub_data usb2514_data = {
- /* TBD */
Do not add this if not used.

Use the regulator API's only if the config DM_REGULATOR is enabled. Don't error out if there is no vdd regulator supply, as these are optional properties.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- common/usb_onboard_hub.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 2f6fb71935d..0cfaa90fce3 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -30,16 +30,22 @@ static int usb_onboard_hub_probe(struct udevice *dev) struct onboard_hub *hub = dev_get_priv(dev); int ret;
- ret = device_get_supply_regulator(dev, "vdd-supply", &hub->vdd); - if (ret) { - dev_err(dev, "can't get vdd-supply: %d\n", ret); - return ret; + if (CONFIG_IS_ENABLED(DM_REGULATOR)) { + ret = device_get_supply_regulator(dev, "vdd-supply", + &hub->vdd); + if (ret && ret != -ENOENT) { + dev_err(dev, "Failed to get VDD regulator: %d\n", ret); + return ret; + } + if (hub->vdd) { + ret = regulator_set_enable_if_allowed(hub->vdd, true); + if (ret && ret != -ENOSYS) { + dev_err(dev, "Failed to enable VDD regulator: %d\n", ret); + return ret; + } + } }
- ret = regulator_set_enable_if_allowed(hub->vdd, true); - if (ret) - dev_err(dev, "can't enable vdd-supply: %d\n", ret); - hub->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_IS_OUT | GPIOD_ACTIVE_LOW); /* property is optional, don't return error! */

On 6/5/24 12:02 PM, Venkatesh Yadav Abbarapu wrote:
Use the regulator API's only if the config DM_REGULATOR is enabled. Don't error out if there is no vdd regulator supply, as these are optional properties.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
common/usb_onboard_hub.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 2f6fb71935d..0cfaa90fce3 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -30,16 +30,22 @@ static int usb_onboard_hub_probe(struct udevice *dev) struct onboard_hub *hub = dev_get_priv(dev); int ret;
- ret = device_get_supply_regulator(dev, "vdd-supply", &hub->vdd);
- if (ret) {
dev_err(dev, "can't get vdd-supply: %d\n", ret);
return ret;
Handle -ENOSYS (regulator support not available) return value here and you wouldn't need all the ifdeffery.

Add support for the Microchip USB5744 USB3.0 and USB2.0 Hub. The usb5744 driver trigger hub reset signal after soft reset. The usb5744 hub need to reset after the phy initialization, which toggles the gpio.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- common/usb_onboard_hub.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 0cfaa90fce3..50870285995 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -88,11 +88,21 @@ static const struct onboard_hub_data usb2514_data = { /* TBD */ };
+static const struct onboard_hub_data usb5744_data = { + .reset_us = 10000, +}; + 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 */ .data = (ulong)&usb2514_data, + }, { + .compatible = "usb424,5744", /* USB5744 USB 3.0 */ + .data = (ulong)&usb5744_data, + }, { + .compatible = "usb424,2744", /* USB2744 USB 2.0 */ + .data = (ulong)&usb5744_data, } };

On 6/5/24 12:02 PM, Venkatesh Yadav Abbarapu wrote:
Add support for the Microchip USB5744 USB3.0 and USB2.0 Hub. The usb5744 driver trigger hub reset signal after soft reset. The usb5744 hub need to reset after the phy initialization, which toggles the gpio.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
common/usb_onboard_hub.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 0cfaa90fce3..50870285995 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -88,11 +88,21 @@ static const struct onboard_hub_data usb2514_data = { /* TBD */ };
+static const struct onboard_hub_data usb5744_data = {
- .reset_us = 10000,
+};
- 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 */ .data = (ulong)&usb2514_data,
- }, {
.compatible = "usb424,5744", /* USB5744 USB 3.0 */
.data = (ulong)&usb5744_data,
- }, {
.compatible = "usb424,2744", /* USB2744 USB 2.0 */
}.data = (ulong)&usb5744_data,
Keep the list sorted.

Add i2c initialization hook and set usb5744 platform data with function having required i2c initialization sequence.
Apart from the USB command attach, prevent the hub from suspend. when the “USB Attach with SMBUS (0xAA56)” command is issued to the hub, the hub is getting enumerated and then it puts in a suspend mode. This causes the hub to NAK any SMBUS access made by the SMBUS Master during this period and not able to see the hub's slave address while running the "i2c probe" command.
Prevent the MCU from the putting the HUB in suspend mode through register write. The BYPASS_UDC_SUSPEND bit (Bit 3) of the RuntimeFlags2 register at address 0x411D controls this aspect of the hub. The BYPASS_UDC_SUSPEND bit in register 0x411Dh must be set to ensure that the MCU is always enabled and ready to respond to SMBus runtime commands. This register needs to be written before the USB attach command is issued. The byte sequence is as follows: Slave addr: 0x2d 00 00 05 00 01 41 1D 08 Slave addr: 0x2d 99 37 00 Slave addr: 0x2d AA 56 00
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- common/usb_onboard_hub.c | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 50870285995..09ce452af1b 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -11,9 +11,15 @@ #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <i2c.h> #include <linux/delay.h> #include <power/regulator.h>
+#define USB5744_COMMAND_ATTACH 0x0056 +#define USB5744_COMMAND_ATTACH_LSB 0xAA +#define USB5744_CONFIG_REG_ACCESS 0x0037 +#define USB5744_CONFIG_REG_ACCESS_LSB 0x99 + struct onboard_hub { struct udevice *vdd; struct gpio_desc *reset_gpio; @@ -21,8 +27,80 @@ struct onboard_hub {
struct onboard_hub_data { unsigned long reset_us; + int (*onboard_dev_i2c_init)(struct udevice *dev); };
+static int usb5744_i2c_init(struct udevice *dev) +{ + /* + * Prevent the MCU from the putting the HUB in suspend mode through register write. + * The BYPASS_UDC_SUSPEND bit (Bit 3) of the RuntimeFlags2 register at address + * 0x411D controls this aspect of the hub. + * Format to write to hub registers via SMBus- 2D 00 00 05 00 01 41 1D 08 + * Byte 0: Address of slave 2D + * Byte 1: Memory address 00 + * Byte 2: Memory address 00 + * Byte 3: Number of bytes to write to memory + * Byte 4: Write configuration register (00) + * Byte 5: Write the number of data bytes (01- 1 data byte) + * Byte 6: LSB of register address 0x41 + * Byte 7: MSB of register address 0x1D + * Byte 8: value to be written to the register + */ + char data_buf[8] = {0x0, 0x5, 0x0, 0x1, 0x41, 0x1D, 0x08}; + int ret, slave_addr; + u32 buf = USB5744_COMMAND_ATTACH; + u32 config_reg_access_buf = USB5744_CONFIG_REG_ACCESS; + struct dm_i2c_chip *i2c_chip; + struct ofnode_phandle_args phandle; + struct udevice *i2c_bus = NULL, *i2c_dev; + + if (!dev_read_phandle_with_args(dev, "i2c-bus", NULL, 0, 0, &phandle)) { + ret = device_get_global_by_ofnode(ofnode_get_parent(phandle.node), &i2c_bus); + if (ret) { + dev_err(dev, "Failed to get i2c node, err: %d\n", ret); + return ret; + } + ret = ofnode_read_u32(phandle.node, "reg", &slave_addr); + if (ret) + return ret; + + ret = i2c_get_chip(i2c_bus, slave_addr, 1, &i2c_dev); + if (ret) { + debug("%s: can't find i2c chip device for addr %x\n", __func__, + slave_addr); + return ret; + } + + i2c_chip = dev_get_parent_plat(i2c_dev); + if (i2c_chip) { + i2c_chip->flags &= ~DM_I2C_CHIP_WR_ADDRESS; + /* SMBus write command */ + ret = dm_i2c_write(i2c_dev, 0, (uint8_t *)&data_buf, 8); + if (ret) { + dev_err(dev, "data_buf i2c_write failed, err:%d\n", ret); + return ret; + } + + /* Configuration register access command */ + ret = dm_i2c_write(i2c_dev, USB5744_CONFIG_REG_ACCESS_LSB, + (uint8_t *)&config_reg_access_buf, 2); + if (ret) { + dev_err(dev, "config_reg_access i2c_write failed, err: %d\n", ret); + return ret; + } + + /* USB Attach with SMBus */ + ret = dm_i2c_write(i2c_dev, USB5744_COMMAND_ATTACH_LSB, (uint8_t *)&buf, 2); + if (ret) { + dev_err(dev, "usb_attach i2c_write failed, err: %d\n", ret); + return ret; + } + } + } + return 0; +} + static int usb_onboard_hub_probe(struct udevice *dev) { struct onboard_hub_data *data = @@ -63,6 +141,13 @@ static int usb_onboard_hub_probe(struct udevice *dev) udelay(data->reset_us); }
+ if (data->onboard_dev_i2c_init) { + ret = data->onboard_dev_i2c_init(dev); + if (ret) { + dev_err(dev, "onboard i2c init failed: %d\n", ret); + return ret; + } + } return 0; }
@@ -90,6 +175,7 @@ static const struct onboard_hub_data usb2514_data = {
static const struct onboard_hub_data usb5744_data = { .reset_us = 10000, + .onboard_dev_i2c_init = usb5744_i2c_init, };
static const struct udevice_id usb_onboard_hub_ids[] = {

On 6/5/24 12:02 PM, Venkatesh Yadav Abbarapu wrote:
Add i2c initialization hook and set usb5744 platform data with function having required i2c initialization sequence.
Apart from the USB command attach, prevent the hub from suspend. when the “USB Attach with SMBUS (0xAA56)” command is issued to the hub, the hub is getting enumerated and then it puts in a suspend mode. This causes the hub to NAK any SMBUS access made by the SMBUS Master during this period and not able to see the hub's slave address while running the "i2c probe" command.
Prevent the MCU from the putting the HUB in suspend mode through register write. The BYPASS_UDC_SUSPEND bit (Bit 3) of the RuntimeFlags2 register at address 0x411D controls this aspect of the hub. The BYPASS_UDC_SUSPEND bit in register 0x411Dh must be set to ensure that the MCU is always enabled and ready to respond to SMBus runtime commands. This register needs to be written before the USB attach command is issued. The byte sequence is as follows: Slave addr: 0x2d 00 00 05 00 01 41 1D 08 Slave addr: 0x2d 99 37 00 Slave addr: 0x2d AA 56 00
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
common/usb_onboard_hub.c | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 50870285995..09ce452af1b 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -11,9 +11,15 @@ #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <i2c.h> #include <linux/delay.h> #include <power/regulator.h>
+#define USB5744_COMMAND_ATTACH 0x0056 +#define USB5744_COMMAND_ATTACH_LSB 0xAA +#define USB5744_CONFIG_REG_ACCESS 0x0037 +#define USB5744_CONFIG_REG_ACCESS_LSB 0x99
- struct onboard_hub { struct udevice *vdd; struct gpio_desc *reset_gpio;
@@ -21,8 +27,80 @@ struct onboard_hub {
struct onboard_hub_data { unsigned long reset_us;
- int (*onboard_dev_i2c_init)(struct udevice *dev);
Why not call it simply "init" ?
};
+static int usb5744_i2c_init(struct udevice *dev) +{
- /*
* Prevent the MCU from the putting the HUB in suspend mode through register write.
* The BYPASS_UDC_SUSPEND bit (Bit 3) of the RuntimeFlags2 register at address
* 0x411D controls this aspect of the hub.
* Format to write to hub registers via SMBus- 2D 00 00 05 00 01 41 1D 08
* Byte 0: Address of slave 2D
* Byte 1: Memory address 00
* Byte 2: Memory address 00
* Byte 3: Number of bytes to write to memory
* Byte 4: Write configuration register (00)
* Byte 5: Write the number of data bytes (01- 1 data byte)
* Byte 6: LSB of register address 0x41
* Byte 7: MSB of register address 0x1D
* Byte 8: value to be written to the register
*/
- char data_buf[8] = {0x0, 0x5, 0x0, 0x1, 0x41, 0x1D, 0x08};
This should be u8 [] , not an array of signed chars.
- int ret, slave_addr;
- u32 buf = USB5744_COMMAND_ATTACH;
- u32 config_reg_access_buf = USB5744_CONFIG_REG_ACCESS;
This should be u8 [] , right ?
- struct dm_i2c_chip *i2c_chip;
- struct ofnode_phandle_args phandle;
- struct udevice *i2c_bus = NULL, *i2c_dev;
Make sure this list of variables is ordered as reverse xmas tree if possible.
- if (!dev_read_phandle_with_args(dev, "i2c-bus", NULL, 0, 0, &phandle)) {
Invert the condition and return early to reduce indent, i.e.
if (dev...) return 0;
ret = device_get_global_by_ofnode(ofnode_get_parent(phandle.node), &i2c_bus);
if (ret) {
dev_err(dev, "Failed to get i2c node, err: %d\n", ret);
return ret;
}
ret = ofnode_read_u32(phandle.node, "reg", &slave_addr);
if (ret)
return ret;
ret = i2c_get_chip(i2c_bus, slave_addr, 1, &i2c_dev);
if (ret) {
debug("%s: can't find i2c chip device for addr %x\n", __func__,
dev_dbg(dev, ...)
slave_addr);
return ret;
}
i2c_chip = dev_get_parent_plat(i2c_dev);
if (i2c_chip) {
if (!i2c_chip) return ...
i2c_chip->flags &= ~DM_I2C_CHIP_WR_ADDRESS;
/* SMBus write command */
ret = dm_i2c_write(i2c_dev, 0, (uint8_t *)&data_buf, 8);
if (ret) {
dev_err(dev, "data_buf i2c_write failed, err:%d\n", ret);
return ret;
}
/* Configuration register access command */
ret = dm_i2c_write(i2c_dev, USB5744_CONFIG_REG_ACCESS_LSB,
(uint8_t *)&config_reg_access_buf, 2);
if (ret) {
dev_err(dev, "config_reg_access i2c_write failed, err: %d\n", ret);
return ret;
}
/* USB Attach with SMBus */
ret = dm_i2c_write(i2c_dev, USB5744_COMMAND_ATTACH_LSB, (uint8_t *)&buf, 2);
if (ret) {
dev_err(dev, "usb_attach i2c_write failed, err: %d\n", ret);
return ret;
}
}
- }
- return 0;
+}
- static int usb_onboard_hub_probe(struct udevice *dev) { struct onboard_hub_data *data =
@@ -63,6 +141,13 @@ static int usb_onboard_hub_probe(struct udevice *dev) udelay(data->reset_us); }
- if (data->onboard_dev_i2c_init) {
ret = data->onboard_dev_i2c_init(dev);
if (ret) {
dev_err(dev, "onboard i2c init failed: %d\n", ret);
return ret;
This should implement some sort of 'goto err' failpath and put the hub back into reset, since the hub was brought out of reset right above here.

Many physical hub chips include multiple logical hubs to handle both USB and 2 and 3. Both logical hubs will then match the onboard hub driver, which means it will end up with two driver instances trying to control the reset GPIO that is only present once on the physical chip.
The reference for this change is taken from https://lore.barebox.org/barebox/20240327165554.894805-1-l.stach@pengutronix...
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- common/usb_onboard_hub.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 09ce452af1b..519bad337e1 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -11,6 +11,7 @@ #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <dm/uclass-internal.h> #include <i2c.h> #include <linux/delay.h> #include <power/regulator.h> @@ -21,7 +22,7 @@ #define USB5744_CONFIG_REG_ACCESS_LSB 0x99
struct onboard_hub { - struct udevice *vdd; + struct udevice *vdd, *dev; struct gpio_desc *reset_gpio; };
@@ -106,8 +107,18 @@ static int usb_onboard_hub_probe(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); + struct ofnode_phandle_args phandle; + struct udevice *hub_dev; int ret;
+ if (!dev_read_phandle_with_args(dev, "peer-hub", NULL, 0, 0, &phandle)) { + if (ofnode_valid(phandle.node)) { + ret = uclass_find_device_by_ofnode(UCLASS_USB_HUB, phandle.node, &hub_dev); + if (hub_dev && hub_dev->priv_) + return 0; + } + } + if (CONFIG_IS_ENABLED(DM_REGULATOR)) { ret = device_get_supply_regulator(dev, "vdd-supply", &hub->vdd); @@ -148,6 +159,9 @@ static int usb_onboard_hub_probe(struct udevice *dev) return ret; } } + hub->dev = dev; + dev->priv_ = hub; + return 0; }

On 6/5/24 12:02 PM, Venkatesh Yadav Abbarapu wrote:
Many physical hub chips include multiple logical hubs to handle both USB and
Remove the 'and' here.
2 and 3
USB 2.0 and USB 3.0 .
. Both logical hubs will then match the onboard hub driver, which means it will end up with two driver instances trying to control the reset GPIO that is only present once on the physical chip.
The reference for this change is taken from https://lore.barebox.org/barebox/20240327165554.894805-1-l.stach@pengutronix...
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
common/usb_onboard_hub.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/common/usb_onboard_hub.c b/common/usb_onboard_hub.c index 09ce452af1b..519bad337e1 100644 --- a/common/usb_onboard_hub.c +++ b/common/usb_onboard_hub.c @@ -11,6 +11,7 @@ #include <common.h> #include <dm.h> #include <dm/device_compat.h> +#include <dm/uclass-internal.h> #include <i2c.h> #include <linux/delay.h> #include <power/regulator.h> @@ -21,7 +22,7 @@ #define USB5744_CONFIG_REG_ACCESS_LSB 0x99
struct onboard_hub {
- struct udevice *vdd;
- struct udevice *vdd, *dev;
One field per line please.
struct gpio_desc *reset_gpio; };
@@ -106,8 +107,18 @@ static int usb_onboard_hub_probe(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);
struct ofnode_phandle_args phandle;
struct udevice *hub_dev; int ret;
if (!dev_read_phandle_with_args(dev, "peer-hub", NULL, 0, 0, &phandle)) {
if (ofnode_valid(phandle.node)) {
ret = uclass_find_device_by_ofnode(UCLASS_USB_HUB, phandle.node, &hub_dev);
if (hub_dev && hub_dev->priv_)
return 0;
}
}
Implement .bind function of this driver, bind the correct "half" of the hub that you want the driver to bind to, and return -ENODEV for the other "half". See rpc_spi_bind() in drivers/spi/renesas_rpc_spi.c for example of this.

USB host support on ZYNQMP KRIA SOM needs onboard USB hub driver for handling reset GPIO and for i2c initialization sequence.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- configs/xilinx_zynqmp_kria_defconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/configs/xilinx_zynqmp_kria_defconfig b/configs/xilinx_zynqmp_kria_defconfig index ba42f0c7848..8ca80b67ee0 100644 --- a/configs/xilinx_zynqmp_kria_defconfig +++ b/configs/xilinx_zynqmp_kria_defconfig @@ -199,6 +199,7 @@ CONFIG_USB_DWC3=y CONFIG_USB_DWC3_GENERIC=y CONFIG_USB_ULPI_VIEWPORT=y CONFIG_USB_ULPI=y +CONFIG_USB_ONBOARD_HUB=y CONFIG_USB_HOST_ETHER=y CONFIG_USB_ETHER_ASIX=y CONFIG_USB_GADGET=y

Updating the usb5744 hub node as per the latest upstream DT binding https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ tree/Documentation/devicetree/bindings/usb/microchip,usb5744.yaml?h=v6.8.8
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- arch/arm/dts/zynqmp-sck-kr-g-revA.dtso | 48 ++++++++++++++++++++++++++ arch/arm/dts/zynqmp-sck-kr-g-revB.dtso | 48 ++++++++++++++++++++++++++ arch/arm/dts/zynqmp-sck-kv-g-revA.dtso | 18 ++++++++++ arch/arm/dts/zynqmp-sck-kv-g-revB.dtso | 25 +++++++++++++- 4 files changed, 138 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso b/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso index ce7c5eb6d34..18e9d308de3 100644 --- a/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso +++ b/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso @@ -105,11 +105,19 @@ #address-cells = <1>; #size-cells = <0>; reg = <0>; + hub_1: usb-hub@2d { + compatible = "microchip,usb5744"; + reg = <0x2d>; + }; }; usbhub_i2c1: i2c@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>; + hub_2: usb-hub@2d { + compatible = "microchip,usb5744"; + reg = <0x2d>; + }; }; /* Bus 2/3 are not connected */ }; @@ -164,6 +172,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub_3_0>; + i2c-bus = <&hub_1>; + reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub_2_0>; + i2c-bus = <&hub_1>; + reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>; + }; };
&usb1 { /* mio64 - mio75 */ @@ -188,6 +216,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub1_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub1_3_0>; + i2c-bus = <&hub_2>; + reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub1_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub1_2_0>; + i2c-bus = <&hub_2>; + reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>; + }; };
&gem0 { /* mdio mio50/51 */ diff --git a/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso b/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso index 0a0cbd2b69a..5261e793c14 100644 --- a/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso +++ b/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso @@ -117,11 +117,19 @@ #address-cells = <1>; #size-cells = <0>; reg = <0>; + hub_1: usb-hub@2d { + compatible = "microchip,usb5744"; + reg = <0x2d>; + }; }; usbhub_i2c1: i2c@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>; + hub_2: usb-hub@2d { + compatible = "microchip,usb5744"; + reg = <0x2d>; + }; }; /* Bus 2/3 are not connected */ }; @@ -184,6 +192,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub_3_0>; + i2c-bus = <&hub_1>; + reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub_2_0>; + i2c-bus = <&hub_1>; + reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>; + }; };
&usb1 { /* mio64 - mio75 */ @@ -209,6 +237,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub1_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub1_3_0>; + i2c-bus = <&hub_2>; + reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub1_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub1_2_0>; + i2c-bus = <&hub_2>; + reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>; + }; };
&gem0 { /* mdio mio50/51 */ diff --git a/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso b/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso index 561b546e37f..0ef0357bd29 100644 --- a/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso +++ b/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso @@ -142,6 +142,24 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub_3_0>; + reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub_2_0>; + reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>; + }; };
&sdhci1 { /* on CC with tuned parameters */ diff --git a/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso b/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso index 64683e0ccbb..92d8851eb8a 100644 --- a/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso +++ b/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso @@ -92,7 +92,10 @@ label = "ina260-u14"; reg = <0x40>; }; - /* u43 - 0x2d - USB hub */ + hub: usb-hub@2d { + compatible = "microchip,usb5744"; + reg = <0x2d>; + }; /* u27 - 0xe0 - STDP4320 DP/HDMI splitter */ };
@@ -146,6 +149,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed"; + #address-cells = <1>; + #size-cells = <0>; + + /* 2.0 hub on port 1 */ + hub_2_0: hub@1 { + compatible = "usb424,2744"; + reg = <1>; + peer-hub = <&hub_3_0>; + i2c-bus = <&hub>; + reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>; + }; + + /* 3.0 hub on port 2 */ + hub_3_0: hub@2 { + compatible = "usb424,5744"; + reg = <2>; + peer-hub = <&hub_2_0>; + i2c-bus = <&hub>; + reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>; + }; };
&sdhci1 { /* on CC with tuned parameters */

On 6/5/24 12:02, Venkatesh Yadav Abbarapu wrote:
Updating the usb5744 hub node as per the latest upstream DT binding https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ tree/Documentation/devicetree/bindings/usb/microchip,usb5744.yaml?h=v6.8.8
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
arch/arm/dts/zynqmp-sck-kr-g-revA.dtso | 48 ++++++++++++++++++++++++++ arch/arm/dts/zynqmp-sck-kr-g-revB.dtso | 48 ++++++++++++++++++++++++++ arch/arm/dts/zynqmp-sck-kv-g-revA.dtso | 18 ++++++++++ arch/arm/dts/zynqmp-sck-kv-g-revB.dtso | 25 +++++++++++++- 4 files changed, 138 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso b/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso index ce7c5eb6d34..18e9d308de3 100644 --- a/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso +++ b/arch/arm/dts/zynqmp-sck-kr-g-revA.dtso @@ -105,11 +105,19 @@ #address-cells = <1>; #size-cells = <0>; reg = <0>;
hub_1: usb-hub@2d {
compatible = "microchip,usb5744";
reg = <0x2d>;
}; usbhub_i2c1: i2c@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>;};
hub_2: usb-hub@2d {
compatible = "microchip,usb5744";
reg = <0x2d>;
}; /* Bus 2/3 are not connected */ };};
@@ -164,6 +172,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub_3_0>;
i2c-bus = <&hub_1>;
reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub_2_0>;
i2c-bus = <&hub_1>;
reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>;
}; };
&usb1 { /* mio64 - mio75 */
@@ -188,6 +216,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub1_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub1_3_0>;
i2c-bus = <&hub_2>;
reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub1_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub1_2_0>;
i2c-bus = <&hub_2>;
reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>;
}; };
&gem0 { /* mdio mio50/51 */
diff --git a/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso b/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso index 0a0cbd2b69a..5261e793c14 100644 --- a/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso +++ b/arch/arm/dts/zynqmp-sck-kr-g-revB.dtso @@ -117,11 +117,19 @@ #address-cells = <1>; #size-cells = <0>; reg = <0>;
hub_1: usb-hub@2d {
compatible = "microchip,usb5744";
reg = <0x2d>;
}; usbhub_i2c1: i2c@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>;};
hub_2: usb-hub@2d {
compatible = "microchip,usb5744";
reg = <0x2d>;
}; /* Bus 2/3 are not connected */ };};
@@ -184,6 +192,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub_3_0>;
i2c-bus = <&hub_1>;
reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub_2_0>;
i2c-bus = <&hub_1>;
reset-gpios = <&slg7xl45106 3 GPIO_ACTIVE_LOW>;
}; };
&usb1 { /* mio64 - mio75 */
@@ -209,6 +237,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub1_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub1_3_0>;
i2c-bus = <&hub_2>;
reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub1_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub1_2_0>;
i2c-bus = <&hub_2>;
reset-gpios = <&slg7xl45106 4 GPIO_ACTIVE_LOW>;
}; };
&gem0 { /* mdio mio50/51 */
diff --git a/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso b/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso index 561b546e37f..0ef0357bd29 100644 --- a/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso +++ b/arch/arm/dts/zynqmp-sck-kv-g-revA.dtso @@ -142,6 +142,24 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub_3_0>;
reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub_2_0>;
reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
}; };
&sdhci1 { /* on CC with tuned parameters */
diff --git a/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso b/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso index 64683e0ccbb..92d8851eb8a 100644 --- a/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso +++ b/arch/arm/dts/zynqmp-sck-kv-g-revB.dtso @@ -92,7 +92,10 @@ label = "ina260-u14"; reg = <0x40>; };
- /* u43 - 0x2d - USB hub */
- hub: usb-hub@2d {
compatible = "microchip,usb5744";
reg = <0x2d>;
- }; /* u27 - 0xe0 - STDP4320 DP/HDMI splitter */ };
@@ -146,6 +149,26 @@ dr_mode = "host"; snps,usb3_lpm_capable; maximum-speed = "super-speed";
#address-cells = <1>;
#size-cells = <0>;
/* 2.0 hub on port 1 */
hub_2_0: hub@1 {
compatible = "usb424,2744";
reg = <1>;
peer-hub = <&hub_3_0>;
i2c-bus = <&hub>;
reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
};
/* 3.0 hub on port 2 */
hub_3_0: hub@2 {
compatible = "usb424,5744";
reg = <2>;
peer-hub = <&hub_2_0>;
i2c-bus = <&hub>;
reset-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
}; };
&sdhci1 { /* on CC with tuned parameters */
There are other changes which needs to happen here. One is kd240 and second remove usb description from usb glue logic driver but let's wait for Marek to look at onboard-hub part. 6/7 and 7/7 should go through my tree anyway and they are here pretty much for description purpose.
Thanks, Michal

Hi Tom, Marek and Fabrice,
st 5. 6. 2024 v 12:02 odesílatel Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com napsal:
Add the usb5744/usb2744 hub driver which does the reset gpio toggling and the i2c initialization sequence.
Tested the USB5744/USB2744 usb hub for usb0, usb1 with the DT nodes on KR260 board.
Venkatesh Yadav Abbarapu (7): usb: onboard-hub: Add reset-gpio support usb: onboard-hub: Fix the return values of regulator APIs usb: onboard-hub: add support for Microchip USB5744 usb: onboard-hub: Add i2c initialization for usb5744 hub usb: onboard-hub: Bail out if peer hub is already probed configs: zynqmp_kria: Enable the USB onboard hub arm64: zynqmp: Update the usb5744 hub node as per binding
arch/arm/dts/zynqmp-sck-kr-g-revA.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kr-g-revB.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kv-g-revA.dtso | 18 +++ arch/arm/dts/zynqmp-sck-kv-g-revB.dtso | 25 +++- common/usb_onboard_hub.c | 176 +++++++++++++++++++++++-- configs/xilinx_zynqmp_kria_defconfig | 1 + 6 files changed, 304 insertions(+), 12 deletions(-)
-- 2.17.1
Can someone please take a look at this patchset?
I am fine with 6/7 and 7/7. Acked-by: Michal Simek michal.simek@amd.com
Thanks, Michal
-- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Xilinx Microblaze Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs

Hi Marek, Did you get a chance to review this?
Thanks Venkatesh
-----Original Message----- From: Michal Simek monstr@monstr.eu Sent: Monday, July 15, 2024 5:24 PM To: Abbarapu, Venkatesh venkatesh.abbarapu@amd.com; Tom Rini trini@konsulko.com; Marek Vašut marex@denx.de; fabrice.gasnier@foss.st.com Cc: u-boot@lists.denx.de; Simek, Michal michal.simek@amd.com; git (AMD-Xilinx) git@amd.com Subject: Re: [PATCH 0/7] Add the USB5744 hub driver as per new DT binding
Hi Tom, Marek and Fabrice,
st 5. 6. 2024 v 12:02 odesílatel Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com napsal:
Add the usb5744/usb2744 hub driver which does the reset gpio toggling and the i2c initialization sequence.
Tested the USB5744/USB2744 usb hub for usb0, usb1 with the DT nodes on KR260 board.
Venkatesh Yadav Abbarapu (7): usb: onboard-hub: Add reset-gpio support usb: onboard-hub: Fix the return values of regulator APIs usb: onboard-hub: add support for Microchip USB5744 usb: onboard-hub: Add i2c initialization for usb5744 hub usb: onboard-hub: Bail out if peer hub is already probed configs: zynqmp_kria: Enable the USB onboard hub arm64: zynqmp: Update the usb5744 hub node as per binding
arch/arm/dts/zynqmp-sck-kr-g-revA.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kr-g-revB.dtso | 48 +++++++ arch/arm/dts/zynqmp-sck-kv-g-revA.dtso | 18 +++ arch/arm/dts/zynqmp-sck-kv-g-revB.dtso | 25 +++- common/usb_onboard_hub.c | 176 +++++++++++++++++++++++-- configs/xilinx_zynqmp_kria_defconfig | 1 + 6 files changed, 304 insertions(+), 12 deletions(-)
-- 2.17.1
Can someone please take a look at this patchset?
I am fine with 6/7 and 7/7. Acked-by: Michal Simek michal.simek@amd.com
Thanks, Michal
-- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Xilinx Microblaze Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs
participants (5)
-
Abbarapu, Venkatesh
-
Marek Vasut
-
Michal Simek
-
Michal Simek
-
Venkatesh Yadav Abbarapu