diff options
author | Bhanu Prakash Maiya <bhanumaiya@google.com> | 2021-07-14 18:06:32 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-07-17 00:18:51 +0000 |
commit | 2920fe5c0c67f56e71a287708b1d1c535f81690e (patch) | |
tree | db46b103845687cc6e31a44348aaec227cceaf40 | |
parent | 5786cdd32f9d8ba7da8b2d9764b06dfeb991f5ff (diff) | |
download | chrome-ec-2920fe5c0c67f56e71a287708b1d1c535f81690e.tar.gz |
driver: bmi3xx: Configure BMI323 config register once at Accel init
The bmi3xx driver init is called multiple times, first for BASE_ACCEL
then for BASE_GYRO. The BMI3xx feature resiter and interrupt register
should be configured once.
BRANCH=none
BUG=b:178398789
TEST=Accel implementation tested on Guybrush
EC commands:
> accelinfo
> acceldata
Signed-off-by: Bhanu Prakash Maiya <bhanumaiya@chromium.org>
Signed-off-by: Latchiamaran Senram <latchiamaran.senram@bosch.corp-partner.google.com>
Change-Id: I5c8522ef7c529ef25e976f2369dfefee76f216e6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3029016
Tested-by: Bhanu Prakash Maiya <bhanumaiya@google.com>
Auto-Submit: Bhanu Prakash Maiya <bhanumaiya@google.com>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Commit-Queue: Diana Z <dzigterman@chromium.org>
-rw-r--r-- | driver/accelgyro_bmi3xx.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/driver/accelgyro_bmi3xx.c b/driver/accelgyro_bmi3xx.c index 41cb2f3bc5..5e4189f86a 100644 --- a/driver/accelgyro_bmi3xx.c +++ b/driver/accelgyro_bmi3xx.c @@ -1135,28 +1135,34 @@ static int init(struct motion_sensor_t *s) && s->type != MOTIONSENSE_TYPE_GYRO) return EC_ERROR_UNIMPLEMENTED; - /* Reset bmi3 device */ - reg_data[0] = (uint8_t)(BMI3_CMD_SOFT_RESET & BMI3_SET_LOW_BYTE); - reg_data[1] = (uint8_t)((BMI3_CMD_SOFT_RESET & BMI3_SET_HIGH_BYTE) - >> 8); + /* Read chip id */ + RETURN_ERROR(bmi3_read_n(s, BMI3_REG_CHIP_ID, reg_data, 4)); - RETURN_ERROR(bmi3_write_n(s, BMI3_REG_CMD, reg_data, 2)); + if (reg_data[2] != BMI323_CHIP_ID) + return EC_ERROR_HW_INTERNAL; - /* Delay of 2ms after soft reset*/ - msleep(2); + if (s->type == MOTIONSENSE_TYPE_ACCEL) { + /* Reset bmi3 device */ + reg_data[0] = (uint8_t)(BMI3_CMD_SOFT_RESET + & BMI3_SET_LOW_BYTE); + reg_data[1] = (uint8_t)((BMI3_CMD_SOFT_RESET + & BMI3_SET_HIGH_BYTE) >> 8); - /* Enable feature engine bit */ - reg_data[0] = BMI3_ENABLE; - reg_data[1] = 0; + RETURN_ERROR(bmi3_write_n(s, BMI3_REG_CMD, reg_data, 2)); - RETURN_ERROR(bmi3_write_n(s, BMI3_REG_FEATURE_ENGINE_GLOB_CTRL, - reg_data, 2)); + /* Delay of 2ms after soft reset*/ + msleep(2); - /* Read chip id */ - RETURN_ERROR(bmi3_read_n(s, BMI3_REG_CHIP_ID, reg_data, 4)); + /* Enable feature engine bit */ + reg_data[0] = BMI3_ENABLE; + reg_data[1] = 0; - if (reg_data[2] != BMI323_CHIP_ID) - return EC_ERROR_HW_INTERNAL; + RETURN_ERROR(bmi3_write_n(s, BMI3_REG_FEATURE_ENGINE_GLOB_CTRL, + reg_data, 2)); + + if (IS_ENABLED(CONFIG_ACCEL_INTERRUPTS)) + RETURN_ERROR(config_interrupt(s)); + } for (i = X; i <= Z; i++) saved_data->scale[i] = MOTION_SENSE_DEFAULT_SCALE; @@ -1168,10 +1174,6 @@ static int init(struct motion_sensor_t *s) data->flags &= ~(BMI_FLAG_SEC_I2C_ENABLED | (BMI_FIFO_ALL_MASK << BMI_FIFO_FLAG_OFFSET)); - if (IS_ENABLED(CONFIG_ACCEL_INTERRUPTS) - && (s->type == MOTIONSENSE_TYPE_ACCEL)) - RETURN_ERROR(config_interrupt(s)); - return sensor_init_done(s); } |