diff options
| author | Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> | 2006-12-07 10:42:16 -0500 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2006-12-08 02:56:06 -0500 |
| commit | 5d0c288b7362ad7ee235b59352ac2a89480e4757 (patch) | |
| tree | d84a59fa93d765b6dfbfb89fceba691ac1a5b7b2 | |
| parent | e41334c0a6ef71458f255db25f011d15099e7cca (diff) | |
ACPI: ec: Query only single query at a time.
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/ec.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index acfe8830da14..a85f795ab4ec 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -104,6 +104,7 @@ struct acpi_ec { | |||
| 104 | unsigned long data_addr; | 104 | unsigned long data_addr; |
| 105 | unsigned long global_lock; | 105 | unsigned long global_lock; |
| 106 | struct semaphore sem; | 106 | struct semaphore sem; |
| 107 | atomic_t query_pending; | ||
| 107 | atomic_t leaving_burst; /* 0 : No, 1 : Yes, 2: abort */ | 108 | atomic_t leaving_burst; /* 0 : No, 1 : Yes, 2: abort */ |
| 108 | wait_queue_head_t wait; | 109 | wait_queue_head_t wait; |
| 109 | } *ec_ecdt; | 110 | } *ec_ecdt; |
| @@ -257,6 +258,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | |||
| 257 | command); | 258 | command); |
| 258 | goto end; | 259 | goto end; |
| 259 | } | 260 | } |
| 261 | } else if (command == ACPI_EC_COMMAND_QUERY) { | ||
| 262 | atomic_set(&ec->query_pending, 0); | ||
| 260 | } | 263 | } |
| 261 | 264 | ||
| 262 | for (; rdata_len > 0; rdata_len --) { | 265 | for (; rdata_len > 0; rdata_len --) { |
| @@ -425,17 +428,9 @@ static void acpi_ec_gpe_query(void *ec_cxt) | |||
| 425 | { | 428 | { |
| 426 | struct acpi_ec *ec = (struct acpi_ec *)ec_cxt; | 429 | struct acpi_ec *ec = (struct acpi_ec *)ec_cxt; |
| 427 | u8 value = 0; | 430 | u8 value = 0; |
| 428 | static char object_name[8]; | 431 | char object_name[8]; |
| 429 | 432 | ||
| 430 | if (!ec) | 433 | if (!ec || acpi_ec_query(ec, &value)) |
| 431 | return; | ||
| 432 | |||
| 433 | value = acpi_ec_read_status(ec); | ||
| 434 | |||
| 435 | if (!(value & ACPI_EC_FLAG_SCI)) | ||
| 436 | return; | ||
| 437 | |||
| 438 | if (acpi_ec_query(ec, &value)) | ||
| 439 | return; | 434 | return; |
| 440 | 435 | ||
| 441 | snprintf(object_name, 8, "_Q%2.2X", value); | 436 | snprintf(object_name, 8, "_Q%2.2X", value); |
| @@ -457,7 +452,8 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
| 457 | } | 452 | } |
| 458 | 453 | ||
| 459 | value = acpi_ec_read_status(ec); | 454 | value = acpi_ec_read_status(ec); |
| 460 | if (value & ACPI_EC_FLAG_SCI) { | 455 | if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { |
| 456 | atomic_set(&ec->query_pending, 1); | ||
| 461 | status = acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); | 457 | status = acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); |
| 462 | } | 458 | } |
| 463 | 459 | ||
| @@ -652,6 +648,7 @@ static int acpi_ec_add(struct acpi_device *device) | |||
| 652 | ec->handle = device->handle; | 648 | ec->handle = device->handle; |
| 653 | ec->uid = -1; | 649 | ec->uid = -1; |
| 654 | init_MUTEX(&ec->sem); | 650 | init_MUTEX(&ec->sem); |
| 651 | atomic_set(&ec->query_pending, 0); | ||
| 655 | if (acpi_ec_mode == EC_INTR) { | 652 | if (acpi_ec_mode == EC_INTR) { |
| 656 | atomic_set(&ec->leaving_burst, 1); | 653 | atomic_set(&ec->leaving_burst, 1); |
| 657 | init_waitqueue_head(&ec->wait); | 654 | init_waitqueue_head(&ec->wait); |
