[PATCH] usb: core: support interface node for simple USB devices

From: Catalin Popescu
Date: Wed Jan 22 2025 - 08:48:02 EST


A simple usb device has a single configuration and a single interface
and is considered as a "combined node" when defined in the devicetree.
If available, its interface node is simply ignored which is a problem
whenever the interface node has subnodes. To prevent that from happening
first check for any subnode and ignore the interface node only if no
subnode was found.

Example: FTDI chip FT234XD that has only one UART interface which is
being used as a serdev by other driver.

device@1 {
compatible = "usb403,6015";
reg = <1>;

#address-cells = <2>;
#size-cells = <0>;

interface@0 {
compatible = "usbif403,6015.config1.0";
reg = <0 1>;

bluetooth {
compatible = "nxp,88w8987-bt";
};
};
};

Signed-off-by: Catalin Popescu <catalin.popescu@xxxxxxxxxxxxxxxxxxxx>
---
drivers/usb/core/message.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index d2b2787be409..f4a9d1831f6a 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -2102,6 +2102,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
struct usb_interface_cache *intfc;
struct usb_interface *intf;
struct usb_host_interface *alt;
+ struct device_node *np;
u8 ifnum;

cp->interface[i] = intf = new_interfaces[i];
@@ -2126,12 +2127,11 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
intf->cur_altsetting = alt;
usb_enable_interface(dev, intf, true);
intf->dev.parent = &dev->dev;
- if (usb_of_has_combined_node(dev)) {
+ np = usb_of_get_interface_node(dev, configuration, ifnum);
+ if (!of_get_child_count(np) && usb_of_has_combined_node(dev))
device_set_of_node_from_dev(&intf->dev, &dev->dev);
- } else {
- intf->dev.of_node = usb_of_get_interface_node(dev,
- configuration, ifnum);
- }
+ else
+ intf->dev.of_node = np;
ACPI_COMPANION_SET(&intf->dev, ACPI_COMPANION(&dev->dev));
intf->dev.driver = NULL;
intf->dev.bus = &usb_bus_type;

base-commit: f066b5a6c7a06adfb666b7652cc99b4ff264f4ed
--
2.34.1