platform/x86: acer-wmi: Only supports AMW0_GUID1 on acer family
authorLee, Chun-Yi <joeyli.kernel@gmail.com>
Tue, 1 Nov 2016 04:30:58 +0000 (12:30 +0800)
committerDarren Hart <dvhart@linux.intel.com>
Tue, 13 Dec 2016 17:28:48 +0000 (09:28 -0800)
The AMW0_GUID1 wmi is not only found on Acer family but also other
machines like Lenovo, Fujitsu and Medion. In the past, acer-wmi handled
those non-Acer machines by quirks list.

But actually acer-wmi driver was loaded on any machine that had
AMW0_GUID1. This behavior is strange because those machines should be
supported by appropriate wmi drivers. e.g. fujitsu-laptop,
ideapad-laptop.

This patch adds the logic to check the machine that has AMW0_GUID1
should be in Acer/Packard Bell/Gateway white list. But, it still keeps
the quirk list of those supported non-acer machines for backward
compatibility.

Tested-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: Lee, Chun-Yi <jlee@suse.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
drivers/platform/x86/acer-wmi.c

index 79d64ea..a66192f 100644 (file)
@@ -355,6 +355,32 @@ static const struct dmi_system_id acer_blacklist[] __initconst = {
        {}
 };
 
+static const struct dmi_system_id amw0_whitelist[] __initconst = {
+       {
+               .ident = "Acer",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+               },
+       },
+       {
+               .ident = "Gateway",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Gateway"),
+               },
+       },
+       {
+               .ident = "Packard Bell",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
+               },
+       },
+       {}
+};
+
+/*
+ * This quirk table is only for Acer/Gateway/Packard Bell family
+ * that those machines are supported by acer-wmi driver.
+ */
 static const struct dmi_system_id acer_quirks[] __initconst = {
        {
                .callback = dmi_matched,
@@ -464,6 +490,17 @@ static const struct dmi_system_id acer_quirks[] __initconst = {
                },
                .driver_data = &quirk_acer_travelmate_2490,
        },
+       {}
+};
+
+/*
+ * This quirk list is for those non-acer machines that have AMW0_GUID1
+ * but supported by acer-wmi in past days. Keeping this quirk list here
+ * is only for backward compatible. Please do not add new machine to
+ * here anymore. Those non-acer machines should be supported by
+ * appropriate wmi drivers.
+ */
+static const struct dmi_system_id non_acer_quirks[] __initconst = {
        {
                .callback = dmi_matched,
                .ident = "Fujitsu Siemens Amilo Li 1718",
@@ -598,6 +635,7 @@ static void __init find_quirks(void)
 {
        if (!force_series) {
                dmi_check_system(acer_quirks);
+               dmi_check_system(non_acer_quirks);
        } else if (force_series == 2490) {
                quirks = &quirk_acer_travelmate_2490;
        }
@@ -2108,6 +2146,24 @@ static int __init acer_wmi_init(void)
        find_quirks();
 
        /*
+        * The AMW0_GUID1 wmi is not only found on Acer family but also other
+        * machines like Lenovo, Fujitsu and Medion. In the past days,
+        * acer-wmi driver handled those non-Acer machines by quirks list.
+        * But actually acer-wmi driver was loaded on any machines that have
+        * AMW0_GUID1. This behavior is strange because those machines should
+        * be supported by appropriate wmi drivers. e.g. fujitsu-laptop,
+        * ideapad-laptop. So, here checks the machine that has AMW0_GUID1
+        * should be in Acer/Gateway/Packard Bell white list, or it's already
+        * in the past quirk list.
+        */
+       if (wmi_has_guid(AMW0_GUID1) &&
+           !dmi_check_system(amw0_whitelist) &&
+           quirks == &quirk_unknown) {
+               pr_err("Unsupported machine has AMW0_GUID1, unable to load\n");
+               return -ENODEV;
+       }
+
+       /*
         * Detect which ACPI-WMI interface we're using.
         */
        if (wmi_has_guid(AMW0_GUID1) && wmi_has_guid(WMID_GUID1))