diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 86fa61a21826..fe5c46da5265 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1303,7 +1303,24 @@ static int __init acpi_bus_init(void)
 		goto error1;
 	}
 
-	status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
+	/*
+	 * This usually sets an OSYS global variable based on _OSI checks,
+	 * and the EC's _REG method may rely on this OSYS variable, so do
+	 * this before acpi_ec_ecdt_exec_reg().
+	 */
+	status = acpi_early_initialize_objects();
+	if (ACPI_FAILURE(status)) {
+		pr_err("Unable to do early ACPI objects initialization\n");
+		goto error1;
+	}
+
+	acpi_ec_ecdt_exec_reg();
+
+	/*
+	 * ACPI_NO_EARLY_DEVICE_INIT to avoid ACPICA calling
+	 * acpi_early_initialize_objects() a second time.
+	 */
+	status = acpi_initialize_objects(ACPI_NO_EARLY_DEVICE_INIT);
 	if (ACPI_FAILURE(status)) {
 		pr_err("Unable to initialize ACPI objects\n");
 		goto error1;
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index a1b871a418f8..cd86e68d6b98 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1459,6 +1459,7 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)
  * ec_install_handlers - Install service callbacks and register query methods.
  * @ec: Target EC.
  * @device: ACPI device object corresponding to @ec.
+ * @flags: Flags to pass to acpi_install_address_space_handler()
  *
  * Install a handler for the EC address space type unless it has been installed
  * already.  If @device is not NULL, also look for EC query methods in the
@@ -1471,7 +1472,7 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)
  * -EPROBE_DEFER if GPIO IRQ acquisition needs to be deferred,
  * or 0 (success) otherwise.
  */
-static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device)
+static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, u32 flags)
 {
 	acpi_status status;
 
@@ -1479,10 +1480,10 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device)
 
 	if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
 		acpi_ec_enter_noirq(ec);
-		status = acpi_install_address_space_handler(ec->handle,
-							    ACPI_ADR_SPACE_EC,
-							    &acpi_ec_space_handler,
-							    NULL, ec);
+		status = acpi_install_address_space_handler_flags(ec->handle,
+								  ACPI_ADR_SPACE_EC,
+								  &acpi_ec_space_handler,
+								  NULL, ec, flags);
 		if (ACPI_FAILURE(status)) {
 			acpi_ec_stop(ec, false);
 			return -ENODEV;
@@ -1575,11 +1576,11 @@ static void ec_remove_handlers(struct acpi_ec *ec)
 	}
 }
 
-static int acpi_ec_setup(struct acpi_ec *ec, struct acpi_device *device)
+static int acpi_ec_setup(struct acpi_ec *ec, struct acpi_device *device, u32 flags)
 {
 	int ret;
 
-	ret = ec_install_handlers(ec, device);
+	ret = ec_install_handlers(ec, device, flags);
 	if (ret)
 		return ret;
 
@@ -1641,7 +1642,7 @@ static int acpi_ec_add(struct acpi_device *device)
 		}
 	}
 
-	ret = acpi_ec_setup(ec, device);
+	ret = acpi_ec_setup(ec, device, 0);
 	if (ret)
 		goto err;
 
@@ -1761,7 +1762,7 @@ void __init acpi_ec_dsdt_probe(void)
 	 * At this point, the GPE is not fully initialized, so do not to
 	 * handle the events.
 	 */
-	ret = acpi_ec_setup(ec, NULL);
+	ret = acpi_ec_setup(ec, NULL, 0);
 	if (ret) {
 		acpi_ec_free(ec);
 		return;
@@ -1973,7 +1974,7 @@ void __init acpi_ec_ecdt_probe(void)
 	 * At this point, the namespace is not initialized, so do not find
 	 * the namespace objects, or handle the events.
 	 */
-	ret = acpi_ec_setup(ec, NULL);
+	ret = acpi_ec_setup(ec, NULL, ACPI_NO_EXEC__REG);
 	if (ret) {
 		acpi_ec_free(ec);
 		goto out;
@@ -1988,6 +1989,23 @@ void __init acpi_ec_ecdt_probe(void)
 	acpi_put_table((struct acpi_table_header *)ecdt_ptr);
 }
 
+void __init acpi_ec_ecdt_exec_reg(void)
+{
+	if (!boot_ec || !boot_ec_is_ecdt)
+		return;
+
+	/*
+	 * Second call, first call is done in acpi_ec_ecdt_probe(), pass
+	 * ACPI_NO_INSTALL_SPACE_HANDLER so as to only exec _REG now that
+	 * the namespace has been setup.
+	 */
+	acpi_install_address_space_handler_flags(boot_ec->handle,
+						 ACPI_ADR_SPACE_EC,
+						 &acpi_ec_space_handler, NULL,
+						 boot_ec,
+						 ACPI_NO_INSTALL_SPACE_HANDLER);
+}
+
 #ifdef CONFIG_PM_SLEEP
 static int acpi_ec_suspend(struct device *dev)
 {
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 628bf8f18130..14dce6830e01 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -203,6 +203,7 @@ typedef int (*acpi_ec_query_func) (void *data);
 
 void acpi_ec_init(void);
 void acpi_ec_ecdt_probe(void);
+void acpi_ec_ecdt_exec_reg(void);
 void acpi_ec_dsdt_probe(void);
 void acpi_ec_block_transactions(void);
 void acpi_ec_unblock_transactions(void);
