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@xxxxxxxxxxxxxx> --- Changes in v2: - Added fixes tag as suggested by gregkh - Link to v1: https://lore.kernel.org/r/20250505-tcpm-v1-1-e6142985a012@xxxxxxxxxxxxxx --- drivers/usb/typec/tcpm/tcpm.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 784fa23102f90..478e9c80fc8c2 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -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) --- base-commit: 588d032e9e566997db3213dee145dbe3bda297b6 change-id: 20250505-tcpm-41b4ba7ea0ec Best regards, -- Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>