Commit 74bdc940 authored by Jonathan Cameron's avatar Jonathan Cameron

staging:iio:accel:sca3000: Fix off by one error in axis due to IIO_NO_MOD

Given the introduction of IIO_NO_MOD was prior to the first submission
prior to IIO entering staging this has been broken for a while.
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
Reviewed-by: default avatarLars-Peter Clausen <lars@metafoo.de>
parent 085fe1b2
...@@ -934,16 +934,17 @@ static int sca3000_read_event_value(struct iio_dev *indio_dev, ...@@ -934,16 +934,17 @@ static int sca3000_read_event_value(struct iio_dev *indio_dev,
{ {
int ret, i; int ret, i;
struct sca3000_state *st = iio_priv(indio_dev); struct sca3000_state *st = iio_priv(indio_dev);
int num = chan->channel2;
switch (info) { switch (info) {
case IIO_EV_INFO_VALUE: case IIO_EV_INFO_VALUE:
mutex_lock(&st->lock); mutex_lock(&st->lock);
ret = sca3000_read_ctrl_reg(st, sca3000_addresses[num][1]); ret = sca3000_read_ctrl_reg(st,
sca3000_addresses[chan->address][1]);
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
if (ret < 0) if (ret < 0)
return ret; return ret;
*val = 0; *val = 0;
if (num == 1) if (chan->channel2 == IIO_MOD_Y)
for_each_set_bit(i, (unsigned long *)&ret, for_each_set_bit(i, (unsigned long *)&ret,
ARRAY_SIZE(st->info->mot_det_mult_y)) ARRAY_SIZE(st->info->mot_det_mult_y))
*val += st->info->mot_det_mult_y[i]; *val += st->info->mot_det_mult_y[i];
...@@ -973,12 +974,11 @@ static int sca3000_write_event_value(struct iio_dev *indio_dev, ...@@ -973,12 +974,11 @@ static int sca3000_write_event_value(struct iio_dev *indio_dev,
int val, int val2) int val, int val2)
{ {
struct sca3000_state *st = iio_priv(indio_dev); struct sca3000_state *st = iio_priv(indio_dev);
int num = chan->channel2;
int ret; int ret;
int i; int i;
u8 nonlinear = 0; u8 nonlinear = 0;
if (num == IIO_MOD_Y) { if (chan->channel2 == IIO_MOD_Y) {
i = ARRAY_SIZE(st->info->mot_det_mult_y); i = ARRAY_SIZE(st->info->mot_det_mult_y);
while (i > 0) while (i > 0)
if (val >= st->info->mot_det_mult_y[--i]) { if (val >= st->info->mot_det_mult_y[--i]) {
...@@ -995,7 +995,9 @@ static int sca3000_write_event_value(struct iio_dev *indio_dev, ...@@ -995,7 +995,9 @@ static int sca3000_write_event_value(struct iio_dev *indio_dev,
} }
mutex_lock(&st->lock); mutex_lock(&st->lock);
ret = sca3000_write_ctrl_reg(st, sca3000_addresses[num][1], nonlinear); ret = sca3000_write_ctrl_reg(st,
sca3000_addresses[chan->address][1],
nonlinear);
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
return ret; return ret;
...@@ -1161,8 +1163,6 @@ static int sca3000_read_event_config(struct iio_dev *indio_dev, ...@@ -1161,8 +1163,6 @@ static int sca3000_read_event_config(struct iio_dev *indio_dev,
{ {
struct sca3000_state *st = iio_priv(indio_dev); struct sca3000_state *st = iio_priv(indio_dev);
int ret; int ret;
int num = chan->channel2;
/* read current value of mode register */ /* read current value of mode register */
mutex_lock(&st->lock); mutex_lock(&st->lock);
...@@ -1190,7 +1190,7 @@ static int sca3000_read_event_config(struct iio_dev *indio_dev, ...@@ -1190,7 +1190,7 @@ static int sca3000_read_event_config(struct iio_dev *indio_dev,
if (ret < 0) if (ret < 0)
goto error_ret; goto error_ret;
/* only supporting logical or's for now */ /* only supporting logical or's for now */
ret = !!(ret & sca3000_addresses[num][2]); ret = !!(ret & sca3000_addresses[chan->address][2]);
} }
break; break;
default: default:
...@@ -1306,7 +1306,8 @@ static int sca3000_write_event_config(struct iio_dev *indio_dev, ...@@ -1306,7 +1306,8 @@ static int sca3000_write_event_config(struct iio_dev *indio_dev,
case IIO_MOD_X: case IIO_MOD_X:
case IIO_MOD_Y: case IIO_MOD_Y:
case IIO_MOD_Z: case IIO_MOD_Z:
ret = sca3000_motion_detect_set_state(indio_dev, chan->channel2, ret = sca3000_motion_detect_set_state(indio_dev,
chan->address,
state); state);
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment