]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: EC: Re-use boot_ec when possible even when EC_FLAGS_TRUST_DSDT_GPE is set
authorHans de Goede <hdegoede@redhat.com>
Mon, 20 Jun 2022 09:25:45 +0000 (11:25 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 29 Jun 2022 17:40:46 +0000 (19:40 +0200)
EC_FLAGS_TRUST_DSDT_GPE only does anything when the:

if (boot_ec && ec->command_addr == boot_ec->command_addr &&
    ec->data_addr == boot_ec->data_addr)

conditions are all true. Normally acpi_ec_add() would re-use the boot_ec
struct acpi_ec in this case. But when the EC_FLAGS_TRUST_DSDT_GPE flag was
set the code would continue with a newly allocated (second) struct acpi_ec.

There is no reason to use a second struct acpi_ec if all the above checks
match. Instead just change boot_ec->gpe to ec->gpe, when the flag is set,
similar to how this is already one done for boot_ec->handle.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/ec.c

index 488c9ec0da0bcca820c69fb87ca03d4bef820a0b..337c6bb6897b7cf0b13d4f01993c4f411dcb9352 100644 (file)
@@ -1617,15 +1617,18 @@ static int acpi_ec_add(struct acpi_device *device)
                }
 
                if (boot_ec && ec->command_addr == boot_ec->command_addr &&
-                   ec->data_addr == boot_ec->data_addr &&
-                   !EC_FLAGS_TRUST_DSDT_GPE) {
+                   ec->data_addr == boot_ec->data_addr) {
                        /*
-                        * Trust PNP0C09 namespace location rather than
-                        * ECDT ID. But trust ECDT GPE rather than _GPE
-                        * because of ASUS quirks, so do not change
-                        * boot_ec->gpe to ec->gpe.
+                        * Trust PNP0C09 namespace location rather than ECDT ID.
+                        * But trust ECDT GPE rather than _GPE because of ASUS
+                        * quirks. So do not change boot_ec->gpe to ec->gpe,
+                        * except when the TRUST_DSDT_GPE quirk is set.
                         */
                        boot_ec->handle = ec->handle;
+
+                       if (EC_FLAGS_TRUST_DSDT_GPE)
+                               boot_ec->gpe = ec->gpe;
+
                        acpi_handle_debug(ec->handle, "duplicated.\n");
                        acpi_ec_free(ec);
                        ec = boot_ec;