Device level event_count can help user level daemon to track if a
praticular device has seen an wake interrupt during a suspend resume
cycle. Thus expose it via sysfs.

Signed-off-by: Ravi Chandra Sadineni <ravisadin...@chromium.org>
---
V2: Address comments from patchset 1.

Documentation/ABI/testing/sysfs-devices-power | 11 ++++++++++
 drivers/base/power/sysfs.c                    | 21 +++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-devices-power 
b/Documentation/ABI/testing/sysfs-devices-power
index 1ca04b4f0489..abae0e8106d2 100644
--- a/Documentation/ABI/testing/sysfs-devices-power
+++ b/Documentation/ABI/testing/sysfs-devices-power
@@ -89,6 +89,17 @@ Description:
                attribute is not present. If the device is not enabled to wake
                up the system from sleep states, this attribute is empty.
 
+What:          /sys/devices/.../power/wakeup_event_count
+Date:          July 2019
+Contact:       Ravi Chandra sadineni <ravisadin...@chromium.org>
+Description:
+               The /sys/devices/.../wakeup_event_count attribute contains the
+               number of signaled wakeup events associated with the device.
+               This attribute is read-only. If the device is not capable to
+               wake up the system from sleep states, this attribute is not
+               present. If the device is not enabled to wake up the system
+               from sleep states, this attribute returns an empty line.
+
 What:          /sys/devices/.../power/wakeup_active_count
 Date:          September 2010
 Contact:       Rafael J. Wysocki <r...@rjwysocki.net>
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
index f42044d9711c..cbb9768b10e8 100644
--- a/drivers/base/power/sysfs.c
+++ b/drivers/base/power/sysfs.c
@@ -357,6 +357,26 @@ static ssize_t wakeup_count_show(struct device *dev,
 
 static DEVICE_ATTR_RO(wakeup_count);
 
+static ssize_t wakeup_event_count_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+       unsigned long count = 0;
+       bool enabled = false;
+
+       spin_lock_irq(&dev->power.lock);
+       if (dev->power.wakeup) {
+               count = dev->power.wakeup->event_count;
+               enabled = true;
+       }
+       spin_unlock_irq(&dev->power.lock);
+       if (enabled)
+               return sprintf(buf, "%lu\n", count);
+       else
+               return sprintf(buf, "\n");
+}
+
+static DEVICE_ATTR_RO(wakeup_event_count);
+
 static ssize_t wakeup_active_count_show(struct device *dev,
                                        struct device_attribute *attr,
                                        char *buf)
@@ -561,6 +581,7 @@ static struct attribute *wakeup_attrs[] = {
 #ifdef CONFIG_PM_SLEEP
        &dev_attr_wakeup.attr,
        &dev_attr_wakeup_count.attr,
+       &dev_attr_wakeup_event_count.attr,
        &dev_attr_wakeup_active_count.attr,
        &dev_attr_wakeup_expire_count.attr,
        &dev_attr_wakeup_active.attr,
-- 
2.20.1

Reply via email to