Message ID | 20200120093620.9681-10-jmaneyrol@invensense.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support of similar chips | expand |
On Mon, 20 Jan 2020 10:36:20 +0100 Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> wrote: > As every chip has some little variant in LPF bandwidth values, > use common values that are working for all chips. > Simplify the LPF setting function. > > Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> hmm. On this one I wonder if the 'fix' title is strictly accurate. It's certainly a good thing to have, but I'm not sure if we will want to backport it. If you do, then break it out of this series as a separate fix and add appropriate fixes tag. All the other patches I haven't commented on in this series look fine to me subject to Rob's suggestion of combining the dt ID additions for the binding doc into one patch. Thanks, Jonathan > --- > drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 30 ++++++++++++---------- > drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 10 ++++---- > 2 files changed, 21 insertions(+), 19 deletions(-) > > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > index 9ecc667debbe..c4db9086775c 100644 > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > @@ -707,30 +707,32 @@ static int inv_mpu6050_write_raw(struct iio_dev *indio_dev, > /** > * inv_mpu6050_set_lpf() - set low pass filer based on fifo rate. > * > - * Based on the Nyquist principle, the sampling rate must > - * exceed twice of the bandwidth of the signal, or there > - * would be alising. This function basically search for the > - * correct low pass parameters based on the fifo rate, e.g, > - * sampling frequency. > + * Based on the Nyquist principle, the bandwidth of the low > + * pass filter must not exceed the signal sampling rate divided > + * by 2, or there would be aliasing. > + * This function basically search for the correct low pass > + * parameters based on the fifo rate, e.g, sampling frequency. > * > * lpf is set automatically when setting sampling rate to avoid any aliases. > */ > static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) > { > - static const int hz[] = {188, 98, 42, 20, 10, 5}; > + static const int hz[] = {400, 200, 90, 40, 20, 10}; > static const int d[] = { > - INV_MPU6050_FILTER_188HZ, INV_MPU6050_FILTER_98HZ, > - INV_MPU6050_FILTER_42HZ, INV_MPU6050_FILTER_20HZ, > + INV_MPU6050_FILTER_200HZ, INV_MPU6050_FILTER_100HZ, > + INV_MPU6050_FILTER_45HZ, INV_MPU6050_FILTER_20HZ, > INV_MPU6050_FILTER_10HZ, INV_MPU6050_FILTER_5HZ > }; > - int i, h, result; > + int i, result; > u8 data; > > - h = (rate >> 1); > - i = 0; > - while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1)) > - i++; > - data = d[i]; > + data = INV_MPU6050_FILTER_5HZ; > + for (i = 0; i < ARRAY_SIZE(hz); ++i) { > + if (rate >= hz[i]) { > + data = d[i]; > + break; > + } > + } > result = inv_mpu6050_set_lpf_regs(st, data); > if (result) > return result; > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h > index 7ae614052210..9a81098a8b4d 100644 > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h > @@ -370,14 +370,14 @@ enum inv_mpu6050_scan { > }; > > enum inv_mpu6050_filter_e { > - INV_MPU6050_FILTER_256HZ_NOLPF2 = 0, > - INV_MPU6050_FILTER_188HZ, > - INV_MPU6050_FILTER_98HZ, > - INV_MPU6050_FILTER_42HZ, > + INV_MPU6050_FILTER_NOLPF2 = 0, > + INV_MPU6050_FILTER_200HZ, > + INV_MPU6050_FILTER_100HZ, > + INV_MPU6050_FILTER_45HZ, > INV_MPU6050_FILTER_20HZ, > INV_MPU6050_FILTER_10HZ, > INV_MPU6050_FILTER_5HZ, > - INV_MPU6050_FILTER_2100HZ_NOLPF, > + INV_MPU6050_FILTER_NOLPF, > NUM_MPU6050_FILTER > }; >
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 9ecc667debbe..c4db9086775c 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -707,30 +707,32 @@ static int inv_mpu6050_write_raw(struct iio_dev *indio_dev, /** * inv_mpu6050_set_lpf() - set low pass filer based on fifo rate. * - * Based on the Nyquist principle, the sampling rate must - * exceed twice of the bandwidth of the signal, or there - * would be alising. This function basically search for the - * correct low pass parameters based on the fifo rate, e.g, - * sampling frequency. + * Based on the Nyquist principle, the bandwidth of the low + * pass filter must not exceed the signal sampling rate divided + * by 2, or there would be aliasing. + * This function basically search for the correct low pass + * parameters based on the fifo rate, e.g, sampling frequency. * * lpf is set automatically when setting sampling rate to avoid any aliases. */ static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate) { - static const int hz[] = {188, 98, 42, 20, 10, 5}; + static const int hz[] = {400, 200, 90, 40, 20, 10}; static const int d[] = { - INV_MPU6050_FILTER_188HZ, INV_MPU6050_FILTER_98HZ, - INV_MPU6050_FILTER_42HZ, INV_MPU6050_FILTER_20HZ, + INV_MPU6050_FILTER_200HZ, INV_MPU6050_FILTER_100HZ, + INV_MPU6050_FILTER_45HZ, INV_MPU6050_FILTER_20HZ, INV_MPU6050_FILTER_10HZ, INV_MPU6050_FILTER_5HZ }; - int i, h, result; + int i, result; u8 data; - h = (rate >> 1); - i = 0; - while ((h < hz[i]) && (i < ARRAY_SIZE(d) - 1)) - i++; - data = d[i]; + data = INV_MPU6050_FILTER_5HZ; + for (i = 0; i < ARRAY_SIZE(hz); ++i) { + if (rate >= hz[i]) { + data = d[i]; + break; + } + } result = inv_mpu6050_set_lpf_regs(st, data); if (result) return result; diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h index 7ae614052210..9a81098a8b4d 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h @@ -370,14 +370,14 @@ enum inv_mpu6050_scan { }; enum inv_mpu6050_filter_e { - INV_MPU6050_FILTER_256HZ_NOLPF2 = 0, - INV_MPU6050_FILTER_188HZ, - INV_MPU6050_FILTER_98HZ, - INV_MPU6050_FILTER_42HZ, + INV_MPU6050_FILTER_NOLPF2 = 0, + INV_MPU6050_FILTER_200HZ, + INV_MPU6050_FILTER_100HZ, + INV_MPU6050_FILTER_45HZ, INV_MPU6050_FILTER_20HZ, INV_MPU6050_FILTER_10HZ, INV_MPU6050_FILTER_5HZ, - INV_MPU6050_FILTER_2100HZ_NOLPF, + INV_MPU6050_FILTER_NOLPF, NUM_MPU6050_FILTER };
As every chip has some little variant in LPF bandwidth values, use common values that are working for all chips. Simplify the LPF setting function. Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> --- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 30 ++++++++++++---------- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 10 ++++---- 2 files changed, 21 insertions(+), 19 deletions(-)