diff options
Diffstat (limited to 'drivers/acpi/ec.c')
-rw-r--r-- | drivers/acpi/ec.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index d7d32c28829b..ad11ba4a412d 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -206,13 +206,13 @@ unlock: | |||
206 | spin_unlock_irqrestore(&ec->lock, flags); | 206 | spin_unlock_irqrestore(&ec->lock, flags); |
207 | } | 207 | } |
208 | 208 | ||
209 | static int acpi_ec_sync_query(struct acpi_ec *ec); | 209 | static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data); |
210 | 210 | ||
211 | static int ec_check_sci_sync(struct acpi_ec *ec, u8 state) | 211 | static int ec_check_sci_sync(struct acpi_ec *ec, u8 state) |
212 | { | 212 | { |
213 | if (state & ACPI_EC_FLAG_SCI) { | 213 | if (state & ACPI_EC_FLAG_SCI) { |
214 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) | 214 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) |
215 | return acpi_ec_sync_query(ec); | 215 | return acpi_ec_sync_query(ec, NULL); |
216 | } | 216 | } |
217 | return 0; | 217 | return 0; |
218 | } | 218 | } |
@@ -443,10 +443,8 @@ acpi_handle ec_get_handle(void) | |||
443 | 443 | ||
444 | EXPORT_SYMBOL(ec_get_handle); | 444 | EXPORT_SYMBOL(ec_get_handle); |
445 | 445 | ||
446 | static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 *data); | ||
447 | |||
448 | /* | 446 | /* |
449 | * Clears stale _Q events that might have accumulated in the EC. | 447 | * Process _Q events that might have accumulated in the EC. |
450 | * Run with locked ec mutex. | 448 | * Run with locked ec mutex. |
451 | */ | 449 | */ |
452 | static void acpi_ec_clear(struct acpi_ec *ec) | 450 | static void acpi_ec_clear(struct acpi_ec *ec) |
@@ -455,7 +453,7 @@ static void acpi_ec_clear(struct acpi_ec *ec) | |||
455 | u8 value = 0; | 453 | u8 value = 0; |
456 | 454 | ||
457 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { | 455 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { |
458 | status = acpi_ec_query_unlocked(ec, &value); | 456 | status = acpi_ec_sync_query(ec, &value); |
459 | if (status || !value) | 457 | if (status || !value) |
460 | break; | 458 | break; |
461 | } | 459 | } |
@@ -582,13 +580,18 @@ static void acpi_ec_run(void *cxt) | |||
582 | kfree(handler); | 580 | kfree(handler); |
583 | } | 581 | } |
584 | 582 | ||
585 | static int acpi_ec_sync_query(struct acpi_ec *ec) | 583 | static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data) |
586 | { | 584 | { |
587 | u8 value = 0; | 585 | u8 value = 0; |
588 | int status; | 586 | int status; |
589 | struct acpi_ec_query_handler *handler, *copy; | 587 | struct acpi_ec_query_handler *handler, *copy; |
590 | if ((status = acpi_ec_query_unlocked(ec, &value))) | 588 | |
589 | status = acpi_ec_query_unlocked(ec, &value); | ||
590 | if (data) | ||
591 | *data = value; | ||
592 | if (status) | ||
591 | return status; | 593 | return status; |
594 | |||
592 | list_for_each_entry(handler, &ec->list, node) { | 595 | list_for_each_entry(handler, &ec->list, node) { |
593 | if (value == handler->query_bit) { | 596 | if (value == handler->query_bit) { |
594 | /* have custom handler for this bit */ | 597 | /* have custom handler for this bit */ |
@@ -612,7 +615,7 @@ static void acpi_ec_gpe_query(void *ec_cxt) | |||
612 | if (!ec) | 615 | if (!ec) |
613 | return; | 616 | return; |
614 | mutex_lock(&ec->mutex); | 617 | mutex_lock(&ec->mutex); |
615 | acpi_ec_sync_query(ec); | 618 | acpi_ec_sync_query(ec, NULL); |
616 | mutex_unlock(&ec->mutex); | 619 | mutex_unlock(&ec->mutex); |
617 | } | 620 | } |
618 | 621 | ||