diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2019-04-25 16:59:28 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2019-04-26 17:35:58 +0000 |
commit | d17cd2add14f1f1e32bd58d51d60a2c93f17f055 (patch) | |
tree | 62d1db11631af9374e944b6700cb58202cf5833a | |
parent | b8e72c0eaf8461c365e42aa750253baf538762e4 (diff) | |
download | chrome-ec-d17cd2add14f1f1e32bd58d51d60a2c93f17f055.tar.gz |
driver: bmi160: Check enable_fifo flags before processing FIFO
If there is an interrupt pending after we suspend the BMI160, we will
try to collect length from the FIFO, but the FIFO is suspended.
Bring back enable_fifo flags check before processing the FIFO.
It has been move after gathering the length in CL:1128555
BUG=b:127321764,b:131272795
BRANCH=master
TEST=Using flip_flop.sh script at b/131272795#comment2
Check the messages "unexpected empty FIFO" disappear.
Change-Id: Iaab1a7f3607b902acd92b75c926365d7eb09fd5e
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1585420
Reviewed-by: Enrico Granata <egranata@chromium.org>
-rw-r--r-- | driver/accelgyro_bmi160.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/driver/accelgyro_bmi160.c b/driver/accelgyro_bmi160.c index 19b109ccdf..947f18d372 100644 --- a/driver/accelgyro_bmi160.c +++ b/driver/accelgyro_bmi160.c @@ -880,6 +880,19 @@ static int load_fifo(struct motion_sensor_t *s, uint32_t last_ts) if (s->type != MOTIONSENSE_TYPE_ACCEL) return EC_SUCCESS; + if (!(data->flags & + (BMI160_FIFO_ALL_MASK << BMI160_FIFO_FLAG_OFFSET))) { + /* + * The FIFO was disabled while we were processing it. + * + * Flush potential left over: + * When sensor is resumed, we won't read old data. + */ + raw_write8(s->port, s->addr, BMI160_CMD_REG, + BMI160_CMD_FIFO_FLUSH); + return EC_SUCCESS; + } + raw_read_n(s->port, s->addr, BMI160_FIFO_LENGTH_0, (uint8_t *)&length, sizeof(length)); length &= BMI160_FIFO_LENGTH_MASK; @@ -900,19 +913,6 @@ static int load_fifo(struct motion_sensor_t *s, uint32_t last_ts) CPRINTS("unexpected large FIFO: %d", length); length = MIN(length, sizeof(bmi160_buffer)); - if (!(data->flags & - (BMI160_FIFO_ALL_MASK << BMI160_FIFO_FLAG_OFFSET))) { - /* - * The FIFO was disabled while we were processing it. - * - * Flush potential left over: - * When sensor is resumed, we won't read old data. - */ - raw_write8(s->port, s->addr, BMI160_CMD_REG, - BMI160_CMD_FIFO_FLUSH); - return EC_SUCCESS; - } - raw_read_n(s->port, s->addr, BMI160_FIFO_DATA, bmi160_buffer, length); |