Commit acc3949a authored by Antoniu Miclaus's avatar Antoniu Miclaus Committed by Jonathan Cameron
Browse files

iio: gyro: mpu3050-core: fix pm_runtime error handling



The return value of pm_runtime_get_sync() is not checked, allowing
the driver to access hardware that may fail to resume. The device
usage count is also unconditionally incremented. Use
pm_runtime_resume_and_get() which propagates errors and avoids
incrementing the usage count on failure.

In preenable, add pm_runtime_put_autosuspend() on set_8khz_samplerate()
failure since postdisable does not run when preenable fails.

Fixes: 3904b28e ("iio: gyro: Add driver for the MPU-3050 gyroscope")
Reviewed-by: default avatarLinus Walleij <linusw@kernel.org>
Signed-off-by: default avatarAntoniu Miclaus <antoniu.miclaus@analog.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 91f950b4
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -322,7 +322,9 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
		}
	case IIO_CHAN_INFO_RAW:
		/* Resume device */
		pm_runtime_get_sync(mpu3050->dev);
		ret = pm_runtime_resume_and_get(mpu3050->dev);
		if (ret)
			return ret;
		mutex_lock(&mpu3050->lock);

		ret = mpu3050_set_8khz_samplerate(mpu3050);
@@ -647,14 +649,20 @@ static irqreturn_t mpu3050_trigger_handler(int irq, void *p)
static int mpu3050_buffer_preenable(struct iio_dev *indio_dev)
{
	struct mpu3050 *mpu3050 = iio_priv(indio_dev);
	int ret;

	pm_runtime_get_sync(mpu3050->dev);
	ret = pm_runtime_resume_and_get(mpu3050->dev);
	if (ret)
		return ret;

	/* Unless we have OUR trigger active, run at full speed */
	if (!mpu3050->hw_irq_trigger)
		return mpu3050_set_8khz_samplerate(mpu3050);
	if (!mpu3050->hw_irq_trigger) {
		ret = mpu3050_set_8khz_samplerate(mpu3050);
		if (ret)
			pm_runtime_put_autosuspend(mpu3050->dev);
	}

	return 0;
	return ret;
}

static int mpu3050_buffer_postdisable(struct iio_dev *indio_dev)