]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i3c: mipi-i3c-hci: Fix handling status of i3c_hci_irq_handler()
authorJarkko Nikula <jarkko.nikula@linux.intel.com>
Wed, 9 Apr 2025 14:03:58 +0000 (17:03 +0300)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 15 May 2025 09:41:13 +0000 (11:41 +0200)
Return IRQ_HANDLED from the i3c_hci_irq_handler() only if some
INTR_STATUS bit was set or if DMA/PIO handler handled it.

Currently it returns IRQ_HANDLED in case INTR_STATUS is zero and IO
handler returns false. Which could be the case if interrupt comes from
other device or is spurious.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Link: https://lore.kernel.org/r/20250409140401.299251-2-jarkko.nikula@linux.intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/mipi-i3c-hci/core.c

index ba7aa6bbcec5f78d23958e0de329f0c59ac34089..780e9db7e21e4bb4af6f91d842e41c2afe682344 100644 (file)
@@ -594,6 +594,7 @@ static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id)
 
        if (val) {
                reg_write(INTR_STATUS, val);
+               result = IRQ_HANDLED;
        }
 
        if (val & INTR_HC_RESET_CANCEL) {
@@ -605,12 +606,11 @@ static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id)
                val &= ~INTR_HC_INTERNAL_ERR;
        }
 
-       hci->io->irq_handler(hci);
+       if (hci->io->irq_handler(hci))
+               result = IRQ_HANDLED;
 
        if (val)
                dev_err(&hci->master.dev, "unexpected INTR_STATUS %#x\n", val);
-       else
-               result = IRQ_HANDLED;
 
        return result;
 }