Merge tag 'pm+acpi-3.17-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafae...
[pandora-kernel.git] / drivers / acpi / scan.c
index f775fa0..0a817ad 100644 (file)
@@ -77,7 +77,9 @@ void acpi_initialize_hp_context(struct acpi_device *adev,
                                void (*uevent)(struct acpi_device *, u32))
 {
        acpi_lock_hp_context();
-       acpi_set_hp_context(adev, hp, notify, uevent, NULL);
+       hp->notify = notify;
+       hp->uevent = uevent;
+       acpi_set_hp_context(adev, hp);
        acpi_unlock_hp_context();
 }
 EXPORT_SYMBOL_GPL(acpi_initialize_hp_context);
@@ -351,7 +353,8 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
        unsigned long long sta;
        acpi_status status;
 
-       if (device->handler->hotplug.demand_offline && !acpi_force_hot_remove) {
+       if (device->handler && device->handler->hotplug.demand_offline
+           && !acpi_force_hot_remove) {
                if (!acpi_scan_is_offline(device, true))
                        return -EBUSY;
        } else {
@@ -1421,14 +1424,13 @@ static int acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
                        wakeup->sleep_state = sleep_state;
                }
        }
-       acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number);
 
  out:
        kfree(buffer.pointer);
        return err;
 }
 
-static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
+static void acpi_wakeup_gpe_init(struct acpi_device *device)
 {
        struct acpi_device_id button_device_ids[] = {
                {"PNP0C0C", 0},
@@ -1436,29 +1438,33 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
                {"PNP0C0E", 0},
                {"", 0},
        };
+       struct acpi_device_wakeup *wakeup = &device->wakeup;
        acpi_status status;
        acpi_event_status event_status;
 
-       device->wakeup.flags.notifier_present = 0;
+       wakeup->flags.notifier_present = 0;
 
        /* Power button, Lid switch always enable wakeup */
        if (!acpi_match_device_ids(device, button_device_ids)) {
-               device->wakeup.flags.run_wake = 1;
+               wakeup->flags.run_wake = 1;
                if (!acpi_match_device_ids(device, &button_device_ids[1])) {
                        /* Do not use Lid/sleep button for S5 wakeup */
-                       if (device->wakeup.sleep_state == ACPI_STATE_S5)
-                               device->wakeup.sleep_state = ACPI_STATE_S4;
+                       if (wakeup->sleep_state == ACPI_STATE_S5)
+                               wakeup->sleep_state = ACPI_STATE_S4;
                }
+               acpi_mark_gpe_for_wake(wakeup->gpe_device, wakeup->gpe_number);
                device_set_wakeup_capable(&device->dev, true);
                return;
        }
 
-       status = acpi_get_gpe_status(device->wakeup.gpe_device,
-                                       device->wakeup.gpe_number,
-                                               &event_status);
-       if (status == AE_OK)
-               device->wakeup.flags.run_wake =
-                               !!(event_status & ACPI_EVENT_FLAG_HANDLE);
+       acpi_setup_gpe_for_wake(device->handle, wakeup->gpe_device,
+                               wakeup->gpe_number);
+       status = acpi_get_gpe_status(wakeup->gpe_device, wakeup->gpe_number,
+                                    &event_status);
+       if (ACPI_FAILURE(status))
+               return;
+
+       wakeup->flags.run_wake = !!(event_status & ACPI_EVENT_FLAG_HANDLE);
 }
 
 static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
@@ -1478,7 +1484,7 @@ static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
 
        device->wakeup.flags.valid = 1;
        device->wakeup.prepare_count = 0;
-       acpi_bus_set_run_wake_flags(device);
+       acpi_wakeup_gpe_init(device);
        /* Call _PSW/_DSW object to disable its ability to wake the sleeping
         * system for the ACPI device with the _PRW object.
         * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW.