Skip to content

Commit

Permalink
iio: pressure: mpl3115: claim direct mode during raw reads
Browse files Browse the repository at this point in the history
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]>
Signed-off-by: Jonathan Cameron <[email protected]>
  • Loading branch information
AlisonSchofield authored and jic23 committed Oct 23, 2016
1 parent 79de2ee commit ac13980
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions drivers/iio/pressure/mpl3115.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,41 +82,49 @@ static int mpl3115_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_PRESSURE: /* in 0.25 pascal / LSB */
mutex_lock(&data->lock);
ret = mpl3115_request(data);
if (ret < 0) {
mutex_unlock(&data->lock);
return ret;
break;
}
ret = i2c_smbus_read_i2c_block_data(data->client,
MPL3115_OUT_PRESS, 3, (u8 *) &tmp);
mutex_unlock(&data->lock);
if (ret < 0)
return ret;
break;
*val = be32_to_cpu(tmp) >> 12;
return IIO_VAL_INT;
ret = IIO_VAL_INT;
break;
case IIO_TEMP: /* in 0.0625 celsius / LSB */
mutex_lock(&data->lock);
ret = mpl3115_request(data);
if (ret < 0) {
mutex_unlock(&data->lock);
return ret;
break;
}
ret = i2c_smbus_read_i2c_block_data(data->client,
MPL3115_OUT_TEMP, 2, (u8 *) &tmp);
mutex_unlock(&data->lock);
if (ret < 0)
return ret;
break;
*val = sign_extend32(be32_to_cpu(tmp) >> 20, 11);
return IIO_VAL_INT;
ret = IIO_VAL_INT;
break;
default:
return -EINVAL;
ret = -EINVAL;
break;
}

iio_device_release_direct_mode(indio_dev);
return ret;

case IIO_CHAN_INFO_SCALE:
switch (chan->type) {
case IIO_PRESSURE:
Expand Down

0 comments on commit ac13980

Please sign in to comment.