From a563176190609097f9efa312a09f7a9b527c9a68 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 23 May 2023 14:11:52 +0100 Subject: [PATCH] i2c-bcm2835: Flush FIFOs cleanly on error On error condition, note the error return code, but still handle the FIFOs in the normal way rather than relying on C_CLEAR flushing everything cleanly. Signed-off-by: Dave Stevenson --- drivers/i2c/busses/i2c-bcm2835.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -385,10 +385,8 @@ static irqreturn_t bcm2835_i2c_isr(int t bcm2835_debug_add(i2c_dev, val); err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR); - if (err) { + if (err) i2c_dev->msg_err = err; - goto complete; - } if (val & BCM2835_I2C_S_DONE) { if (!i2c_dev->curr_msg) { @@ -400,8 +398,6 @@ static irqreturn_t bcm2835_i2c_isr(int t if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining) i2c_dev->msg_err = BCM2835_I2C_S_LEN; - else - i2c_dev->msg_err = 0; goto complete; } @@ -465,6 +461,7 @@ static int bcm2835_i2c_xfer(struct i2c_a i2c_dev->curr_msg = msgs; i2c_dev->num_msgs = num; + i2c_dev->msg_err = 0; reinit_completion(&i2c_dev->completion); bcm2835_i2c_start_transfer(i2c_dev);