aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrina Tirdea <irina.tirdea@intel.com>2016-03-29 08:35:45 -0400
committerJonathan Cameron <jic23@kernel.org>2016-04-03 06:16:11 -0400
commit2215f31dc6f88634c1916362e922b1ecdce0a6b3 (patch)
tree91692db1d75e0cef5b85494a930d8c329e9e5fa2
parent9b090a98e95c2530ef0ce474e3b6218621b8ae25 (diff)
iio: accel: bmc150: fix endianness when reading axes
For big endian platforms, reading the axes will return invalid values. The device stores each axis value in a 16 bit little endian register. The driver uses regmap_read_bulk to get the axis value, resulting in a 16 bit little endian value. This needs to be converted to cpu endianness to work on big endian platforms. Fix endianness for big endian platforms by converting the values for the axes read from little endian to cpu. This is also partially fixed in commit b6fb9b6d6552 ("iio: accel: bmc150: optimize transfers in trigger handler"). Signed-off-by: Irina Tirdea <irina.tirdea@intel.com> Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/accel/bmc150-accel-core.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c
index c73331f7782b..2072a31e813b 100644
--- a/drivers/iio/accel/bmc150-accel-core.c
+++ b/drivers/iio/accel/bmc150-accel-core.c
@@ -547,7 +547,7 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data,
547{ 547{
548 int ret; 548 int ret;
549 int axis = chan->scan_index; 549 int axis = chan->scan_index;
550 unsigned int raw_val; 550 __le16 raw_val;
551 551
552 mutex_lock(&data->mutex); 552 mutex_lock(&data->mutex);
553 ret = bmc150_accel_set_power_state(data, true); 553 ret = bmc150_accel_set_power_state(data, true);
@@ -557,14 +557,14 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data,
557 } 557 }
558 558
559 ret = regmap_bulk_read(data->regmap, BMC150_ACCEL_AXIS_TO_REG(axis), 559 ret = regmap_bulk_read(data->regmap, BMC150_ACCEL_AXIS_TO_REG(axis),
560 &raw_val, 2); 560 &raw_val, sizeof(raw_val));
561 if (ret < 0) { 561 if (ret < 0) {
562 dev_err(data->dev, "Error reading axis %d\n", axis); 562 dev_err(data->dev, "Error reading axis %d\n", axis);
563 bmc150_accel_set_power_state(data, false); 563 bmc150_accel_set_power_state(data, false);
564 mutex_unlock(&data->mutex); 564 mutex_unlock(&data->mutex);
565 return ret; 565 return ret;
566 } 566 }
567 *val = sign_extend32(raw_val >> chan->scan_type.shift, 567 *val = sign_extend32(le16_to_cpu(raw_val) >> chan->scan_type.shift,
568 chan->scan_type.realbits - 1); 568 chan->scan_type.realbits - 1);
569 ret = bmc150_accel_set_power_state(data, false); 569 ret = bmc150_accel_set_power_state(data, false);
570 mutex_unlock(&data->mutex); 570 mutex_unlock(&data->mutex);
@@ -988,6 +988,7 @@ static const struct iio_event_spec bmc150_accel_event = {
988 .realbits = (bits), \ 988 .realbits = (bits), \
989 .storagebits = 16, \ 989 .storagebits = 16, \
990 .shift = 16 - (bits), \ 990 .shift = 16 - (bits), \
991 .endianness = IIO_LE, \
991 }, \ 992 }, \
992 .event_spec = &bmc150_accel_event, \ 993 .event_spec = &bmc150_accel_event, \
993 .num_event_specs = 1 \ 994 .num_event_specs = 1 \