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

Commit 053485ca authored by Fenglin Wu's avatar Fenglin Wu
Browse files

power: supply: smblite: Only enable temp change IRQ when VBUS present



Charger die temperature monitoring in hardware will be always enabled
even when charger is absent. This helps flash driver to detect charger
die temperature status and set flash current correctly. In this case,
to avoid charger driver receiving unrelated charger die temperature
change interrupt, only enable this IRQ when charger is inserted.

Change-Id: I1a3e86a420df4015d3f3a6a888d45c5fdd46f54b
Signed-off-by: default avatarFenglin Wu <fenglinw@codeaurora.org>
parent 82e942f3
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1453,6 +1453,8 @@ static int smblite_post_init(struct smblite *chip)
		}
	}

	rerun_election(chg->temp_change_irq_disable_votable);

	return 0;
}

+35 −0
Original line number Diff line number Diff line
@@ -670,6 +670,30 @@ static int smblite_lib_icl_irq_disable_vote_callback(struct votable *votable,
	return 0;
}

static int smblite_lib_temp_change_irq_disable_vote_callback(
		struct votable *votable, void *data,
		int disable, const char *client)
{
	struct smb_charger *chg = data;

	if (!chg->irq_info[TEMP_CHANGE_IRQ].irq)
		return 0;

	if (chg->irq_info[TEMP_CHANGE_IRQ].enabled && disable) {
		if (chg->irq_info[TEMP_CHANGE_IRQ].wake)
			disable_irq_wake(chg->irq_info[TEMP_CHANGE_IRQ].irq);
		disable_irq_nosync(chg->irq_info[TEMP_CHANGE_IRQ].irq);
	} else if (!chg->irq_info[TEMP_CHANGE_IRQ].enabled && !disable) {
		enable_irq(chg->irq_info[TEMP_CHANGE_IRQ].irq);
		if (chg->irq_info[TEMP_CHANGE_IRQ].wake)
			enable_irq_wake(chg->irq_info[TEMP_CHANGE_IRQ].irq);
	}

	chg->irq_info[TEMP_CHANGE_IRQ].enabled = !disable;

	return 0;
}

/********************
 * BATT PSY GETTERS *
 ********************/
@@ -2277,6 +2301,8 @@ void smblite_lib_usb_plugin_locked(struct smb_charger *chg)
	if (chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB)
		smblite_lib_micro_usb_plugin(chg, vbus_rising);

	vote(chg->temp_change_irq_disable_votable, DEFAULT_VOTER,
						!vbus_rising, 0);
	power_supply_changed(chg->usb_psy);
	smblite_lib_dbg(chg, PR_INTERRUPT, "IRQ: usbin-plugin %s\n",
					vbus_rising ? "attached" : "detached");
@@ -3278,6 +3304,15 @@ static int smblite_lib_create_votables(struct smb_charger *chg)
		return rc;
	}

	chg->temp_change_irq_disable_votable = create_votable(
			"TEMP_CHANGE_IRQ_DISABLE", VOTE_SET_ANY,
			smblite_lib_temp_change_irq_disable_vote_callback, chg);
	if (IS_ERR(chg->temp_change_irq_disable_votable)) {
		rc = PTR_ERR(chg->temp_change_irq_disable_votable);
		chg->temp_change_irq_disable_votable = NULL;
		return rc;
	}

	return rc;
}

+1 −0
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ struct smb_charger {
	struct votable		*chg_disable_votable;
	struct votable		*pl_enable_votable_indirect;
	struct votable		*icl_irq_disable_votable;
	struct votable		*temp_change_irq_disable_votable;

	/* work */
	struct work_struct	bms_update_work;