]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/x86: asus-wmi: Move i8042 filter install to shared asus-wmi code
authorHans de Goede <hdegoede@redhat.com>
Mon, 20 Nov 2023 15:42:33 +0000 (16:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Dec 2023 17:45:03 +0000 (18:45 +0100)
[ Upstream commit b52cbca22cbf6c9d2700c1e576d0ddcc670e49d5 ]

asus-nb-wmi calls i8042_install_filter() in some cases, but it never
calls i8042_remove_filter(). This means that a dangling pointer to
the filter function is left after rmmod leading to crashes.

Fix this by moving the i8042-filter installation to the shared
asus-wmi code and also remove it from the shared code on driver unbind.

Fixes: b5643539b825 ("platform/x86: asus-wmi: Filter buggy scan codes on ASUS Q500A")
Cc: Oleksij Rempel <linux@rempel-privat.de>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20231120154235.610808-2-hdegoede@redhat.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/platform/x86/Kconfig
drivers/platform/x86/asus-nb-wmi.c
drivers/platform/x86/asus-wmi.c

index 2a10705433911d9aa2c0d9fd7d9c1cf81b663c4a..07eea525091b0854fce60a5d120cd7529407eba6 100644 (file)
@@ -263,6 +263,7 @@ config ASUS_WMI
        depends on RFKILL || RFKILL = n
        depends on HOTPLUG_PCI
        depends on ACPI_VIDEO || ACPI_VIDEO = n
+       depends on SERIO_I8042 || SERIO_I8042 = n
        select INPUT_SPARSEKMAP
        select LEDS_CLASS
        select NEW_LEDS
@@ -279,7 +280,6 @@ config ASUS_WMI
 config ASUS_NB_WMI
        tristate "Asus Notebook WMI Driver"
        depends on ASUS_WMI
-       depends on SERIO_I8042 || SERIO_I8042 = n
        help
          This is a driver for newer Asus notebooks. It adds extra features
          like wireless radio and bluetooth control, leds, hotkeys, backlight...
index df1db54d4e183b8e34f6a0f4305d5d224aecba0e..af3da303e2b15a17828a205413d9e4c22d88f101 100644 (file)
@@ -501,8 +501,6 @@ static const struct dmi_system_id asus_quirks[] = {
 
 static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
 {
-       int ret;
-
        quirks = &quirk_asus_unknown;
        dmi_check_system(asus_quirks);
 
@@ -517,15 +515,6 @@ static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
 
        if (tablet_mode_sw != -1)
                quirks->tablet_switch_mode = tablet_mode_sw;
-
-       if (quirks->i8042_filter) {
-               ret = i8042_install_filter(quirks->i8042_filter);
-               if (ret) {
-                       pr_warn("Unable to install key filter\n");
-                       return;
-               }
-               pr_info("Using i8042 filter function for receiving events\n");
-       }
 }
 
 static const struct key_entry asus_nb_wmi_keymap[] = {
index 19bfd30861aa883159ae91d2beca8762eba36fbd..9c6321c2fc3c591e111a06d25095d6d29d37d10e 100644 (file)
@@ -4437,6 +4437,12 @@ static int asus_wmi_add(struct platform_device *pdev)
                goto fail_wmi_handler;
        }
 
+       if (asus->driver->quirks->i8042_filter) {
+               err = i8042_install_filter(asus->driver->quirks->i8042_filter);
+               if (err)
+                       pr_warn("Unable to install key filter - %d\n", err);
+       }
+
        asus_wmi_battery_init(asus);
 
        asus_wmi_debugfs_init(asus);
@@ -4471,6 +4477,8 @@ static int asus_wmi_remove(struct platform_device *device)
        struct asus_wmi *asus;
 
        asus = platform_get_drvdata(device);
+       if (asus->driver->quirks->i8042_filter)
+               i8042_remove_filter(asus->driver->quirks->i8042_filter);
        wmi_remove_notify_handler(asus->driver->event_guid);
        asus_wmi_backlight_exit(asus);
        asus_wmi_input_exit(asus);