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

Commit e44e8944 authored by Anirudh Ghayal's avatar Anirudh Ghayal
Browse files

drivers: qpnp-bms: Use disable_irq_nosync() in IRQ context



Do not use disable_irq() as it waits for the irq handler
to complete causing a deadlock.

CRs-Fixed: 591227
Change-Id: I0a1d29845b3bced2fda6080765c20dff678050d4
Signed-off-by: default avatarAnirudh Ghayal <aghayal@codeaurora.org>
parent 9b7a320d
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -408,6 +408,14 @@ static void disable_bms_irq(struct bms_irq *irq)
	}
}

static void disable_bms_irq_nosync(struct bms_irq *irq)
{
	if (!__test_and_set_bit(0, &irq->disabled)) {
		disable_irq_nosync(irq->irq);
		pr_debug("disabled irq %d\n", irq->irq);
	}
}

#define HOLD_OREG_DATA		BIT(0)
static int lock_output_data(struct qpnp_bms_chip *chip)
{
@@ -3553,7 +3561,7 @@ static irqreturn_t bms_sw_cc_thr_irq_handler(int irq, void *_chip)
	struct qpnp_bms_chip *chip = _chip;

	pr_debug("sw_cc_thr irq triggered\n");
	disable_bms_irq(&chip->sw_cc_thr_irq);
	disable_bms_irq_nosync(&chip->sw_cc_thr_irq);
	bms_stay_awake(&chip->soc_wake_source);
	schedule_work(&chip->recalc_work);
	return IRQ_HANDLED;