diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-03-17 13:47:04 +0100 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-03-17 13:47:04 +0100 |
commit | d983f93328041f85e884a586810a67528ae59945 (patch) | |
tree | cee4bb57846b237dc63bd111fa2ffe6cbcdc7cba /drivers/acpi/bus.c | |
parent | Linux 3.14-rc7 (diff) | |
parent | ACPI / hotplug / PCI: Use pci_device_is_present() (diff) | |
download | linux-d983f93328041f85e884a586810a67528ae59945.tar.xz linux-d983f93328041f85e884a586810a67528ae59945.zip |
Merge branch 'acpi-pci-hotplug'
* acpi-pci-hotplug: (23 commits)
ACPI / hotplug / PCI: Use pci_device_is_present()
ACPI / hotplug / PCI: Add ACPIPHP contexts to devices handled by PCIeHP
ACPI / hotplug / PCI: Rename register_slot() to acpiphp_add_context()
ACPI / hotplug / PCI: Execute _EJ0 under the ACPI scan lock
ACPI / hotplug / PCI: Rework acpiphp_check_host_bridge()
ACPI / hotplug / PCI: Hotplug notifications from acpi_bus_notify()
ACPI / hotplug / PCI: Simplify acpi_install_hotplug_notify_handler()
ACPI / hotplug / PCI: Rework the handling of eject requests
ACPI / hotplug / PCI: Consolidate ACPIPHP with ACPI core hotplug
ACPI / hotplug / PCI: Define hotplug context lock in the core
ACPI / hotplug: Fix potential race in acpi_bus_notify()
ACPICA: Introduce acpi_get_data_full() and rework acpi_get_data()
ACPI / hotplug / PCI: Do not pass ACPI handle to hotplug_event()
ACPI / hotplug / PCI: Use acpi_handle_debug() in hotplug_event()
ACPI / hotplug / PCI: Simplify hotplug_event()
ACPI / hotplug / PCI: Drop crit_sect locking
ACPI / hotplug / PCI: Drop acpiphp_bus_add()
ACPI / hotplug / PCI: Store acpi_device pointer in acpiphp_context
ACPI / hotplug / PCI: Rework acpiphp_no_hotplug()
ACPI / hotplug / PCI: Drop acpiphp_bus_trim()
...
Diffstat (limited to 'drivers/acpi/bus.c')
-rw-r--r-- | drivers/acpi/bus.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index fcb59c21c68d..e61e7b8a2eaf 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -340,60 +340,77 @@ static void acpi_bus_osc_support(void) */ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) { - struct acpi_device *device = NULL; + struct acpi_device *adev; struct acpi_driver *driver; - - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Notification %#02x to handle %p\n", - type, handle)); + acpi_status status; + u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; switch (type) { - case ACPI_NOTIFY_BUS_CHECK: - /* TBD */ + acpi_handle_debug(handle, "ACPI_NOTIFY_BUS_CHECK event\n"); break; case ACPI_NOTIFY_DEVICE_CHECK: - /* TBD */ + acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_CHECK event\n"); break; case ACPI_NOTIFY_DEVICE_WAKE: - /* TBD */ + acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_WAKE event\n"); break; case ACPI_NOTIFY_EJECT_REQUEST: - /* TBD */ + acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n"); break; case ACPI_NOTIFY_DEVICE_CHECK_LIGHT: + acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_CHECK_LIGHT event\n"); /* TBD: Exactly what does 'light' mean? */ break; case ACPI_NOTIFY_FREQUENCY_MISMATCH: - /* TBD */ + acpi_handle_err(handle, "Device cannot be configured due " + "to a frequency mismatch\n"); break; case ACPI_NOTIFY_BUS_MODE_MISMATCH: - /* TBD */ + acpi_handle_err(handle, "Device cannot be configured due " + "to a bus mode mismatch\n"); break; case ACPI_NOTIFY_POWER_FAULT: - /* TBD */ + acpi_handle_err(handle, "Device has suffered a power fault\n"); break; default: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Received unknown/unsupported notification [%08x]\n", - type)); - break; + acpi_handle_warn(handle, "Unsupported event type 0x%x\n", type); + ost_code = ACPI_OST_SC_UNRECOGNIZED_NOTIFY; + goto err; } - acpi_bus_get_device(handle, &device); - if (device) { - driver = device->driver; - if (driver && driver->ops.notify && - (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS)) - driver->ops.notify(device, type); + adev = acpi_bus_get_acpi_device(handle); + if (!adev) + goto err; + + driver = adev->driver; + if (driver && driver->ops.notify && + (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS)) + driver->ops.notify(adev, type); + + switch (type) { + case ACPI_NOTIFY_BUS_CHECK: + case ACPI_NOTIFY_DEVICE_CHECK: + case ACPI_NOTIFY_EJECT_REQUEST: + status = acpi_hotplug_execute(acpi_device_hotplug, adev, type); + if (ACPI_SUCCESS(status)) + return; + default: + break; } + acpi_bus_put_acpi_device(adev); + return; + + err: + acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL); } /* -------------------------------------------------------------------------- |