staging: iio: adc: ad7192: use driver private lock to protect hardware state 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. In this driver, mlock was being used to protect hardware state changes. Replace it with a driver private lock. Also, as there are state changes in the ad7192_ write_raw function, a lock is added to prevent the concurrent state changes. Signed-off-by: Aastha Gupta <aastha.gupta4104@gmail.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
103f3afe91
commit
2db82e320d
|
@ -162,6 +162,7 @@ struct ad7192_state {
|
|||
u32 scale_avail[8][2];
|
||||
u8 gpocon;
|
||||
u8 devid;
|
||||
struct mutex lock; /* protect sensor state */
|
||||
|
||||
struct ad_sigma_delta sd;
|
||||
};
|
||||
|
@ -461,10 +462,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;
|
||||
|
@ -508,6 +509,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;
|
||||
|
@ -521,6 +523,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) {
|
||||
|
@ -630,6 +633,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);
|
||||
|
|
Loading…
Reference in a new issue