Re: [PATCH v2] mailbox: arm_mhuv3: Keep the combined IRQ enabled during system suspend
From: Jassi Brar
Date: Sun Oct 11 2026 - 21:33:32 EST
On Wed, Oct 7, 2026 at 10:03 PM Finley Xiao <finley.xiao@xxxxxxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxxxxxx>
> Reviewed-by: Sudeep Holla <sudeep.holla@xxxxxxxxxx>
> ---
>
> Changes in v2:
> - Add Sudeep's Reviewed-by tag
> - Clarify that this does not make the mailbox a wakeup source
>
> 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 a1c528be47f3..04998e1346c5 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 dev_err_probe(dev, ret,
> "Failed to request PBX IRQ\n");
> @@ -1017,7 +1018,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 dev_err_probe(dev, ret, "Failed to request MBX IRQ\n");
> --
> 2.43.0
>
Applied to mailbox/for-next
Thanks
Jassi