iio: accel: msa311: Fix failure to release runtime pm if direct mode claim fails.
[ Upstream commit 60a0cf2ebab92011055ab7db6553c0fc3c546938 ]
Reorder the claiming of direct mode and runtime pm calls to simplify
handling a little. For correct error handling, after the reorder
iio_device_release_direct_mode() must be claimed in an error occurs
in pm_runtime_resume_and_get()
Fixes: 1ca2cfbc0c
("iio: add MEMSensing MSA311 3-axis accelerometer driver")
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250217140135.896574-7-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8bd1e85254
commit
7214c53e3c
@ -595,23 +595,25 @@ static int msa311_read_raw_data(struct iio_dev *indio_dev,
|
||||
__le16 axis;
|
||||
int err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = iio_device_claim_direct_mode(indio_dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err) {
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
mutex_lock(&msa311->lock);
|
||||
err = msa311_get_axis(msa311, chan, &axis);
|
||||
mutex_unlock(&msa311->lock);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (err) {
|
||||
dev_err(dev, "can't get axis %s (%pe)\n",
|
||||
chan->datasheet_name, ERR_PTR(err));
|
||||
@ -757,10 +759,6 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
unsigned int odr;
|
||||
int err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/*
|
||||
* Sampling frequency changing is prohibited when buffer mode is
|
||||
* enabled, because sometimes MSA311 chip returns outliers during
|
||||
@ -770,6 +768,12 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err) {
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = -EINVAL;
|
||||
for (odr = 0; odr < ARRAY_SIZE(msa311_odr_table); odr++)
|
||||
if (val == msa311_odr_table[odr].integral &&
|
||||
@ -780,11 +784,11 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
break;
|
||||
}
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (err)
|
||||
dev_err(dev, "can't update frequency (%pe)\n", ERR_PTR(err));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user