Commit d3e6ed84 authored by David Veenstra's avatar David Veenstra Committed by Jonathan Cameron

staging: iio: ad2s1200: Add scaling factor for angular velocity channel

The sysfs iio ABI states radians per second is expected as the unit for
angular velocity, but the 12-bit angular velocity register has
revolution per seconds as its unit. So a scaling factor of approximately
2 * Pi is added to the angular velocity channel.
Signed-off-by: default avatarDavid Veenstra <davidjulianveenstra@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 2363c010
...@@ -55,37 +55,55 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev, ...@@ -55,37 +55,55 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
struct ad2s1200_state *st = iio_priv(indio_dev); struct ad2s1200_state *st = iio_priv(indio_dev);
int ret; int ret;
mutex_lock(&st->lock); switch (m) {
gpiod_set_value(st->sample, 0); case IIO_CHAN_INFO_SCALE:
switch (chan->type) {
/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */ case IIO_ANGL_VEL:
udelay(1); /* 2 * Pi ~= 6.283185 */
gpiod_set_value(st->sample, 1); *val = 6;
gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL)); *val2 = 283185;
return IIO_VAL_INT_PLUS_MICRO;
ret = spi_read(st->sdev, &st->rx, 2); default:
if (ret < 0) { return -EINVAL;
}
break;
case IIO_CHAN_INFO_RAW:
mutex_lock(&st->lock);
gpiod_set_value(st->sample, 0);
/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
udelay(1);
gpiod_set_value(st->sample, 1);
gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
ret = spi_read(st->sdev, &st->rx, 2);
if (ret < 0) {
mutex_unlock(&st->lock);
return ret;
}
switch (chan->type) {
case IIO_ANGL:
*val = be16_to_cpup(&st->rx) >> 4;
break;
case IIO_ANGL_VEL:
*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
break;
default:
mutex_unlock(&st->lock);
return -EINVAL;
}
/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
udelay(1);
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
return ret;
}
switch (chan->type) { return IIO_VAL_INT;
case IIO_ANGL:
*val = be16_to_cpup(&st->rx) >> 4;
break;
case IIO_ANGL_VEL:
*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
break;
default: default:
mutex_unlock(&st->lock); break;
return -EINVAL;
} }
/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */ return -EINVAL;
udelay(1);
mutex_unlock(&st->lock);
return IIO_VAL_INT;
} }
static const struct iio_chan_spec ad2s1200_channels[] = { static const struct iio_chan_spec ad2s1200_channels[] = {
...@@ -99,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = { ...@@ -99,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = {
.indexed = 1, .indexed = 1,
.channel = 0, .channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
} }
}; };
......
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