diff options
| author | Lv Zheng <lv.zheng@intel.com> | 2015-06-11 01:21:23 -0400 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-06-15 08:35:58 -0400 |
| commit | f8b8eb71533338654f39211a87efeca35055566b (patch) | |
| tree | aea22cd59255de99ac61e977649681e556e4fb17 | |
| parent | 3174abcfea6a05aa25038156d6722b6c8876fb36 (diff) | |
ACPI / EC: Cleanup transaction state transition.
This patch collects transaction state transition code into one function. We
then could have a single function to maintain transaction transition
related behaviors. No functional changes.
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Tested-by: Gabriele Mazzotta <gabriele.mzt@gmail.com>
Tested-by: Tigran Gabrielyan <tigrangab@gmail.com>
Tested-by: Adrien D <ghbdtn@openmailbox.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
| -rw-r--r-- | drivers/acpi/ec.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 149b5e7ee5c7..0ce8b6e8c3e8 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -391,7 +391,7 @@ static void acpi_ec_submit_query(struct acpi_ec *ec) | |||
| 391 | 391 | ||
| 392 | static void acpi_ec_complete_query(struct acpi_ec *ec) | 392 | static void acpi_ec_complete_query(struct acpi_ec *ec) |
| 393 | { | 393 | { |
| 394 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | 394 | if (test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { |
| 395 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 395 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
| 396 | ec_dbg_req("Event stopped"); | 396 | ec_dbg_req("Event stopped"); |
| 397 | } | 397 | } |
| @@ -421,6 +421,15 @@ static int ec_transaction_completed(struct acpi_ec *ec) | |||
| 421 | return ret; | 421 | return ret; |
| 422 | } | 422 | } |
| 423 | 423 | ||
| 424 | static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag) | ||
| 425 | { | ||
| 426 | ec->curr->flags |= flag; | ||
| 427 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | ||
| 428 | if (flag == ACPI_EC_COMMAND_POLL) | ||
| 429 | acpi_ec_complete_query(ec); | ||
| 430 | } | ||
| 431 | } | ||
| 432 | |||
| 424 | static void advance_transaction(struct acpi_ec *ec) | 433 | static void advance_transaction(struct acpi_ec *ec) |
| 425 | { | 434 | { |
| 426 | struct transaction *t; | 435 | struct transaction *t; |
| @@ -449,7 +458,7 @@ static void advance_transaction(struct acpi_ec *ec) | |||
| 449 | if ((status & ACPI_EC_FLAG_OBF) == 1) { | 458 | if ((status & ACPI_EC_FLAG_OBF) == 1) { |
| 450 | t->rdata[t->ri++] = acpi_ec_read_data(ec); | 459 | t->rdata[t->ri++] = acpi_ec_read_data(ec); |
| 451 | if (t->rlen == t->ri) { | 460 | if (t->rlen == t->ri) { |
| 452 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 461 | ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); |
| 453 | if (t->command == ACPI_EC_COMMAND_QUERY) | 462 | if (t->command == ACPI_EC_COMMAND_QUERY) |
| 454 | ec_dbg_req("Command(%s) hardware completion", | 463 | ec_dbg_req("Command(%s) hardware completion", |
| 455 | acpi_ec_cmd_string(t->command)); | 464 | acpi_ec_cmd_string(t->command)); |
| @@ -459,7 +468,7 @@ static void advance_transaction(struct acpi_ec *ec) | |||
| 459 | goto err; | 468 | goto err; |
| 460 | } else if (t->wlen == t->wi && | 469 | } else if (t->wlen == t->wi && |
| 461 | (status & ACPI_EC_FLAG_IBF) == 0) { | 470 | (status & ACPI_EC_FLAG_IBF) == 0) { |
| 462 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 471 | ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); |
| 463 | wakeup = true; | 472 | wakeup = true; |
| 464 | } | 473 | } |
| 465 | goto out; | 474 | goto out; |
| @@ -467,17 +476,15 @@ static void advance_transaction(struct acpi_ec *ec) | |||
| 467 | if (EC_FLAGS_QUERY_HANDSHAKE && | 476 | if (EC_FLAGS_QUERY_HANDSHAKE && |
| 468 | !(status & ACPI_EC_FLAG_SCI) && | 477 | !(status & ACPI_EC_FLAG_SCI) && |
| 469 | (t->command == ACPI_EC_COMMAND_QUERY)) { | 478 | (t->command == ACPI_EC_COMMAND_QUERY)) { |
| 470 | t->flags |= ACPI_EC_COMMAND_POLL; | 479 | ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); |
| 471 | acpi_ec_complete_query(ec); | ||
| 472 | t->rdata[t->ri++] = 0x00; | 480 | t->rdata[t->ri++] = 0x00; |
| 473 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 481 | ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); |
| 474 | ec_dbg_req("Command(%s) software completion", | 482 | ec_dbg_req("Command(%s) software completion", |
| 475 | acpi_ec_cmd_string(t->command)); | 483 | acpi_ec_cmd_string(t->command)); |
| 476 | wakeup = true; | 484 | wakeup = true; |
| 477 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { | 485 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { |
| 478 | acpi_ec_write_cmd(ec, t->command); | 486 | acpi_ec_write_cmd(ec, t->command); |
| 479 | t->flags |= ACPI_EC_COMMAND_POLL; | 487 | ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); |
| 480 | acpi_ec_complete_query(ec); | ||
| 481 | } else | 488 | } else |
| 482 | goto err; | 489 | goto err; |
| 483 | goto out; | 490 | goto out; |
