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

Commit f82d21fd authored by Ashay Jaiswal's avatar Ashay Jaiswal
Browse files

power: smb5-lib: fix SMB EN override handling



SMB EN override is configure from multiple entry points,
use voting mechanism to control SMB EN override.

Change-Id: I4b8ec3a74a74d1cd1a7569652a5f9aafc1f978ad
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
parent f43dabe3
Loading
Loading
Loading
Loading
+34 −16
Original line number Diff line number Diff line
@@ -235,12 +235,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg,
			return rc;
		}
		/* Enable Charge Pump, under HW control */
		rc = smblib_write(chg, MISC_SMB_EN_CMD_REG,  EN_CP_CMD_BIT);
		rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
					EN_CP_CMD_BIT, EN_CP_CMD_BIT);
		if (rc < 0) {
			dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n",
						rc);
			return rc;
		}
		vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0);
		break;
	case POWER_SUPPLY_CHARGER_SEC_PL:
		/* select slave charger instead of Charge Pump */
@@ -252,12 +254,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg,
			return rc;
		}
		/* Enable slave charger, under HW control */
		rc = smblib_write(chg, MISC_SMB_EN_CMD_REG,  EN_STAT_CMD_BIT);
		rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
					EN_STAT_CMD_BIT, EN_STAT_CMD_BIT);
		if (rc < 0) {
			dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n",
						rc);
			return rc;
		}
		vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0);

		vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, false, 0);

@@ -267,13 +271,7 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg,
		vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, true, 0);

		/* SW override, disabling secondary charger(s) */
		rc = smblib_write(chg, MISC_SMB_EN_CMD_REG,
						SMB_EN_OVERRIDE_BIT);
		if (rc < 0) {
			dev_err(chg->dev, "Couldn't disable charging rc=%d\n",
						rc);
			return rc;
		}
		vote(chg->smb_override_votable, PL_SMB_EN_VOTER, true, 0);
		break;
	}

@@ -1327,6 +1325,21 @@ int smblib_toggle_smb_en(struct smb_charger *chg, int toggle)
/*********************
 * VOTABLE CALLBACKS *
 *********************/
static int smblib_smb_disable_override_vote_callback(struct votable *votable,
			void *data, int disable_smb, const char *client)
{
	struct smb_charger *chg = data;
	int rc = 0;

	/* Enable/disable SMB_EN pin */
	rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
			SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT,
			disable_smb ? SMB_EN_OVERRIDE_BIT : 0);
	if (rc < 0)
		smblib_err(chg, "Couldn't configure SMB_EN, rc=%d\n", rc);

	return rc;
}

static int smblib_dc_suspend_vote_callback(struct votable *votable, void *data,
			int suspend, const char *client)
@@ -2465,13 +2478,8 @@ static int smblib_process_thermal_readings(struct smb_charger *chg)
		if (chg->thermal_status == TEMP_ALERT_LEVEL)
			goto exit;

		/* Enable/disable SMB_EN pin */
		rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG,
			SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT,
			(disable_smb ? SMB_EN_OVERRIDE_BIT :
			(SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT)));
		if (rc < 0)
			smblib_err(chg, "Couldn't set SMB_EN, rc=%d\n", rc);
		vote(chg->smb_override_votable, SW_THERM_REGULATION_VOTER,
				disable_smb, 0);

		/*
		 * Enable/disable secondary charger through votables to ensure
@@ -5578,6 +5586,15 @@ static int smblib_create_votables(struct smb_charger *chg)

	vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0);

	chg->smb_override_votable = create_votable("SMB_EN_OVERRIDE",
				VOTE_SET_ANY,
				smblib_smb_disable_override_vote_callback, chg);
	if (IS_ERR(chg->smb_override_votable)) {
		rc = PTR_ERR(chg->smb_override_votable);
		chg->smb_override_votable = NULL;
		return rc;
	}

	chg->dc_suspend_votable = create_votable("DC_SUSPEND", VOTE_SET_ANY,
					smblib_dc_suspend_vote_callback,
					chg);
@@ -5681,6 +5698,7 @@ int smblib_init(struct smb_charger *chg)
	chg->jeita_configured = false;
	chg->sec_chg_selected = POWER_SUPPLY_CHARGER_SEC_NONE;
	chg->cp_reason = POWER_SUPPLY_CP_NONE;
	chg->thermal_status = TEMP_BELOW_RANGE;

	switch (chg->mode) {
	case PARALLEL_MASTER:
+1 −0
Original line number Diff line number Diff line
@@ -372,6 +372,7 @@ struct smb_charger {
	struct votable		*usb_irq_enable_votable;
	struct votable		*cp_disable_votable;
	struct votable		*wdog_snarl_irq_en_votable;
	struct votable		*smb_override_votable;

	/* work */
	struct work_struct	bms_update_work;