summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-17 20:28:42 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-17 20:28:42 -0700
commitc07b149eee50809b44e2a56190fe92f45c0ad80c (patch)
tree654d3e6af4ad5f971a1e087c2efa6e2e1e6ae918 /drivers
parentbd641c5b2be07182a8f899531b91136936c98d6a (diff)
parent0c924e6706a9a1fbf1d363effb6e3613ca0649f6 (diff)
Merge "usb: pd: Fix ERROR_RECOVERY handling"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/pd/policy_engine.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c
index 0cc57e41ebb1..b011efe189e7 100644
--- a/drivers/usb/pd/policy_engine.c
+++ b/drivers/usb/pd/policy_engine.c
@@ -575,8 +575,8 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
case PE_ERROR_RECOVERY: /* perform hard disconnect/reconnect */
pd->in_pr_swap = false;
set_power_role(pd, PR_NONE);
- hrtimer_start(&pd->timer, ms_to_ktime(ERROR_RECOVERY_TIME),
- HRTIMER_MODE_REL);
+ pd->typec_mode = POWER_SUPPLY_TYPEC_NONE;
+ queue_work(pd->wq, &pd->sm_work);
break;
/* Source states */
@@ -1271,12 +1271,18 @@ static void usbpd_sm(struct work_struct *w)
reset_vdm_state(pd);
+ if (pd->current_state == PE_ERROR_RECOVERY)
+ /* forced disconnect, wait before resetting to DRP */
+ usleep_range(ERROR_RECOVERY_TIME * USEC_PER_MSEC,
+ (ERROR_RECOVERY_TIME + 5) * USEC_PER_MSEC);
+
/* Set CC back to DRP toggle */
val.intval = POWER_SUPPLY_TYPEC_PR_DUAL;
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
pd->current_state = PE_UNKNOWN;
+
return;
}