[PATCH 2/2 V2] power:sysfs: Expose device wakeup_event_count.

From: Ravi Chandra Sadineni
Date: Mon Jul 22 2019 - 18:33:47 EST


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 <ravisadineni@xxxxxxxxxxxx>
---
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 <ravisadineni@xxxxxxxxxxxx>
+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 <rjw@xxxxxxxxxxxxx>
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