aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Starikovskiy <astarikovskiy@suse.de>2007-09-30 14:39:42 -0400
committerLen Brown <len.brown@intel.com>2007-10-10 01:00:39 -0400
commit2d571b33cf7efd6a894e765e3cb45587ec5b834a (patch)
treebdc1a1906488d58fde00d855862090ef2289393d
parentd30dc9abb4aacfd4df3f486f22bcbc0531b73283 (diff)
ACPICA: hw: Don't carry spinlock over suspend
ACPI uses acpi_get_register() in order to get into suspend. This function is guarded by acpi_gbl_hardware_lock, which will be carried into resume phase. At resume interrupts are enabled and first ACPI interrupt deadlocks on this lock. Solution seems to be to not lock register read, as there are no concurrent activity at this point. Reference: http://bugzilla.kernel.org/show_bug.cgi?id=7499 Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--drivers/acpi/hardware/hwsleep.c3
-rw-r--r--include/acpi/acpixf.h2
2 files changed, 4 insertions, 1 deletions
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
index 4d0c677fac19..c0577ca55358 100644
--- a/drivers/acpi/hardware/hwsleep.c
+++ b/drivers/acpi/hardware/hwsleep.c
@@ -398,7 +398,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
398 /* Wait until we enter sleep state */ 398 /* Wait until we enter sleep state */
399 399
400 do { 400 do {
401 status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value); 401 status = acpi_get_register_unlocked(ACPI_BITREG_WAKE_STATUS,
402 &in_value);
402 if (ACPI_FAILURE(status)) { 403 if (ACPI_FAILURE(status)) {
403 return_ACPI_STATUS(status); 404 return_ACPI_STATUS(status);
404 } 405 }
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index 3d7ab9e0c9fe..9512f0456ad1 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -314,6 +314,8 @@ acpi_resource_to_address64(struct acpi_resource *resource,
314 */ 314 */
315acpi_status acpi_get_register(u32 register_id, u32 * return_value); 315acpi_status acpi_get_register(u32 register_id, u32 * return_value);
316 316
317acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value);
318
317acpi_status acpi_set_register(u32 register_id, u32 value); 319acpi_status acpi_set_register(u32 register_id, u32 value);
318 320
319acpi_status 321acpi_status