i2c: aspeed: Handle master/slave combined irq events properly
authorJae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
Thu, 23 Aug 2018 22:57:31 +0000 (15:57 -0700)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 6 Sep 2018 18:36:57 +0000 (20:36 +0200)
commit3e9efc3299dd78a0fa96515f0a453fab1ed4a1bd
treef68d5da7123b0a174d9bc9c81c9177c3252cd192
parentfc66b39fe36acfd06f716e338de7cd8f9550fad2
i2c: aspeed: Handle master/slave combined irq events properly

In most of cases, interrupt bits are set one by one but there are
also a lot of other cases that Aspeed I2C IP sends multiple
interrupt bits with combining master and slave events using a
single interrupt call. It happens much more in multi-master
environment than single-master. For an example, when master is
waiting for a NORMAL_STOP interrupt in its MASTER_STOP state,
SLAVE_MATCH and RX_DONE interrupts could come along with the
NORMAL_STOP in case of an another master immediately sends data
just after acquiring the bus. In this case, the NORMAL_STOP
interrupt should be handled by master_irq and the SLAVE_MATCH and
RX_DONE interrupts should be handled by slave_irq. This commit
modifies irq hadling logic to handle the master/slave combined
events properly.

Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
Reviewed-by: Brendan Higgins <brendanhiggins@google.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-aspeed.c