power: Add check_wakeup_reason() to verify wakeup source irq
authorDmitry Shmidt <dimitrysh@google.com>
Fri, 31 Oct 2014 23:05:46 +0000 (16:05 -0700)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 16 Feb 2016 21:53:39 +0000 (13:53 -0800)
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>
include/linux/wakeup_reason.h
kernel/power/wakeup_reason.c

index 5f095da2c977b2c1ec607f7729cdcb6cc1a2a5be..ad8b76936c7fb70e35f69e4e7327d41d0d7ac8ba 100644 (file)
@@ -22,4 +22,6 @@
 
 void log_wakeup_reason(int irq);
 void log_suspend_abort_reason(const char *fmt, ...);
+int check_wakeup_reason(int irq);
+
 #endif /* _LINUX_WAKEUP_REASON_H */
index 2aacc34ef17c018728631ef5aa1b82872626d175..085c99edca06fac67365cfbb2d3a4e1e414d1a6b 100644 (file)
@@ -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",