mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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:
parent
8228ed61b6
commit
65dacbb315
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user