summaryrefslogtreecommitdiff
path: root/kernel/power/wakeup_reason.c
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2014-10-31 16:05:46 -0700
committerJohn Stultz <john.stultz@linaro.org>2016-02-16 13:53:39 -0800
commitdd0c7788b67fed52d2d2b9893f7290e3c63757b8 (patch)
tree0185a93d2524e4d16dc95f8b66249a2de7e5508f /kernel/power/wakeup_reason.c
parent57caa2ad5ce35bedb7ab374a2e5b4d7adf63da2b (diff)
power: Add check_wakeup_reason() to verify wakeup source irq
Wakeup reason is set before driver resume handlers are called. It is cleared before driver suspend handlers are called, on PM_SUSPEND_PREPARE. Change-Id: I04218c9b0c115a7877e8029c73e6679ff82e0aa4 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'kernel/power/wakeup_reason.c')
-rw-r--r--kernel/power/wakeup_reason.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/kernel/power/wakeup_reason.c b/kernel/power/wakeup_reason.c
index 2aacc34ef17c..085c99edca06 100644
--- a/kernel/power/wakeup_reason.c
+++ b/kernel/power/wakeup_reason.c
@@ -34,7 +34,7 @@ static int irqcount;
static bool suspend_abort;
static char abort_reason[MAX_SUSPEND_ABORT_LEN];
static struct kobject *wakeup_reason;
-static spinlock_t resume_reason_lock;
+static DEFINE_SPINLOCK(resume_reason_lock);
static ssize_t last_resume_reason_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
@@ -95,6 +95,21 @@ void log_wakeup_reason(int irq)
spin_unlock(&resume_reason_lock);
}
+int check_wakeup_reason(int irq)
+{
+ int irq_no;
+ int ret = false;
+
+ spin_lock(&resume_reason_lock);
+ for (irq_no = 0; irq_no < irqcount; irq_no++)
+ if (irq_list[irq_no] == irq) {
+ ret = true;
+ break;
+ }
+ spin_unlock(&resume_reason_lock);
+ return ret;
+}
+
void log_suspend_abort_reason(const char *fmt, ...)
{
va_list args;
@@ -141,7 +156,7 @@ static struct notifier_block wakeup_reason_pm_notifier_block = {
int __init wakeup_reason_init(void)
{
int retval;
- spin_lock_init(&resume_reason_lock);
+
retval = register_pm_notifier(&wakeup_reason_pm_notifier_block);
if (retval)
printk(KERN_WARNING "[%s] failed to register PM notifier %d\n",