usb: pd: Notify charger when PR Swap is in progress
Charger driver needs to know when PR Swap is happening in order to avoid resetting state when the disconnect (which is expected) occurs. Utilize the new power supply PR_SWAP property to notify whenever PD is in PR Swap. Change-Id: I13fdbd4a3cf3e0716d48d1268795189f6b064598 Signed-off-by: Jack Pham <jackp@codeaurora.org>
This commit is contained in:
parent
ef4834bc69
commit
7805ee656a
1 changed files with 28 additions and 0 deletions
|
@ -571,6 +571,8 @@ static int pd_eval_src_caps(struct usbpd *pd)
|
|||
|
||||
static void pd_send_hard_reset(struct usbpd *pd)
|
||||
{
|
||||
union power_supply_propval val = {0};
|
||||
|
||||
usbpd_dbg(&pd->dev, "send hard reset");
|
||||
|
||||
/* Force CC logic to source/sink to keep Rp/Rd unchanged */
|
||||
|
@ -578,6 +580,7 @@ static void pd_send_hard_reset(struct usbpd *pd)
|
|||
pd->hard_reset_count++;
|
||||
pd_phy_signal(HARD_RESET_SIG, 5); /* tHardResetComplete */
|
||||
pd->in_pr_swap = false;
|
||||
power_supply_set_property(pd->usb_psy, POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
}
|
||||
|
||||
static void kick_sm(struct usbpd *pd, int ms)
|
||||
|
@ -716,6 +719,9 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
|
|||
switch (next_state) {
|
||||
case PE_ERROR_RECOVERY: /* perform hard disconnect/reconnect */
|
||||
pd->in_pr_swap = false;
|
||||
val.intval = 0;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
pd->current_pr = PR_NONE;
|
||||
set_power_role(pd, PR_NONE);
|
||||
pd->typec_mode = POWER_SUPPLY_TYPEC_NONE;
|
||||
|
@ -771,6 +777,9 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
|
|||
if (pd->in_pr_swap) {
|
||||
kick_sm(pd, SWAP_SOURCE_START_TIME);
|
||||
pd->in_pr_swap = false;
|
||||
val.intval = 0;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1564,6 +1573,9 @@ static void usbpd_sm(struct work_struct *w)
|
|||
rx_msg_cleanup(pd);
|
||||
|
||||
val.intval = 0;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
|
||||
|
||||
|
@ -1622,6 +1634,10 @@ static void usbpd_sm(struct work_struct *w)
|
|||
POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
|
||||
|
||||
pd->in_pr_swap = false;
|
||||
val.intval = 0;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
|
||||
pd->in_explicit_contract = false;
|
||||
pd->selected_pdo = pd->requested_pdo = 0;
|
||||
pd->rdo = 0;
|
||||
|
@ -1888,6 +1904,9 @@ static void usbpd_sm(struct work_struct *w)
|
|||
|
||||
case PE_SNK_WAIT_FOR_CAPABILITIES:
|
||||
pd->in_pr_swap = false;
|
||||
val.intval = 0;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
|
||||
if (IS_DATA(rx_msg, MSG_SOURCE_CAPABILITIES)) {
|
||||
val.intval = 0;
|
||||
|
@ -2066,6 +2085,9 @@ static void usbpd_sm(struct work_struct *w)
|
|||
}
|
||||
|
||||
pd->in_pr_swap = true;
|
||||
val.intval = 1;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
usbpd_set_state(pd, PE_PRS_SNK_SRC_TRANSITION_TO_OFF);
|
||||
break;
|
||||
} else if (IS_CTRL(rx_msg, MSG_VCONN_SWAP)) {
|
||||
|
@ -2209,6 +2231,9 @@ static void usbpd_sm(struct work_struct *w)
|
|||
|
||||
case PE_PRS_SRC_SNK_TRANSITION_TO_OFF:
|
||||
pd->in_pr_swap = true;
|
||||
val.intval = 1;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
pd->in_explicit_contract = false;
|
||||
|
||||
if (pd->vbus_enabled) {
|
||||
|
@ -2249,6 +2274,9 @@ static void usbpd_sm(struct work_struct *w)
|
|||
}
|
||||
|
||||
pd->in_pr_swap = true;
|
||||
val.intval = 1;
|
||||
power_supply_set_property(pd->usb_psy,
|
||||
POWER_SUPPLY_PROP_PR_SWAP, &val);
|
||||
usbpd_set_state(pd, PE_PRS_SNK_SRC_TRANSITION_TO_OFF);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue