summaryrefslogtreecommitdiff
path: root/drivers/iio/imu
diff options
context:
space:
mode:
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>2018-11-17 19:04:27 +0100
committerJonathan Cameron <Jonathan.Cameron@huawei.com>2018-11-25 14:06:30 +0000
commit3aed83caa2f7370a04cc0be0e86d0939eba0c5f7 (patch)
tree3295837a7a1830d47ff2c46f4187c9c2b2949f3b /drivers/iio/imu
parent8611b69e95464da1458c1430c64b147b0f51058a (diff)
downloadlwn-3aed83caa2f7370a04cc0be0e86d0939eba0c5f7.tar.gz
lwn-3aed83caa2f7370a04cc0be0e86d0939eba0c5f7.zip
iio: imu: st_lsm6dsx: do not use a fixed read len in read_oneshot
Generalize st_lsm6dsx_shub_read_oneshot in order to not use a fixed read length and take into account iio channel realbits for single read operations Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Diffstat (limited to 'drivers/iio/imu')
-rw-r--r--drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
index ee59b0cac84f..8e47dccdd40f 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c
@@ -432,8 +432,8 @@ st_lsm6dsx_shub_read_oneshot(struct st_lsm6dsx_sensor *sensor,
struct iio_chan_spec const *ch,
int *val)
{
- int err, delay, len = ch->scan_type.realbits >> 3;
- __le16 data;
+ int err, delay, len;
+ u8 data[4];
err = st_lsm6dsx_shub_set_enable(sensor, true);
if (err < 0)
@@ -442,15 +442,17 @@ st_lsm6dsx_shub_read_oneshot(struct st_lsm6dsx_sensor *sensor,
delay = 1000000 / sensor->odr;
usleep_range(delay, 2 * delay);
- err = st_lsm6dsx_shub_read(sensor, ch->address, (u8 *)&data, len);
- if (err < 0)
- return err;
+ len = min_t(int, sizeof(data), ch->scan_type.realbits >> 3);
+ err = st_lsm6dsx_shub_read(sensor, ch->address, data, len);
st_lsm6dsx_shub_set_enable(sensor, false);
+ if (err < 0)
+ return err;
+
switch (len) {
case 2:
- *val = (s16)le16_to_cpu(data);
+ *val = (s16)le16_to_cpu(*((__le16 *)data));
break;
default:
return -EINVAL;