diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-12-24 14:34:01 -0500 |
---|---|---|
committer | Matthew Garrett <matthew.garrett@nebula.com> | 2014-01-21 08:44:17 -0500 |
commit | 97f440c23f2b02fac8af0558cba9ca0bed603794 (patch) | |
tree | 838437bb563ed638c743e07c06be4999645f6b79 /drivers/platform/x86 | |
parent | 997ab407d2b4e7d7ce2788d2de68435eb94fcfec (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.c | 63 |
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 | } |
560 | static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); | 560 | static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); |
561 | 561 | ||
562 | static 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 | ||
563 | static int __init dell_setup_rfkill(void) | 586 | static 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; |
669 | err_filter: | ||
670 | if (wwan_rfkill) | ||
671 | rfkill_unregister(wwan_rfkill); | ||
640 | err_wwan: | 672 | err_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 | ||
761 | static 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 | |||
785 | static int __init dell_init(void) | 793 | static 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) | |||
888 | fail_backlight: | 890 | fail_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); |
891 | fail_filter: | ||
892 | dell_cleanup_rfkill(); | 893 | dell_cleanup_rfkill(); |
893 | fail_rfkill: | 894 | fail_rfkill: |
894 | free_page((unsigned long)bufferpage); | 895 | free_page((unsigned long)bufferpage); |