On Wed, Feb 28, 2024 at 12:05:12AM +0000, Badhri Jagan Sridharan wrote: > While commit 69f89168b310 ("usb: typec: tpcm: Fix issues with power being > removed during reset") fixes the boot issues for bus powered devices such > as LibreTech Renegade Elite/Firefly, it trades off the CC pins NOT being > Hi-Zed during errory recovery (i.e PORT_RESET) for devices which are NOT > bus powered(a.k.a self powered). This change Hi-Zs the CC pins only for > self powered devices, thus preventing brown out for bus powered devices > > Adhering to spec is gaining more importance due to the Common charger > initiative enforced by the European Union. > > Quoting from the spec: > 4.5.2.2.2.1 ErrorRecovery State Requirements > The port shall not drive VBUS or VCONN, and shall present a > high-impedance to ground (above zOPEN) on its CC1 and CC2 pins. > > Hi-Zing the CC pins is the inteded behavior for PORT_RESET. > CC pins are set to default state after tErrorRecovery in > PORT_RESET_WAIT_OFF. > > 4.5.2.2.2.2 Exiting From ErrorRecovery State > A Sink shall transition to Unattached.SNK after tErrorRecovery. > A Source shall transition to Unattached.SRC after tErrorRecovery. > > Fixes: 69f89168b310 ("usb: typec: tpcm: Fix issues with power being removed during reset") > Cc: stable@xxxxxxxxxxxxxxx > Cc: Mark Brown <broonie@xxxxxxxxxx> > Signed-off-by: Badhri Jagan Sridharan <badhri@xxxxxxxxxx> Acked-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > Changes since V1: > * Fix CC for linux stable > --- > drivers/usb/typec/tcpm/tcpm.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c > index c9a78f55ca48..bbe1381232eb 100644 > --- a/drivers/usb/typec/tcpm/tcpm.c > +++ b/drivers/usb/typec/tcpm/tcpm.c > @@ -5593,8 +5593,11 @@ static void run_state_machine(struct tcpm_port *port) > break; > case PORT_RESET: > tcpm_reset_port(port); > - tcpm_set_cc(port, tcpm_default_state(port) == SNK_UNATTACHED ? > - TYPEC_CC_RD : tcpm_rp_cc(port)); > + if (port->self_powered) > + tcpm_set_cc(port, TYPEC_CC_OPEN); > + else > + tcpm_set_cc(port, tcpm_default_state(port) == SNK_UNATTACHED ? > + TYPEC_CC_RD : tcpm_rp_cc(port)); > tcpm_set_state(port, PORT_RESET_WAIT_OFF, > PD_T_ERROR_RECOVERY); > break; > > base-commit: a560a5672826fc1e057068bda93b3d4c98d037a2 > -- > 2.44.0.rc1.240.g4c46232300-goog -- heikki