Hi,

* Rafael J. Wysocki <[email protected]> [171228 17:33]:
> So we are fine except for the race and we need the wakeirq field in wakeup
> sources to automatically arm the wakeup IRQs during suspend.
> 
> If I'm not mistaken, we only need something like the patch below (untested).

Yeah for your patch below works just fine for my
test cases so:

Tested-by: Tony Lindgren <[email protected]>

> ---
>  drivers/base/power/wakeirq.c |    9 ++++-----
>  drivers/base/power/wakeup.c  |    2 +-
>  2 files changed, 5 insertions(+), 6 deletions(-)
> 
> Index: linux-pm/drivers/base/power/wakeirq.c
> ===================================================================
> --- linux-pm.orig/drivers/base/power/wakeirq.c
> +++ linux-pm/drivers/base/power/wakeirq.c
> @@ -33,7 +33,6 @@ static int dev_pm_attach_wake_irq(struct
>                                 struct wake_irq *wirq)
>  {
>       unsigned long flags;
> -     int err;
>  
>       if (!dev || !wirq)
>               return -EINVAL;
> @@ -45,12 +44,12 @@ static int dev_pm_attach_wake_irq(struct
>               return -EEXIST;
>       }
>  
> -     err = device_wakeup_attach_irq(dev, wirq);
> -     if (!err)
> -             dev->power.wakeirq = wirq;
> +     dev->power.wakeirq = wirq;
> +     if (dev->power.wakeup)
> +             device_wakeup_attach_irq(dev, wirq);
>  
>       spin_unlock_irqrestore(&dev->power.lock, flags);
> -     return err;
> +     return 0;
>  }
>  
>  /**
> Index: linux-pm/drivers/base/power/wakeup.c
> ===================================================================
> --- linux-pm.orig/drivers/base/power/wakeup.c
> +++ linux-pm/drivers/base/power/wakeup.c
> @@ -303,7 +303,7 @@ int device_wakeup_attach_irq(struct devi
>       }
>  
>       if (ws->wakeirq)
> -             return -EEXIST;
> +             dev_err(dev, "Leftover wakeup IRQ found, overriding\n");
>  
>       ws->wakeirq = wakeirq;
>       return 0;
> 

Reply via email to