summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Baptiste Maneyrol <jmaneyrol@invensense.com>2021-02-08 15:28:42 +0000
committerCommit Bot <commit-bot@chromium.org>2021-09-27 05:29:29 +0000
commit9a08037006df4c9cdcd595463c8b3b85406d6137 (patch)
tree9017b805188607619f1175b5f252d8d71ccc0bba
parent281402b2ae9bb5c3537e66e470cbe5849eee13e9 (diff)
downloadchrome-ec-9a08037006df4c9cdcd595463c8b3b85406d6137.tar.gz
driver: icm426xx: change accel oscillator to RC clock
When using accel low-power with WakeUp oscillator, turning gyro on switch directly to PLL mode and provokes glitch on ODR. Use RC clock oscillator for accel low-power to avoid this glitch. BUG=chromium:1175757 BRANCH=hatch,nami,kukui,dedede,grunt,zork,octopus,volteer TEST=turn gyro on when accel is running using cros-ec iio devices and check that odr stays consistent. Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> Change-Id: I51435eb9533a1fa16bf695e468854156c16d3296 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2679700 Reviewed-by: Gwendal Grignou <gwendal@chromium.org> Commit-Queue: Gwendal Grignou <gwendal@chromium.org> Tested-by: Gwendal Grignou <gwendal@chromium.org> (cherry picked from commit ae50227d0d5b9c135e474bbfd3bb8cce6efef71f) Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3128755 Reviewed-by: JuHyun Kim <jkim@invensense.com> Reviewed-by: Zhuohao Lee <zhuohao@chromium.org> Tested-by: JuHyun Kim <jkim@invensense.com> Commit-Queue: Zhuohao Lee <zhuohao@chromium.org>
-rw-r--r--driver/accelgyro_icm426xx.c9
-rw-r--r--driver/accelgyro_icm426xx.h3
2 files changed, 11 insertions, 1 deletions
diff --git a/driver/accelgyro_icm426xx.c b/driver/accelgyro_icm426xx.c
index 409916d42f..411ad86a14 100644
--- a/driver/accelgyro_icm426xx.c
+++ b/driver/accelgyro_icm426xx.c
@@ -803,7 +803,14 @@ static int icm426xx_init_config(const struct motion_sensor_t *s)
val |= ICM426XX_UI_SIFS_CFG_SPI_DIS;
#endif
- return icm_field_update8(s, ICM426XX_REG_INTF_CONFIG0, mask, val);
+ ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG0, mask, val);
+ if (ret)
+ return ret;
+
+ /* set accel oscillator to RC clock to avoid bad transition with PLL */
+ return icm_field_update8(s, ICM426XX_REG_INTF_CONFIG1,
+ ICM426XX_ACCEL_LP_CLK_SEL,
+ ICM426XX_ACCEL_LP_CLK_SEL);
}
static int icm426xx_init(const struct motion_sensor_t *s)
diff --git a/driver/accelgyro_icm426xx.h b/driver/accelgyro_icm426xx.h
index d20fd97e57..90f75184ec 100644
--- a/driver/accelgyro_icm426xx.h
+++ b/driver/accelgyro_icm426xx.h
@@ -136,6 +136,9 @@ enum icm426xx_slew_rate {
#define ICM426XX_UI_SIFS_CFG_SPI_DIS 0x02
#define ICM426XX_UI_SIFS_CFG_I2C_DIS 0x03
+#define ICM426XX_REG_INTF_CONFIG1 0x004D
+#define ICM426XX_ACCEL_LP_CLK_SEL BIT(3)
+
enum icm426xx_sensor_mode {
ICM426XX_MODE_OFF,
ICM426XX_MODE_STANDBY,