acpi_ec_start(first_ec, true);
 }
 
+void acpi_ec_mark_gpe_for_wake(void)
+{
+       if (first_ec && !ec_no_wakeup)
+               acpi_mark_gpe_for_wake(NULL, first_ec->gpe);
+}
+
+void acpi_ec_set_gpe_wake_mask(u8 action)
+{
+       if (first_ec && !ec_no_wakeup)
+               acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
+}
+
 void acpi_ec_dispatch_gpe(void)
 {
        if (first_ec)
 
 int acpi_ec_dsdt_probe(void);
 void acpi_ec_block_transactions(void);
 void acpi_ec_unblock_transactions(void);
+void acpi_ec_mark_gpe_for_wake(void);
+void acpi_ec_set_gpe_wake_mask(u8 action);
 void acpi_ec_dispatch_gpe(void);
 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
                              acpi_handle handle, acpi_ec_query_func func,
 
 
                acpi_handle_debug(adev->handle, "_DSM function mask: 0x%x\n",
                                  bitmask);
+
+               acpi_ec_mark_gpe_for_wake();
        } else {
                acpi_handle_debug(adev->handle,
                                  "_DSM function 0 evaluation failed\n");
        if (lps0_device_handle) {
                acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
                acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
+
+               acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
        }
 
        if (acpi_sci_irq_valid())
                enable_irq_wake(acpi_sci_irq);
 
+       /* Change the configuration of GPEs to avoid spurious wakeup. */
+       acpi_enable_all_wakeup_gpes();
+       acpi_os_wait_events_complete();
        return 0;
 }
 
 
 static void acpi_s2idle_restore(void)
 {
+       acpi_enable_all_runtime_gpes();
+
        if (acpi_sci_irq_valid())
                disable_irq_wake(acpi_sci_irq);
 
        if (lps0_device_handle) {
+               acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
+
                acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
                acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON);
        }