i2c: aspeed: Acknowledge most interrupts early in interrupt handler
authorGuenter Roeck <linux@roeck-us.net>
Fri, 14 Sep 2018 03:30:10 +0000 (20:30 -0700)
committerWolfram Sang <wsa@the-dreams.de>
Mon, 24 Sep 2018 21:44:33 +0000 (23:44 +0200)
commit2be6b47211e17e6c90ead40d24d2a5cc815f2d5c
treec930c3c61c144056861b8869c8a65ea60f743022
parent3e9efc3299dd78a0fa96515f0a453fab1ed4a1bd
i2c: aspeed: Acknowledge most interrupts early in interrupt handler

Commit 3e9efc3299dd ("i2c: aspeed: Handle master/slave combined irq events
properly") moved interrupt acknowledgment to the end of the interrupt
handler. In part this was done because the AST2500 datasheet says:

 I2CD10 Interrupt Status Register
   bit 2 Receive Done Interrupt status
         S/W needs to clear this status bit to allow next data receiving.

Acknowledging Receive Done before receive data was handled resulted in
receive errors on high speed I2C busses.

However, interrupt acknowledgment was not only moved to the end of the
interrupt handler for Receive Done Interrupt status, but for all interrupt
status bits. This could result in race conditions if a second interrupt was
received during interrupt handling and not handled but still acknowledged
at the end of the interrupt handler.

Acknowledge only "Receive Done Interrupt status" late in the interrupt
handler to solve the problem.

Fixes: 3e9efc3299dd ("i2c: aspeed: Handle master/slave combined irq events properly")
Cc: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
Cc: Joel Stanley <joel@jms.id.au>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
Tested-by: Joel Stanley <joel@jms.id.au>
Acked-by: Brendan Higgins <brendanhiggins@google.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-aspeed.c