staging: ad7606: Replace mlock with driver private lock
Subsystems (4)
PATCH v3 1/1 staging: ad7606: Replace mlock with driver private lock
The IIO subsystem is redefining iio_dev->mlock to be used by the IIO core only for protecting device operating mode changes. ie. Changes between INDIO_DIRECT_MODE, INDIO_BUFFER_* modes.
In this driver, mlock was being used to protect hardware state changes. Replace it with a lock in the devices global data.
---
changes in v3
- Add mutex_init.
drivers/staging/iio/adc/ad7606.c | 9 +++++---- drivers/staging/iio/adc/ad7606.h | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-)
drivers/staging/iio/adc/ad7606.c +5 -4
@@ -208,7 +208,7 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_SCALE : ret = -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&st->lock);for (i =0 ; i <ARRAY_SIZE (scale_avail); i++)if (val2 == scale_avail[i][1 ]) {gpiod_set_value (st->gpio_range, i);
@@ -217,7 +217,7 @@ static int ad7606_write_raw(struct iio_dev *indio_dev, ret =0 ;break ; } -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&st->lock);return ret;case IIO_CHAN_INFO_OVERSAMPLING_RATIO :
@@ -231,11 +231,11 @@ static int ad7606_write_raw(struct iio_dev *indio_dev, values[1 ] = (ret >>1 ) &1 ; values[2 ] = (ret >>2 ) &1 ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&st->lock);gpiod_set_array_value (ARRAY_SIZE (values), st->gpio_os->desc, values); st->oversampling = val; -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&st->lock);return 0 ;default :
@@ -413,6 +413,7 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, st =iio_priv (indio_dev); st->dev = dev; +mutex_init (&st->lock); st->bops = bops; st->base_address = base_address;/* tied to logic low, analog input range is +/- 5V */
drivers/staging/iio/adc/ad7606.h +2 -0
@@ -14,6 +14,7 @@* @name: identification string for chip * @channels: channel specification * @num_channels: number of channels +* @lock protect sensor state */ struct ad7606_chip_info {
@@ -37,6 +38,7 @@ struct ad7606_state {bool done;void __iomem *base_address; +struct mutex lock;/* protect sensor state */ struct gpio_desc *gpio_convst;struct gpio_desc *gpio_reset;struct gpio_desc *gpio_range;
Signature · 1 line
2.11.0
On 03/20/2017 07:56 PM, Arushi Singhal wrote:
[...]
drivers/staging/iio/adc/ad7606.c int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, · line 416
Quoted 5 lines
drivers/staging/iio/adc/ad7606.c +1
-0@@ -413,6 +413,7 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, st =iio_priv (indio_dev); st->dev = dev; +mutex_init (&st->lock);
This is nitpicking, but putting this in the middle of the assignments has a bit of a weired flow it. Either put it above or below the assignments.
drivers/staging/iio/adc/ad7606.h line 17
Quoted 12 lines
drivers/staging/iio/adc/ad7606.c +0
-0st->bops = bops; st->base_address = base_address;/* tied to logic low, analog input range is +/- 5V */ drivers/staging/iio/adc/ad7606.h +1
-0@@ -14,6 +14,7 @@* @name: identification string for chip * @channels: channel specification * @num_channels: number of channels +* @lock protect sensor state
This documentation is for struct ad7607_chip_info, but you are adding the field to struct ad7606_state.
Quoted 12 lines
drivers/staging/iio/adc/ad7606.h +1
-0*/ struct ad7606_chip_info {@@ -37,6 +38,7 @@ struct ad7606_state {bool done;void __iomem *base_address; +struct mutex lock;/* protect sensor state */ struct gpio_desc *gpio_convst;struct gpio_desc *gpio_reset;struct gpio_desc *gpio_range;