Messages in this thread Patch in this message | | | From | cy_huang <> | Subject | [PATCH] usb: typec: tcpm: Fix if vbus before cc, hard_reset_count not reset issue | Date | Wed, 2 Sep 2020 23:35:33 +0800 |
| |
From: ChiYuan Huang <cy_huang@richtek.com>
Fix: If vbus event is before cc_event trigger, hard_reset_count won't bt reset for some case.
Signed-off-by: ChiYuan Huang <cy_huang@richtek.com> --- Below's the flow.
_tcpm_pd_vbus_off() -> run_state_machine to change state to SNK_UNATTACHED call tcpm_snk_detach() -> tcpm_snk_detach() -> tcpm_detach() tcpm_port_is_disconnected() will be called. But port->attached is still true and port->cc1=open and port->cc2=open
It cause tcpm_port_is_disconnected return false, then hard_reset_count won't be reset. After that, tcpm_reset_port() is called. port->attached become false.
After that, cc now trigger cc_change event, the hard_reset_count will be kept. Even tcpm_detach will be called, due to port->attached is false, tcpm_detach() will directly return.
CC_EVENT will only trigger drp toggling again. --- drivers/usb/typec/tcpm/tcpm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index a48e3f90..5c73e1d 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -2797,8 +2797,7 @@ static void tcpm_detach(struct tcpm_port *port) port->tcpc->set_bist_data(port->tcpc, false); } - if (tcpm_port_is_disconnected(port)) - port->hard_reset_count = 0; + port->hard_reset_count = 0; tcpm_reset_port(port); } -- 2.7.4
| |