Re: [PATCH v3 2/3] iio: imu: inv_icm42600: drop the whoami check
From: Jonathan Cameron
Date: Fri Jul 31 2026 - 22:23:27 EST
On Tue, 28 Jul 2026 20:43:50 +0200
Jorijn van der Graaf <jorijnvdgraaf@xxxxxxxxxxxxx> wrote:
> A WHOAMI value differing from the one the compatible implies aborts
> probe with -ENODEV, preventing a register-compatible part described
> with a fallback compatible from probing at all.
>
> The devicetree compatible is authoritative for which part is fitted:
> drop the check, and with it the now-unused whoami definitions. No
> warning replaces it, since probing via a fallback compatible is
> legitimate use, not a condition to report. This changes the probe
> outcome on mismatch for all parts the driver supports.
>
> Tested via a backport to a Fairphone 6 running a 7.1-based kernel: its
> ICM-42630 (WHOAMI 0x0C), described with an icm42631 fallback compatible
> and matched as icm42631, probes silently, and accelerometer, gyroscope
> and temperature reads work.
>
> Suggested-by: Conor Dooley <conor@xxxxxxxxxx>
> Link: https://lore.kernel.org/all/20260722-creature-volley-0f083b904c1d@spud/
> Link: https://lore.kernel.org/all/20260728-extradite-yanking-42d918637f61@spud/
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@xxxxxxxxxxxxx>
Hi Jorijn,
I'm open to other opinions, particularly from those who are using
this driver but I think dropping any form of hint that the device isn't
the one we expect is too far when previous we just failed to probe.
We have a lot of drivers that issue such a print and my understanding
is that has been useful. If we want to make it non threatening we could
phrase it as something like "Device ID XX is not the YY associate with the
FW specified device, probably using a valid fallback compatible". That
would still provide the breadcrumb for anyone seeing an unexpected
part change on their device vs the DT.
Jonathan
> ---
> v3: drop the check and the now-unused whoami definitions instead of
> demoting the mismatch error to a warning (Conor); retested on the
> device.
> New in v2, as a demotion of the error to a warning.
> drivers/iio/imu/inv_icm42600/inv_icm42600.h | 9 ---------
> .../iio/imu/inv_icm42600/inv_icm42600_core.c | 17 -----------------
> 2 files changed, 26 deletions(-)
>
> diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
> index b55d993f0264..88acdbab14c3 100644
> --- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
> +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
> @@ -378,15 +378,6 @@ struct inv_icm42600_sensor_state {
> #define INV_ICM42600_INT_SOURCE1_SMD_INT1_EN BIT(3)
> #define INV_ICM42600_INT_SOURCE1_WOM_INT1_EN GENMASK(2, 0)
>
> -#define INV_ICM42600_REG_WHOAMI 0x0075
> -#define INV_ICM42600_WHOAMI_ICM42600 0x40
> -#define INV_ICM42600_WHOAMI_ICM42602 0x41
> -#define INV_ICM42600_WHOAMI_ICM42605 0x42
> -#define INV_ICM42600_WHOAMI_ICM42686 0x44
> -#define INV_ICM42600_WHOAMI_ICM42622 0x46
> -#define INV_ICM42600_WHOAMI_ICM42688 0x47
> -#define INV_ICM42600_WHOAMI_ICM42631 0x5C
> -
> /* User bank 1 (MSB 0x10) */
> #define INV_ICM42600_REG_SENSOR_CONFIG0 0x1003
> #define INV_ICM42600_SENSOR_CONFIG0_ZG_DISABLE BIT(5)
> diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
> index dc97d8a274e3..963c9425e31a 100644
> --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
> +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
> @@ -103,7 +103,6 @@ const struct regmap_config inv_icm42600_spi_regmap_config = {
> EXPORT_SYMBOL_NS_GPL(inv_icm42600_spi_regmap_config, "IIO_ICM42600");
>
> struct inv_icm42600_hw {
> - u8 whoami;
> const char *name;
> const struct inv_icm42600_conf *conf;
> };
> @@ -143,37 +142,30 @@ static const struct inv_icm42600_conf inv_icm42686_default_conf = {
>
> static const struct inv_icm42600_hw inv_icm42600_hw[INV_CHIP_NB] = {
> [INV_CHIP_ICM42600] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42600,
> .name = "icm42600",
> .conf = &inv_icm42600_default_conf,
> },
> [INV_CHIP_ICM42602] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42602,
> .name = "icm42602",
> .conf = &inv_icm42600_default_conf,
> },
> [INV_CHIP_ICM42605] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42605,
> .name = "icm42605",
> .conf = &inv_icm42600_default_conf,
> },
> [INV_CHIP_ICM42686] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42686,
> .name = "icm42686",
> .conf = &inv_icm42686_default_conf,
> },
> [INV_CHIP_ICM42622] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42622,
> .name = "icm42622",
> .conf = &inv_icm42600_default_conf,
> },
> [INV_CHIP_ICM42688] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42688,
> .name = "icm42688",
> .conf = &inv_icm42600_default_conf,
> },
> [INV_CHIP_ICM42631] = {
> - .whoami = INV_ICM42600_WHOAMI_ICM42631,
> .name = "icm42631",
> .conf = &inv_icm42600_default_conf,
> },
> @@ -505,15 +497,6 @@ static int inv_icm42600_setup(struct inv_icm42600_state *st,
> unsigned int val;
> int ret;
>
> - /* check chip self-identification value */
> - ret = regmap_read(st->map, INV_ICM42600_REG_WHOAMI, &val);
> - if (ret)
> - return ret;
> - if (val != hw->whoami) {
> - dev_err(dev, "invalid whoami %#02x expected %#02x (%s)\n",
> - val, hw->whoami, hw->name);
> - return -ENODEV;
> - }
> st->name = hw->name;
>
> /* reset to make sure previous state are not there */