diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2009-04-30 11:35:37 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-06-18 00:13:14 -0400 |
commit | 6d2781310036a8d3fa2b590a6f83a298010fd64a (patch) | |
tree | b10f1e9b275aed0a666786421f636f6fae5cb661 | |
parent | 07a2039b8eb0af4ff464efd3dfd95de5c02648c6 (diff) |
ACPI: allow drivers to request both device and system notify events
System notify events (0x00-0x7f) are common across all device types
and should be handled in Linux/ACPI, not in drivers. However, some
BIOSes use system notify events in device-specific ways that require
the driver to be involved.
This patch adds a ACPI_DRIVER_ALL_NOTIFY_EVENTS driver flag. When a
driver sets this flag and supplies a .notify method, Linux/ACPI calls
the .notify method for ALL notify events on the device, not just the
device-specific (0x80-0xff) events.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r-- | drivers/acpi/bus.c | 6 | ||||
-rw-r--r-- | include/acpi/acpi_bus.h | 3 |
2 files changed, 8 insertions, 1 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index ae862f1798dc..cdfecc0a2ac6 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -549,6 +549,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) | |||
549 | { | 549 | { |
550 | int result = 0; | 550 | int result = 0; |
551 | struct acpi_device *device = NULL; | 551 | struct acpi_device *device = NULL; |
552 | struct acpi_driver *driver; | ||
552 | 553 | ||
553 | blocking_notifier_call_chain(&acpi_bus_notify_list, | 554 | blocking_notifier_call_chain(&acpi_bus_notify_list, |
554 | type, (void *)handle); | 555 | type, (void *)handle); |
@@ -629,7 +630,10 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) | |||
629 | break; | 630 | break; |
630 | } | 631 | } |
631 | 632 | ||
632 | return; | 633 | driver = device->driver; |
634 | if (driver && driver->ops.notify && | ||
635 | (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS)) | ||
636 | driver->ops.notify(device, type); | ||
633 | } | 637 | } |
634 | 638 | ||
635 | /* -------------------------------------------------------------------------- | 639 | /* -------------------------------------------------------------------------- |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index c34b11022908..84e35d5646a1 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -114,10 +114,13 @@ struct acpi_device_ops { | |||
114 | acpi_op_notify notify; | 114 | acpi_op_notify notify; |
115 | }; | 115 | }; |
116 | 116 | ||
117 | #define ACPI_DRIVER_ALL_NOTIFY_EVENTS 0x1 /* system AND device events */ | ||
118 | |||
117 | struct acpi_driver { | 119 | struct acpi_driver { |
118 | char name[80]; | 120 | char name[80]; |
119 | char class[80]; | 121 | char class[80]; |
120 | const struct acpi_device_id *ids; /* Supported Hardware IDs */ | 122 | const struct acpi_device_id *ids; /* Supported Hardware IDs */ |
123 | unsigned int flags; | ||
121 | struct acpi_device_ops ops; | 124 | struct acpi_device_ops ops; |
122 | struct device_driver drv; | 125 | struct device_driver drv; |
123 | struct module *owner; | 126 | struct module *owner; |