diff options
| author | Jack Pham <jackp@codeaurora.org> | 2017-01-31 15:23:56 -0800 |
|---|---|---|
| committer | Jack Pham <jackp@codeaurora.org> | 2017-02-10 17:42:29 -0800 |
| commit | da9c7fa2a547c9a05d84fccc48dc693fbdf9b8f8 (patch) | |
| tree | 2c7adffa73077b71f7b996072370b006e7960a59 | |
| parent | 47fdec0cf105986642b30e3e901db4930860996f (diff) | |
usb: pd: Update uevent parameters during hard reset
Ensure that a few of the parameters (SELECTED_PDO, REQUESTED_PDO,
RDO) are properly cleared out during hard reset and a uevent
update is sent to notify userspace clients.
Also, don't reset src_cap_id upon disconnect. This makes it a
a monotonically increasing value upon every connection so that
clients can distinguish when a new PD session is established.
Demote it to a u16 in order to have a smaller wraparound (65535).
Change-Id: I622ad1155b3680d3f616d5e9a835d4c6cbca3636
Signed-off-by: Jack Pham <jackp@codeaurora.org>
| -rw-r--r-- | drivers/usb/pd/policy_engine.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c index 43fbc5aab073..3d87d0e6580a 100644 --- a/drivers/usb/pd/policy_engine.c +++ b/drivers/usb/pd/policy_engine.c @@ -309,7 +309,7 @@ struct usbpd { spinlock_t rx_lock; u32 received_pdos[7]; - int src_cap_id; + u16 src_cap_id; u8 selected_pdo; u8 requested_pdo; u32 rdo; /* can be either source or sink */ @@ -1551,9 +1551,9 @@ static void usbpd_sm(struct work_struct *w) pd->hard_reset_recvd = false; pd->caps_count = 0; pd->hard_reset_count = 0; - pd->src_cap_id = 0; pd->requested_voltage = 0; pd->requested_current = 0; + pd->selected_pdo = pd->requested_pdo = 0; memset(&pd->received_pdos, 0, sizeof(pd->received_pdos)); rx_msg_cleanup(pd); @@ -1621,8 +1621,12 @@ static void usbpd_sm(struct work_struct *w) POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val); pd->in_pr_swap = false; + pd->in_explicit_contract = false; + pd->selected_pdo = pd->requested_pdo = 0; + pd->rdo = 0; rx_msg_cleanup(pd); reset_vdm_state(pd); + kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE); if (pd->current_pr == PR_SINK) { usbpd_set_state(pd, PE_SNK_TRANSITION_TO_DEFAULT); @@ -1845,8 +1849,10 @@ static void usbpd_sm(struct work_struct *w) pd_send_hard_reset(pd); pd->in_explicit_contract = false; + pd->rdo = 0; rx_msg_cleanup(pd); reset_vdm_state(pd); + kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE); pd->current_state = PE_SRC_TRANSITION_TO_DEFAULT; kick_sm(pd, PS_HARD_RESET_TIME); @@ -2166,7 +2172,10 @@ static void usbpd_sm(struct work_struct *w) pd_send_hard_reset(pd); pd->in_explicit_contract = false; + pd->selected_pdo = pd->requested_pdo = 0; + pd->rdo = 0; reset_vdm_state(pd); + kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE); usbpd_set_state(pd, PE_SNK_TRANSITION_TO_DEFAULT); break; |
