diff options
| author | Luming Yu <luming.yu@intel.com> | 2005-04-22 23:07:10 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2005-07-12 00:12:53 -0400 |
| commit | 17e9c78a75ce9eacd61200f9e1f1924012e28846 (patch) | |
| tree | d9d8f1c19eaa45ec419b76d5ec1bdad27a1451e6 | |
| parent | a27ac38efd6dc6dccebfc9bcc475ab4aa5fc4a56 (diff) | |
[ACPI] EC GPE-disabled issue
http://bugzilla.kernel.org/show_bug.cgi?id=3851
Signed-off-by: Luming Yu <luming.yu@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/ec.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index a4b70dfdcf04..8e665f2e3138 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -282,7 +282,7 @@ end: | |||
| 282 | 282 | ||
| 283 | if(atomic_read(&ec->leaving_burst) == 2){ | 283 | if(atomic_read(&ec->leaving_burst) == 2){ |
| 284 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); | 284 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); |
| 285 | while(!atomic_read(&ec->pending_gpe)){ | 285 | while(atomic_read(&ec->pending_gpe)){ |
| 286 | msleep(1); | 286 | msleep(1); |
| 287 | } | 287 | } |
| 288 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); | 288 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); |
| @@ -365,7 +365,7 @@ end: | |||
| 365 | 365 | ||
| 366 | if(atomic_read(&ec->leaving_burst) == 2){ | 366 | if(atomic_read(&ec->leaving_burst) == 2){ |
| 367 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); | 367 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); |
| 368 | while(!atomic_read(&ec->pending_gpe)){ | 368 | while(atomic_read(&ec->pending_gpe)){ |
| 369 | msleep(1); | 369 | msleep(1); |
| 370 | } | 370 | } |
| 371 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); | 371 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); |
| @@ -431,7 +431,6 @@ acpi_ec_query ( | |||
| 431 | 431 | ||
| 432 | if (!ec || !data) | 432 | if (!ec || !data) |
| 433 | return_VALUE(-EINVAL); | 433 | return_VALUE(-EINVAL); |
| 434 | retry: | ||
| 435 | *data = 0; | 434 | *data = 0; |
| 436 | 435 | ||
| 437 | if (ec->global_lock) { | 436 | if (ec->global_lock) { |
| @@ -469,13 +468,9 @@ end: | |||
| 469 | 468 | ||
| 470 | if(atomic_read(&ec->leaving_burst) == 2){ | 469 | if(atomic_read(&ec->leaving_burst) == 2){ |
| 471 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); | 470 | ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); |
| 472 | while(!atomic_read(&ec->pending_gpe)){ | ||
| 473 | msleep(1); | ||
| 474 | } | ||
| 475 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); | 471 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); |
| 476 | goto retry; | 472 | status = -ENODATA; |
| 477 | } | 473 | } |
| 478 | |||
| 479 | return_VALUE(status); | 474 | return_VALUE(status); |
| 480 | } | 475 | } |
| 481 | 476 | ||
| @@ -514,8 +509,8 @@ acpi_ec_gpe_query ( | |||
| 514 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name)); | 509 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name)); |
| 515 | 510 | ||
| 516 | acpi_evaluate_object(ec->handle, object_name, NULL, NULL); | 511 | acpi_evaluate_object(ec->handle, object_name, NULL, NULL); |
| 517 | atomic_dec(&ec->pending_gpe); | ||
| 518 | end: | 512 | end: |
| 513 | atomic_dec(&ec->pending_gpe); | ||
| 519 | return; | 514 | return; |
| 520 | } | 515 | } |
| 521 | 516 | ||
| @@ -553,7 +548,7 @@ acpi_ec_gpe_handler ( | |||
| 553 | !(value & ACPI_EC_FLAG_IBF))) { | 548 | !(value & ACPI_EC_FLAG_IBF))) { |
| 554 | ec->expect_event = 0; | 549 | ec->expect_event = 0; |
| 555 | wake_up(&ec->wait); | 550 | wake_up(&ec->wait); |
| 556 | 551 | return ACPI_INTERRUPT_HANDLED; | |
| 557 | } | 552 | } |
| 558 | } | 553 | } |
| 559 | 554 | ||
| @@ -561,8 +556,10 @@ acpi_ec_gpe_handler ( | |||
| 561 | atomic_add(1, &ec->pending_gpe) ; | 556 | atomic_add(1, &ec->pending_gpe) ; |
| 562 | status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, | 557 | status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, |
| 563 | acpi_ec_gpe_query, ec); | 558 | acpi_ec_gpe_query, ec); |
| 559 | return status == AE_OK ? | ||
| 560 | ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; | ||
| 564 | } | 561 | } |
| 565 | 562 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_ISR); | |
| 566 | return status == AE_OK ? | 563 | return status == AE_OK ? |
| 567 | ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; | 564 | ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; |
| 568 | } | 565 | } |
| @@ -688,6 +685,7 @@ acpi_ec_read_info (struct seq_file *seq, void *offset) | |||
| 688 | (u32) ec->status_addr.address, (u32) ec->data_addr.address); | 685 | (u32) ec->status_addr.address, (u32) ec->data_addr.address); |
| 689 | seq_printf(seq, "use global lock: %s\n", | 686 | seq_printf(seq, "use global lock: %s\n", |
| 690 | ec->global_lock?"yes":"no"); | 687 | ec->global_lock?"yes":"no"); |
| 688 | acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); | ||
| 691 | 689 | ||
| 692 | end: | 690 | end: |
| 693 | return_VALUE(0); | 691 | return_VALUE(0); |
