[PATCH v3 2/3] iio: imu: inv_icm42600: drop the whoami check
From: Jorijn van der Graaf
Date: Tue Jul 28 2026 - 14:55:12 EST
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>
---
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 */
--
2.55.0