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

Commit 44b001d3 authored by Bingzhe Cai's avatar Bingzhe Cai
Browse files

input: sensors: fix deadlock issue during accelerometer disabling.



Accelerometer mma8x5x driver may struck in disabling procedure due
to deadlock on workqueue flush.

Change-Id: Ibcd6ebe92bc2fece459fde5f76e5bfe1f90586a0
Signed-off-by: default avatarBingzhe Cai <bingzhec@codeaurora.org>
parent 018ecdd9
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -503,10 +503,13 @@ static void mma8x5x_dev_poll(struct work_struct *work)
{
	struct mma8x5x_data *pdata = container_of((struct delayed_work *)work,
				struct mma8x5x_data, dwork);

	if ((pdata->active & MMA_STATE_MASK) == MMA_ACTIVED) {
		mma8x5x_report_data(pdata);
		schedule_delayed_work(&pdata->dwork,
					msecs_to_jiffies(pdata->poll_delay));
	}
}

static irqreturn_t mma8x5x_interrupt(int vec, void *data)
{
@@ -570,7 +573,7 @@ static int mma8x5x_enable_set(struct sensors_classdev *sensors_cdev,
				dev_err(&client->dev, "change device state failed!");
				goto err_failed;
			}

			if (!pdata->use_int)
				schedule_delayed_work(&pdata->dwork,
					msecs_to_jiffies(pdata->poll_delay));

@@ -580,8 +583,6 @@ static int mma8x5x_enable_set(struct sensors_classdev *sensors_cdev,
		}
	} else if (enable == 0) {
		if (pdata->active == MMA_ACTIVED) {
			cancel_delayed_work_sync(&pdata->dwork);

			val = i2c_smbus_read_byte_data(client,
					MMA8X5X_CTRL_REG1);
			if (val < 0) {
@@ -596,7 +597,10 @@ static int mma8x5x_enable_set(struct sensors_classdev *sensors_cdev,
				dev_err(&client->dev, "change device state failed!");
				goto err_failed;
			}

			/*
			 * Set standby state,
			 * polling work queue will stop after next call.
			 */
			pdata->active = MMA_STANDBY;
			dev_dbg(&client->dev, "%s:mma enable setting inactive.\n",
					__func__);