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 <finley.xiao@rock-chips.com>
Reviewed-by: Sudeep Holla <sudeep.holla@kernel.org>
Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
This commit is contained in:
Finley Xiao 2026-10-08 11:02:14 +08:00 committed by Jassi Brar
parent 8228ed61b6
commit 65dacbb315

View File

@ -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;