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

Commit 922f8288 authored by Oliver Wang's avatar Oliver Wang Committed by Gerrit - the friendly Code Review server
Browse files

input: sensors: add ap3426 queue_work return value check



queue_work returns false if work was already on a queue. The work
won't get chance to run in that case. Add queue_work return value
check to fix ap3426 driver may hold a wake lock forever on race
conditions.

Change-Id: I43441e2db535af9155d3b62596e9590f7c23aa11
Signed-off-by: default avatarOliver Wang <mengmeng@codeaurora.org>
parent 64590efd
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -920,12 +920,13 @@ exit:
static irqreturn_t ap3426_irq_handler(int irq, void *data)
{
	struct ap3426_data *di = data;
	bool rc;

	rc = queue_work(di->workqueue, &di->report_work);
	/* wake up event should hold a wake lock until reported */
	if (atomic_inc_return(&di->wake_count) == 1)
	if (rc && (atomic_inc_return(&di->wake_count) == 1))
		pm_stay_awake(&di->i2c->dev);

	queue_work(di->workqueue, &di->report_work);

	return IRQ_HANDLED;
}
@@ -971,8 +972,10 @@ static void ap3426_report_work(struct work_struct *work)
	}

exit:
	if (atomic_dec_and_test(&di->wake_count))
	if (atomic_dec_and_test(&di->wake_count)) {
		pm_relax(&di->i2c->dev);
		dev_dbg(&di->i2c->dev, "wake lock released\n");
	}

	/* clear interrupt */
	if (di->power_enabled) {