[PATCH] usb: typec: tcpm: detect orientation in debug acc mode
From: Michael Grzeschik
Date: Mon May 05 2025 - 07:06:33 EST
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.
Signed-off-by: Michael Grzeschik <m.grzeschik@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>