提交 ff754e2e 编写于 作者: B Bjorn Helgaas 提交者: Len Brown

ACPI: use handle, not device, in system notification path

This patch changes the global system notification path so it uses the
acpi_handle, not the acpi_device.

System notifications often deal with device presence and status change.
In these cases, we may not have an acpi_device.  For example, we may
get a Device Check notification on an object that previously was not
present.  Since the object was not present, we would not have had an
acpi_device for it.
Signed-off-by: NBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 cdd5b8ca
...@@ -450,11 +450,14 @@ int acpi_bus_receive_event(struct acpi_bus_event *event) ...@@ -450,11 +450,14 @@ int acpi_bus_receive_event(struct acpi_bus_event *event)
Notification Handling Notification Handling
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
static void acpi_bus_check_device(struct acpi_device *device) static void acpi_bus_check_device(acpi_handle handle)
{ {
struct acpi_device *device;
acpi_status status; acpi_status status;
struct acpi_device_status old_status; struct acpi_device_status old_status;
if (acpi_bus_get_device(handle, &device))
return;
if (!device) if (!device)
return; return;
...@@ -488,13 +491,10 @@ static void acpi_bus_check_device(struct acpi_device *device) ...@@ -488,13 +491,10 @@ static void acpi_bus_check_device(struct acpi_device *device)
} }
} }
static void acpi_bus_check_scope(struct acpi_device *device) static void acpi_bus_check_scope(acpi_handle handle)
{ {
if (!device)
return;
/* Status Change? */ /* Status Change? */
acpi_bus_check_device(device); acpi_bus_check_device(handle);
/* /*
* TBD: Enumerate child devices within this device's scope and * TBD: Enumerate child devices within this device's scope and
...@@ -531,13 +531,10 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -531,13 +531,10 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
blocking_notifier_call_chain(&acpi_bus_notify_list, blocking_notifier_call_chain(&acpi_bus_notify_list,
type, (void *)handle); type, (void *)handle);
if (acpi_bus_get_device(handle, &device))
return;
switch (type) { switch (type) {
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
acpi_bus_check_scope(device); acpi_bus_check_scope(handle);
/* /*
* TBD: We'll need to outsource certain events to non-ACPI * TBD: We'll need to outsource certain events to non-ACPI
* drivers via the device manager (device.c). * drivers via the device manager (device.c).
...@@ -545,7 +542,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -545,7 +542,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
break; break;
case ACPI_NOTIFY_DEVICE_CHECK: case ACPI_NOTIFY_DEVICE_CHECK:
acpi_bus_check_device(device); acpi_bus_check_device(handle);
/* /*
* TBD: We'll need to outsource certain events to non-ACPI * TBD: We'll need to outsource certain events to non-ACPI
* drivers via the device manager (device.c). * drivers via the device manager (device.c).
...@@ -583,10 +580,13 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -583,10 +580,13 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
break; break;
} }
acpi_bus_get_device(handle, &device);
if (device) {
driver = device->driver; driver = device->driver;
if (driver && driver->ops.notify && if (driver && driver->ops.notify &&
(driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS)) (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
driver->ops.notify(device, type); driver->ops.notify(device, type);
}
} }
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册