i2c-bcm2835: Do not abort transfers on ERR if still active
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Tue, 23 May 2023 13:14:05 +0000 (14:14 +0100)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:35 +0000 (11:33 +0000)
If a transaction is aborted immediately on ERR being reported,
then the bus is not returned to the STOP condition, and devices
generally get very upset.

Handle the ERR and CLKT conditions only when TA is not set.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/i2c/busses/i2c-bcm2835.c

index 8c98393..cc78e99 100644 (file)
@@ -385,7 +385,7 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data)
        bcm2835_debug_add(i2c_dev, val);
 
        err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR);
-       if (err)
+       if (err && !(val & BCM2835_I2C_S_TA))
                i2c_dev->msg_err = err;
 
        if (val & BCM2835_I2C_S_DONE) {