From 1ad464830e781e8df27cabcd47f812301557e9a5 Mon Sep 17 00:00:00 2001 From: Li Jun Date: Wed, 9 Jan 2019 12:49:26 +0530 Subject: [PATCH] MLK-16013-37 usb: typec: Power swap force discharge for source VBus off only means the vbus falls to be below 4v, we can use vbus force discharge and vbus low alarm to go forward. Reviewed-by: Peter Chen Signed-off-by: Li Jun Signed-off-by: Vipul Kumar --- drivers/usb/typec/tcpm.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index 6a6a4f41cab8..4056ad1ff34e 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c @@ -3921,7 +3921,13 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port) break; case PR_SWAP_SRC_SNK_TRANSITION_OFF: - tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0); + /* + * At this moment, vbus may only fall to be below 4v, + * we need wait tPSSourceOff and let vbus discharge + * finished. + */ + if (!port->tcpc->vbus_discharge) + tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0); break; case PR_SWAP_SNK_SRC_SINK_OFF: @@ -3960,8 +3966,16 @@ static void _tcpm_vbus_discharge(struct tcpm_port *port, bool on) { tcpm_log_force(port, "%s force discharge", on ? "Enable":"Disable"); + /* + * By vbus discharge and low alarm, now we can disable + * vbus discharge. + */ if (port->tcpc && port->tcpc->vbus_discharge) port->tcpc->vbus_discharge(port->tcpc, false); + + /* We can transit to PR_SWAP_SRC_SNK_SOURCE_OFF safely */ + if (port->state == PR_SWAP_SRC_SNK_TRANSITION_OFF) + tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0); } static void tcpm_pd_event_handler(struct work_struct *work) -- 2.17.1