Message ID | 1310342666-2493-1-git-send-email-ccross@android.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
On Monday, July 11, 2011, Colin Cross wrote: > Patch 2e711c04dbbf7a7732a3f7073b1fc285d12b369d > (PM: Remove sysdev suspend, resume and shutdown operations) > deleted sysdev_suspend, which was being relied on to call > check_wakeup_irqs in suspend. If check_wakeup_irqs is not > called, wake interrupts that are pending when suspend is > entered may be lost. It also breaks IRQCHIP_MASK_ON_SUSPEND, > which is handled in check_wakeup_irqs. > > This patch adds a call to check_wakeup_irqs in syscore_suspend, > similar to what was deleted in sysdev_suspend. > > CC: Rafael J. Wysocki <rjw@sisk.pl> > CC: Thomas Gleixner <tglx@linutronix.de> > CC: Greg Kroah-Hartman <gregkh@suse.de> > Signed-off-by: Colin Cross <ccross@android.com> Thanks a lot for the patch and sorry for the breakage. I'll push it to Linus later today (hopefully, that's not to late for 3.0). Thanks, Rafael > --- > drivers/base/syscore.c | 8 ++++++++ > 1 files changed, 8 insertions(+), 0 deletions(-) > > diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c > index c126db3..9b8bbe0 100644 > --- a/drivers/base/syscore.c > +++ b/drivers/base/syscore.c > @@ -9,6 +9,7 @@ > #include <linux/syscore_ops.h> > #include <linux/mutex.h> > #include <linux/module.h> > +#include <linux/interrupt.h> > > static LIST_HEAD(syscore_ops_list); > static DEFINE_MUTEX(syscore_ops_lock); > @@ -48,6 +49,13 @@ int syscore_suspend(void) > struct syscore_ops *ops; > int ret = 0; > > + pr_debug("Checking wake-up interrupts\n"); > + > + /* Return error code if there are any wake-up interrupts pending */ > + ret = check_wakeup_irqs(); > + if (ret) > + return ret; > + > WARN_ONCE(!irqs_disabled(), > "Interrupts enabled before system core suspend.\n"); > >
diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c index c126db3..9b8bbe0 100644 --- a/drivers/base/syscore.c +++ b/drivers/base/syscore.c @@ -9,6 +9,7 @@ #include <linux/syscore_ops.h> #include <linux/mutex.h> #include <linux/module.h> +#include <linux/interrupt.h> static LIST_HEAD(syscore_ops_list); static DEFINE_MUTEX(syscore_ops_lock); @@ -48,6 +49,13 @@ int syscore_suspend(void) struct syscore_ops *ops; int ret = 0; + pr_debug("Checking wake-up interrupts\n"); + + /* Return error code if there are any wake-up interrupts pending */ + ret = check_wakeup_irqs(); + if (ret) + return ret; + WARN_ONCE(!irqs_disabled(), "Interrupts enabled before system core suspend.\n");
Patch 2e711c04dbbf7a7732a3f7073b1fc285d12b369d (PM: Remove sysdev suspend, resume and shutdown operations) deleted sysdev_suspend, which was being relied on to call check_wakeup_irqs in suspend. If check_wakeup_irqs is not called, wake interrupts that are pending when suspend is entered may be lost. It also breaks IRQCHIP_MASK_ON_SUSPEND, which is handled in check_wakeup_irqs. This patch adds a call to check_wakeup_irqs in syscore_suspend, similar to what was deleted in sysdev_suspend. CC: Rafael J. Wysocki <rjw@sisk.pl> CC: Thomas Gleixner <tglx@linutronix.de> CC: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Colin Cross <ccross@android.com> --- drivers/base/syscore.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)