diff options
Diffstat (limited to 'drivers/acpi/events')
-rw-r--r-- | drivers/acpi/events/evgpe.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c index 23fe53ba7375..f01d339407f8 100644 --- a/drivers/acpi/events/evgpe.c +++ b/drivers/acpi/events/evgpe.c | |||
@@ -382,6 +382,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
382 | u32 status_reg; | 382 | u32 status_reg; |
383 | u32 enable_reg; | 383 | u32 enable_reg; |
384 | acpi_cpu_flags flags; | 384 | acpi_cpu_flags flags; |
385 | acpi_cpu_flags hw_flags; | ||
385 | acpi_native_uint i; | 386 | acpi_native_uint i; |
386 | acpi_native_uint j; | 387 | acpi_native_uint j; |
387 | 388 | ||
@@ -393,9 +394,12 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
393 | return (int_status); | 394 | return (int_status); |
394 | } | 395 | } |
395 | 396 | ||
396 | /* Examine all GPE blocks attached to this interrupt level */ | 397 | /* We need to hold the GPE lock now, hardware lock in the loop */ |
397 | 398 | ||
398 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | 399 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
400 | |||
401 | /* Examine all GPE blocks attached to this interrupt level */ | ||
402 | |||
399 | gpe_block = gpe_xrupt_list->gpe_block_list_head; | 403 | gpe_block = gpe_xrupt_list->gpe_block_list_head; |
400 | while (gpe_block) { | 404 | while (gpe_block) { |
401 | /* | 405 | /* |
@@ -409,6 +413,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
409 | 413 | ||
410 | gpe_register_info = &gpe_block->register_info[i]; | 414 | gpe_register_info = &gpe_block->register_info[i]; |
411 | 415 | ||
416 | hw_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); | ||
417 | |||
412 | /* Read the Status Register */ | 418 | /* Read the Status Register */ |
413 | 419 | ||
414 | status = | 420 | status = |
@@ -417,6 +423,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
417 | &gpe_register_info-> | 423 | &gpe_register_info-> |
418 | status_address); | 424 | status_address); |
419 | if (ACPI_FAILURE(status)) { | 425 | if (ACPI_FAILURE(status)) { |
426 | acpi_os_release_lock(acpi_gbl_hardware_lock, | ||
427 | hw_flags); | ||
420 | goto unlock_and_exit; | 428 | goto unlock_and_exit; |
421 | } | 429 | } |
422 | 430 | ||
@@ -427,6 +435,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
427 | &enable_reg, | 435 | &enable_reg, |
428 | &gpe_register_info-> | 436 | &gpe_register_info-> |
429 | enable_address); | 437 | enable_address); |
438 | acpi_os_release_lock(acpi_gbl_hardware_lock, hw_flags); | ||
439 | |||
430 | if (ACPI_FAILURE(status)) { | 440 | if (ACPI_FAILURE(status)) { |
431 | goto unlock_and_exit; | 441 | goto unlock_and_exit; |
432 | } | 442 | } |
@@ -499,7 +509,6 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) | |||
499 | static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | 509 | static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) |
500 | { | 510 | { |
501 | struct acpi_gpe_event_info *gpe_event_info = (void *)context; | 511 | struct acpi_gpe_event_info *gpe_event_info = (void *)context; |
502 | u32 gpe_number = 0; | ||
503 | acpi_status status; | 512 | acpi_status status; |
504 | struct acpi_gpe_event_info local_gpe_event_info; | 513 | struct acpi_gpe_event_info local_gpe_event_info; |
505 | struct acpi_evaluate_info *info; | 514 | struct acpi_evaluate_info *info; |
@@ -565,10 +574,10 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
565 | 574 | ||
566 | if (ACPI_FAILURE(status)) { | 575 | if (ACPI_FAILURE(status)) { |
567 | ACPI_EXCEPTION((AE_INFO, status, | 576 | ACPI_EXCEPTION((AE_INFO, status, |
568 | "While evaluating method [%4.4s] for GPE[%2X]", | 577 | "While evaluating GPE method [%4.4s]", |
569 | acpi_ut_get_node_name | 578 | acpi_ut_get_node_name |
570 | (local_gpe_event_info.dispatch. | 579 | (local_gpe_event_info.dispatch. |
571 | method_node), gpe_number)); | 580 | method_node))); |
572 | } | 581 | } |
573 | } | 582 | } |
574 | 583 | ||