ACPI: x86: s2idle: Add a quirk for ASUS TUF Gaming A17 FA707RE
authorMario Limonciello <mario.limonciello@amd.com>
Wed, 21 Sep 2022 20:40:51 +0000 (15:40 -0500)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 25 Sep 2022 15:44:55 +0000 (17:44 +0200)
ASUS TUF Gaming A17 FA707RE has problems with ACPI events after
s2idle resume.  It's from a missing call to an ASL method in AMD
the s2idle calling path. Force the system to use the Microsoft
Modern Standby calling path instead.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=216101
Reported-and-tested-by: catalin@antebit.com
Reviewed-by: Philipp Zabel <philipp.zabel@gmail.com>
Tested-by: Philipp Zabel <philipp.zabel@gmail.com> # GA402RJ
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/x86/s2idle.c

index 725d2a6..99eae36 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <linux/acpi.h>
 #include <linux/device.h>
+#include <linux/dmi.h>
 #include <linux/suspend.h>
 
 #include "../sleep.h"
@@ -400,6 +401,28 @@ static const struct acpi_device_id amd_hid_ids[] = {
        {}
 };
 
+static int lps0_prefer_microsoft(const struct dmi_system_id *id)
+{
+       pr_debug("Preferring Microsoft GUID.\n");
+       prefer_microsoft_dsm_guid = true;
+       return 0;
+}
+
+static const struct dmi_system_id s2idle_dmi_table[] __initconst = {
+       {
+               /*
+                * ASUS TUF Gaming A17 FA707RE
+                * https://bugzilla.kernel.org/show_bug.cgi?id=216101
+                */
+               .callback = lps0_prefer_microsoft,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ASUS TUF Gaming A17"),
+               },
+       },
+       {}
+};
+
 static int lps0_device_attach(struct acpi_device *adev,
                              const struct acpi_device_id *not_used)
 {
@@ -566,8 +589,9 @@ static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = {
        .end = acpi_s2idle_end,
 };
 
-void acpi_s2idle_setup(void)
+void __init acpi_s2idle_setup(void)
 {
+       dmi_check_system(s2idle_dmi_table);
        acpi_scan_add_handler(&lps0_handler);
        s2idle_set_ops(&acpi_s2idle_ops_lps0);
 }