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 /drivers/acpi/ec.c | |
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>
Diffstat (limited to 'drivers/acpi/ec.c')
-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 a4b70dfdcf0..8e665f2e313 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -282,7 +282,7 @@ end: if(atomic_read(&ec->leaving_burst) == 2){ ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); - while(!atomic_read(&ec->pending_gpe)){ + while(atomic_read(&ec->pending_gpe)){ msleep(1); } acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); @@ -365,7 +365,7 @@ end: if(atomic_read(&ec->leaving_burst) == 2){ ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); - while(!atomic_read(&ec->pending_gpe)){ + while(atomic_read(&ec->pending_gpe)){ msleep(1); } acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); @@ -431,7 +431,6 @@ acpi_ec_query ( if (!ec || !data) return_VALUE(-EINVAL); -retry: *data = 0; if (ec->global_lock) { @@ -469,13 +468,9 @@ end: if(atomic_read(&ec->leaving_burst) == 2){ ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n")); - while(!atomic_read(&ec->pending_gpe)){ - msleep(1); - } acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); - goto retry; + status = -ENODATA; } - return_VALUE(status); } @@ -514,8 +509,8 @@ acpi_ec_gpe_query ( ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name)); acpi_evaluate_object(ec->handle, object_name, NULL, NULL); - atomic_dec(&ec->pending_gpe); end: + atomic_dec(&ec->pending_gpe); return; } @@ -553,7 +548,7 @@ acpi_ec_gpe_handler ( !(value & ACPI_EC_FLAG_IBF))) { ec->expect_event = 0; wake_up(&ec->wait); - + return ACPI_INTERRUPT_HANDLED; } } @@ -561,8 +556,10 @@ acpi_ec_gpe_handler ( atomic_add(1, &ec->pending_gpe) ; status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, acpi_ec_gpe_query, ec); + return status == AE_OK ? + ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; } - + acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_ISR); return status == AE_OK ? ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; } @@ -688,6 +685,7 @@ acpi_ec_read_info (struct seq_file *seq, void *offset) (u32) ec->status_addr.address, (u32) ec->data_addr.address); seq_printf(seq, "use global lock: %s\n", ec->global_lock?"yes":"no"); + acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); end: return_VALUE(0); |