|
@@ -162,6 +162,7 @@ struct ad7192_state {
|
|
u32 scale_avail[8][2];
|
|
u32 scale_avail[8][2];
|
|
u8 gpocon;
|
|
u8 gpocon;
|
|
u8 devid;
|
|
u8 devid;
|
|
|
|
+ struct mutex lock; /* protect sensor state */
|
|
|
|
|
|
struct ad_sigma_delta sd;
|
|
struct ad_sigma_delta sd;
|
|
};
|
|
};
|
|
@@ -461,10 +462,10 @@ static int ad7192_read_raw(struct iio_dev *indio_dev,
|
|
case IIO_CHAN_INFO_SCALE:
|
|
case IIO_CHAN_INFO_SCALE:
|
|
switch (chan->type) {
|
|
switch (chan->type) {
|
|
case IIO_VOLTAGE:
|
|
case IIO_VOLTAGE:
|
|
- mutex_lock(&indio_dev->mlock);
|
|
|
|
|
|
+ mutex_lock(&st->lock);
|
|
*val = st->scale_avail[AD7192_CONF_GAIN(st->conf)][0];
|
|
*val = st->scale_avail[AD7192_CONF_GAIN(st->conf)][0];
|
|
*val2 = st->scale_avail[AD7192_CONF_GAIN(st->conf)][1];
|
|
*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;
|
|
return IIO_VAL_INT_PLUS_NANO;
|
|
case IIO_TEMP:
|
|
case IIO_TEMP:
|
|
*val = 0;
|
|
*val = 0;
|
|
@@ -508,6 +509,7 @@ static int ad7192_write_raw(struct iio_dev *indio_dev,
|
|
switch (mask) {
|
|
switch (mask) {
|
|
case IIO_CHAN_INFO_SCALE:
|
|
case IIO_CHAN_INFO_SCALE:
|
|
ret = -EINVAL;
|
|
ret = -EINVAL;
|
|
|
|
+ mutex_lock(&st->lock);
|
|
for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
|
|
for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
|
|
if (val2 == st->scale_avail[i][1]) {
|
|
if (val2 == st->scale_avail[i][1]) {
|
|
ret = 0;
|
|
ret = 0;
|
|
@@ -521,6 +523,7 @@ static int ad7192_write_raw(struct iio_dev *indio_dev,
|
|
ad7192_calibrate_all(st);
|
|
ad7192_calibrate_all(st);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ mutex_unlock(&st->lock);
|
|
break;
|
|
break;
|
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
|
if (!val) {
|
|
if (!val) {
|
|
@@ -630,6 +633,8 @@ static int ad7192_probe(struct spi_device *spi)
|
|
|
|
|
|
st = iio_priv(indio_dev);
|
|
st = iio_priv(indio_dev);
|
|
|
|
|
|
|
|
+ mutex_init(&st->lock);
|
|
|
|
+
|
|
st->avdd = devm_regulator_get(&spi->dev, "avdd");
|
|
st->avdd = devm_regulator_get(&spi->dev, "avdd");
|
|
if (IS_ERR(st->avdd))
|
|
if (IS_ERR(st->avdd))
|
|
return PTR_ERR(st->avdd);
|
|
return PTR_ERR(st->avdd);
|