From 65dacbb315a2a842a21979b5c3f27eccd72b215a Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Thu, 8 Oct 2026 11:02:14 +0800 Subject: [PATCH] mailbox: arm_mhuv3: Keep the combined IRQ enabled during system suspend When MHUv3 is used as the SCMI mailbox transport (arm,scmi-mailbox), SCMI clock and power-domain operations still need to work in the noirq phase of system suspend: genpd may power off a device's parent domain from genpd_suspend_noirq(), which issues scmi_clock_config_set() / scmi_power_state_set() and waits for the firmware reply via the mailbox RX IRQ. However, dpm_suspend_noirq() calls suspend_device_irqs() before running the suspend_noirq callbacks, so the combined interrupts are already masked at that point and the SCMI transfer times out while waiting for the reply. Both the PBX and MBX combined interrupts are requested as threaded IRQs with only IRQF_ONESHOT. The MBX combined IRQ must stay enabled so that firmware replies are delivered, and the PBX combined IRQ, used for txdone by IRQ when not in polling mode, needs the same treatment. IRQ threads are not frozen during system suspend, so with IRQF_NO_SUSPEND the threaded combined-IRQ handlers still run in the noirq phase. Add IRQF_NO_SUSPEND to the MHUv3 combined IRQ registrations so that SCMI remains functional throughout the suspend/resume cycle. Note that this only keeps the IRQs functional during the suspend/resume cycle and does not make the mailbox a wakeup source. Signed-off-by: Finley Xiao Reviewed-by: Sudeep Holla Signed-off-by: Jassi Brar --- drivers/mailbox/arm_mhuv3.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/mailbox/arm_mhuv3.c b/drivers/mailbox/arm_mhuv3.c index 6569c3dda377..b9addd9e2c41 100644 --- a/drivers/mailbox/arm_mhuv3.c +++ b/drivers/mailbox/arm_mhuv3.c @@ -980,7 +980,8 @@ static int mhuv3_setup_pbx(struct mhuv3 *mhu) ret = devm_request_threaded_irq(dev, mhu->cmb_irq, NULL, mhuv3_pbx_comb_interrupt, - IRQF_ONESHOT, "mhuv3-pbx", mhu); + IRQF_ONESHOT | IRQF_NO_SUSPEND, + "mhuv3-pbx", mhu); if (ret) return ret; @@ -1016,7 +1017,8 @@ static int mhuv3_setup_mbx(struct mhuv3 *mhu) "MBX combined IRQ is missing !\n"); ret = devm_request_threaded_irq(dev, mhu->cmb_irq, NULL, - mhuv3_mbx_comb_interrupt, IRQF_ONESHOT, + mhuv3_mbx_comb_interrupt, + IRQF_ONESHOT | IRQF_NO_SUSPEND, "mhuv3-mbx", mhu); if (ret) return ret;