]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mailbox: sprd: clear delivery flag before handling TX done
authorOtto Pflüger <otto.pflueger@abscue.de>
Sat, 10 Jan 2026 15:43:36 +0000 (16:43 +0100)
committerSasha Levin <sashal@kernel.org>
Wed, 4 Mar 2026 12:20:37 +0000 (07:20 -0500)
[ Upstream commit c77661d60d4223bf2ff10d409beb0c3b2021183b ]

If there are any pending messages in the mailbox queue, they are sent
as soon as a TX done event arrives from the driver. This may trigger a
new delivery interrupt while the previous one is still being handled.
If the delivery status is cleared after this, the interrupt is lost.
To prevent this from happening, clear the delivery status immediately
after checking it and before any new messages are sent.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mailbox/sprd-mailbox.c

index c1a5fe6cc87718577f193ff4b40acca6b939b13f..46d0c34177ab91adb39e034197d67e4caeaf062a 100644 (file)
@@ -166,6 +166,11 @@ static irqreturn_t sprd_mbox_inbox_isr(int irq, void *data)
                return IRQ_NONE;
        }
 
+       /* Clear FIFO delivery and overflow status first */
+       writel(fifo_sts &
+              (SPRD_INBOX_FIFO_DELIVER_MASK | SPRD_INBOX_FIFO_OVERLOW_MASK),
+              priv->inbox_base + SPRD_MBOX_FIFO_RST);
+
        while (send_sts) {
                id = __ffs(send_sts);
                send_sts &= (send_sts - 1);
@@ -181,11 +186,6 @@ static irqreturn_t sprd_mbox_inbox_isr(int irq, void *data)
                        mbox_chan_txdone(chan, 0);
        }
 
-       /* Clear FIFO delivery and overflow status */
-       writel(fifo_sts &
-              (SPRD_INBOX_FIFO_DELIVER_MASK | SPRD_INBOX_FIFO_OVERLOW_MASK),
-              priv->inbox_base + SPRD_MBOX_FIFO_RST);
-
        /* Clear irq status */
        writel(SPRD_MBOX_IRQ_CLR, priv->inbox_base + SPRD_MBOX_IRQ_STS);