Hi, On Mon, Jul 22, 2019 at 08:55:27PM +0200, Michał Mirosław wrote: > > Driver was not disabling TXRDY interrupt after last TX byte. > This caused interrupt storm until transfer timeouts for slow > or broken device on the bus. The patch fixes the interrupt storm > on my SAMA5D2-based board. > > Cc: stable@xxxxxxxxxxxxxxx # 5.2.x > [v5.2 introduced file split; the patch should apply to i2c-at91.c before the split] > Fixes: fac368a0404 ("i2c: at91: add new driver") > Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx> Acked-by: Ludovic Desroches <ludovic.desroches@xxxxxxxxxxxxx> Sounds good to me as AT91_TWI_TXRDY is only used to send the next byte. Raag, you added you in the copy list as it seems close to your issue. I am really sorry, I didn't have time to go further with your issue. Is this patch solves your issue? Thanks for this patch. Ludovic > --- > drivers/i2c/busses/i2c-at91-master.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-at91-master.c b/drivers/i2c/busses/i2c-at91-master.c > index e87232f2e708..a3fcc35ffd3b 100644 > --- a/drivers/i2c/busses/i2c-at91-master.c > +++ b/drivers/i2c/busses/i2c-at91-master.c > @@ -122,9 +122,11 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) > writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); > > /* send stop when last byte has been written */ > - if (--dev->buf_len == 0) > + if (--dev->buf_len == 0) { > if (!dev->use_alt_cmd) > at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); > + at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY); > + } > > dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); > > @@ -542,9 +544,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) > } else { > at91_twi_write_next_byte(dev); > at91_twi_write(dev, AT91_TWI_IER, > - AT91_TWI_TXCOMP | > - AT91_TWI_NACK | > - AT91_TWI_TXRDY); > + AT91_TWI_TXCOMP | AT91_TWI_NACK | > + (dev->buf_len ? AT91_TWI_TXRDY : 0)); > } > } > > -- > 2.20.1 >