Commit 47d8cf41 authored by Akinobu Mita's avatar Akinobu Mita Committed by Jonathan Cameron

iio: adc: ti-ads1015: use iio_device_claim_direct_mode()

While the iio buffer for the ti-ads1015 driver is enabled, reading the
raw ADC channel data is restricted.  We usually use the
iio_device_claim_direct_mode()/iio_device_release_direct_mode() pair for
that.

This change consequently reverses the locking order for the driver's
private lock and indio_dev->mlock which acquired by
iio_device_claim_direct_mode() internally. But it's safe because there is
no other dependency between these locks.

Cc: Daniel Baluta <daniel.baluta@gmail.com>
Cc: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 4de43d25
...@@ -347,34 +347,34 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, ...@@ -347,34 +347,34 @@ static int ads1015_read_raw(struct iio_dev *indio_dev,
int ret, idx; int ret, idx;
struct ads1015_data *data = iio_priv(indio_dev); struct ads1015_data *data = iio_priv(indio_dev);
mutex_lock(&indio_dev->mlock);
mutex_lock(&data->lock); mutex_lock(&data->lock);
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: { case IIO_CHAN_INFO_RAW: {
int shift = chan->scan_type.shift; int shift = chan->scan_type.shift;
if (iio_buffer_enabled(indio_dev)) { ret = iio_device_claim_direct_mode(indio_dev);
ret = -EBUSY; if (ret)
break; break;
}
ret = ads1015_set_power_state(data, true); ret = ads1015_set_power_state(data, true);
if (ret < 0) if (ret < 0)
break; goto release_direct;
ret = ads1015_get_adc_result(data, chan->address, val); ret = ads1015_get_adc_result(data, chan->address, val);
if (ret < 0) { if (ret < 0) {
ads1015_set_power_state(data, false); ads1015_set_power_state(data, false);
break; goto release_direct;
} }
*val = sign_extend32(*val >> shift, 15 - shift); *val = sign_extend32(*val >> shift, 15 - shift);
ret = ads1015_set_power_state(data, false); ret = ads1015_set_power_state(data, false);
if (ret < 0) if (ret < 0)
break; goto release_direct;
ret = IIO_VAL_INT; ret = IIO_VAL_INT;
release_direct:
iio_device_release_direct_mode(indio_dev);
break; break;
} }
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:
...@@ -393,7 +393,6 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, ...@@ -393,7 +393,6 @@ static int ads1015_read_raw(struct iio_dev *indio_dev,
break; break;
} }
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
mutex_unlock(&indio_dev->mlock);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment