diff options
author | Miquel Raynal <miquel.raynal@bootlin.com> | 2021-09-21 14:54:02 +0300 |
---|---|---|
committer | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2021-10-19 10:27:33 +0300 |
commit | 59fcc6af89ff2069436830be02ebfde76d79d2d8 (patch) | |
tree | 8e0affae937ba546f359e5bb073a70dc838d859d /drivers | |
parent | af8b93e27fb6cc74c0cf1e9b70ba01e85586d793 (diff) | |
download | linux-59fcc6af89ff2069436830be02ebfde76d79d2d8.tar.xz |
iio: adc: max1027: Prevent single channel accesses during buffer reads
When hardware buffers are enabled (the cnvst pin being the trigger), one
should not mess with the device state by requesting a single channel
read.
There is already a iio_buffer_enabled() check in *_read_single_value()
to merely prevent this situation but the check is inconsistent since
buffers can be enabled after the if clause anyway. Instead, use the core
mutex by calling iio_device_claim/release_direct_mode().
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/r/20210921115408.66711-11-miquel.raynal@bootlin.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/iio/adc/max1027.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/iio/adc/max1027.c b/drivers/iio/adc/max1027.c index 33f89f902b83..a3ab88bbe5ae 100644 --- a/drivers/iio/adc/max1027.c +++ b/drivers/iio/adc/max1027.c @@ -311,10 +311,9 @@ static int max1027_read_single_value(struct iio_dev *indio_dev, int ret; struct max1027_state *st = iio_priv(indio_dev); - if (iio_buffer_enabled(indio_dev)) { - dev_warn(&indio_dev->dev, "trigger mode already enabled"); - return -EBUSY; - } + ret = iio_device_claim_direct_mode(indio_dev); + if (ret) + return ret; /* Configure conversion register with the requested chan */ st->reg = MAX1027_CONV_REG | MAX1027_CHAN(chan->channel) | @@ -325,6 +324,7 @@ static int max1027_read_single_value(struct iio_dev *indio_dev, if (ret < 0) { dev_err(&indio_dev->dev, "Failed to configure conversion register\n"); + iio_device_release_direct_mode(indio_dev); return ret; } @@ -337,6 +337,9 @@ static int max1027_read_single_value(struct iio_dev *indio_dev, /* Read result */ ret = spi_read(st->spi, st->buffer, (chan->type == IIO_TEMP) ? 4 : 2); + + iio_device_release_direct_mode(indio_dev); + if (ret < 0) return ret; |