[PATCH v2 1/2] i2c: imx: Don't recover bus when arbitration lost
Daniel Scally
dan.scally at ideasonboard.com
Fri Apr 24 05:36:46 PDT 2026
In i2c_imx_xfer_common(), the driver attempts bus recovery whenever
i2c_imx_start() fails. One of the failure modes for i2c_imx_start()
is an arbitration-lost signal which results when a second I2C master
on the bus tries to control the bus simultaneously, which is a normal
and expected behaviour.
Bus recovery is not the right response for this case. Add a check for
the -EAGAIN return code to avoid running the bus recovery.
Fixes: 1c4b6c3bcf30d ("i2c: imx: implement bus recovery")
Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
---
drivers/i2c/busses/i2c-imx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index a208fefd3c3b35672a00eda8448f24859aaa793a..b68a0f7105682006bbcfee52891c9a9c2d8c009e 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -1552,7 +1552,7 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
/* Start I2C transfer */
result = i2c_imx_start(i2c_imx, atomic);
- if (result) {
+ if (result && result != -EAGAIN) {
/*
* Bus recovery uses gpiod_get_value_cansleep() which is not
* allowed within atomic context.
--
2.43.0
More information about the linux-arm-kernel
mailing list