static const unsigned adis16400_3db_divisors[] = {
[0] = 2, /* Special case */
- [1] = 5,
- [2] = 10,
- [3] = 50,
- [4] = 200,
+ [1] = 6,
+ [2] = 12,
+ [3] = 25,
+ [4] = 50,
+ [5] = 100,
+ [6] = 200,
+ [7] = 200, /* Not a valid setting */
};
static int adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
{
int i, ret;
u16 val16;
- for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 0; i--)
- if (sps/adis16400_3db_divisors[i] > val)
+
+ for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) {
+ if (sps / adis16400_3db_divisors[i] >= val)
break;
- if (i == -1)
- ret = -EINVAL;
- else {
- ret = adis16400_spi_read_reg_16(indio_dev,
- ADIS16400_SENS_AVG,
+ }
+
+ ret = adis16400_spi_read_reg_16(indio_dev, ADIS16400_SENS_AVG,
&val16);
- if (ret < 0)
- goto error_ret;
+ if (ret < 0)
+ return ret;
- ret = adis16400_spi_write_reg_16(indio_dev,
- ADIS16400_SENS_AVG,
- (val16 & ~0x03) | i);
- }
-error_ret:
+ ret = adis16400_spi_write_reg_16(indio_dev, ADIS16400_SENS_AVG,
+ (val16 & ~0x07) | i);
return ret;
}
mutex_unlock(&indio_dev->mlock);
return ret;
}
- val16 = st->variant->get_freq(indio_dev);
- if (ret > 0)
- *val = ret/adis16400_3db_divisors[val16 & 0x03];
+ ret = st->variant->get_freq(indio_dev);
+ if (ret >= 0)
+ *val = ret / adis16400_3db_divisors[val16 & 0x07];
*val2 = 0;
mutex_unlock(&indio_dev->mlock);
if (ret < 0)