ACPI: make /proc/acpi/wakeup more useful
authorDavid Brownell <david-b@pacbell.net>
Wed, 25 Apr 2007 19:20:10 +0000 (15:20 -0400)
committerLen Brown <len.brown@intel.com>
Wed, 25 Apr 2007 19:20:10 +0000 (15:20 -0400)
This updates /proc/acpi/wakeup to be more informative, primarily by showing
the sysfs node associated with each wakeup-enabled device.  Example:

Device S-state   Status   Sysfs node
PCI0   S4  disabled  no-bus:pci0000:00
PS2M   S4  disabled  pnp:00:05
PS2K   S4  disabled  pnp:00:06
UAR1   S4  disabled  pnp:00:08
USB1   S3  disabled  pci:0000:00:03.0
USB2   S3  disabled  pci:0000:00:03.1
USB3   S3  disabled
USB4   S3  disabled  pci:0000:00:03.3
S139   S4  disabled
LAN   S4  disabled  pci:0000:00:04.0
MDM   S4  disabled
AUD   S4  disabled  pci:0000:00:02.7
SLPB   S4 *enabled

Eventually this file should be removed, but until then it's almost the only
way we have to tell how the relevant ACPI tables are broken (and cope).  In
that example, two devices don't actually exist (USB3, S139), one can't issue
wakeup events (PCI0), and two seem harmlessly (?) confused (MDM and AUD are
the same PCI device, but it's the _modem_ that does wake-on-ring).

In particular, we need to be sure driver model nodes are properly hooked
up before we can get rid of this ACPI-only interface for wakeup events.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/sleep/proc.c

index ccc11b33d89cd713036ae2d0f5ad98bb9a4bd3f3..2d912b71e5435651226cc1278b9d01e8ea55b3e4 100644 (file)
@@ -350,21 +350,31 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
 {
        struct list_head *node, *next;
 
-       seq_printf(seq, "Device Sleep state     Status\n");
+       seq_printf(seq, "Device\tS-state\t  Status   Sysfs node\n");
 
        spin_lock(&acpi_device_lock);
        list_for_each_safe(node, next, &acpi_wakeup_device_list) {
                struct acpi_device *dev =
                    container_of(node, struct acpi_device, wakeup_list);
+               struct device *ldev;
 
                if (!dev->wakeup.flags.valid)
                        continue;
                spin_unlock(&acpi_device_lock);
-               seq_printf(seq, "%4s    %4d             %s%8s\n",
+
+               ldev = acpi_get_physical_device(dev->handle);
+               seq_printf(seq, "%s\t  S%d\t%c%-8s  ",
                           dev->pnp.bus_id,
                           (u32) dev->wakeup.sleep_state,
-                          dev->wakeup.flags.run_wake ? "*" : "",
+                          dev->wakeup.flags.run_wake ? '*' : ' ',
                           dev->wakeup.state.enabled ? "enabled" : "disabled");
+               if (ldev)
+                       seq_printf(seq, "%s:%s",
+                               ldev->bus ? ldev->bus->name : "no-bus",
+                               ldev->bus_id);
+               seq_printf(seq, "\n");
+               put_device(ldev);
+
                spin_lock(&acpi_device_lock);
        }
        spin_unlock(&acpi_device_lock);