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

Commit 4ed92c2c authored by Harry Yang's avatar Harry Yang Committed by Nicholas Troast
Browse files

qcom-charger: update qc charger detection for PMICv2



PMICv2 added irq support to tell if DCP is not QC charger.
Update charger driver for this HW change.

Change-Id: Ic75e2f1d528e6bbb3cf14c842b803bf4ebca8ad8
Signed-off-by: default avatarHarry Yang <harryy@codeaurora.org>
parent 7cb26033
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1102,6 +1102,7 @@ static int smb2_init_hw(struct smb2 *chip)

static int smb2_setup_wa_flags(struct smb2 *chip)
{
	struct smb_charger *chg = &chip->chg;
	struct pmic_revid_data *pmic_rev_id;
	struct device_node *revid_dev_node;

@@ -1124,6 +1125,8 @@ static int smb2_setup_wa_flags(struct smb2 *chip)

	switch (pmic_rev_id->pmic_subtype) {
	case PMICOBALT_SUBTYPE:
		if (pmic_rev_id->rev4 == PMICOBALT_V1P1_REV4) /* PMI rev 1.1 */
			chg->wa_flags |= QC_CHARGER_DETECTION_WA_BIT;
		break;
	default:
		pr_err("PMIC subtype %d not supported\n",
+19 −2
Original line number Diff line number Diff line
@@ -1953,6 +1953,18 @@ static void smblib_handle_hvdcp_3p0_auth_done(struct smb_charger *chg,
		   apsd_result->name);
}

static void smblib_handle_hvdcp_check_timeout(struct smb_charger *chg,
					      bool rising, bool qc_charger)
{
	if (rising && !qc_charger) {
		vote(chg->pd_allowed_votable, DEFAULT_VOTER, true, 0);
		power_supply_changed(chg->usb_psy);
	}

	smblib_dbg(chg, PR_INTERRUPT, "IRQ: smblib_handle_hvdcp_check_timeout %s\n",
		   rising ? "rising" : "falling");
}

/* triggers when HVDCP is detected */
static void smblib_handle_hvdcp_detect_done(struct smb_charger *chg,
					    bool rising)
@@ -1984,6 +1996,7 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
		vote(chg->pd_allowed_votable, DEFAULT_VOTER, true, 0);
		break;
	case DCP_CHARGER_BIT:
		if (chg->wa_flags & QC_CHARGER_DETECTION_WA_BIT)
			schedule_delayed_work(&chg->hvdcp_detect_work,
					      msecs_to_jiffies(HVDCP_DET_MS));
		break;
@@ -2019,6 +2032,10 @@ irqreturn_t smblib_handle_usb_source_change(int irq, void *data)
	smblib_handle_hvdcp_detect_done(chg,
		(bool)(stat & QC_CHARGER_BIT));

	smblib_handle_hvdcp_check_timeout(chg,
		(bool)(stat & HVDCP_CHECK_TIMEOUT_BIT),
		(bool)(stat & QC_CHARGER_BIT));

	smblib_handle_hvdcp_3p0_auth_done(chg,
		(bool)(stat & QC_AUTH_DONE_STATUS_BIT));

+4 −0
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@ enum smb_mode {
	NUM_MODES,
};

enum {
	QC_CHARGER_DETECTION_WA_BIT = BIT(0),
};

struct smb_regulator {
	struct regulator_dev	*rdev;
	struct regulator_desc	rdesc;
+1 −1
Original line number Diff line number Diff line
@@ -427,7 +427,7 @@ enum {

#define APSD_STATUS_REG			(USBIN_BASE + 0x07)
#define APSD_STATUS_7_BIT		BIT(7)
#define APSD_STATUS_6_BIT		BIT(6)
#define HVDCP_CHECK_TIMEOUT_BIT		BIT(6)
#define SLOW_PLUGIN_TIMEOUT_BIT		BIT(5)
#define ENUMERATION_DONE_BIT		BIT(4)
#define VADP_CHANGE_DONE_AFTER_AUTH_BIT	BIT(3)