On Sat, Aug 26, 2017 at 11:50:31PM -0700, Badhri Jagan Sridharan wrote: > In the case that the lower layer driver reports a cc change directly > from SINK state to SOURCE state, TCPM doesn't handle these cc change > in SRC_SEND_CAPABILITIES, SRC_READY states. And with SRC_ATTACHED > state, the change is not handled as the port is still considered > connected. > > [49606.131672] state change DRP_TOGGLING -> SRC_ATTACH_WAIT > [49606.131701] pending state change SRC_ATTACH_WAIT -> SRC_ATTACHED @ > 200 ms > [49606.329952] state change SRC_ATTACH_WAIT -> SRC_ATTACHED [delayed 200 > ms] > [49606.329978] polarity 0 > [49606.329989] Requesting mux mode 1, config 0, polarity 0 > [49606.349416] vbus:=1 charge=0 > [49606.372274] pending state change SRC_ATTACHED -> SRC_UNATTACHED @ 480 > ms > [49606.372431] VBUS on > [49606.372488] state change SRC_ATTACHED -> SRC_STARTUP > ... > (the lower layer driver reports a direct change from source to sink) > [49606.536927] pending state change SRC_SEND_CAPABILITIES -> > SRC_SEND_CAPABILITIES @ 150 ms > [49606.547244] CC1: 2 -> 5, CC2: 0 -> 0 [state SRC_SEND_CAPABILITIES, > polarity 0, connected] > > This can happen when the lower layer driver and/or the hardware > handles a portion of the Type-C state machine work, and quietly goes > through the unattached state. > > Originally-from: Yueyao Zhu <yueyao@xxxxxxxxxx> > Signed-off-by: Badhri Jagan Sridharan <Badhri@xxxxxxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > drivers/staging/typec/tcpm.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c > index 645f43ee83df..1f6827f32b29 100644 > --- a/drivers/staging/typec/tcpm.c > +++ b/drivers/staging/typec/tcpm.c > @@ -2874,10 +2874,12 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1, > tcpm_set_state(port, SRC_ATTACH_WAIT, 0); > break; > case SRC_ATTACHED: > - if (tcpm_port_is_disconnected(port)) > + case SRC_SEND_CAPABILITIES: > + case SRC_READY: > + if (tcpm_port_is_disconnected(port) || > + !tcpm_port_is_source(port)) > tcpm_set_state(port, SRC_UNATTACHED, 0); > break; > - > case SNK_UNATTACHED: > if (tcpm_port_is_sink(port)) > tcpm_set_state(port, SNK_ATTACH_WAIT, 0); > -- > 2.14.1.342.g6490525c54-goog > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel