summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorLi Jun <jun.li@nxp.com>2017-07-28 18:20:42 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:27:54 +0800
commitcf5506a3dd566458cc6d0615e1693e599704380a (patch)
tree1741ea41ef2755dc01367246af36579a2dc4ed34 /drivers/staging
parent84040232ea822ae2c83bfbad78151d079476d20b (diff)
MLK-16013-37 staging: 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 <peter.chen@nxp.com> Signed-off-by: Li Jun <jun.li@nxp.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/typec/tcpm.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c
index 830305c22bd6..ed4abee7717b 100644
--- a/drivers/staging/typec/tcpm.c
+++ b/drivers/staging/typec/tcpm.c
@@ -3209,7 +3209,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:
@@ -3248,8 +3254,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)