Re: [PATCH v5 3/6] genirq/PM: Introduce IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND flag

Stephen Boyd
2020-08-25T10:12:58Z

Quoting Maulik Shah (2020-08-22 09:16:58)
> diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
> index c6c7e18..2cc800b 100644
> --- a/kernel/irq/pm.c
> +++ b/kernel/irq/pm.c
> @@ -69,12 +69,17 @@ void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action)
>
> static bool suspend_device_irq(struct irq_desc *desc)
> {
> + unsigned long chipflags = irq_desc_get_chip(desc)->flags;
> +
> if (!desc->action || irq_desc_is_chained(desc) ||
> desc->no_suspend_depth)
> return false;
>
> if (irqd_is_wakeup_set(&desc->irq_data)) {
> irqd_set(&desc->irq_data, IRQD_WAKEUP_ARMED);
> +
> + if (chipflags & IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND)
> + irq_enable(desc);

Where is the corresponding change to resume_irq()? Don't we need to
disable an irq if it was disabled on suspend and forcibly enabled here?

> /*
> * We return true here to force the caller to issue
> * synchronize_irq(). We need to make sure that the
> @@ -93,7 +98,7 @@ static bool suspend_device_irq(struct irq_desc *desc)
> * chip level. The chip implementation indicates that with
> * IRQCHIP_MASK_ON_SUSPEND.
> */
> - if (irq_desc_get_chip(desc)->flags & IRQCHIP_MASK_ON_SUSPEND)
> + if (chipflags & IRQCHIP_MASK_ON_SUSPEND)
> mask_irq(desc);
> return true;
> }