Re: [PATCH] iio: imu: inv_mpu6050: fix swapped accel and gyro startup times
From: Jean-Baptiste Maneyrol
Date: Mon Oct 12 2026 - 04:35:52 EST
>struct inv_mpu6050_hw declares startup_time as { accel, gyro }, but
>every entry of hw_info[] initializes it positionally as
>{ *_GYRO_STARTUP_TIME, *_ACCEL_STARTUP_TIME }, so the two values are
>swapped for all chips.
>
>inv_mpu6050_switch_engine() waits for startup_time.gyro after enabling
>the gyroscope, so it waits for the accelerometer startup time instead,
>e.g. 20 ms instead of 60 ms on MPU6050 and 20 ms instead of 100 ms on
>ICM20602, and the first gyroscope samples can be read before the sensor
>has settled. Enabling only the accelerometer waits longer than needed.
>
>Use designated initializers, so each value is assigned to the member it
>is named after.
>
>Fixes: e46a36d92da0 ("Add startup time for each chip using inv_mpu6050 driver")
>Assisted-by: LLM
>Signed-off-by: Arnav Kapoor <kapoorarnav43@xxxxxxxxx>
>---
>Compile-tested only (W=1); I don't have the hardware. I checked the
>built object: before this patch hw_info[] has e.g. accel=60, gyro=20 for
>MPU6050 and accel=100, gyro=20 for ICM20602; after it accel=20, gyro=60
>and accel=20, gyro=100, matching the *_STARTUP_TIME defines.
>
> drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 95 +++++++++++++++++-----
> 1 file changed, 76 insertions(+), 19 deletions(-)
>
>diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>index 38c3f3b398d4..b26d1d401aaf 100644
>--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>@@ -150,7 +150,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6050,
> .fifo_size = 1024,
> .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
>- .startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6050_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6050_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU6500_WHOAMI_VALUE,
>@@ -159,7 +162,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU6515_WHOAMI_VALUE,
>@@ -168,7 +174,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU6880_WHOAMI_VALUE,
>@@ -177,7 +186,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 4096,
> .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU6000_WHOAMI_VALUE,
>@@ -186,7 +198,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6050,
> .fifo_size = 1024,
> .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
>- .startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6050_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6050_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU9150_WHOAMI_VALUE,
>@@ -195,7 +210,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6050,
> .fifo_size = 1024,
> .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
>- .startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6050_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6050_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU9250_WHOAMI_VALUE,
>@@ -204,7 +222,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_MPU9255_WHOAMI_VALUE,
>@@ -213,7 +234,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20608_WHOAMI_VALUE,
>@@ -222,7 +246,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20608D_WHOAMI_VALUE,
>@@ -231,7 +258,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20609_WHOAMI_VALUE,
>@@ -240,7 +270,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 4 * 1024,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20689_WHOAMI_VALUE,
>@@ -249,7 +282,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 4 * 1024,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20600_WHOAMI_VALUE,
>@@ -258,7 +294,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 1008,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_ICM20602_GYRO_STARTUP_TIME, INV_ICM20602_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_ICM20602_ACCEL_STARTUP_TIME,
>+ .gyro = INV_ICM20602_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20602_WHOAMI_VALUE,
>@@ -267,7 +306,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 1008,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_ICM20602_GYRO_STARTUP_TIME, INV_ICM20602_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_ICM20602_ACCEL_STARTUP_TIME,
>+ .gyro = INV_ICM20602_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_ICM20690_WHOAMI_VALUE,
>@@ -276,7 +318,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 1024,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_ICM20690_GYRO_STARTUP_TIME, INV_ICM20690_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_ICM20690_ACCEL_STARTUP_TIME,
>+ .gyro = INV_ICM20690_GYRO_STARTUP_TIME,
>+ },
> },
> { .whoami = INV_IAM20380_WHOAMI_VALUE,
> .name = "IAM20380",
>@@ -284,7 +329,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_IAM20680_WHOAMI_VALUE,
>@@ -293,7 +341,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 512,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_IAM20680HP_WHOAMI_VALUE,
>@@ -302,7 +353,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 4 * 1024,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> {
> .whoami = INV_IAM20680HT_WHOAMI_VALUE,
>@@ -311,7 +365,10 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .config = &chip_config_6500,
> .fifo_size = 4 * 1024,
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
>- .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
>+ .startup_time = {
>+ .accel = INV_MPU6500_ACCEL_STARTUP_TIME,
>+ .gyro = INV_MPU6500_GYRO_STARTUP_TIME,
>+ },
> },
> };
>
>--
>2.53.0
>
Hello Arnav,
another good catch, thanks for the patch.
Acked-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@xxxxxxx>
Thanks,
JB