[PATCH v2] irqchip/meson-gpio: Allow the GPIO interrupts to wake the system

Neil Armstrong neil.armstrong at linaro.org
Mon Oct 12 02:22:13 PDT 2026


On 10/10/26 20:20, Igor Velkov via B4 Relay wrote:
> From: Igor Velkov <iav at iav.lv>
> 
> meson_gpio_irq_chip has neither .irq_set_wake nor IRQCHIP_SKIP_SET_WAKE,
> so enable_irq_wake() fails with -ENXIO for every interrupt routed through
> it, and such an interrupt never gets IRQD_WAKEUP_STATE.
> 
> That matters for suspend-to-idle. suspend_device_irqs() keeps only the
> wakeup interrupts enabled; the rest are suspended and masked by the flow
> handler when they first fire. A GPIO interrupt that fires during s2idle
> therefore brings a CPU out of idle once, gets masked, and the system
> sleeps on. For mem the firmware chooses the wakeup sources, and this
> flag changes nothing there.
> 
> Set IRQCHIP_SKIP_SET_WAKE, like the other hierarchical irqchips with a
> GIC parent. The GIC sets the same flag, so irq_chip_set_wake_parent()
> would end there anyway.
> 
> Tested on ODROID-HC4 with the PCF8563 alarm interrupt routed through this
> controller: with the flag the alarm wakes the board from s2idle 4/4, and
> /sys/power/pm_wakeup_irq names it; without the flag the board stayed in
> s2idle past the alarm until a power cycle (0/5).
> 
> Assisted-by: LLM
> Signed-off-by: Igor Velkov <iav at iav.lv>
> ---
> Changes in v2:
> - Reworded, as Neil asked: say that the test and the effect are for
>    suspend-to-idle, describe how genirq handles the interrupt there, and
>    note that for mem the firmware picks the wakeup sources.
> - Repeated the run without the flag: 0/5 (v1 said 0/1).
> - Link to v1: https://lore.kernel.org/r/20261008-meson-gpio-wake-v1-1-b0af1598d469@iav.lv
> ---
>   drivers/irqchip/irq-meson-gpio.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/irqchip/irq-meson-gpio.c b/drivers/irqchip/irq-meson-gpio.c
> index 91a9c337fe6d..e0329ef5e4a2 100644
> --- a/drivers/irqchip/irq-meson-gpio.c
> +++ b/drivers/irqchip/irq-meson-gpio.c
> @@ -538,7 +538,7 @@ static struct irq_chip meson_gpio_irq_chip = {
>   #ifdef CONFIG_SMP
>   	.irq_set_affinity	= irq_chip_set_affinity_parent,
>   #endif
> -	.flags			= IRQCHIP_SET_TYPE_MASKED,
> +	.flags			= IRQCHIP_SET_TYPE_MASKED | IRQCHIP_SKIP_SET_WAKE,
>   };
>   
>   static int meson_gpio_irq_domain_translate(struct irq_domain *domain,
> 
> ---
> base-commit: a90ee4305c4a5df72c11b31dacfdc76e00fcf78a
> change-id: 20261008-meson-gpio-wake-f3bfa3bb2e5a
> 
> Best regards,

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>

Thanks,
Neil



More information about the linux-amlogic mailing list