Hi, * Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> [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 <tony@xxxxxxxxxxx> > --- > 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; >