From 2033032d9b49dda2238fd15917c10c9ba8f7385d Mon Sep 17 00:00:00 2001 From: Gwendal Grignou Date: Thu, 29 Mar 2018 11:23:57 -0700 Subject: driver: lsm6dsm: Fix ODR rate calculation rate was wrong, but round up was saving us. BUG=b:73546254 BRANCH=none TEST=Check register is set correctly even when roundup is 0. (cherry picked from commit 94eaba49b0166f7d1d7f5356f4b5c21468f419f1) Reviewed-on: https://chromium-review.googlesource.com/986917 Tested-by: Gwendal Grignou Reviewed-by: Gwendal Grignou Change-Id: I4cf11291345ccfaacd1fc9942a3f112b460268c1 Signed-off-by: Gwendal Grignou Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1621261 Reviewed-by: Enrico Granata --- driver/accelgyro_lsm6dsm.c | 2 +- driver/accelgyro_lsm6dsm.h | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/driver/accelgyro_lsm6dsm.c b/driver/accelgyro_lsm6dsm.c index 5e2ab05a54..9eff6fecc6 100644 --- a/driver/accelgyro_lsm6dsm.c +++ b/driver/accelgyro_lsm6dsm.c @@ -120,7 +120,7 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) } reg_val = LSM6DSM_ODR_TO_REG(rate); - normalized_rate = LSM6DSM_ODR_TO_NORMALIZE(rate); + normalized_rate = LSM6DSM_REG_TO_ODR(rate); if (rnd && (normalized_rate < rate)) { reg_val++; diff --git a/driver/accelgyro_lsm6dsm.h b/driver/accelgyro_lsm6dsm.h index 606e19153f..7f02baa02e 100644 --- a/driver/accelgyro_lsm6dsm.h +++ b/driver/accelgyro_lsm6dsm.h @@ -67,12 +67,10 @@ enum lsm6dsm_odr { #define LSM6DSM_ODR_MAX_VAL 416000 /* ODR reg value from selected data rate in mHz */ -#define LSM6DSM_ODR_TO_REG(_odr) \ - __fls(_odr / LSM6DSM_ODR_MIN_VAL) +#define LSM6DSM_ODR_TO_REG(_odr) (__fls(_odr / LSM6DSM_ODR_MIN_VAL) + 1) /* normalized ODR value from selected data rate in mHz */ -#define LSM6DSM_ODR_TO_NORMALIZE(_odr) \ - (LSM6DSM_ODR_MIN_VAL << __fls(_odr/LSM6DSM_ODR_MIN_VAL)) +#define LSM6DSM_REG_TO_ODR(_reg) (LSM6DSM_ODR_MIN_VAL << (_reg - 1)) /* Full Scale range value and gain for Acc */ #define LSM6DSM_FS_LIST_NUM 4 -- cgit v1.2.1