From 5bac2f457cb61f077459c20e0052c737a264ae60 Mon Sep 17 00:00:00 2001 From: Gwendal Grignou Date: Mon, 9 Mar 2020 10:22:58 -0700 Subject: driver: bmi160: Fix ODR to REG when rate is less than 100Hz properly When the ODr was the exact frequency, the calculation was not correct. For instance, 50Hz would return register 6 when 7 was expected. Fixes: 0e99e9763 ("bmi160: Fix ODR to REG when rate is less than 100Hz") BUG=b:120942904 BRANCH=none TEST=use: for (int i = 1600000 ; i > 1000 ; i >>= 1) { printf("%d mHZ : reg %d\n", i + 1, BMI160_ODR_TO_REG(i + 1)); printf("%d mHZ : reg %d\n", i, BMI160_ODR_TO_REG(i)); printf("%d mHZ : reg %d\n", i -1 , BMI160_ODR_TO_REG(i -1)); } To verify the code is correct: 1600001 mHZ : reg 12 1600000 mHZ : reg 12 1599999 mHZ : reg 11 800001 mHZ : reg 11 800000 mHZ : reg 11 799999 mHZ : reg 10 400001 mHZ : reg 10 400000 mHZ : reg 10 399999 mHZ : reg 9 200001 mHZ : reg 9 200000 mHZ : reg 9 199999 mHZ : reg 8 100001 mHZ : reg 8 100000 mHZ : reg 8 99999 mHZ : reg 7 50001 mHZ : reg 7 50000 mHZ : reg 7 49999 mHZ : reg 6 25001 mHZ : reg 6 25000 mHZ : reg 6 24999 mHZ : reg 5 12501 mHZ : reg 5 12500 mHZ : reg 5 12499 mHZ : reg 4 6251 mHZ : reg 4 6250 mHZ : reg 4 6249 mHZ : reg 3 3126 mHZ : reg 3 3125 mHZ : reg 3 3124 mHZ : reg 2 1563 mHZ : reg 2 1562 mHZ : reg 2 1561 mHZ : reg 1 Signed-off-by: Gwendal Grignou Change-Id: Iefd0e0c732b52fef02f5b048c083ea67a2da247c Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2093289 Reviewed-by: Daisuke Nojiri (cherry picked from commit c3dcd2826896e2f2f9b585dcd42ea98d38ae17cc) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2262107 Tested-by: Inno.Park Reviewed-by: Inno.Park Reviewed-by: Bob Moragues Commit-Queue: Bob Moragues --- driver/accelgyro_bmi160.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/accelgyro_bmi160.h b/driver/accelgyro_bmi160.h index 626da83217..78f167b305 100644 --- a/driver/accelgyro_bmi160.h +++ b/driver/accelgyro_bmi160.h @@ -178,7 +178,7 @@ enum fifo_header { ((_regval) < BMI160_ODR_100HZ ? 100000 / (1 << (8 - (_regval))) : \ 100000 * (1 << ((_regval) - 8))) #define BMI160_ODR_TO_REG(_odr) \ - ((_odr) < 100000 ? (__builtin_clz(100000 / (_odr)) - 24) : \ + ((_odr) < 100000 ? (__builtin_clz(100000 / ((_odr) + 1)) - 24) : \ (39 - __builtin_clz((_odr) / 100000))) #define BMI160_CONF_REG(_sensor) (0x40 + 2 * (_sensor)) -- cgit v1.2.1