| From foo@baz Thu Nov 9 09:48:01 CET 2017 |
| From: Alison Schofield <amsfield22@gmail.com> |
| Date: Fri, 20 Jan 2017 12:22:58 -0800 |
| Subject: iio: pressure: ms5611: claim direct mode during oversampling changes |
| |
| From: Alison Schofield <amsfield22@gmail.com> |
| |
| |
| [ Upstream commit 3bc1abcddb24f55b9c251e03caa4f9bd22ff748b ] |
| |
| Driver was checking for direct mode before changing oversampling |
| ratios, but was not locking it. Use the claim/release helper |
| functions to guarantee the device stays in direct mode while the |
| oversampling ratios are being updated. Continue to use the drivers |
| private state lock to protect against conflicting direct mode access |
| of the state data. |
| |
| Signed-off-by: Alison Schofield <amsfield22@gmail.com> |
| Signed-off-by: Jonathan Cameron <jic23@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/pressure/ms5611_core.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/iio/pressure/ms5611_core.c |
| +++ b/drivers/iio/pressure/ms5611_core.c |
| @@ -308,6 +308,7 @@ static int ms5611_write_raw(struct iio_d |
| { |
| struct ms5611_state *st = iio_priv(indio_dev); |
| const struct ms5611_osr *osr = NULL; |
| + int ret; |
| |
| if (mask != IIO_CHAN_INFO_OVERSAMPLING_RATIO) |
| return -EINVAL; |
| @@ -321,12 +322,11 @@ static int ms5611_write_raw(struct iio_d |
| if (!osr) |
| return -EINVAL; |
| |
| - mutex_lock(&st->lock); |
| + ret = iio_device_claim_direct_mode(indio_dev); |
| + if (ret) |
| + return ret; |
| |
| - if (iio_buffer_enabled(indio_dev)) { |
| - mutex_unlock(&st->lock); |
| - return -EBUSY; |
| - } |
| + mutex_lock(&st->lock); |
| |
| if (chan->type == IIO_TEMP) |
| st->temp_osr = osr; |
| @@ -334,6 +334,8 @@ static int ms5611_write_raw(struct iio_d |
| st->pressure_osr = osr; |
| |
| mutex_unlock(&st->lock); |
| + iio_device_release_direct_mode(indio_dev); |
| + |
| return 0; |
| } |
| |