iio: magnetometer: mag3110: claim direct mode during raw reads
PATCH 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.
--- drivers/iio/magnetometer/mag3110.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
drivers/iio/magnetometer/mag3110.c +13 -8
@@ -154,34 +154,39 @@ 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 ;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 ;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
Jonathan Cameron
maintainerQuoted 24 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]>--- drivers/iio/magnetometer/mag3110.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)drivers/iio/magnetometer/mag3110.c +3
-2@@ -154,34 +154,39 @@ 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;
drivers/iio/magnetometer/mag3110.c static int mag3110_read_raw(struct iio_dev *indio_dev, · line 168
Quoted 10 lines
drivers/iio/magnetometer/mag3110.c +2
-2switch (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 ;
No break?
Quoted 7 lines
drivers/iio/magnetometer/mag3110.c +1
-1case 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;
drivers/iio/magnetometer/mag3110.c static int mag3110_read_raw(struct iio_dev *indio_dev, · line 182
Quoted 10 lines
drivers/iio/magnetometer/mag3110.c +2
-2} 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 ;
No break here either....
Quoted 12 lines
drivers/iio/magnetometer/mag3110.c +5
-1default : -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 :
Quoted 25 lines · Jonathan Cameron
Quoted 24 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]>--- drivers/iio/magnetometer/mag3110.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)drivers/iio/magnetometer/mag3110.c +3
-2@@ -154,34 +154,39 @@ 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;
Quoted 11 lines
drivers/iio/magnetometer/mag3110.c static int mag3110_read_raw(struct iio_dev *indio_dev, · line 168
Quoted 10 lines
drivers/iio/magnetometer/mag3110.c +2
-2switch (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 ;No break?
oops...needs one and the next case too. Thanks!
Quoted 31 lines
Quoted 7 lines
drivers/iio/magnetometer/mag3110.c +1
-1case 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;drivers/iio/magnetometer/mag3110.c static int mag3110_read_raw(struct iio_dev *indio_dev, · line 182
Quoted 10 lines
drivers/iio/magnetometer/mag3110.c +2
-2} 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 ;No break here either....
Quoted 12 lines
drivers/iio/magnetometer/mag3110.c +5
-1default : -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 :