summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Pham <jackp@codeaurora.org>2017-06-06 11:10:03 -0700
committerJack Pham <jackp@codeaurora.org>2017-06-06 22:50:26 -0700
commited97270b784c0ecaa3809fe8474aa2609ecd3492 (patch)
treecf2ea6a5abb84153b31ced46e2f1cfe8195fa56a
parent95d46e9eb081048feab618a08e261379e2b9bf8b (diff)
usb: pd: Set PD_IN_HARD_RESET as soon as hard reset received
Move setting of PD_IN_HARD_RESET to the phy_sig_received() callback in order to inform the charger to ignore the upcoming VBUS toggle as soon as possible. This will help decrease the possibility of racing to set the appropriate HW bits while VBUS turns off and leads to the charger indicating disconnect. Change-Id: I42cc2969defa48c9987fa4bea64780866861d868 Signed-off-by: Jack Pham <jackp@codeaurora.org>
-rw-r--r--drivers/usb/pd/policy_engine.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c
index 90e9f14d550c..bf3fe5b7579e 100644
--- a/drivers/usb/pd/policy_engine.c
+++ b/drivers/usb/pd/policy_engine.c
@@ -596,6 +596,8 @@ static void kick_sm(struct usbpd *pd, int ms)
static void phy_sig_received(struct usbpd *pd, enum pd_sig_type type)
{
+ union power_supply_propval val = {1};
+
if (type != HARD_RESET_SIG) {
usbpd_err(&pd->dev, "invalid signal (%d) received\n", type);
return;
@@ -606,6 +608,9 @@ static void phy_sig_received(struct usbpd *pd, enum pd_sig_type type)
/* Force CC logic to source/sink to keep Rp/Rd unchanged */
set_power_role(pd, pd->current_pr);
pd->hard_reset_recvd = true;
+ power_supply_set_property(pd->usb_psy,
+ POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
+
kick_sm(pd, 0);
}
@@ -1629,10 +1634,6 @@ static void usbpd_sm(struct work_struct *w)
if (pd->hard_reset_recvd) {
pd->hard_reset_recvd = false;
- val.intval = 1;
- power_supply_set_property(pd->usb_psy,
- POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
-
if (pd->requested_current) {
val.intval = pd->requested_current = 0;
power_supply_set_property(pd->usb_psy,