Re: [PATCH v6 06/16] usb: hub: Associate port@ fwnode with USB port device
Konrad Dybcio <[email protected]> Fri, 31 Jul 2026 16:42:29 +0200
| Newsgroups | dev.linux.lists.driver-core,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-mediatek,org.kernel.vger.linux-acpi,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.linux-usb |
|---|---|
| Message-ID | <[email protected]> |
On 7/21/26 8:54 AM, Chen-Yu Tsai wrote: > When a USB hub port is connected to a connector in a firmware node > graph, the port itself has a node in the graph. > > Associate the port's firmware node with the USB port's device, > usb_port::dev. This is used in later changes for the M.2 slot power > sequencing provider to match against the requesting port. > > To avoid potential conflicts with ACPI firmware nodes and then causing > power management issues, only assign the firmware node if the hub's > firmware node is not an ACPI firmware node. > > Reviewed-by: Andy Shevchenko <[email protected]> > Reviewed-by: Bartosz Golaszewski <[email protected]> > Signed-off-by: Chen-Yu Tsai <[email protected]> > --- [...] > + /* > + * ACPI FW nodes are associated later when device_register() happens. > + * Skip assigning one here to avoid potential conflicts. > + */ > + if (!is_acpi_node(fwnode)) { > + struct fwnode_handle *port; > + > + /* > + * fwnode_graph_get_port_by_id() returns either a valid fwnode handle > + * or NULL. Passing NULL to device_set_node() clears any associated > + * fwnode. It is effectively a no-op here, since no fwnode has been > + * assigned to the newly created device yet. > + */ > + port = fwnode_graph_get_port_by_id(fwnode, port1, FWNODE_GRAPH_DEVICE_DISABLED); This works if the node at the other end of the graph is a USB hub, e.g. from qcom/lemans-evk.dts: usb_hub_3_x: hub@2 { compatible = "usb5e3,625"; reg = <2>; peer-hub = <&usb_hub_2_x>; ports { #address-cells = <1>; #size-cells = <0>; port@1 { reg = <1>; usb_hub_3_1: endpoint { remote-endpoint = <&hd3ss3220_1_out_ep>; }; }; port@4 { reg = <4>; usb_hub_3_4: endpoint { }; }; }; }; But something I faced when I was poking at USB4 was that dt-bindings currently assume every controller is effectively single-port and the of_graph ports under it represent HS/SS lanes, i.e. the entire "ports" subnode represents a single USB port I think the solution here would be to do ports {} under the controller and have every one of them have 2 endpoints (for HS and SS respectively) - then, each DT-port would correspond to a USB port (sorta like in the hub case, minus the hubs are split for HS/SS so they have just a single endpoint under each port) But that comes with a big breakage, as always.. Konrad