summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuming Yu <luming.yu@intel.com>2005-04-22 23:07:10 -0400
committerLen Brown <len.brown@intel.com>2005-07-12 00:12:53 -0400
commit17e9c78a75ce9eacd61200f9e1f1924012e28846 (patch)
treed9d8f1c19eaa45ec419b76d5ec1bdad27a1451e6
parenta27ac38efd6dc6dccebfc9bcc475ab4aa5fc4a56 (diff)
downloadlinux-17e9c78a75ce9eacd61200f9e1f1924012e28846.tar.gz
linux-17e9c78a75ce9eacd61200f9e1f1924012e28846.tar.bz2
linux-17e9c78a75ce9eacd61200f9e1f1924012e28846.zip
[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.c20
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:
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);