iio: magnetometer: mag3110: claim direct mode during raw writes
PATCH 1/1 iio: magnetometer: mag3110: claim direct mode during raw writes
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 writes.
Signed-off-by Alison Schofield <[email protected]>
--- drivers/iio/magnetometer/mag3110.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)
drivers/iio/magnetometer/mag3110.c +20 -10
@@ -222,29 +222,39 @@ static int mag3110_write_raw(struct iio_dev *indio_dev, int val, int val2, long mask) { struct mag3110_data *data = iio_priv(indio_dev); -int rate; +int rate, ret; -if (iio_buffer_enabled (indio_dev)) -return -EBUSY ; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret;switch (mask) {case IIO_CHAN_INFO_SAMP_FREQ : rate =mag3110_get_samp_freq_index (data, val, val2); -if (rate <0 ) -return -EINVAL ; +if (rate <0 ) { + ret = -EINVAL ; +break ; + } data->ctrl_reg1 &= ~MAG3110_CTRL_DR_MASK ; data->ctrl_reg1 |= rate <<MAG3110_CTRL_DR_SHIFT ; -return i2c_smbus_write_byte_data (data->client, + ret =i2c_smbus_write_byte_data (data->client,MAG3110_CTRL_REG1 , data->ctrl_reg1); +break ;case IIO_CHAN_INFO_CALIBBIAS : -if (val <-10000 || val >10000 ) -return -EINVAL ; -return i2c_smbus_write_word_swapped (data->client, +if (val <-10000 || val >10000 ) { + ret = -EINVAL ; +break ; + } + ret =i2c_smbus_write_word_swapped (data->client,MAG3110_OFF_X +2 * chan->scan_index, val <<1 ); +break ;default : -return -EINVAL ; + ret = -EINVAL ; +break ; } +iio_device_release_direct_mode (indio_dev); +return ret; }static irqreturn_t mag3110_trigger_handler (int irq,void *p)
Signature · 1 line
2.1.4
Quoted 4 lines
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 writes.
looks good,
Quoted 60 lines
Signed-off-by Alison Schofield <[email protected]>--- drivers/iio/magnetometer/mag3110.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)drivers/iio/magnetometer/mag3110.c +20
-10@@ -222,29 +222,39 @@ static int mag3110_write_raw(struct iio_dev *indio_dev, int val, int val2, long mask) { struct mag3110_data *data = iio_priv(indio_dev); -int rate; +int rate, ret; -if (iio_buffer_enabled (indio_dev)) -return -EBUSY ; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret;switch (mask) {case IIO_CHAN_INFO_SAMP_FREQ : rate =mag3110_get_samp_freq_index (data, val, val2); -if (rate <0 ) -return -EINVAL ; +if (rate <0 ) { + ret = -EINVAL ; +break ; + } data->ctrl_reg1 &= ~MAG3110_CTRL_DR_MASK ; data->ctrl_reg1 |= rate <<MAG3110_CTRL_DR_SHIFT ; -return i2c_smbus_write_byte_data (data->client, + ret =i2c_smbus_write_byte_data (data->client,MAG3110_CTRL_REG1 , data->ctrl_reg1); +break ;case IIO_CHAN_INFO_CALIBBIAS : -if (val <-10000 || val >10000 ) -return -EINVAL ; -return i2c_smbus_write_word_swapped (data->client, +if (val <-10000 || val >10000 ) { + ret = -EINVAL ; +break ; + } + ret =i2c_smbus_write_word_swapped (data->client,MAG3110_OFF_X +2 * chan->scan_index, val <<1 ); +break ;default : -return -EINVAL ; + ret = -EINVAL ; +break ; } +iio_device_release_direct_mode (indio_dev); +return ret; }static irqreturn_t mag3110_trigger_handler (int irq,void *p)
Signature · 2 lines
Peter Meerwald-Stadler +43-664-2444418 (mobile)
Jonathan Cameron
maintainerQuoted 7 lines · Peter Meerwald-Stadler
Quoted 4 lines
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 writes.
looks good,
Applied to the togreg branch of iio.git - initially pushed out as testing etc..
Jonathan
Quoted 62 lines
Quoted 61 lines
Signed-off-by Alison Schofield <[email protected]>--- drivers/iio/magnetometer/mag3110.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)drivers/iio/magnetometer/mag3110.c +20
-10@@ -222,29 +222,39 @@ static int mag3110_write_raw(struct iio_dev *indio_dev, int val, int val2, long mask) { struct mag3110_data *data = iio_priv(indio_dev); -int rate; +int rate, ret; -if (iio_buffer_enabled (indio_dev)) -return -EBUSY ; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret;switch (mask) {case IIO_CHAN_INFO_SAMP_FREQ : rate =mag3110_get_samp_freq_index (data, val, val2); -if (rate <0 ) -return -EINVAL ; +if (rate <0 ) { + ret = -EINVAL ; +break ; + } data->ctrl_reg1 &= ~MAG3110_CTRL_DR_MASK ; data->ctrl_reg1 |= rate <<MAG3110_CTRL_DR_SHIFT ; -return i2c_smbus_write_byte_data (data->client, + ret =i2c_smbus_write_byte_data (data->client,MAG3110_CTRL_REG1 , data->ctrl_reg1); +break ;case IIO_CHAN_INFO_CALIBBIAS : -if (val <-10000 || val >10000 ) -return -EINVAL ; -return i2c_smbus_write_word_swapped (data->client, +if (val <-10000 || val >10000 ) { + ret = -EINVAL ; +break ; + } + ret =i2c_smbus_write_word_swapped (data->client,MAG3110_OFF_X +2 * chan->scan_index, val <<1 ); +break ;default : -return -EINVAL ; + ret = -EINVAL ; +break ; } +iio_device_release_direct_mode (indio_dev); +return ret; }static irqreturn_t mag3110_trigger_handler (int irq,void *p)