Handle only slave interrupts which are enabled.

The IS_OFFSET register contains the interrupt status bits which will be
set regardless of the enabling of the corresponding interrupt condition.
One must therefore look at both IS_OFFSET and IE_OFFSET to determine
whether an interrupt condition is set and enabled.

Fixes: c245d94ed106 ("i2c: iproc: Add multi byte read-write support for slave 
mode")
Signed-off-by: Rayagonda Kokatanur <rayagonda.kokata...@broadcom.com>
Acked-by: Ray Jui <ray....@broadcom.com>
---
 drivers/i2c/busses/i2c-bcm-iproc.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c 
b/drivers/i2c/busses/i2c-bcm-iproc.c
index 834a98caeada..b54f5130d246 100644
--- a/drivers/i2c/busses/i2c-bcm-iproc.c
+++ b/drivers/i2c/busses/i2c-bcm-iproc.c
@@ -507,12 +507,17 @@ static void bcm_iproc_i2c_process_m_event(struct 
bcm_iproc_i2c_dev *iproc_i2c,
 static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data)
 {
        struct bcm_iproc_i2c_dev *iproc_i2c = data;
-       u32 status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET);
+       u32 slave_status;
+       u32 status;
        bool ret;
-       u32 sl_status = status & ISR_MASK_SLAVE;
 
-       if (sl_status) {
-               ret = bcm_iproc_i2c_slave_isr(iproc_i2c, sl_status);
+       status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET);
+       /* process only slave interrupt which are enabled */
+       slave_status = status & iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET) &
+                      ISR_MASK_SLAVE;
+
+       if (slave_status) {
+               ret = bcm_iproc_i2c_slave_isr(iproc_i2c, slave_status);
                if (ret)
                        return IRQ_HANDLED;
                else
-- 
2.17.1

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to