diff options
Diffstat (limited to 'drivers/acpi/ec.c')
| -rw-r--r-- | drivers/acpi/ec.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index e61d4f8e62a5..5f2027d782e8 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -79,7 +79,7 @@ enum { | |||
| 79 | EC_FLAGS_GPE_STORM, /* GPE storm detected */ | 79 | EC_FLAGS_GPE_STORM, /* GPE storm detected */ |
| 80 | EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and | 80 | EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and |
| 81 | * OpReg are installed */ | 81 | * OpReg are installed */ |
| 82 | EC_FLAGS_FROZEN, /* Transactions are suspended */ | 82 | EC_FLAGS_BLOCKED, /* Transactions are blocked */ |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | /* If we find an EC via the ECDT, we need to keep a ptr to its context */ | 85 | /* If we find an EC via the ECDT, we need to keep a ptr to its context */ |
| @@ -293,7 +293,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) | |||
| 293 | if (t->rdata) | 293 | if (t->rdata) |
| 294 | memset(t->rdata, 0, t->rlen); | 294 | memset(t->rdata, 0, t->rlen); |
| 295 | mutex_lock(&ec->lock); | 295 | mutex_lock(&ec->lock); |
| 296 | if (test_bit(EC_FLAGS_FROZEN, &ec->flags)) { | 296 | if (test_bit(EC_FLAGS_BLOCKED, &ec->flags)) { |
| 297 | status = -EINVAL; | 297 | status = -EINVAL; |
| 298 | goto unlock; | 298 | goto unlock; |
| 299 | } | 299 | } |
| @@ -459,7 +459,7 @@ int ec_transaction(u8 command, | |||
| 459 | 459 | ||
| 460 | EXPORT_SYMBOL(ec_transaction); | 460 | EXPORT_SYMBOL(ec_transaction); |
| 461 | 461 | ||
| 462 | void acpi_ec_suspend_transactions(void) | 462 | void acpi_ec_block_transactions(void) |
| 463 | { | 463 | { |
| 464 | struct acpi_ec *ec = first_ec; | 464 | struct acpi_ec *ec = first_ec; |
| 465 | 465 | ||
| @@ -468,11 +468,11 @@ void acpi_ec_suspend_transactions(void) | |||
| 468 | 468 | ||
| 469 | mutex_lock(&ec->lock); | 469 | mutex_lock(&ec->lock); |
| 470 | /* Prevent transactions from being carried out */ | 470 | /* Prevent transactions from being carried out */ |
| 471 | set_bit(EC_FLAGS_FROZEN, &ec->flags); | 471 | set_bit(EC_FLAGS_BLOCKED, &ec->flags); |
| 472 | mutex_unlock(&ec->lock); | 472 | mutex_unlock(&ec->lock); |
| 473 | } | 473 | } |
| 474 | 474 | ||
| 475 | void acpi_ec_resume_transactions(void) | 475 | void acpi_ec_unblock_transactions(void) |
| 476 | { | 476 | { |
| 477 | struct acpi_ec *ec = first_ec; | 477 | struct acpi_ec *ec = first_ec; |
| 478 | 478 | ||
| @@ -481,10 +481,20 @@ void acpi_ec_resume_transactions(void) | |||
| 481 | 481 | ||
| 482 | mutex_lock(&ec->lock); | 482 | mutex_lock(&ec->lock); |
| 483 | /* Allow transactions to be carried out again */ | 483 | /* Allow transactions to be carried out again */ |
| 484 | clear_bit(EC_FLAGS_FROZEN, &ec->flags); | 484 | clear_bit(EC_FLAGS_BLOCKED, &ec->flags); |
| 485 | mutex_unlock(&ec->lock); | 485 | mutex_unlock(&ec->lock); |
| 486 | } | 486 | } |
| 487 | 487 | ||
| 488 | void acpi_ec_unblock_transactions_early(void) | ||
| 489 | { | ||
| 490 | /* | ||
| 491 | * Allow transactions to happen again (this function is called from | ||
| 492 | * atomic context during wakeup, so we don't need to acquire the mutex). | ||
| 493 | */ | ||
| 494 | if (first_ec) | ||
| 495 | clear_bit(EC_FLAGS_BLOCKED, &first_ec->flags); | ||
| 496 | } | ||
| 497 | |||
| 488 | static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data) | 498 | static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data) |
| 489 | { | 499 | { |
| 490 | int result; | 500 | int result; |
