summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBhanu Prakash Maiya <bhanumaiya@google.com>2021-07-14 18:06:32 -0700
committerCommit Bot <commit-bot@chromium.org>2021-07-17 00:18:51 +0000
commit2920fe5c0c67f56e71a287708b1d1c535f81690e (patch)
treedb46b103845687cc6e31a44348aaec227cceaf40
parent5786cdd32f9d8ba7da8b2d9764b06dfeb991f5ff (diff)
downloadchrome-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.c42
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);
}