staging: iio: adc: ad7192: use private driver lock to protect hardware changes
Subsystems (4)
v2 cover staging: iio: adc: ad7192: use private driver lock to protect hardware changes
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.
These patches
- replace mlock with private driver lock
- add lock where there are hardware state changes
Changes in v2:
- more descriptive commit messages
Aastha Gupta (2):
staging: iio: adc: ad7192: Replace mlock with driver private lock
staging: iio: adc: ad7192: add lock to protect hardware state changes
drivers/staging/iio/adc/ad7192.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
Signature · 1 line
2.7.4
PATCH v2 1/2 staging: iio: adc: ad7192: 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.
--- drivers/staging/iio/adc/ad7192.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/staging/iio/adc/ad7192.c +5 -2
@@ -162,6 +162,7 @@ struct ad7192_state {u32 scale_avail[8 ][2 ];u8 gpocon;u8 devid; +struct mutex lock;struct ad_sigma_delta sd; };
@@ -463,10 +464,10 @@ static int ad7192_read_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_SCALE :switch (chan->type) {case IIO_VOLTAGE : -mutex_lock (&indio_dev->mlock); +mutex_lock (&st->lock); *val = st->scale_avail[AD7192_CONF_GAIN (st->conf)][0 ]; *val2 = st->scale_avail[AD7192_CONF_GAIN (st->conf)][1 ]; -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&st->lock);return IIO_VAL_INT_PLUS_NANO ;case IIO_TEMP : *val =0 ;
@@ -634,6 +635,8 @@ static int ad7192_probe(struct spi_device *spi) st =iio_priv (indio_dev); +mutex_init (&st->lock); + st->avdd =devm_regulator_get (&spi->dev,"avdd" );if (IS_ERR (st->avdd))return PTR_ERR (st->avdd);
Signature · 1 line
2.7.4
PATCH v2 2/2 staging: iio: adc: ad7192: add lock to protect hardware state changes
In reply to Aastha GuptaThe 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, private driver lock is being used to protect hardware state changes as here state variables are being changed.
--- drivers/staging/iio/adc/ad7192.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/staging/iio/adc/ad7192.c +2 -0
@@ -511,6 +511,7 @@ static int ad7192_write_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_SCALE : ret = -EINVAL ; +mutex_lock (&st->lock);for (i =0 ; i <ARRAY_SIZE (st->scale_avail); i++)if (val2 == st->scale_avail[i][1 ]) { ret =0 ;
@@ -524,6 +525,7 @@ static int ad7192_write_raw(struct iio_dev *indio_dev,ad7192_calibrate_all (st);break ; } +mutex_unlock (&st->lock);break ;case IIO_CHAN_INFO_SAMP_FREQ :if (!val) {
Signature · 1 line
2.7.4
Quoted 7 lines · Aastha Gupta
The IIO subsystem is redefining
iio_dev->mlockto be used by the IIO core only for protecting device operating mode changes. ie. Changes betweenINDIO_DIRECT_MODE, INDIO_BUFFER_* modes.These patches
- replace mlock with private driver lock
- add lock where there are hardware state changes
For this to make sense both changes need to be in the same patch. You are removing the protection in patch 1 and then adding it back in patch 2. A patch series shouldn't leave the driver in a broken intermediate state if only part of the series is applied.