i2c: iproc: handle only slave interrupts which are enabled
authorRayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
Mon, 2 Nov 2020 03:54:29 +0000 (09:24 +0530)
committerWolfram Sang <wsa@kernel.org>
Tue, 5 Jan 2021 16:15:43 +0000 (17:15 +0100)
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.kokatanur@broadcom.com>
Acked-by: Ray Jui <ray.jui@broadcom.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-bcm-iproc.c

index 834a98caeada3ccda779506e8adf049a20990c9e..b54f5130d2469d18d70ecd2ca05a687a02a4c676 100644 (file)
@@ -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