]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i2c: imx: fix i2c issue when reading multiple messages
authorStefan Eichenberger <stefan.eichenberger@toradex.com>
Wed, 18 Feb 2026 15:08:49 +0000 (16:08 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Fri, 27 Mar 2026 12:51:20 +0000 (13:51 +0100)
When reading multiple messages, meaning a repeated start is required,
polling the bus busy bit must be avoided. This must only be done for
the last message. Otherwise, the driver will timeout.

Here an example of such a sequence that fails with an error:
i2ctransfer -y -a 0 w1@0x00 0x02 r1 w1@0x00 0x02 r1
Error: Sending messages failed: Connection timed out

Fixes: 5f5c2d4579ca ("i2c: imx: prevent rescheduling in non dma mode")
Cc: stable@vger.kernel.org # v6.13+
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20260218150940.131354-2-eichest@gmail.com
drivers/i2c/busses/i2c-imx.c

index 85f554044cf1eec7d28310c3d9e7a7346237afdb..56e2a14495a9abc4e3205cc254f61e858f0678b0 100644 (file)
@@ -1522,7 +1522,7 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
                dev_err(&i2c_imx->adapter.dev, "<%s> read timedout\n", __func__);
                return -ETIMEDOUT;
        }
-       if (!i2c_imx->stopped)
+       if (i2c_imx->is_lastmsg && !i2c_imx->stopped)
                return i2c_imx_bus_busy(i2c_imx, 0, false);
 
        return 0;