[PATCH v2 4/4] iio: imu: inv_icm42600: add support for icm42630
Jorijn van der Graaf <[email protected]>
| Newsgroups | org.kernel.vger.linux-iio,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The TDK InvenSense ICM-42630 is a 6-axis IMU of the ICM-42600 family, found e.g. in the Fairphone 6. It is register-compatible with its siblings (the existing driver works on it unmodified) and reports WHOAMI value 0x0C. The part appears to be a mobile SKU and has no public datasheet: the identity comes from the Fairphone 6 platform documentation and schematics naming the part, and the WHOAMI value was read from the hardware, whose bank 0 register defaults match the ICM-42600 family layout. Add the chip id, WHOAMI value and I2C/SPI match entries, using the family default configuration like the ICM-42631. Devicetrees describe the part with an icm42631 fallback; the dedicated entries bind the exact part where the kernel knows it. Tested on the Fairphone 6 via a backport of this change to the device's 7.1-based kernel (only the id-table style and entry placement adjusted to that base), on a bit-banged SPI bus with INT1 wired to the SoC: probe, accelerometer, gyroscope and temperature raw reads, all full-scale ranges, multiple sampling frequencies, and watermark-paced FIFO reads through the INT1 interrupt. Acked-by: Jean-Baptiste Maneyrol <[email protected]> Assisted-by: Claude:claude-fable-5 Signed-off-by: Jorijn van der Graaf <[email protected]> --- v2: place the match entries in numeric position (the only code change); kept the Acked-by. drivers/iio/imu/inv_icm42600/inv_icm42600.h | 2 ++ drivers/iio/imu/inv_icm42600/inv_icm42600_core.c | 5 +++++ drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c | 4 ++++ drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h index b55d993f0264..349de5458581 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h @@ -28,6 +28,7 @@ enum inv_icm42600_chip { INV_CHIP_ICM42622, INV_CHIP_ICM42688, INV_CHIP_ICM42631, + INV_CHIP_ICM42630, INV_CHIP_NB, }; @@ -386,6 +387,7 @@ struct inv_icm42600_sensor_state { #define INV_ICM42600_WHOAMI_ICM42622 0x46 #define INV_ICM42600_WHOAMI_ICM42688 0x47 #define INV_ICM42600_WHOAMI_ICM42631 0x5C +#define INV_ICM42600_WHOAMI_ICM42630 0x0C /* User bank 1 (MSB 0x10) */ #define INV_ICM42600_REG_SENSOR_CONFIG0 0x1003 diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c index f306e3ffca48..da7bc0f1155c 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c @@ -177,6 +177,11 @@ static const struct inv_icm42600_hw inv_icm42600_hw[INV_CHIP_NB] = { .name = "icm42631", .conf = &inv_icm42600_default_conf, }, + [INV_CHIP_ICM42630] = { + .whoami = INV_ICM42600_WHOAMI_ICM42630, + .name = "icm42630", + .conf = &inv_icm42600_default_conf, + }, }; const struct iio_mount_matrix * diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c index e44ed6dcde02..672b19d2e41c 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c @@ -78,6 +78,7 @@ static const struct i2c_device_id inv_icm42600_id[] = { { .name = "icm42602", .driver_data = INV_CHIP_ICM42602 }, { .name = "icm42605", .driver_data = INV_CHIP_ICM42605 }, { .name = "icm42622", .driver_data = INV_CHIP_ICM42622 }, + { .name = "icm42630", .driver_data = INV_CHIP_ICM42630 }, { .name = "icm42631", .driver_data = INV_CHIP_ICM42631 }, { .name = "icm42686", .driver_data = INV_CHIP_ICM42686 }, { .name = "icm42688", .driver_data = INV_CHIP_ICM42688 }, @@ -98,6 +99,9 @@ static const struct of_device_id inv_icm42600_of_matches[] = { }, { .compatible = "invensense,icm42622", .data = (void *)INV_CHIP_ICM42622, + }, { + .compatible = "invensense,icm42630", + .data = (void *)INV_CHIP_ICM42630, }, { .compatible = "invensense,icm42631", .data = (void *)INV_CHIP_ICM42631, diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c index 3e2f4eb42e97..3707460d77e1 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c @@ -75,6 +75,7 @@ static const struct spi_device_id inv_icm42600_id[] = { { .name = "icm42602", .driver_data = INV_CHIP_ICM42602 }, { .name = "icm42605", .driver_data = INV_CHIP_ICM42605 }, { .name = "icm42622", .driver_data = INV_CHIP_ICM42622 }, + { .name = "icm42630", .driver_data = INV_CHIP_ICM42630 }, { .name = "icm42631", .driver_data = INV_CHIP_ICM42631 }, { .name = "icm42686", .driver_data = INV_CHIP_ICM42686 }, { .name = "icm42688", .driver_data = INV_CHIP_ICM42688 }, @@ -95,6 +96,9 @@ static const struct of_device_id inv_icm42600_of_matches[] = { }, { .compatible = "invensense,icm42622", .data = (void *)INV_CHIP_ICM42622, + }, { + .compatible = "invensense,icm42630", + .data = (void *)INV_CHIP_ICM42630, }, { .compatible = "invensense,icm42631", .data = (void *)INV_CHIP_ICM42631, -- 2.55.0