mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
FROMGIT: usb: typec: tcpm: Stay in SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS till Rp is seen
TD.4.7.3. Try SNK DRP Connect Try.SRC DRP fails. The compliance tester mimics being a Try.SRC USB-C port. The failure is due to TCPM exiting SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS when VBUS is not present eventhough when SNK.Rp is seen. Exit to SRC_TRYWAIT from SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS only when SNK.Rp is not seen for PD_T_TRY_CC_DEBOUNCE. >From the spec: The port shall then transition to Attached.SNK when the SNK.Rp state is detected on exactly one of the CC1 or CC2 pins for at least tTryCCDebounce and VBUS is detected. Alternatively, the port shall transition to TryWait.SRC if SNK.Rp state is not detected for tTryCCDebounce. Bug: 158724104 Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> Link: https://lore.kernel.org/r/20201125014804.1596719-1-badhri@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 733315532b90d8dccfdc2d0d2744db4559d40e80 https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next) Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> (cherry picked from commit ee1142f3cbf23af75db98d235b5cbf950421ad9c) (cherry picked from commit a723b4dd4fb4e44d4925ac52b1cca512f47bb1ab) Signed-off-by: Will McVicker <willmcvicker@google.com> (cherry picked from commit 10a1f26e421c83c7a3590a7c41211773ffd74a5f) Signed-off-by: Will McVicker <willmcvicker@google.com> Change-Id: Ieee7069dab909604291c331d7468e1408ada0a5e
This commit is contained in:
parent
6397739ba1
commit
5b0b1850d2
|
|
@ -3156,15 +3156,13 @@ static void run_state_machine(struct tcpm_port *port)
|
|||
break;
|
||||
case SNK_TRY_WAIT_DEBOUNCE:
|
||||
tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS,
|
||||
PD_T_PD_DEBOUNCE);
|
||||
PD_T_TRY_CC_DEBOUNCE);
|
||||
break;
|
||||
case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
|
||||
if (port->vbus_present && tcpm_port_is_sink(port)) {
|
||||
if (port->vbus_present && tcpm_port_is_sink(port))
|
||||
tcpm_set_state(port, SNK_ATTACHED, 0);
|
||||
} else {
|
||||
tcpm_set_state(port, SRC_TRYWAIT, 0);
|
||||
else
|
||||
port->max_wait = 0;
|
||||
}
|
||||
break;
|
||||
case SRC_TRYWAIT:
|
||||
tcpm_set_cc(port, tcpm_rp_cc(port));
|
||||
|
|
@ -4098,6 +4096,12 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
|
|||
if (!tcpm_port_is_sink(port))
|
||||
tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
|
||||
break;
|
||||
case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
|
||||
if (!tcpm_port_is_sink(port))
|
||||
tcpm_set_state(port, SRC_TRYWAIT, PD_T_TRY_CC_DEBOUNCE);
|
||||
else
|
||||
tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS, 0);
|
||||
break;
|
||||
case SNK_TRYWAIT:
|
||||
/* Do nothing, waiting for tCCDebounce */
|
||||
break;
|
||||
|
|
@ -4184,6 +4188,10 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
|
|||
case SNK_TRYWAIT_DEBOUNCE:
|
||||
/* Do nothing, waiting for Rp */
|
||||
break;
|
||||
case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
|
||||
if (port->vbus_present && tcpm_port_is_sink(port))
|
||||
tcpm_set_state(port, SNK_ATTACHED, 0);
|
||||
break;
|
||||
case SRC_TRY_WAIT:
|
||||
case SRC_TRY_DEBOUNCE:
|
||||
/* Do nothing, waiting for sink detection */
|
||||
|
|
|
|||
|
|
@ -484,6 +484,7 @@ static inline unsigned int rdo_max_power(u32 rdo)
|
|||
|
||||
#define PD_T_CC_DEBOUNCE 200 /* 100 - 200 ms */
|
||||
#define PD_T_PD_DEBOUNCE 20 /* 10 - 20 ms */
|
||||
#define PD_T_TRY_CC_DEBOUNCE 15 /* 10 - 20 ms */
|
||||
|
||||
#define PD_N_CAPS_COUNT (PD_T_NO_RESPONSE / PD_T_SEND_SOURCE_CAP)
|
||||
#define PD_N_HARD_RESET_COUNT 2
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user