commit 23481121c81d984193edf1532f5e123637e50903 upstream.
It is not possible to use the parent of the port device when requesting mux handles as the parent may be a multiport USB Type-C or PD controller. The muxes must be assigned to the ports, not the controllers.
This will also move the requesting of the muxes after the port device is initialized.
[ heikki: This patch fixes an issue where port->id was used uninitialized. ]
Cc: stable@vger.kernel.org # 4.19.x: cd7753d: drivers: base: Helpers for adding device connection descriptions Cc: stable@vger.kernel.org # 4.19.x: 140a4ec: platform: x86: intel_cht_int33fe: Register all connections at once Cc: stable@vger.kernel.org # 4.19.x: 78d2b54: platform: x86: intel_cht_int33fe: Add connection for the DP alt mode Cc: stable@vger.kernel.org # 4.19.x: 495965a: platform: x86: intel_cht_int33fe: Add connections for the USB Type-C port Cc: stable@vger.kernel.org # 4.19.x Cc: stable@vger.kernel.org # 4.19.x: 148b0aa: platform: x86: intel_cht_int33fe: Remove the old connections for the muxes Fixes: bdecb33af34f ("usb: typec: API for controlling USB Type-C Multiplexers") Acked-by: Hans de Goede hdegoede@redhat.com Tested-by: Hans de Goede hdegoede@redhat.com Signed-off-by: Heikki Krogerus heikki.krogerus@linux.intel.com --- Hi,
This is a request to backport commit 23481121c81d984193edf1532f5e123637e50903
It was not marked as a fix, but it does fix an issue where a variable "port->id" was used in function typec_register_port() without initializing it.
The patch has additional prerequisites which are listed in the sign-off area. Please note that there is also one patch listed there after this one.
thanks,
heikki --- drivers/usb/typec/class.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index e61dffb27a0c..00141e05bc72 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -1500,7 +1500,7 @@ typec_port_register_altmode(struct typec_port *port,
sprintf(id, "id%04xm%02x", desc->svid, desc->mode);
- mux = typec_mux_get(port->dev.parent, id); + mux = typec_mux_get(&port->dev, id); if (IS_ERR(mux)) return ERR_CAST(mux);
@@ -1540,18 +1540,6 @@ struct typec_port *typec_register_port(struct device *parent, return ERR_PTR(id); }
- port->sw = typec_switch_get(cap->fwnode ? &port->dev : parent); - if (IS_ERR(port->sw)) { - ret = PTR_ERR(port->sw); - goto err_switch; - } - - port->mux = typec_mux_get(parent, "typec-mux"); - if (IS_ERR(port->mux)) { - ret = PTR_ERR(port->mux); - goto err_mux; - } - switch (cap->type) { case TYPEC_PORT_SRC: port->pwr_role = TYPEC_SOURCE; @@ -1592,13 +1580,26 @@ struct typec_port *typec_register_port(struct device *parent, port->port_type = cap->type; port->prefer_role = cap->prefer_role;
+ device_initialize(&port->dev); port->dev.class = typec_class; port->dev.parent = parent; port->dev.fwnode = cap->fwnode; port->dev.type = &typec_port_dev_type; dev_set_name(&port->dev, "port%d", id);
- ret = device_register(&port->dev); + port->sw = typec_switch_get(&port->dev); + if (IS_ERR(port->sw)) { + put_device(&port->dev); + return ERR_CAST(port->sw); + } + + port->mux = typec_mux_get(&port->dev, "typec-mux"); + if (IS_ERR(port->mux)) { + put_device(&port->dev); + return ERR_CAST(port->mux); + } + + ret = device_add(&port->dev); if (ret) { dev_err(parent, "failed to register port (%d)\n", ret); put_device(&port->dev); @@ -1606,15 +1607,6 @@ struct typec_port *typec_register_port(struct device *parent, }
return port; - -err_mux: - typec_switch_put(port->sw); - -err_switch: - ida_simple_remove(&typec_index_ida, port->id); - kfree(port); - - return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(typec_register_port);