diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2015-08-05 09:38:15 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2015-08-08 07:51:56 -0400 |
commit | 7abad1063deb0f77d275c61f58863ec319c58c5c (patch) | |
tree | d8ed380536ecccfe7c13d41a8dbc7935a65c80c4 | |
parent | c689a923c867eac40ed3826c1d9328edea8b6bc7 (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.c | 39 |
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 @@ | |||
110 | struct adis16480_chip_info { | 110 | struct 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 | ||
115 | struct adis16480 { | 119 | struct adis16480 { |
@@ -497,19 +501,21 @@ static int adis16480_set_filter_freq(struct iio_dev *indio_dev, | |||
497 | static int adis16480_read_raw(struct iio_dev *indio_dev, | 501 | static 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 | ||