spin_unlock_irq(&ec->lock);
 }
 
-static void acpi_ec_handle_interrupt(struct acpi_ec *ec)
+static void clear_gpe_and_advance_transaction(struct acpi_ec *ec, bool interrupt)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&ec->lock, flags);
-
        /*
         * Clear GPE_STS upfront to allow subsequent hardware GPE_STS 0->1
         * changes to always trigger a GPE interrupt.
                acpi_clear_gpe(NULL, ec->gpe);
 
        advance_transaction(ec, true);
+}
+
+static void acpi_ec_handle_interrupt(struct acpi_ec *ec)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ec->lock, flags);
+
+       clear_gpe_and_advance_transaction(ec, true);
+
        spin_unlock_irqrestore(&ec->lock, flags);
 }
 
        if (acpi_ec_gpe_status_set(first_ec)) {
                pm_pr_dbg("ACPI EC GPE status set\n");
 
-               advance_transaction(first_ec, false);
+               clear_gpe_and_advance_transaction(first_ec, false);
                work_in_progress = acpi_ec_work_in_progress(first_ec);
        }