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

Commit 6e3630b5 authored by Jack Pham's avatar Jack Pham
Browse files

usb: dwc3-msm: Support external charging detection



External circuitry can perform USB charger detection, obviating
the need for the USB controller to read the D+/D- lines itself.
Notification of detected charger type would happen by way of the
power_supply_set_type() callback. This patch adds handling of
the POWER_SUPPLY_PROP_TYPE property to set the detected charger
type in the dwc3-msm driver and bypass the internal driver-based
detection routine.

Change-Id: Icf32bd418a189de901c5f47034ed0b0a317aef5f
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 1deb6375
Loading
Loading
Loading
Loading
+29 −0
Original line number Original line Diff line number Diff line
@@ -1458,6 +1458,11 @@ static void dwc3_start_chg_det(struct dwc3_charger *charger, bool start)
{
{
	struct dwc3_msm *mdwc = container_of(charger, struct dwc3_msm, charger);
	struct dwc3_msm *mdwc = container_of(charger, struct dwc3_msm, charger);


	/* Skip if charger type was already detected externally */
	if (mdwc->chg_state == USB_CHG_STATE_DETECTED &&
		charger->chg_type != DWC3_INVALID_CHARGER)
		return;

	if (start == false) {
	if (start == false) {
		dev_dbg(mdwc->dev, "canceling charging detection work\n");
		dev_dbg(mdwc->dev, "canceling charging detection work\n");
		cancel_delayed_work_sync(&mdwc->chg_work);
		cancel_delayed_work_sync(&mdwc->chg_work);
@@ -1904,6 +1909,30 @@ static int dwc3_msm_power_set_property_usb(struct power_supply *psy,
		break;
		break;
	case POWER_SUPPLY_PROP_TYPE:
	case POWER_SUPPLY_PROP_TYPE:
		psy->type = val->intval;
		psy->type = val->intval;

		switch (psy->type) {
		case POWER_SUPPLY_TYPE_USB:
			mdwc->charger.chg_type = DWC3_SDP_CHARGER;
			break;
		case POWER_SUPPLY_TYPE_USB_DCP:
			mdwc->charger.chg_type = DWC3_DCP_CHARGER;
			break;
		case POWER_SUPPLY_TYPE_USB_CDP:
			mdwc->charger.chg_type = DWC3_CDP_CHARGER;
			break;
		case POWER_SUPPLY_TYPE_USB_ACA:
			mdwc->charger.chg_type = DWC3_PROPRIETARY_CHARGER;
			break;
		default:
			mdwc->charger.chg_type = DWC3_INVALID_CHARGER;
			break;
		}

		if (mdwc->charger.chg_type != DWC3_INVALID_CHARGER)
			mdwc->chg_state = USB_CHG_STATE_DETECTED;

		dev_dbg(mdwc->dev, "%s: charger type: %s\n", __func__,
				chg_to_string(mdwc->charger.chg_type));
		break;
		break;
	default:
	default:
		return -EINVAL;
		return -EINVAL;