wakeup: Add last wake up source logging for suspend abort reason.
[firefly-linux-kernel-4.4.55.git] / drivers / base / power / wakeup.c
index bea700736f2476f8de18f943ec1090b82d11bd37..4b35cc08c3b6b3e9491e95858d07ed5ed243902d 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/suspend.h>
 #include <linux/seq_file.h>
 #include <linux/debugfs.h>
+#include <linux/types.h>
 #include <trace/events/power.h>
 
 #include "power.h"
@@ -661,16 +662,31 @@ EXPORT_SYMBOL_GPL(pm_wakeup_event);
 
 void pm_get_active_wakeup_sources(char *pending_wakeup_source, size_t max)
 {
-       struct wakeup_source *ws;
+       struct wakeup_source *ws, *last_active_ws = NULL;
        int len = 0;
+       bool active = false;
+
        rcu_read_lock();
-       len += snprintf(pending_wakeup_source, max, "Pending Wakeup Sources: ");
        list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
                if (ws->active) {
-                       len += snprintf(pending_wakeup_source + len, max,
+                       if (!active)
+                               len += scnprintf(pending_wakeup_source, max,
+                                               "Pending Wakeup Sources: ");
+                       len += scnprintf(pending_wakeup_source + len, max - len,
                                "%s ", ws->name);
+                       active = true;
+               } else if (!active &&
+                          (!last_active_ws ||
+                           ktime_to_ns(ws->last_time) >
+                           ktime_to_ns(last_active_ws->last_time))) {
+                       last_active_ws = ws;
                }
        }
+       if (!active && last_active_ws) {
+               scnprintf(pending_wakeup_source, max,
+                               "Last active Wakeup Source: %s",
+                               last_active_ws->name);
+       }
        rcu_read_unlock();
 }
 EXPORT_SYMBOL_GPL(pm_get_active_wakeup_sources);