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

Commit 20ae1915 authored by Nicholas Troast's avatar Nicholas Troast Committed by Harry Yang
Browse files

smb-lib: rerun AICL when PD voltage changes



When the PD voltage changes AICL needs to be rerun to increase the input
current. Do it.

Change-Id: Ifa49547037d17c3ec2f01b6ac70faa310585825a
Signed-off-by: default avatarNicholas Troast <ntroast@codeaurora.org>
parent 9e2bb12c
Loading
Loading
Loading
Loading
+41 −17
Original line number Diff line number Diff line
@@ -920,7 +920,6 @@ static int smblib_usb_icl_vote_callback(struct votable *votable, void *data,

enable_icl_changed_interrupt:
	enable_irq(chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq);

	return rc;
}

@@ -1719,33 +1718,54 @@ int smblib_set_prop_system_temp_level(struct smb_charger *chg,

int smblib_rerun_aicl(struct smb_charger *chg)
{
	int rc = 0;
	u8 val;
	int rc, settled_icl_ua;
	u8 stat;

	/*
	 * Use restart_AICL instead of trigger_AICL as it runs the
	 * complete AICL instead of starting from the last settled value.
	 *
	 * 8998 only supports trigger_AICL return error for 8998
	 */
	rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
	if (rc < 0) {
		smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
								rc);
		return rc;
	}

	/* USB is suspended so skip re-running AICL */
	if (stat & USBIN_SUSPEND_STS_BIT)
		return rc;

	smblib_dbg(chg, PR_MISC, "re-running AICL\n");
	switch (chg->smb_version) {
	case PMI8998_SUBTYPE:
		smblib_dbg(chg, PR_PARALLEL, "AICL rerun not supported\n");
		return -EINVAL;
		rc = smblib_get_charge_param(chg, &chg->param.icl_stat,
							&settled_icl_ua);
		if (rc < 0) {
			smblib_err(chg, "Couldn't get settled ICL rc=%d\n", rc);
			return rc;
		}

		vote(chg->usb_icl_votable, AICL_RERUN_VOTER, true,
				max(settled_icl_ua - chg->param.usb_icl.step_u,
				chg->param.usb_icl.step_u));
		vote(chg->usb_icl_votable, AICL_RERUN_VOTER, false, 0);
		break;
	case PM660_SUBTYPE:
		val = RESTART_AICL_BIT;
		/*
		 * Use restart_AICL instead of trigger_AICL as it runs the
		 * complete AICL instead of starting from the last settled
		 * value.
		 */
		rc = smblib_masked_write(chg, CMD_HVDCP_2_REG,
					RESTART_AICL_BIT, RESTART_AICL_BIT);
		if (rc < 0)
			smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n",
									rc);
		break;
	default:
		smblib_dbg(chg, PR_PARALLEL, "unknown SMB chip %d\n",
				chg->smb_version);
		return -EINVAL;
	}
	rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, val, val);
	if (rc < 0)
		smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n",
				rc);

	return rc;
	return 0;
}

static int smblib_dp_pulse(struct smb_charger *chg)
@@ -2402,6 +2422,10 @@ int smblib_set_prop_usb_voltage_max(struct smb_charger *chg,
	}

	chg->voltage_max_uv = max_uv;
	rc = smblib_rerun_aicl(chg);
	if (rc < 0)
		smblib_err(chg, "Couldn't re-run AICL rc=%d\n", rc);

	return rc;
}

+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ enum print_reason {
#define PL_DELAY_HVDCP_VOTER		"PL_DELAY_HVDCP_VOTER"
#define CTM_VOTER			"CTM_VOTER"
#define SW_QC3_VOTER			"SW_QC3_VOTER"
#define AICL_RERUN_VOTER		"AICL_RERUN_VOTER"

#define VCONN_MAX_ATTEMPTS	3
#define OTG_MAX_ATTEMPTS	3