@@ -611,6 +611,12 @@ static const char * const pd_rev[] = {
#define tcpm_port_is_sink(port) \
(tcpm_cc_is_sink((port)->cc1) || tcpm_cc_is_sink((port)->cc2))
+#define tcpm_port_is_debug_pol_cc1(port) \
+ ((tcpm_port_is_sink(port) && \
+ (port->cc2 == TYPEC_CC_RP_DEF && port->cc1 == TYPEC_CC_RP_1_5)) || \
+ (!tcpm_port_is_sink(port) && \
+ (port->cc2 == TYPEC_CC_RA && port->cc1 == TYPEC_CC_RD)))
+
#define tcpm_cc_is_source(cc) ((cc) == TYPEC_CC_RD)
#define tcpm_cc_is_audio(cc) ((cc) == TYPEC_CC_RA)
#define tcpm_cc_is_open(cc) ((cc) == TYPEC_CC_OPEN)
@@ -4569,8 +4575,11 @@ static int tcpm_acc_attach(struct tcpm_port *port)
if (tcpm_port_is_audio(port))
state = TYPEC_MODE_AUDIO;
- if (tcpm_port_is_debug(port))
+ if (tcpm_port_is_debug(port)) {
+ port->polarity = tcpm_port_is_debug_pol_cc1(port) ?
+ TYPEC_POLARITY_CC1 : TYPEC_POLARITY_CC2;
state = TYPEC_MODE_DEBUG;
+ }
ret = tcpm_set_roles(port, true, state, role, data);
if (ret < 0)
For the debug accessory case, the orientation can be detected by reading the cc resistor values. The will be TYPEC_CC_RP_DEF and TYPEC_CC_RP_1_5 in sink mode and TYPEC_CC_RA TYPEC_CC_RD in src mode. Fixes: 64843d0ba96 ('usb: typec: tcpm: allow to use sink in accessory mode') Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> --- Changes in v2: - Added fixes tag as suggested by gregkh - Link to v1: https://lore.kernel.org/r/20250505-tcpm-v1-1-e6142985a012@pengutronix.de --- drivers/usb/typec/tcpm/tcpm.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) --- base-commit: 588d032e9e566997db3213dee145dbe3bda297b6 change-id: 20250505-tcpm-41b4ba7ea0ec Best regards,