summary refs log tree commit diff
path: root/drivers
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2011-07-11 10:51:49 +0200
committerRafael J. Wysocki <rjw@sisk.pl>2011-07-11 10:51:49 +0200
commit887596224cca4dc4669c53e4d7a33fcfc9d9e823 (patch)
tree51cf1ce6f98ddf3e304c06b45c28265dfc9e4503 /drivers
parente3bbfa78bab125f58b831b5f7f45b5a305091d72 (diff)
downloadlinux-887596224cca4dc4669c53e4d7a33fcfc9d9e823.tar.gz
PM: Reintroduce dropped call to check_wakeup_irqs
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().

Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/syscore.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c
index c126db3cb7d1..e8d11b6630ee 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 wakeup interrupts\n");
+
+	/* Return error code if there are any wakeup interrupts pending. */
+	ret = check_wakeup_irqs();
+	if (ret)
+		return ret;
+
 	WARN_ONCE(!irqs_disabled(),
 		"Interrupts enabled before system core suspend.\n");