Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: pressure: mpl3115: 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 <amsfield22@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Alison Schofield and committed by
Jonathan Cameron
ac139805 79de2ee4

+17 -9
+17 -9
drivers/iio/pressure/mpl3115.c
··· 82 82 83 83 switch (mask) { 84 84 case IIO_CHAN_INFO_RAW: 85 - if (iio_buffer_enabled(indio_dev)) 86 - return -EBUSY; 85 + ret = iio_device_claim_direct_mode(indio_dev); 86 + if (ret) 87 + return ret; 87 88 88 89 switch (chan->type) { 89 90 case IIO_PRESSURE: /* in 0.25 pascal / LSB */ ··· 92 91 ret = mpl3115_request(data); 93 92 if (ret < 0) { 94 93 mutex_unlock(&data->lock); 95 - return ret; 94 + break; 96 95 } 97 96 ret = i2c_smbus_read_i2c_block_data(data->client, 98 97 MPL3115_OUT_PRESS, 3, (u8 *) &tmp); 99 98 mutex_unlock(&data->lock); 100 99 if (ret < 0) 101 - return ret; 100 + break; 102 101 *val = be32_to_cpu(tmp) >> 12; 103 - return IIO_VAL_INT; 102 + ret = IIO_VAL_INT; 103 + break; 104 104 case IIO_TEMP: /* in 0.0625 celsius / LSB */ 105 105 mutex_lock(&data->lock); 106 106 ret = mpl3115_request(data); 107 107 if (ret < 0) { 108 108 mutex_unlock(&data->lock); 109 - return ret; 109 + break; 110 110 } 111 111 ret = i2c_smbus_read_i2c_block_data(data->client, 112 112 MPL3115_OUT_TEMP, 2, (u8 *) &tmp); 113 113 mutex_unlock(&data->lock); 114 114 if (ret < 0) 115 - return ret; 115 + break; 116 116 *val = sign_extend32(be32_to_cpu(tmp) >> 20, 11); 117 - return IIO_VAL_INT; 117 + ret = IIO_VAL_INT; 118 + break; 118 119 default: 119 - return -EINVAL; 120 + ret = -EINVAL; 121 + break; 120 122 } 123 + 124 + iio_device_release_direct_mode(indio_dev); 125 + return ret; 126 + 121 127 case IIO_CHAN_INFO_SCALE: 122 128 switch (chan->type) { 123 129 case IIO_PRESSURE: