--- /dev/null
+From 0e6b6dedf16800df0ff73ffe2bb5066514db29c2 Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Wed, 12 Jun 2024 16:15:55 +0200
+Subject: ACPI: EC: Evaluate orphan _REG under EC device
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 0e6b6dedf16800df0ff73ffe2bb5066514db29c2 upstream.
+
+After starting to install the EC address space handler at the ACPI
+namespace root, if there is an "orphan" _REG method in the EC device's
+scope, it will not be evaluated any more. This breaks EC operation
+regions on some systems, like Asus gu605.
+
+To address this, use a wrapper around an existing ACPICA function to
+look for an "orphan" _REG method in the EC device scope and evaluate
+it if present.
+
+Fixes: 60fa6ae6e6d0 ("ACPI: EC: Install address space handler at the namespace root")
+Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218945
+Reported-by: VitaliiT <vitaly.torshyn@gmail.com>
+Tested-by: VitaliiT <vitaly.torshyn@gmail.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/acpi/acpica/acevents.h | 4 +++
+ drivers/acpi/acpica/evregion.c | 6 ----
+ drivers/acpi/acpica/evxfregn.c | 54 +++++++++++++++++++++++++++++++++++++++++
+ drivers/acpi/ec.c | 3 ++
+ include/acpi/acpixf.h | 4 +++
+ 5 files changed, 66 insertions(+), 5 deletions(-)
+
+--- a/drivers/acpi/acpica/acevents.h
++++ b/drivers/acpi/acpica/acevents.h
+@@ -191,6 +191,10 @@ void
+ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
+ acpi_adr_space_type space_id, u32 function);
+
++void
++acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *node,
++ acpi_adr_space_type space_id);
++
+ acpi_status
+ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function);
+
+--- a/drivers/acpi/acpica/evregion.c
++++ b/drivers/acpi/acpica/evregion.c
+@@ -20,10 +20,6 @@ extern u8 acpi_gbl_default_address_space
+
+ /* Local prototypes */
+
+-static void
+-acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
+- acpi_adr_space_type space_id);
+-
+ static acpi_status
+ acpi_ev_reg_run(acpi_handle obj_handle,
+ u32 level, void *context, void **return_value);
+@@ -818,7 +814,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,
+ *
+ ******************************************************************************/
+
+-static void
++void
+ acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
+ acpi_adr_space_type space_id)
+ {
+--- a/drivers/acpi/acpica/evxfregn.c
++++ b/drivers/acpi/acpica/evxfregn.c
+@@ -306,3 +306,57 @@ acpi_execute_reg_methods(acpi_handle dev
+ }
+
+ ACPI_EXPORT_SYMBOL(acpi_execute_reg_methods)
++
++/*******************************************************************************
++ *
++ * FUNCTION: acpi_execute_orphan_reg_method
++ *
++ * PARAMETERS: device - Handle for the device
++ * space_id - The address space ID
++ *
++ * RETURN: Status
++ *
++ * DESCRIPTION: Execute an "orphan" _REG method that appears under an ACPI
++ * device. This is a _REG method that has no corresponding region
++ * within the device's scope.
++ *
++ ******************************************************************************/
++acpi_status
++acpi_execute_orphan_reg_method(acpi_handle device, acpi_adr_space_type space_id)
++{
++ struct acpi_namespace_node *node;
++ acpi_status status;
++
++ ACPI_FUNCTION_TRACE(acpi_execute_orphan_reg_method);
++
++ /* Parameter validation */
++
++ if (!device) {
++ return_ACPI_STATUS(AE_BAD_PARAMETER);
++ }
++
++ status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
++ if (ACPI_FAILURE(status)) {
++ return_ACPI_STATUS(status);
++ }
++
++ /* Convert and validate the device handle */
++
++ node = acpi_ns_validate_handle(device);
++ if (node) {
++
++ /*
++ * If an "orphan" _REG method is present in the device's scope
++ * for the given address space ID, run it.
++ */
++
++ acpi_ev_execute_orphan_reg_method(node, space_id);
++ } else {
++ status = AE_BAD_PARAMETER;
++ }
++
++ (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
++ return_ACPI_STATUS(status);
++}
++
++ACPI_EXPORT_SYMBOL(acpi_execute_orphan_reg_method)
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -1502,6 +1502,9 @@ static int ec_install_handlers(struct ac
+
+ if (call_reg && !test_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags)) {
+ acpi_execute_reg_methods(scope_handle, ACPI_ADR_SPACE_EC);
++ if (scope_handle != ec->handle)
++ acpi_execute_orphan_reg_method(ec->handle, ACPI_ADR_SPACE_EC);
++
+ set_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags);
+ }
+
+--- a/include/acpi/acpixf.h
++++ b/include/acpi/acpixf.h
+@@ -663,6 +663,10 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
+ acpi_adr_space_type
+ space_id))
+ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
++ acpi_execute_orphan_reg_method(acpi_handle device,
++ acpi_adr_space_type
++ space_id))
++ACPI_EXTERNAL_RETURN_STATUS(acpi_status
+ acpi_remove_address_space_handler(acpi_handle
+ device,
+ acpi_adr_space_type
+++ /dev/null
-From 25de722027644cf7cbb33d6e7566bc924103718c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 25 Mar 2024 17:10:44 -0500
-Subject: ASoC: Intel: sof_cs42l42: rename BT offload quirk
-
-From: Brent Lu <brent.lu@intel.com>
-
-[ Upstream commit 109896246a5311aa05692ecf38c0d71e1837fe23 ]
-
-Rename the quirk in preparation for future changes: common quriks will
-be defined and handled in board helper module.
-
-Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
-Signed-off-by: Brent Lu <brent.lu@intel.com>
-Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
-Link: https://msgid.link/r/20240325221059.206042-7-pierre-louis.bossart@linux.intel.com
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- sound/soc/intel/boards/sof_cs42l42.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/sound/soc/intel/boards/sof_cs42l42.c b/sound/soc/intel/boards/sof_cs42l42.c
-index 323b86c42ef95..330d596b2eb6d 100644
---- a/sound/soc/intel/boards/sof_cs42l42.c
-+++ b/sound/soc/intel/boards/sof_cs42l42.c
-@@ -34,7 +34,7 @@
- #define SOF_CS42L42_NUM_HDMIDEV_MASK (GENMASK(9, 7))
- #define SOF_CS42L42_NUM_HDMIDEV(quirk) \
- (((quirk) << SOF_CS42L42_NUM_HDMIDEV_SHIFT) & SOF_CS42L42_NUM_HDMIDEV_MASK)
--#define SOF_BT_OFFLOAD_PRESENT BIT(25)
-+#define SOF_CS42L42_BT_OFFLOAD_PRESENT BIT(25)
- #define SOF_CS42L42_SSP_BT_SHIFT 26
- #define SOF_CS42L42_SSP_BT_MASK (GENMASK(28, 26))
- #define SOF_CS42L42_SSP_BT(quirk) \
-@@ -268,7 +268,7 @@ static int sof_audio_probe(struct platform_device *pdev)
-
- ctx->ssp_codec = sof_cs42l42_quirk & SOF_CS42L42_SSP_CODEC_MASK;
-
-- if (sof_cs42l42_quirk & SOF_BT_OFFLOAD_PRESENT)
-+ if (sof_cs42l42_quirk & SOF_CS42L42_BT_OFFLOAD_PRESENT)
- ctx->bt_offload_present = true;
-
- /* update dai_link */
-@@ -306,7 +306,7 @@ static const struct platform_device_id board_ids[] = {
- .driver_data = (kernel_ulong_t)(SOF_CS42L42_SSP_CODEC(0) |
- SOF_CS42L42_SSP_AMP(1) |
- SOF_CS42L42_NUM_HDMIDEV(4) |
-- SOF_BT_OFFLOAD_PRESENT |
-+ SOF_CS42L42_BT_OFFLOAD_PRESENT |
- SOF_CS42L42_SSP_BT(2)),
- },
- { }
---
-2.43.0
-