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

Commit 9660be9b authored by Jack Pham's avatar Jack Pham
Browse files

usb: pd: notify charger if source is PPS capable



The charger driver may need to perform different charging
behavior depending on whether the source is PPS capable or
not. This can be determined when evaluating the source
capabilities. If PPS capable, set PD_ACTIVE to 2. Use the
new enum definitions POWER_SUPPLY_PD_ACTIVE,
POWER_SUPPLY_PD_PPS_ACTIVE and POWER_SUPPLY_PD_INACTIVE
for better readability.

Change-Id: I2255fe404951e88a342095de21303358ae8ea50b
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 848f68e0
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -753,6 +753,7 @@ static int pd_eval_src_caps(struct usbpd *pd)
{
	int i;
	union power_supply_propval val;
	bool pps_found = false;
	u32 first_pdo = pd->received_pdos[0];

	if (PD_SRC_PDO_TYPE(first_pdo) != PD_SRC_PDO_TYPE_FIXED) {
@@ -768,10 +769,8 @@ static int pd_eval_src_caps(struct usbpd *pd)
	power_supply_set_property(pd->usb_psy,
			POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED, &val);

	if (pd->spec_rev == USBPD_REV_30 && !rev3_sink_only) {
		bool pps_found = false;

		/* downgrade to 2.0 if no PPS */
	/* Check for PPS APDOs */
	if (pd->spec_rev == USBPD_REV_30) {
		for (i = 1; i < PD_MAX_DATA_OBJ; i++) {
			if ((PD_SRC_PDO_TYPE(pd->received_pdos[i]) ==
					PD_SRC_PDO_TYPE_AUGMENTED) &&
@@ -780,10 +779,18 @@ static int pd_eval_src_caps(struct usbpd *pd)
				break;
			}
		}
		if (!pps_found)

		/* downgrade to 2.0 if no PPS */
		if (!pps_found && !rev3_sink_only)
			pd->spec_rev = USBPD_REV_20;
	}

	val.intval = pps_found ?
			POWER_SUPPLY_PD_PPS_ACTIVE :
			POWER_SUPPLY_PD_ACTIVE;
	power_supply_set_property(pd->usb_psy,
			POWER_SUPPLY_PROP_PD_ACTIVE, &val);

	/* Select the first PDO (vSafe5V) immediately. */
	pd_select_pdo(pd, 1, 0, 0);

@@ -2140,7 +2147,7 @@ static void usbpd_sm(struct work_struct *w)
				usbpd_dbg(&pd->dev, "Src CapsCounter exceeded, disabling PD\n");
				usbpd_set_state(pd, PE_SRC_DISABLED);

				val.intval = 0;
				val.intval = POWER_SUPPLY_PD_INACTIVE;
				power_supply_set_property(pd->usb_psy,
						POWER_SUPPLY_PROP_PD_ACTIVE,
						&val);
@@ -2160,7 +2167,7 @@ static void usbpd_sm(struct work_struct *w)
		pd->current_state = PE_SRC_SEND_CAPABILITIES_WAIT;
		kick_sm(pd, SENDER_RESPONSE_TIME);

		val.intval = 1;
		val.intval = POWER_SUPPLY_PD_ACTIVE;
		power_supply_set_property(pd->usb_psy,
				POWER_SUPPLY_PROP_PD_ACTIVE, &val);
		break;
@@ -2352,10 +2359,6 @@ static void usbpd_sm(struct work_struct *w)
			pd->src_cap_id++;

			usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);

			val.intval = 1;
			power_supply_set_property(pd->usb_psy,
					POWER_SUPPLY_PROP_PD_ACTIVE, &val);
		} else if (pd->hard_reset_count < 3) {
			usbpd_set_state(pd, PE_SNK_HARD_RESET);
		} else {
@@ -2366,7 +2369,7 @@ static void usbpd_sm(struct work_struct *w)
					POWER_SUPPLY_PROP_PD_IN_HARD_RESET,
					&val);

			val.intval = 0;
			val.intval = POWER_SUPPLY_PD_INACTIVE;
			power_supply_set_property(pd->usb_psy,
					POWER_SUPPLY_PROP_PD_ACTIVE, &val);
		}