aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>2019-07-22 14:55:27 -0400
committerWolfram Sang <wsa@the-dreams.de>2019-08-01 16:24:16 -0400
commitd12e3aae160fb26b534c4496b211d6e60a5179ed (patch)
tree894ef1f43b93686b8c9f7fdc9a789ba660b305d1
parentfd01eecdf9591453177d7b06faaabef8c300114a (diff)
i2c: at91: disable TXRDY interrupt after sending data
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@vger.kernel.org # 5.2.x [v5.2 introduced file split; the patch should apply to i2c-at91.c before the split] Fixes: fac368a04048 ("i2c: at91: add new driver") Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com> Tested-by: Raag Jadav <raagjadav@gmail.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/i2c/busses/i2c-at91-master.c9
1 files 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)
122 writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); 122 writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR);
123 123
124 /* send stop when last byte has been written */ 124 /* send stop when last byte has been written */
125 if (--dev->buf_len == 0) 125 if (--dev->buf_len == 0) {
126 if (!dev->use_alt_cmd) 126 if (!dev->use_alt_cmd)
127 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); 127 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
128 at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY);
129 }
128 130
129 dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); 131 dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len);
130 132
@@ -542,9 +544,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
542 } else { 544 } else {
543 at91_twi_write_next_byte(dev); 545 at91_twi_write_next_byte(dev);
544 at91_twi_write(dev, AT91_TWI_IER, 546 at91_twi_write(dev, AT91_TWI_IER,
545 AT91_TWI_TXCOMP | 547 AT91_TWI_TXCOMP | AT91_TWI_NACK |
546 AT91_TWI_NACK | 548 (dev->buf_len ? AT91_TWI_TXRDY : 0));
547 AT91_TWI_TXRDY);
548 } 549 }
549 } 550 }
550 551