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