ACPI / EC: Cleanup transaction state transition.
authorLv Zheng <lv.zheng@intel.com>
Thu, 11 Jun 2015 05:21:23 +0000 (13:21 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 15 Jun 2015 12:35:58 +0000 (14:35 +0200)
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>
drivers/acpi/ec.c

index 149b5e7..0ce8b6e 100644 (file)
@@ -391,7 +391,7 @@ static void acpi_ec_submit_query(struct acpi_ec *ec)
 
 static void acpi_ec_complete_query(struct acpi_ec *ec)
 {
-       if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
+       if (test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
                clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
                ec_dbg_req("Event stopped");
        }
@@ -421,6 +421,15 @@ static int ec_transaction_completed(struct acpi_ec *ec)
        return ret;
 }
 
+static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag)
+{
+       ec->curr->flags |= flag;
+       if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
+               if (flag == ACPI_EC_COMMAND_POLL)
+                       acpi_ec_complete_query(ec);
+       }
+}
+
 static void advance_transaction(struct acpi_ec *ec)
 {
        struct transaction *t;
@@ -449,7 +458,7 @@ static void advance_transaction(struct acpi_ec *ec)
                        if ((status & ACPI_EC_FLAG_OBF) == 1) {
                                t->rdata[t->ri++] = acpi_ec_read_data(ec);
                                if (t->rlen == t->ri) {
-                                       t->flags |= ACPI_EC_COMMAND_COMPLETE;
+                                       ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
                                        if (t->command == ACPI_EC_COMMAND_QUERY)
                                                ec_dbg_req("Command(%s) hardware completion",
                                                           acpi_ec_cmd_string(t->command));
@@ -459,7 +468,7 @@ static void advance_transaction(struct acpi_ec *ec)
                                goto err;
                } else if (t->wlen == t->wi &&
                           (status & ACPI_EC_FLAG_IBF) == 0) {
-                       t->flags |= ACPI_EC_COMMAND_COMPLETE;
+                       ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
                        wakeup = true;
                }
                goto out;
@@ -467,17 +476,15 @@ static void advance_transaction(struct acpi_ec *ec)
                if (EC_FLAGS_QUERY_HANDSHAKE &&
                    !(status & ACPI_EC_FLAG_SCI) &&
                    (t->command == ACPI_EC_COMMAND_QUERY)) {
-                       t->flags |= ACPI_EC_COMMAND_POLL;
-                       acpi_ec_complete_query(ec);
+                       ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
                        t->rdata[t->ri++] = 0x00;
-                       t->flags |= ACPI_EC_COMMAND_COMPLETE;
+                       ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
                        ec_dbg_req("Command(%s) software completion",
                                   acpi_ec_cmd_string(t->command));
                        wakeup = true;
                } else if ((status & ACPI_EC_FLAG_IBF) == 0) {
                        acpi_ec_write_cmd(ec, t->command);
-                       t->flags |= ACPI_EC_COMMAND_POLL;
-                       acpi_ec_complete_query(ec);
+                       ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
                } else
                        goto err;
                goto out;