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

Commit 33e4ee21 authored by Harry Yang's avatar Harry Yang
Browse files

power: smb5: Fix a possible reverse boost



If a PD hard reset occurs while the device is charging with charge
pump (CP) enabled, SMB_EN pin will go low. After hard reset, it is
occasionally observed that the moment SMB_EN pin goes high, switcher
is already enabled, which causes reverse boost issue.

Disable the CP switcher during PD hard reset, and re-enable it
with some delay after SMB_EN pin goes high when the input is
present.

Change-Id: Ie8182ae9425367792327683436f01c9436d66e08
Signed-off-by: default avatarHarry Yang <harryy@codeaurora.org>
parent 4c16f4bd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3033,6 +3033,7 @@ static struct smb_irq_info smb5_irqs[] = {
	},
	[SMB_EN_IRQ] = {
		.name		= "smb-en",
		.handler	= smb_en_irq_handler,
	},
	[IMP_TRIGGER_IRQ] = {
		.name		= "imp-trigger",
+35 −0
Original line number Diff line number Diff line
@@ -4508,6 +4508,41 @@ irqreturn_t sdam_sts_change_irq_handler(int irq, void *data)
	return IRQ_HANDLED;
}

irqreturn_t smb_en_irq_handler(int irq, void *data)
{
	struct smb_irq_data *irq_data = data;
	struct smb_charger *chg = irq_data->parent_data;
	int rc, input_present;

	if (!chg->cp_disable_votable) {
		chg->cp_disable_votable = find_votable("CP_DISABLE");
		if (!chg->cp_disable_votable)
			return IRQ_HANDLED;
	}

	if (chg->pd_hard_reset) {
		vote(chg->cp_disable_votable, BOOST_BACK_VOTER, true, 0);
		return IRQ_HANDLED;
	}

	rc = smblib_is_input_present(chg, &input_present);
	if (rc < 0) {
		pr_err("Couldn't get usb presence status rc=%d\n", rc);
		return IRQ_HANDLED;
	}

	if (input_present) {
		/*
		 * Add some delay to enable SMB1390 switcher after SMB_EN
		 * pin goes high
		 */
		usleep_range(1000, 1100);
		vote(chg->cp_disable_votable, BOOST_BACK_VOTER, false, 0);
	}

	return IRQ_HANDLED;
}

#define CHG_TERM_WA_ENTRY_DELAY_MS		300000		/* 5 min */
#define CHG_TERM_WA_EXIT_DELAY_MS		60000		/* 1 min */
static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status)
+1 −0
Original line number Diff line number Diff line
@@ -596,6 +596,7 @@ int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);

irqreturn_t default_irq_handler(int irq, void *data);
irqreturn_t smb_en_irq_handler(int irq, void *data);
irqreturn_t chg_state_change_irq_handler(int irq, void *data);
irqreturn_t batt_temp_changed_irq_handler(int irq, void *data);
irqreturn_t batt_psy_changed_irq_handler(int irq, void *data);