aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-12-24 14:34:01 -0500
committerMatthew Garrett <matthew.garrett@nebula.com>2014-01-21 08:44:17 -0500
commit97f440c23f2b02fac8af0558cba9ca0bed603794 (patch)
tree838437bb563ed638c743e07c06be4999645f6b79 /drivers/platform/x86
parent997ab407d2b4e7d7ce2788d2de68435eb94fcfec (diff)
dell-laptop: Only install the i8042 filter when rfkill is active
Installing the i8042 filter is not useful on machines where rfkill is not whitelisted, so move the filter installation into dell_setup_rfkill, after the whitelist check. This avoids doing a needless and potentially troublesome rfkill query (dell_send_request(buf, 17, 11)) when the wireless Fn key gets pressed on non whitelisted laptops. This patch was written as a result of: https://bugzilla.redhat.com/show_bug.cgi?id=1045807 It is not yet clear if this is related, but it is a good idea to not register the i8042 filter in general. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Diffstat (limited to 'drivers/platform/x86')
-rw-r--r--drivers/platform/x86/dell-laptop.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
index d2ceb761a7a2..fed4111ac31a 100644
--- a/drivers/platform/x86/dell-laptop.c
+++ b/drivers/platform/x86/dell-laptop.c
@@ -559,6 +559,29 @@ static void dell_update_rfkill(struct work_struct *ignored)
559} 559}
560static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); 560static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill);
561 561
562static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
563 struct serio *port)
564{
565 static bool extended;
566
567 if (str & 0x20)
568 return false;
569
570 if (unlikely(data == 0xe0)) {
571 extended = true;
572 return false;
573 } else if (unlikely(extended)) {
574 switch (data) {
575 case 0x8:
576 schedule_delayed_work(&dell_rfkill_work,
577 round_jiffies_relative(HZ / 4));
578 break;
579 }
580 extended = false;
581 }
582
583 return false;
584}
562 585
563static int __init dell_setup_rfkill(void) 586static int __init dell_setup_rfkill(void)
564{ 587{
@@ -636,7 +659,16 @@ static int __init dell_setup_rfkill(void)
636 goto err_wwan; 659 goto err_wwan;
637 } 660 }
638 661
662 ret = i8042_install_filter(dell_laptop_i8042_filter);
663 if (ret) {
664 pr_warn("Unable to install key filter\n");
665 goto err_filter;
666 }
667
639 return 0; 668 return 0;
669err_filter:
670 if (wwan_rfkill)
671 rfkill_unregister(wwan_rfkill);
640err_wwan: 672err_wwan:
641 rfkill_destroy(wwan_rfkill); 673 rfkill_destroy(wwan_rfkill);
642 if (bluetooth_rfkill) 674 if (bluetooth_rfkill)
@@ -758,30 +790,6 @@ static void touchpad_led_exit(void)
758 led_classdev_unregister(&touchpad_led); 790 led_classdev_unregister(&touchpad_led);
759} 791}
760 792
761static bool dell_laptop_i8042_filter(unsigned char data, unsigned char str,
762 struct serio *port)
763{
764 static bool extended;
765
766 if (str & 0x20)
767 return false;
768
769 if (unlikely(data == 0xe0)) {
770 extended = true;
771 return false;
772 } else if (unlikely(extended)) {
773 switch (data) {
774 case 0x8:
775 schedule_delayed_work(&dell_rfkill_work,
776 round_jiffies_relative(HZ / 4));
777 break;
778 }
779 extended = false;
780 }
781
782 return false;
783}
784
785static int __init dell_init(void) 793static int __init dell_init(void)
786{ 794{
787 int max_intensity = 0; 795 int max_intensity = 0;
@@ -831,12 +839,6 @@ static int __init dell_init(void)
831 goto fail_rfkill; 839 goto fail_rfkill;
832 } 840 }
833 841
834 ret = i8042_install_filter(dell_laptop_i8042_filter);
835 if (ret) {
836 pr_warn("Unable to install key filter\n");
837 goto fail_filter;
838 }
839
840 if (quirks && quirks->touchpad_led) 842 if (quirks && quirks->touchpad_led)
841 touchpad_led_init(&platform_device->dev); 843 touchpad_led_init(&platform_device->dev);
842 844
@@ -888,7 +890,6 @@ static int __init dell_init(void)
888fail_backlight: 890fail_backlight:
889 i8042_remove_filter(dell_laptop_i8042_filter); 891 i8042_remove_filter(dell_laptop_i8042_filter);
890 cancel_delayed_work_sync(&dell_rfkill_work); 892 cancel_delayed_work_sync(&dell_rfkill_work);
891fail_filter:
892 dell_cleanup_rfkill(); 893 dell_cleanup_rfkill();
893fail_rfkill: 894fail_rfkill:
894 free_page((unsigned long)bufferpage); 895 free_page((unsigned long)bufferpage);