[PATCH v6 06/16] usb: hub: Associate port@ fwnode with USB port device
Konrad Dybcio
konrad.dybcio at oss.qualcomm.com
Fri Jul 31 07:42:29 PDT 2026
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 <andriy.shevchenko at linux.intel.com>
> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski at oss.qualcomm.com>
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
[...]
> + /*
> + * 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 at 2 {
compatible = "usb5e3,625";
reg = <2>;
peer-hub = <&usb_hub_2_x>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port at 1 {
reg = <1>;
usb_hub_3_1: endpoint {
remote-endpoint = <&hd3ss3220_1_out_ep>;
};
};
port at 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
More information about the Linux-mediatek
mailing list