Skip to content

Commit dd8ab32

Browse files
author
Desnes Nunes
committed
usb: typec: tcpm: allow sink (ufp) to toggle into accessory mode debug
JIRA: https://issues.redhat.com/browse/RHEL-116016 commit 8db73e6 Author: Michael Grzeschik <m.grzeschik@pengutronix.de> Date: Fri, 4 Apr 2025 00:43:05 +0200 This patch extends the is_debug macro to cover the sink case (ufp). It also handles the transition to access the DEBUG_ACC_ATTACHED state in the sink case. It also handles the debounce case in which the cc pins are not immediately valid after the plug event. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://lore.kernel.org/r/20250404-ml-topic-tcpm-v1-2-b99f44badce8@pengutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Desnes Nunes <desnesn@redhat.com>
1 parent f8949c4 commit dd8ab32

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

drivers/usb/typec/tcpm/tcpm.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
\
6868
S(ACC_UNATTACHED), \
6969
S(DEBUG_ACC_ATTACHED), \
70+
S(DEBUG_ACC_DEBOUNCE), \
7071
S(AUDIO_ACC_ATTACHED), \
7172
S(AUDIO_ACC_DEBOUNCE), \
7273
\
@@ -621,7 +622,8 @@ static const char * const pd_rev[] = {
621622
!tcpm_cc_is_source((port)->cc1)))
622623

623624
#define tcpm_port_is_debug(port) \
624-
(tcpm_cc_is_source((port)->cc1) && tcpm_cc_is_source((port)->cc2))
625+
((tcpm_cc_is_source((port)->cc1) && tcpm_cc_is_source((port)->cc2)) || \
626+
(tcpm_cc_is_sink((port)->cc1) && tcpm_cc_is_sink((port)->cc2)))
625627

626628
#define tcpm_port_is_audio(port) \
627629
(tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_audio((port)->cc2))
@@ -4969,7 +4971,13 @@ static void run_state_machine(struct tcpm_port *port)
49694971
tcpm_set_state(port, SRC_UNATTACHED, PD_T_DRP_SRC);
49704972
break;
49714973
case SNK_ATTACH_WAIT:
4972-
if ((port->cc1 == TYPEC_CC_OPEN &&
4974+
if (tcpm_port_is_debug(port))
4975+
tcpm_set_state(port, DEBUG_ACC_ATTACHED,
4976+
PD_T_CC_DEBOUNCE);
4977+
else if (tcpm_port_is_audio(port))
4978+
tcpm_set_state(port, AUDIO_ACC_ATTACHED,
4979+
PD_T_CC_DEBOUNCE);
4980+
else if ((port->cc1 == TYPEC_CC_OPEN &&
49734981
port->cc2 != TYPEC_CC_OPEN) ||
49744982
(port->cc1 != TYPEC_CC_OPEN &&
49754983
port->cc2 == TYPEC_CC_OPEN))
@@ -4983,6 +4991,12 @@ static void run_state_machine(struct tcpm_port *port)
49834991
if (tcpm_port_is_disconnected(port))
49844992
tcpm_set_state(port, SNK_UNATTACHED,
49854993
PD_T_PD_DEBOUNCE);
4994+
else if (tcpm_port_is_debug(port))
4995+
tcpm_set_state(port, DEBUG_ACC_ATTACHED,
4996+
PD_T_CC_DEBOUNCE);
4997+
else if (tcpm_port_is_audio(port))
4998+
tcpm_set_state(port, AUDIO_ACC_ATTACHED,
4999+
PD_T_CC_DEBOUNCE);
49865000
else if (port->vbus_present)
49875001
tcpm_set_state(port,
49885002
tcpm_try_src(port) ? SRC_TRY
@@ -5281,14 +5295,18 @@ static void run_state_machine(struct tcpm_port *port)
52815295
/* Accessory states */
52825296
case ACC_UNATTACHED:
52835297
tcpm_acc_detach(port);
5284-
tcpm_set_state(port, SRC_UNATTACHED, 0);
5298+
if (port->port_type == TYPEC_PORT_SRC)
5299+
tcpm_set_state(port, SRC_UNATTACHED, 0);
5300+
else
5301+
tcpm_set_state(port, SNK_UNATTACHED, 0);
52855302
break;
52865303
case DEBUG_ACC_ATTACHED:
52875304
case AUDIO_ACC_ATTACHED:
52885305
ret = tcpm_acc_attach(port);
52895306
if (ret < 0)
52905307
tcpm_set_state(port, ACC_UNATTACHED, 0);
52915308
break;
5309+
case DEBUG_ACC_DEBOUNCE:
52925310
case AUDIO_ACC_DEBOUNCE:
52935311
tcpm_set_state(port, ACC_UNATTACHED, port->timings.cc_debounce_time);
52945312
break;
@@ -5880,7 +5898,8 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
58805898
}
58815899
break;
58825900
case SNK_UNATTACHED:
5883-
if (tcpm_port_is_sink(port))
5901+
if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
5902+
tcpm_port_is_sink(port))
58845903
tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
58855904
break;
58865905
case SNK_ATTACH_WAIT:
@@ -5943,7 +5962,12 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
59435962

59445963
case DEBUG_ACC_ATTACHED:
59455964
if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
5946-
tcpm_set_state(port, ACC_UNATTACHED, 0);
5965+
tcpm_set_state(port, DEBUG_ACC_DEBOUNCE, 0);
5966+
break;
5967+
5968+
case DEBUG_ACC_DEBOUNCE:
5969+
if (tcpm_port_is_debug(port))
5970+
tcpm_set_state(port, DEBUG_ACC_ATTACHED, 0);
59475971
break;
59485972

59495973
case SNK_TRY:

0 commit comments

Comments
 (0)