[PATCH v2 03/22] usb: typec: tipd: Register a USB4 port mode for CD321x

Sven Peter sven at kernel.org
Sun Sep 6 11:36:26 PDT 2026


Register a USB4 mode next to the DP and Thunderbolt alternate modes so
that negotiated USB4 partner modes can be linked to the port. Identify
it using TYPEC_MODE_KIND_USB4 without an SVID or mode index.

Signed-off-by: Sven Peter <sven at kernel.org>
---
 drivers/usb/typec/tipd/core.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index f76f563dc42b..8c7f93d4270e 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -211,6 +211,7 @@ struct cd321x {
 
 	struct typec_altmode *port_altmode_dp;
 	struct typec_altmode *port_altmode_tbt;
+	struct typec_altmode *port_altmode_usb4;
 
 	struct typec_mux *mux;
 	struct typec_mux_state state;
@@ -1312,6 +1313,18 @@ static int cd321x_register_port_altmodes(struct cd321x *cd321x)
 	}
 	cd321x->port_altmode_tbt = amode;
 
+	memset(&desc, 0, sizeof(desc));
+	desc.mode_kind = TYPEC_MODE_KIND_USB4;
+	amode = typec_port_register_altmode(cd321x->tps.port, &desc);
+	if (IS_ERR(amode)) {
+		typec_unregister_altmode(cd321x->port_altmode_dp);
+		typec_unregister_altmode(cd321x->port_altmode_tbt);
+		cd321x->port_altmode_dp = NULL;
+		cd321x->port_altmode_tbt = NULL;
+		return PTR_ERR(amode);
+	}
+	cd321x->port_altmode_usb4 = amode;
+
 	return 0;
 }
 
@@ -1347,8 +1360,10 @@ cd321x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
 err_unregister_altmodes:
 	typec_unregister_altmode(cd321x->port_altmode_dp);
 	typec_unregister_altmode(cd321x->port_altmode_tbt);
+	typec_unregister_altmode(cd321x->port_altmode_usb4);
 	cd321x->port_altmode_dp = NULL;
 	cd321x->port_altmode_tbt = NULL;
+	cd321x->port_altmode_usb4 = NULL;
 err_unregister_port:
 	typec_unregister_port(tps->port);
 	return ret;
@@ -1371,6 +1386,8 @@ cd321x_unregister_port(struct tps6598x *tps)
 	cd321x->port_altmode_dp = NULL;
 	typec_unregister_altmode(cd321x->port_altmode_tbt);
 	cd321x->port_altmode_tbt = NULL;
+	typec_unregister_altmode(cd321x->port_altmode_usb4);
+	cd321x->port_altmode_usb4 = NULL;
 	typec_unregister_port(tps->port);
 }
 

-- 
2.55.0





More information about the linux-arm-kernel mailing list