]> Pileus Git - ~andy/linux/blobdiff - drivers/platform/x86/dell-laptop.c
dell-laptop: Only install the i8042 filter when rfkill is active
[~andy/linux] / drivers / platform / x86 / dell-laptop.c
index d2ceb761a7a2d5e717f93f04e20ccfd566df6407..fed4111ac31a6d6fbff0c02a6be563485ccec7dc 100644 (file)
@@ -559,6 +559,29 @@ static void dell_update_rfkill(struct work_struct *ignored)
 }
 static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill);
 
+static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
+                             struct serio *port)
+{
+       static bool extended;
+
+       if (str & 0x20)
+               return false;
+
+       if (unlikely(data == 0xe0)) {
+               extended = true;
+               return false;
+       } else if (unlikely(extended)) {
+               switch (data) {
+               case 0x8:
+                       schedule_delayed_work(&dell_rfkill_work,
+                                             round_jiffies_relative(HZ / 4));
+                       break;
+               }
+               extended = false;
+       }
+
+       return false;
+}
 
 static int __init dell_setup_rfkill(void)
 {
@@ -636,7 +659,16 @@ static int __init dell_setup_rfkill(void)
                        goto err_wwan;
        }
 
+       ret = i8042_install_filter(dell_laptop_i8042_filter);
+       if (ret) {
+               pr_warn("Unable to install key filter\n");
+               goto err_filter;
+       }
+
        return 0;
+err_filter:
+       if (wwan_rfkill)
+               rfkill_unregister(wwan_rfkill);
 err_wwan:
        rfkill_destroy(wwan_rfkill);
        if (bluetooth_rfkill)
@@ -758,30 +790,6 @@ static void touchpad_led_exit(void)
        led_classdev_unregister(&touchpad_led);
 }
 
-static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
-                             struct serio *port)
-{
-       static bool extended;
-
-       if (str & 0x20)
-               return false;
-
-       if (unlikely(data == 0xe0)) {
-               extended = true;
-               return false;
-       } else if (unlikely(extended)) {
-               switch (data) {
-               case 0x8:
-                       schedule_delayed_work(&dell_rfkill_work,
-                                             round_jiffies_relative(HZ / 4));
-                       break;
-               }
-               extended = false;
-       }
-
-       return false;
-}
-
 static int __init dell_init(void)
 {
        int max_intensity = 0;
@@ -831,12 +839,6 @@ static int __init dell_init(void)
                goto fail_rfkill;
        }
 
-       ret = i8042_install_filter(dell_laptop_i8042_filter);
-       if (ret) {
-               pr_warn("Unable to install key filter\n");
-               goto fail_filter;
-       }
-
        if (quirks && quirks->touchpad_led)
                touchpad_led_init(&platform_device->dev);
 
@@ -888,7 +890,6 @@ static int __init dell_init(void)
 fail_backlight:
        i8042_remove_filter(dell_laptop_i8042_filter);
        cancel_delayed_work_sync(&dell_rfkill_work);
-fail_filter:
        dell_cleanup_rfkill();
 fail_rfkill:
        free_page((unsigned long)bufferpage);