static struct acpi_ec *boot_ec;
 static bool boot_ec_is_ecdt = false;
+static struct workqueue_struct *ec_wq;
 static struct workqueue_struct *ec_query_wq;
 
 static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */
                ec_dbg_evt("Command(%s) submitted/blocked",
                           acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
                ec->nr_pending_queries++;
-               schedule_work(&ec->work);
+               queue_work(ec_wq, &ec->work);
        }
 }
 
 #ifdef CONFIG_PM_SLEEP
 static void __acpi_ec_flush_work(void)
 {
-       flush_scheduled_work(); /* flush ec->work */
+       drain_workqueue(ec_wq); /* flush ec->work */
        flush_workqueue(ec_query_wq); /* flush queries */
 }
 
 
 void acpi_ec_flush_work(void)
 {
-       /* Without ec_query_wq there is nothing to flush. */
-       if (!ec_query_wq)
+       /* Without ec_wq there is nothing to flush. */
+       if (!ec_wq)
                return;
 
        __acpi_ec_flush_work();
        .drv.pm = &acpi_ec_pm,
 };
 
-static inline int acpi_ec_query_init(void)
+static void acpi_ec_destroy_workqueues(void)
 {
-       if (!ec_query_wq) {
-               ec_query_wq = alloc_workqueue("kec_query", 0,
-                                             ec_max_queries);
-               if (!ec_query_wq)
-                       return -ENODEV;
+       if (ec_wq) {
+               destroy_workqueue(ec_wq);
+               ec_wq = NULL;
        }
-       return 0;
-}
-
-static inline void acpi_ec_query_exit(void)
-{
        if (ec_query_wq) {
                destroy_workqueue(ec_query_wq);
                ec_query_wq = NULL;
        }
 }
 
+static int acpi_ec_init_workqueues(void)
+{
+       if (!ec_wq)
+               ec_wq = alloc_ordered_workqueue("kec", 0);
+
+       if (!ec_query_wq)
+               ec_query_wq = alloc_workqueue("kec_query", 0, ec_max_queries);
+
+       if (!ec_wq || !ec_query_wq) {
+               acpi_ec_destroy_workqueues();
+               return -ENODEV;
+       }
+       return 0;
+}
+
 static const struct dmi_system_id acpi_ec_no_wakeup[] = {
        {
                .ident = "Thinkpad X1 Carbon 6th",
        int result;
        int ecdt_fail, dsdt_fail;
 
-       /* register workqueue for _Qxx evaluations */
-       result = acpi_ec_query_init();
+       result = acpi_ec_init_workqueues();
        if (result)
                return result;
 
 {
 
        acpi_bus_unregister_driver(&acpi_ec_driver);
-       acpi_ec_query_exit();
+       acpi_ec_destroy_workqueues();
 }
 #endif /* 0 */