[PATCH v4 2/3] iio: imu: inv_icm42600: log whoami mismatch instead of failing probe
From: Jorijn van der Graaf
Date: Mon Aug 10 2026 - 15:12:48 EST
A WHOAMI value differing from the one the compatible implies aborts
probe with -ENODEV, which prevents a register-compatible part described
with a fallback compatible from probing at all.
The devicetree compatible is authoritative for which part is fitted:
log the mismatch at info level and continue. The message keeps a
breadcrumb for anyone seeing an unexpected part change on their device
versus the devicetree; tmp117 takes the same trade at the same level
for its fallback matches.
A whoami of 0x00 or 0xff still fails probe: SPI has no transfer-level
ack, so those values mean nothing answered; this is the same
no-response guard inv_icm45600 carries. Otherwise the probe outcome on
mismatch changes 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 with the one informational line, and
accelerometer, gyroscope and temperature reads work.
Suggested-by: Conor Dooley <conor@xxxxxxxxxx>
Suggested-by: Jonathan Cameron <jic23@xxxxxxxxxx>
Link: https://lore.kernel.org/all/20260722-creature-volley-0f083b904c1d@spud/
Link: https://lore.kernel.org/all/20260728222015.6a62b287@jic23-huawei/
Link: https://lore.kernel.org/all/20260801032310.18f5f16d@jic23-huawei/
Link: https://lore.kernel.org/all/20260804-scarily-hacker-651df3eafea9@spud/
Assisted-by: Claude:claude-fable-5
Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@xxxxxxxxxxxxx>
---
v4: keep the whoami read and log the mismatch at info level,
following the wording Jonathan proposed (Jonathan, Conor), instead
of deleting the check and the whoami definitions; add
inv_icm45600's no-response guard - whoami 0x00/0xff still fails
probe; both prints use %#04x so the two ids render at equal width;
retested on the device.
v3 dropped the check and the whoami definitions entirely.
New in v2, as a demotion of the error to a warning.
drivers/iio/imu/inv_icm42600/inv_icm42600_core.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index dc97d8a274e3..8ceaf825f124 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -8,6 +8,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
+#include <linux/limits.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/pm_runtime.h>
@@ -510,9 +511,18 @@ static int inv_icm42600_setup(struct inv_icm42600_state *st,
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;
+ /*
+ * SPI interface has no ack mechanism.
+ * 0xFF or 0x00 whoami means no response from the device.
+ */
+ if (val == U8_MAX || val == 0)
+ return dev_err_probe(dev, -ENODEV,
+ "invalid whoami %#04x expected %#04x (%s)\n",
+ val, hw->whoami, hw->name);
+
+ dev_info(dev,
+ "device id %#04x is not the %#04x associated with the FW-specified device (%s), probably using a valid fallback compatible\n",
+ val, hw->whoami, hw->name);
}
st->name = hw->name;
--
2.55.0