forked from luck/tmp_suning_uos_patched
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: fac368a040
("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>
This commit is contained in:
parent
fd01eecdf9
commit
d12e3aae16
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user