Re: [PATCH v2 4/4] iio: imu: inv_icm42600: add support for icm42630
From: Conor Dooley
Date: Tue Jul 28 2026 - 13:43:43 EST
On Fri, Jul 24, 2026 at 10:27:08PM +0200, Jorijn van der Graaf wrote:
> 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 <jean-baptiste.maneyrol@xxxxxxx>
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@xxxxxxxxxxxxx>
This patch is not needed because you can make use of the fallback and
should be dropped.
Thanks,
Conor.
> ---
> 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
>
Attachment:
signature.asc
Description: PGP signature