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

Commit 71de40a1 authored by Fenglin Wu's avatar Fenglin Wu
Browse files

power: supply: smb5-lib: use spinlock to protect pr_lock_in_progress



API smblib_set_prop_typec_power_role() would be called from a hrtimer
callback which is in an interrupt context, it's not correct to use
cancel_delayed_work_sync() function inside. Change to use the
non-sleep version cancel_delayed_work() and use a spinlock to protect
the pr_lock_in_progress flag.

Change-Id: I0a2e6e63179250579d8b826eaa2c7192399e17e6
Signed-off-by: default avatarFenglin Wu <fenglinw@codeaurora.org>
parent eb85c6e5
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -4240,7 +4240,8 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg,

	smblib_dbg(chg, PR_MISC, "snk_attached = %d, src_attached = %d, is_pr_lock = %d\n",
			snk_attached, src_attached, is_pr_lock);
	cancel_delayed_work_sync(&chg->pr_lock_clear_work);
	cancel_delayed_work(&chg->pr_lock_clear_work);
	spin_lock(&chg->typec_pr_lock);
	if (!chg->pr_lock_in_progress && is_pr_lock) {
		smblib_dbg(chg, PR_MISC, "disable type-c interrupts for power role locking\n");
		smblib_typec_irq_config(chg, false);
@@ -4252,6 +4253,7 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg,
	}

	chg->pr_lock_in_progress = is_pr_lock;
	spin_unlock(&chg->typec_pr_lock);

	switch (val->intval) {
	case POWER_SUPPLY_TYPEC_PR_NONE:
@@ -6569,11 +6571,13 @@ static void smblib_pr_lock_clear_work(struct work_struct *work)
	struct smb_charger *chg = container_of(work, struct smb_charger,
						pr_lock_clear_work.work);

	spin_lock(&chg->typec_pr_lock);
	if (chg->pr_lock_in_progress) {
		smblib_dbg(chg, PR_MISC, "restore type-c interrupts\n");
		smblib_typec_irq_config(chg, true);
		chg->pr_lock_in_progress = false;
	}
	spin_unlock(&chg->typec_pr_lock);
}

static void smblib_pr_swap_detach_work(struct work_struct *work)
@@ -7336,6 +7340,7 @@ int smblib_init(struct smb_charger *chg)
	mutex_init(&chg->smb_lock);
	mutex_init(&chg->irq_status_lock);
	mutex_init(&chg->dcin_aicl_lock);
	spin_lock_init(&chg->typec_pr_lock);
	INIT_WORK(&chg->bms_update_work, bms_update_work);
	INIT_WORK(&chg->pl_update_work, pl_update_work);
	INIT_WORK(&chg->jeita_update_work, jeita_update_work);
+1 −0
Original line number Diff line number Diff line
@@ -385,6 +385,7 @@ struct smb_charger {
	struct mutex		ps_change_lock;
	struct mutex		irq_status_lock;
	struct mutex		dcin_aicl_lock;
	spinlock_t		typec_pr_lock;

	/* power supplies */
	struct power_supply		*batt_psy;