Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7805ee65 authored by Jack Pham's avatar Jack Pham
Browse files

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: default avatarJack Pham <jackp@codeaurora.org>
parent ef4834bc
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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;