summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Ma <magf@bitland.corp-partner.google.com>2019-08-08 11:06:22 +0800
committerCommit Bot <commit-bot@chromium.org>2019-08-23 00:12:36 +0000
commita6e196e0e172804abae75fefa8367aa4afe6be01 (patch)
tree29053dfd74e97d08b7fbad319f9498917a3a657a
parent4e0f0652f035f97aa933c4e74e17514ff785e46f (diff)
downloadchrome-ec-a6e196e0e172804abae75fefa8367aa4afe6be01.tar.gz
driver: lis2dw12/lis2dwl: add polling mode support
This patch add polling (forced mode) support for lis2dw family. 'froced mode' is a common usage model for lid accel sensor. Treeya will support two set (BMI160/KX022 and LSM6DS3/LIS2DWL) of base/lid sensors and both of their lid sensor should work in the same mode (forced mode or interrupt). Since KX022 driver only support polling, so lis2dwl also need polling support. This patch add it. BUG=b:138768226, b:138978278 BRANCH=none TEST=on Akemi board, build both interrupt and polling (by define CONFIG_ACCEL_LIS2DW_AS_BASE or not) mode firmware, boot and confirm sensors init suscess and 'accelinfo on' has correct sensor x/y/z output. Cq-Depend: chromium:1739026 Change-Id: Ib0dcb7b317eec51a38598a644f965d7ecc5928c6 Signed-off-by: Paul Ma <magf@bitland.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1741598 Tested-by: Martin Roth <martinroth@chromium.org> Reviewed-by: Martin Roth <martinroth@chromium.org> Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Commit-Queue: Martin Roth <martinroth@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1767533 Reviewed-by: Edward Hill <ecgh@chromium.org> Commit-Queue: Edward Hill <ecgh@chromium.org> Tested-by: Edward Hill <ecgh@chromium.org>
-rw-r--r--driver/accel_lis2dw12.c31
-rw-r--r--include/config.h6
2 files changed, 27 insertions, 10 deletions
diff --git a/driver/accel_lis2dw12.c b/driver/accel_lis2dw12.c
index 13359575de..a38e7e91c6 100644
--- a/driver/accel_lis2dw12.c
+++ b/driver/accel_lis2dw12.c
@@ -19,6 +19,11 @@
#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ## args)
+/* Only when configured as base accel sensor, fifo and interrupt
+ * are supported.
+ */
+#ifdef CONFIG_ACCEL_LIS2DW_AS_BASE
+
#ifdef CONFIG_ACCEL_FIFO
static volatile uint32_t last_interrupt_timestamp;
@@ -260,6 +265,8 @@ static int lis2dw12_irq_handler(struct motion_sensor_t *s, uint32_t *event)
return ret;
}
+#endif /* CONFIG_ACCEL_LIS2DW_AS_BASE */
+
/**
* set_power_mode - set sensor power mode
* @s: Motion sensor pointer
@@ -315,7 +322,7 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd)
reg_val = LIS2DW12_FS_REG(newrange);
mutex_lock(s->mutex);
-#ifdef CONFIG_ACCEL_FIFO
+#if defined(CONFIG_ACCEL_FIFO) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
/*
* FIFO stop collecting events. Restart FIFO in Bypass mode.
* If Range is changed all samples in FIFO must be discharged because
@@ -324,18 +331,18 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd)
err = lis2dw12_enable_fifo(s, LIS2DW12_FIFO_BYPASS_MODE);
if (err != EC_SUCCESS)
goto unlock_rate;
-#endif /* CONFIG_ACCEL_FIFO */
+#endif /* CONFIG_ACCEL_FIFO && CONFIG_ACCEL_LIS2DW_AS_BASE */
err = st_write_data_with_mask(s, LIS2DW12_FS_ADDR, LIS2DW12_FS_MASK,
reg_val);
if (err == EC_SUCCESS)
data->base.range = newrange;
-#ifdef CONFIG_ACCEL_FIFO
+#if defined(CONFIG_ACCEL_FIFO) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
/* FIFO restart collecting events in Cont. mode. */
err = lis2dw12_enable_fifo(s, LIS2DW12_FIFO_CONT_MODE);
-#endif /* CONFIG_ACCEL_FIFO */
unlock_rate:
+#endif /* CONFIG_ACCEL_FIFO && CONFIG_ACCEL_LIS2DW_AS_BASE */
mutex_unlock(s->mutex);
return err;
@@ -356,12 +363,12 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd)
mutex_lock(s->mutex);
-#ifdef CONFIG_ACCEL_FIFO
+#if defined(CONFIG_ACCEL_FIFO) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
/* FIFO stop collecting events. Restart FIFO in Bypass mode. */
ret = lis2dw12_enable_fifo(s, LIS2DW12_FIFO_BYPASS_MODE);
if (ret != EC_SUCCESS)
goto unlock_rate;
-#endif /* CONFIG_ACCEL_FIFO */
+#endif /* CONFIG_ACCEL_FIFO && CONFIG_ACCEL_LIS2DW_AS_BASE */
if (rate == 0) {
ret = st_write_data_with_mask(s, LIS2DW12_ACC_ODR_ADDR,
@@ -406,10 +413,10 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd)
if (ret == EC_SUCCESS)
data->base.odr = normalized_rate;
-#ifdef CONFIG_ACCEL_FIFO
+#if defined(CONFIG_ACCEL_FIFO) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
/* FIFO restart collecting events in continuous mode. */
ret = lis2dw12_enable_fifo(s, LIS2DW12_FIFO_CONT_MODE);
-#endif /* CONFIG_ACCEL_FIFO */
+#endif /* CONFIG_ACCEL_FIFO && CONFIG_ACCEL_LIS2DW_AS_BASE */
unlock_rate:
mutex_unlock(s->mutex);
@@ -516,6 +523,7 @@ static int init(const struct motion_sensor_t *s)
if (ret != EC_SUCCESS)
goto err_unlock;
+#if defined(CONFIG_ACCEL_INTERRUPTS) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
/* Interrupt trigger level of power-on-reset is HIGH */
if (!(MOTIONSENSE_FLAG_INT_ACTIVE_HIGH & s->flags)) {
ret = st_write_data_with_mask(s, LIS2DW12_H_ACTIVE_ADDR,
@@ -524,6 +532,7 @@ static int init(const struct motion_sensor_t *s)
if (ret != EC_SUCCESS)
goto err_unlock;
}
+#endif
#ifdef CONFIG_ACCEL_LIS2DWL
/* lis2dwl supports 14 bit resolution only at high perfomance mode */
@@ -535,11 +544,13 @@ static int init(const struct motion_sensor_t *s)
if (ret != EC_SUCCESS)
goto err_unlock;
+#ifdef CONFIG_ACCEL_LIS2DW_AS_BASE
if (IS_ENABLED(CONFIG_ACCEL_INTERRUPTS)) {
ret = lis2dw12_config_interrupt(s);
if (ret != EC_SUCCESS)
goto err_unlock;
}
+#endif
mutex_unlock(s->mutex);
/* Set default resolution. */
@@ -563,7 +574,7 @@ const struct accelgyro_drv lis2dw12_drv = {
.get_data_rate = st_get_data_rate,
.set_offset = st_set_offset,
.get_offset = st_get_offset,
-#ifdef CONFIG_ACCEL_INTERRUPTS
+#if defined(CONFIG_ACCEL_INTERRUPTS) && defined(CONFIG_ACCEL_LIS2DW_AS_BASE)
.irq_handler = lis2dw12_irq_handler,
-#endif /* CONFIG_ACCEL_INTERRUPTS */
+#endif /* CONFIG_ACCEL_INTERRUPTS && CONFIG_ACCEL_LIS2DW_AS_BASE */
};
diff --git a/include/config.h b/include/config.h
index a39d899573..351446f24a 100644
--- a/include/config.h
+++ b/include/config.h
@@ -92,6 +92,12 @@
#undef CONFIG_ACCEL_LIS2DWL
#undef CONFIG_ACCEL_LIS2DW_COMMON
+/* lis2dw driver support fifo and interrupt, but letting lid accel sensor work
+ * at polling mode is a common selection in current usage model. We need get a
+ * option to be able to select interrupt or polling (foced mode).
+ */
+#undef CONFIG_ACCEL_LIS2DW_AS_BASE
+
#undef CONFIG_ACCELGYRO_BMI160
#undef CONFIG_ACCELGYRO_LSM6DS0
/* Use CONFIG_ACCELGYRO_LSM6DSM for LSM6DSL, LSM6DSM, and/or LSM6DS3 */