aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2015-08-05 09:38:15 -0400
committerJonathan Cameron <jic23@kernel.org>2015-08-08 07:51:56 -0400
commit7abad1063deb0f77d275c61f58863ec319c58c5c (patch)
treed8ed380536ecccfe7c13d41a8dbc7935a65c80c4
parentc689a923c867eac40ed3826c1d9328edea8b6bc7 (diff)
iio: adis16480: Fix scale factors
The different devices support by the adis16480 driver have slightly different scales for the gyroscope and accelerometer channels. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/imu/adis16480.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c
index 989605dd6f78..b94bfd3f595b 100644
--- a/drivers/iio/imu/adis16480.c
+++ b/drivers/iio/imu/adis16480.c
@@ -110,6 +110,10 @@
110struct adis16480_chip_info { 110struct adis16480_chip_info {
111 unsigned int num_channels; 111 unsigned int num_channels;
112 const struct iio_chan_spec *channels; 112 const struct iio_chan_spec *channels;
113 unsigned int gyro_max_val;
114 unsigned int gyro_max_scale;
115 unsigned int accel_max_val;
116 unsigned int accel_max_scale;
113}; 117};
114 118
115struct adis16480 { 119struct adis16480 {
@@ -497,19 +501,21 @@ static int adis16480_set_filter_freq(struct iio_dev *indio_dev,
497static int adis16480_read_raw(struct iio_dev *indio_dev, 501static int adis16480_read_raw(struct iio_dev *indio_dev,
498 const struct iio_chan_spec *chan, int *val, int *val2, long info) 502 const struct iio_chan_spec *chan, int *val, int *val2, long info)
499{ 503{
504 struct adis16480 *st = iio_priv(indio_dev);
505
500 switch (info) { 506 switch (info) {
501 case IIO_CHAN_INFO_RAW: 507 case IIO_CHAN_INFO_RAW:
502 return adis_single_conversion(indio_dev, chan, 0, val); 508 return adis_single_conversion(indio_dev, chan, 0, val);
503 case IIO_CHAN_INFO_SCALE: 509 case IIO_CHAN_INFO_SCALE:
504 switch (chan->type) { 510 switch (chan->type) {
505 case IIO_ANGL_VEL: 511 case IIO_ANGL_VEL:
506 *val = 0; 512 *val = st->chip_info->gyro_max_scale;
507 *val2 = IIO_DEGREE_TO_RAD(20000); /* 0.02 degree/sec */ 513 *val2 = st->chip_info->gyro_max_val;
508 return IIO_VAL_INT_PLUS_MICRO; 514 return IIO_VAL_FRACTIONAL;
509 case IIO_ACCEL: 515 case IIO_ACCEL:
510 *val = 0; 516 *val = st->chip_info->accel_max_scale;
511 *val2 = IIO_G_TO_M_S_2(800); /* 0.8 mg */ 517 *val2 = st->chip_info->accel_max_val;
512 return IIO_VAL_INT_PLUS_MICRO; 518 return IIO_VAL_FRACTIONAL;
513 case IIO_MAGN: 519 case IIO_MAGN:
514 *val = 0; 520 *val = 0;
515 *val2 = 100; /* 0.0001 gauss */ 521 *val2 = 100; /* 0.0001 gauss */
@@ -674,18 +680,39 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
674 [ADIS16375] = { 680 [ADIS16375] = {
675 .channels = adis16485_channels, 681 .channels = adis16485_channels,
676 .num_channels = ARRAY_SIZE(adis16485_channels), 682 .num_channels = ARRAY_SIZE(adis16485_channels),
683 /*
684 * storing the value in rad/degree and the scale in degree
685 * gives us the result in rad and better precession than
686 * storing the scale directly in rad.
687 */
688 .gyro_max_val = IIO_RAD_TO_DEGREE(22887),
689 .gyro_max_scale = 300,
690 .accel_max_val = IIO_M_S_2_TO_G(21973),
691 .accel_max_scale = 18,
677 }, 692 },
678 [ADIS16480] = { 693 [ADIS16480] = {
679 .channels = adis16480_channels, 694 .channels = adis16480_channels,
680 .num_channels = ARRAY_SIZE(adis16480_channels), 695 .num_channels = ARRAY_SIZE(adis16480_channels),
696 .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
697 .gyro_max_scale = 450,
698 .accel_max_val = IIO_M_S_2_TO_G(12500),
699 .accel_max_scale = 5,
681 }, 700 },
682 [ADIS16485] = { 701 [ADIS16485] = {
683 .channels = adis16485_channels, 702 .channels = adis16485_channels,
684 .num_channels = ARRAY_SIZE(adis16485_channels), 703 .num_channels = ARRAY_SIZE(adis16485_channels),
704 .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
705 .gyro_max_scale = 450,
706 .accel_max_val = IIO_M_S_2_TO_G(20000),
707 .accel_max_scale = 5,
685 }, 708 },
686 [ADIS16488] = { 709 [ADIS16488] = {
687 .channels = adis16480_channels, 710 .channels = adis16480_channels,
688 .num_channels = ARRAY_SIZE(adis16480_channels), 711 .num_channels = ARRAY_SIZE(adis16480_channels),
712 .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
713 .gyro_max_scale = 450,
714 .accel_max_val = IIO_M_S_2_TO_G(22500),
715 .accel_max_scale = 18,
689 }, 716 },
690}; 717};
691 718