]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
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)
committerAndrea Righi <andrea.righi@canonical.com>
Mon, 15 Mar 2021 14:09:15 +0000 (15:09 +0100)
[ Upstream commit 545f4011e156554d704d6278245d54543f6680d1 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
drivers/i2c/busses/i2c-bcm-iproc.c

index d8295b1c379d1b947fefde1e6a7ab5a6faebc395..b98433c04d1844b56d3a77792b0b04d5d3baa975 100644 (file)
@@ -505,12 +505,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