iio: magnetometer: mag3110: claim direct mode during raw reads
PATCH v2 1/1 iio: magnetometer: mag3110: claim direct mode during raw reads
Driver was checking for direct mode but not locking it. Use claim/release helper functions to guarantee the device stays in direct mode during raw reads.
Signed-off-by Alison Schofield <[email protected]>
Cc Daniel Baluta <[email protected]>
---
Changes in v2:
added breaks in switch to prevent fall through
drivers/iio/magnetometer/mag3110.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)
drivers/iio/magnetometer/mag3110.c +15 -8
@@ -154,34 +154,41 @@ static int mag3110_read_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_RAW : -if (iio_buffer_enabled (indio_dev)) -return -EBUSY ; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret;switch (chan->type) {case IIO_MAGN :/* in 0.1 uT / LSB */ ret =mag3110_read (data, buffer);if (ret <0 ) -return ret; + goto release; *val =sign_extend32 (be16_to_cpu (buffer[chan->scan_index]),15 ); -return IIO_VAL_INT ; + ret =IIO_VAL_INT ; +break ;case IIO_TEMP :/* in 1 C / LSB */ mutex_lock (&data->lock); ret =mag3110_request (data);if (ret <0 ) {mutex_unlock (&data->lock); -return ret; + goto release; } ret =i2c_smbus_read_byte_data (data->client,MAG3110_DIE_TEMP );mutex_unlock (&data->lock);if (ret <0 ) -return ret; + goto release; *val =sign_extend32 (ret,7 ); -return IIO_VAL_INT ; + ret =IIO_VAL_INT ; +break ;default : -return -EINVAL ; + ret = -EINVAL ; } +release: +iio_device_release_direct_mode (indio_dev); +return ret; +case IIO_CHAN_INFO_SCALE :switch (chan->type) {case IIO_MAGN :
Signature · 1 line
2.1.4
Quoted 6 lines · Alison Schofield
Driver was checking for direct mode but not locking it. Use claim/release helper functions to guarantee the device stays in direct mode during raw reads.
Signed-off-by Alison Schofield <[email protected]>Cc Daniel Baluta <[email protected]>
Applied to the togreg branch of iio.git. Initially pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 62 lines
---
Changes in v2:
added breaks in switch to prevent fall throughdrivers/iio/magnetometer/mag3110.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)drivers/iio/magnetometer/mag3110.c +15
-8@@ -154,34 +154,41 @@ static int mag3110_read_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_RAW : -if (iio_buffer_enabled (indio_dev)) -return -EBUSY ; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret;switch (chan->type) {case IIO_MAGN :/* in 0.1 uT / LSB */ ret =mag3110_read (data, buffer);if (ret <0 ) -return ret; + goto release; *val =sign_extend32 (be16_to_cpu (buffer[chan->scan_index]),15 ); -return IIO_VAL_INT ; + ret =IIO_VAL_INT ; +break ;case IIO_TEMP :/* in 1 C / LSB */ mutex_lock (&data->lock); ret =mag3110_request (data);if (ret <0 ) {mutex_unlock (&data->lock); -return ret; + goto release; } ret =i2c_smbus_read_byte_data (data->client,MAG3110_DIE_TEMP );mutex_unlock (&data->lock);if (ret <0 ) -return ret; + goto release; *val =sign_extend32 (ret,7 ); -return IIO_VAL_INT ; + ret =IIO_VAL_INT ; +break ;default : -return -EINVAL ; + ret = -EINVAL ; } +release: +iio_device_release_direct_mode (indio_dev); +return ret; +case IIO_CHAN_INFO_SCALE :switch (chan->type) {case IIO_MAGN :