[PATCH v4.19.x] usb: typec: class: Don't use port parent for getting mux handles

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxx> # 4.19.x: cd7753d: drivers: base: Helpers for adding device connection descriptions
Cc: <stable@xxxxxxxxxxxxxxx> # 4.19.x: 140a4ec: platform: x86: intel_cht_int33fe: Register all connections at once
Cc: <stable@xxxxxxxxxxxxxxx> # 4.19.x: 78d2b54: platform: x86: intel_cht_int33fe: Add connection for the DP alt mode
Cc: <stable@xxxxxxxxxxxxxxx> # 4.19.x: 495965a: platform: x86: intel_cht_int33fe: Add connections for the USB Type-C port
Cc: <stable@xxxxxxxxxxxxxxx> # 4.19.x
Cc: <stable@xxxxxxxxxxxxxxx> # 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@xxxxxxxxxx>
Tested-by: Hans de Goede <hdegoede@xxxxxxxxxx>
Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>
---
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);
 
-- 
2.20.1




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux