Merge branch 'pm-core'
[muen/linux.git] / drivers / acpi / device_pm.c
index 3d6ec51d2bbce8251a8c99e4816b891417835b76..e4ffaeec9ec204110f7e50c5cff49172a486f081 100644 (file)
@@ -387,6 +387,7 @@ EXPORT_SYMBOL(acpi_bus_power_manageable);
 
 #ifdef CONFIG_PM
 static DEFINE_MUTEX(acpi_pm_notifier_lock);
+static DEFINE_MUTEX(acpi_pm_notifier_install_lock);
 
 void acpi_pm_wakeup_event(struct device *dev)
 {
@@ -443,24 +444,25 @@ acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
        if (!dev && !func)
                return AE_BAD_PARAMETER;
 
-       mutex_lock(&acpi_pm_notifier_lock);
+       mutex_lock(&acpi_pm_notifier_install_lock);
 
        if (adev->wakeup.flags.notifier_present)
                goto out;
 
-       adev->wakeup.ws = wakeup_source_register(dev_name(&adev->dev));
-       adev->wakeup.context.dev = dev;
-       adev->wakeup.context.func = func;
-
        status = acpi_install_notify_handler(adev->handle, ACPI_SYSTEM_NOTIFY,
                                             acpi_pm_notify_handler, NULL);
        if (ACPI_FAILURE(status))
                goto out;
 
+       mutex_lock(&acpi_pm_notifier_lock);
+       adev->wakeup.ws = wakeup_source_register(dev_name(&adev->dev));
+       adev->wakeup.context.dev = dev;
+       adev->wakeup.context.func = func;
        adev->wakeup.flags.notifier_present = true;
+       mutex_unlock(&acpi_pm_notifier_lock);
 
  out:
-       mutex_unlock(&acpi_pm_notifier_lock);
+       mutex_unlock(&acpi_pm_notifier_install_lock);
        return status;
 }
 
@@ -472,7 +474,7 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev)
 {
        acpi_status status = AE_BAD_PARAMETER;
 
-       mutex_lock(&acpi_pm_notifier_lock);
+       mutex_lock(&acpi_pm_notifier_install_lock);
 
        if (!adev->wakeup.flags.notifier_present)
                goto out;
@@ -483,14 +485,15 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev)
        if (ACPI_FAILURE(status))
                goto out;
 
+       mutex_lock(&acpi_pm_notifier_lock);
        adev->wakeup.context.func = NULL;
        adev->wakeup.context.dev = NULL;
        wakeup_source_unregister(adev->wakeup.ws);
-
        adev->wakeup.flags.notifier_present = false;
+       mutex_unlock(&acpi_pm_notifier_lock);
 
  out:
-       mutex_unlock(&acpi_pm_notifier_lock);
+       mutex_unlock(&acpi_pm_notifier_install_lock);
        return status;
 }