[PATCH v5 2/3] iio: imu: inv_icm42600: log whoami mismatch instead of failing probe
Jorijn van der Graaf <[email protected]>
| Newsgroups | org.kernel.vger.linux-devicetree,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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. Otherwise the probe outcome on mismatch changes for all parts the driver supports. The check sits before the mismatch comparison; it does not depend on hw->whoami, since no supported part uses either value (the WHOAMI values the driver defines span 0x40-0x5C). inv_icm45600 carries the same guard nested in its mismatch branch. 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 <[email protected]> Suggested-by: Jonathan Cameron <[email protected]> Assisted-by: Claude:claude-fable-5 Signed-off-by: Jorijn van der Graaf <[email protected]> --- v5: the no-response guard moves before the whoami-mismatch comparison as its own check (Andy); the four Link trailers are dropped (Andy, Jonathan); retested on the device. v4 kept the whoami read, logging the mismatch at info level (Jonathan, Conor), and added inv_icm45600's no-response guard; both prints use %#04x so the two ids render at equal width. v3 dropped the check and the whoami definitions entirely. New in v2, as a demotion of the error to a warning. .../iio/imu/inv_icm42600/inv_icm42600_core.c | 17 ++++++++++++++--- 1 file changed, 14 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..be8cbecdd92e 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> @@ -509,10 +510,20 @@ static int inv_icm42600_setup(struct inv_icm42600_state *st, ret = regmap_read(st->map, INV_ICM42600_REG_WHOAMI, &val); if (ret) return ret; + + /* + * 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); + if (val != hw->whoami) { - dev_err(dev, "invalid whoami %#02x expected %#02x (%s)\n", - val, hw->whoami, hw->name); - return -ENODEV; + 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