OSDN Git Service

genirq: Add wakeup sysfs node to show IRQ wakeup state
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 26 Feb 2018 15:50:43 +0000 (17:50 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 28 Feb 2018 17:07:20 +0000 (18:07 +0100)
Surprisingly there is no simple way to see if the IRQ line in question
is wakeup source or not.

Note that wakeup might be an OOB (out-of-band) source like GPIO line
which makes things slightly more complicated.

Add a sysfs node to cover this case.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Tony Lindgren <tony@atomide.com>
Cc: Grygorii Strashko <grygorii.strashko@ti.com>
Cc: "Rafael J . Wysocki" <rafael.j.wysocki@intel.com>
Link: https://lkml.kernel.org/r/20180226155043.67937-1-andriy.shevchenko@linux.intel.com
Documentation/ABI/testing/sysfs-kernel-irq
kernel/irq/irqdesc.c

index eb074b1..8910d0c 100644 (file)
@@ -51,3 +51,10 @@ Date:                September 2016
 KernelVersion: 4.9
 Contact:       Craig Gallek <kraig@google.com>
 Description:   The type of the interrupt.  Either the string 'level' or 'edge'.
+
+What:          /sys/kernel/irq/<irq>/wakeup
+Date:          March 2018
+KernelVersion: 4.17
+Contact:       Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Description:   The wakeup state of the interrupt. Either the string
+               'enabled' or 'disabled'.
index 49b54e9..d9ded08 100644 (file)
@@ -210,6 +210,22 @@ static ssize_t type_show(struct kobject *kobj,
 }
 IRQ_ATTR_RO(type);
 
+static ssize_t wakeup_show(struct kobject *kobj,
+                          struct kobj_attribute *attr, char *buf)
+{
+       struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
+       ssize_t ret = 0;
+
+       raw_spin_lock_irq(&desc->lock);
+       ret = sprintf(buf, "%s\n",
+                     irqd_is_wakeup_set(&desc->irq_data) ? "enabled" : "disabled");
+       raw_spin_unlock_irq(&desc->lock);
+
+       return ret;
+
+}
+IRQ_ATTR_RO(wakeup);
+
 static ssize_t name_show(struct kobject *kobj,
                         struct kobj_attribute *attr, char *buf)
 {
@@ -253,6 +269,7 @@ static struct attribute *irq_attrs[] = {
        &chip_name_attr.attr,
        &hwirq_attr.attr,
        &type_attr.attr,
+       &wakeup_attr.attr,
        &name_attr.attr,
        &actions_attr.attr,
        NULL