These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / drivers / iio / imu / adis16480.c
index 989605d..b94bfd3 100644 (file)
 struct adis16480_chip_info {
        unsigned int num_channels;
        const struct iio_chan_spec *channels;
+       unsigned int gyro_max_val;
+       unsigned int gyro_max_scale;
+       unsigned int accel_max_val;
+       unsigned int accel_max_scale;
 };
 
 struct adis16480 {
@@ -497,19 +501,21 @@ static int adis16480_set_filter_freq(struct iio_dev *indio_dev,
 static int adis16480_read_raw(struct iio_dev *indio_dev,
        const struct iio_chan_spec *chan, int *val, int *val2, long info)
 {
+       struct adis16480 *st = iio_priv(indio_dev);
+
        switch (info) {
        case IIO_CHAN_INFO_RAW:
                return adis_single_conversion(indio_dev, chan, 0, val);
        case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_ANGL_VEL:
-                       *val = 0;
-                       *val2 = IIO_DEGREE_TO_RAD(20000); /* 0.02 degree/sec */
-                       return IIO_VAL_INT_PLUS_MICRO;
+                       *val = st->chip_info->gyro_max_scale;
+                       *val2 = st->chip_info->gyro_max_val;
+                       return IIO_VAL_FRACTIONAL;
                case IIO_ACCEL:
-                       *val = 0;
-                       *val2 = IIO_G_TO_M_S_2(800); /* 0.8 mg */
-                       return IIO_VAL_INT_PLUS_MICRO;
+                       *val = st->chip_info->accel_max_scale;
+                       *val2 = st->chip_info->accel_max_val;
+                       return IIO_VAL_FRACTIONAL;
                case IIO_MAGN:
                        *val = 0;
                        *val2 = 100; /* 0.0001 gauss */
@@ -674,18 +680,39 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
        [ADIS16375] = {
                .channels = adis16485_channels,
                .num_channels = ARRAY_SIZE(adis16485_channels),
+               /*
+                * storing the value in rad/degree and the scale in degree
+                * gives us the result in rad and better precession than
+                * storing the scale directly in rad.
+                */
+               .gyro_max_val = IIO_RAD_TO_DEGREE(22887),
+               .gyro_max_scale = 300,
+               .accel_max_val = IIO_M_S_2_TO_G(21973),
+               .accel_max_scale = 18,
        },
        [ADIS16480] = {
                .channels = adis16480_channels,
                .num_channels = ARRAY_SIZE(adis16480_channels),
+               .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
+               .gyro_max_scale = 450,
+               .accel_max_val = IIO_M_S_2_TO_G(12500),
+               .accel_max_scale = 5,
        },
        [ADIS16485] = {
                .channels = adis16485_channels,
                .num_channels = ARRAY_SIZE(adis16485_channels),
+               .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
+               .gyro_max_scale = 450,
+               .accel_max_val = IIO_M_S_2_TO_G(20000),
+               .accel_max_scale = 5,
        },
        [ADIS16488] = {
                .channels = adis16480_channels,
                .num_channels = ARRAY_SIZE(adis16480_channels),
+               .gyro_max_val = IIO_RAD_TO_DEGREE(22500),
+               .gyro_max_scale = 450,
+               .accel_max_val = IIO_M_S_2_TO_G(22500),
+               .accel_max_scale = 18,
        },
 };