diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-17 20:28:42 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-17 20:28:42 -0700 |
commit | c07b149eee50809b44e2a56190fe92f45c0ad80c (patch) | |
tree | 654d3e6af4ad5f971a1e087c2efa6e2e1e6ae918 /drivers | |
parent | bd641c5b2be07182a8f899531b91136936c98d6a (diff) | |
parent | 0c924e6706a9a1fbf1d363effb6e3613ca0649f6 (diff) |
Merge "usb: pd: Fix ERROR_RECOVERY handling"
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/pd/policy_engine.c | 10 |
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; } |