diff options
Diffstat (limited to 'drivers/input/misc/wistron_btns.c')
-rw-r--r-- | drivers/input/misc/wistron_btns.c | 256 |
1 files changed, 83 insertions, 173 deletions
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index a932179c4c9..38da6ab0438 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/dmi.h> | 21 | #include <linux/dmi.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/input-polldev.h> | 23 | #include <linux/input-polldev.h> |
24 | #include <linux/input/sparse-keymap.h> | ||
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
25 | #include <linux/jiffies.h> | 26 | #include <linux/jiffies.h> |
26 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
@@ -224,19 +225,8 @@ static void bios_set_state(u8 subsys, int enable) | |||
224 | 225 | ||
225 | /* Hardware database */ | 226 | /* Hardware database */ |
226 | 227 | ||
227 | struct key_entry { | 228 | #define KE_WIFI (KE_LAST + 1) |
228 | char type; /* See KE_* below */ | 229 | #define KE_BLUETOOTH (KE_LAST + 2) |
229 | u8 code; | ||
230 | union { | ||
231 | u16 keycode; /* For KE_KEY */ | ||
232 | struct { /* For KE_SW */ | ||
233 | u8 code; | ||
234 | u8 value; | ||
235 | } sw; | ||
236 | }; | ||
237 | }; | ||
238 | |||
239 | enum { KE_END, KE_KEY, KE_SW, KE_WIFI, KE_BLUETOOTH }; | ||
240 | 230 | ||
241 | #define FE_MAIL_LED 0x01 | 231 | #define FE_MAIL_LED 0x01 |
242 | #define FE_WIFI_LED 0x02 | 232 | #define FE_WIFI_LED 0x02 |
@@ -644,10 +634,10 @@ static struct key_entry keymap_prestigio[] __initdata = { | |||
644 | * a list of buttons and their key codes (reported when loading this module | 634 | * a list of buttons and their key codes (reported when loading this module |
645 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. | 635 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. |
646 | */ | 636 | */ |
647 | static struct dmi_system_id dmi_ids[] __initdata = { | 637 | static const struct dmi_system_id __initconst dmi_ids[] = { |
648 | { | 638 | { |
639 | /* Fujitsu-Siemens Amilo Pro V2000 */ | ||
649 | .callback = dmi_matched, | 640 | .callback = dmi_matched, |
650 | .ident = "Fujitsu-Siemens Amilo Pro V2000", | ||
651 | .matches = { | 641 | .matches = { |
652 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 642 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
653 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), | 643 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), |
@@ -655,8 +645,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
655 | .driver_data = keymap_fs_amilo_pro_v2000 | 645 | .driver_data = keymap_fs_amilo_pro_v2000 |
656 | }, | 646 | }, |
657 | { | 647 | { |
648 | /* Fujitsu-Siemens Amilo Pro Edition V3505 */ | ||
658 | .callback = dmi_matched, | 649 | .callback = dmi_matched, |
659 | .ident = "Fujitsu-Siemens Amilo Pro Edition V3505", | ||
660 | .matches = { | 650 | .matches = { |
661 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 651 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
662 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"), | 652 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"), |
@@ -664,8 +654,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
664 | .driver_data = keymap_fs_amilo_pro_v3505 | 654 | .driver_data = keymap_fs_amilo_pro_v3505 |
665 | }, | 655 | }, |
666 | { | 656 | { |
657 | /* Fujitsu-Siemens Amilo M7400 */ | ||
667 | .callback = dmi_matched, | 658 | .callback = dmi_matched, |
668 | .ident = "Fujitsu-Siemens Amilo M7400", | ||
669 | .matches = { | 659 | .matches = { |
670 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 660 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
671 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), | 661 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), |
@@ -673,8 +663,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
673 | .driver_data = keymap_fs_amilo_pro_v2000 | 663 | .driver_data = keymap_fs_amilo_pro_v2000 |
674 | }, | 664 | }, |
675 | { | 665 | { |
666 | /* Maxdata Pro 7000 DX */ | ||
676 | .callback = dmi_matched, | 667 | .callback = dmi_matched, |
677 | .ident = "Maxdata Pro 7000 DX", | ||
678 | .matches = { | 668 | .matches = { |
679 | DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), | 669 | DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), |
680 | DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), | 670 | DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), |
@@ -682,8 +672,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
682 | .driver_data = keymap_fs_amilo_pro_v2000 | 672 | .driver_data = keymap_fs_amilo_pro_v2000 |
683 | }, | 673 | }, |
684 | { | 674 | { |
675 | /* Fujitsu N3510 */ | ||
685 | .callback = dmi_matched, | 676 | .callback = dmi_matched, |
686 | .ident = "Fujitsu N3510", | ||
687 | .matches = { | 677 | .matches = { |
688 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 678 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
689 | DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), | 679 | DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), |
@@ -691,8 +681,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
691 | .driver_data = keymap_fujitsu_n3510 | 681 | .driver_data = keymap_fujitsu_n3510 |
692 | }, | 682 | }, |
693 | { | 683 | { |
684 | /* Acer Aspire 1500 */ | ||
694 | .callback = dmi_matched, | 685 | .callback = dmi_matched, |
695 | .ident = "Acer Aspire 1500", | ||
696 | .matches = { | 686 | .matches = { |
697 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 687 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
698 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), | 688 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), |
@@ -700,8 +690,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
700 | .driver_data = keymap_acer_aspire_1500 | 690 | .driver_data = keymap_acer_aspire_1500 |
701 | }, | 691 | }, |
702 | { | 692 | { |
693 | /* Acer Aspire 1600 */ | ||
703 | .callback = dmi_matched, | 694 | .callback = dmi_matched, |
704 | .ident = "Acer Aspire 1600", | ||
705 | .matches = { | 695 | .matches = { |
706 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 696 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
707 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), | 697 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), |
@@ -709,8 +699,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
709 | .driver_data = keymap_acer_aspire_1600 | 699 | .driver_data = keymap_acer_aspire_1600 |
710 | }, | 700 | }, |
711 | { | 701 | { |
702 | /* Acer Aspire 3020 */ | ||
712 | .callback = dmi_matched, | 703 | .callback = dmi_matched, |
713 | .ident = "Acer Aspire 3020", | ||
714 | .matches = { | 704 | .matches = { |
715 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 705 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
716 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), | 706 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), |
@@ -718,8 +708,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
718 | .driver_data = keymap_acer_aspire_5020 | 708 | .driver_data = keymap_acer_aspire_5020 |
719 | }, | 709 | }, |
720 | { | 710 | { |
711 | /* Acer Aspire 5020 */ | ||
721 | .callback = dmi_matched, | 712 | .callback = dmi_matched, |
722 | .ident = "Acer Aspire 5020", | ||
723 | .matches = { | 713 | .matches = { |
724 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 714 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
725 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), | 715 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), |
@@ -727,8 +717,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
727 | .driver_data = keymap_acer_aspire_5020 | 717 | .driver_data = keymap_acer_aspire_5020 |
728 | }, | 718 | }, |
729 | { | 719 | { |
720 | /* Acer TravelMate 2100 */ | ||
730 | .callback = dmi_matched, | 721 | .callback = dmi_matched, |
731 | .ident = "Acer TravelMate 2100", | ||
732 | .matches = { | 722 | .matches = { |
733 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 723 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
734 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), | 724 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), |
@@ -736,8 +726,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
736 | .driver_data = keymap_acer_aspire_5020 | 726 | .driver_data = keymap_acer_aspire_5020 |
737 | }, | 727 | }, |
738 | { | 728 | { |
729 | /* Acer TravelMate 2410 */ | ||
739 | .callback = dmi_matched, | 730 | .callback = dmi_matched, |
740 | .ident = "Acer TravelMate 2410", | ||
741 | .matches = { | 731 | .matches = { |
742 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 732 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
743 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), | 733 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), |
@@ -745,8 +735,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
745 | .driver_data = keymap_acer_travelmate_2410 | 735 | .driver_data = keymap_acer_travelmate_2410 |
746 | }, | 736 | }, |
747 | { | 737 | { |
738 | /* Acer TravelMate C300 */ | ||
748 | .callback = dmi_matched, | 739 | .callback = dmi_matched, |
749 | .ident = "Acer TravelMate C300", | ||
750 | .matches = { | 740 | .matches = { |
751 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 741 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
752 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), | 742 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), |
@@ -754,8 +744,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
754 | .driver_data = keymap_acer_travelmate_300 | 744 | .driver_data = keymap_acer_travelmate_300 |
755 | }, | 745 | }, |
756 | { | 746 | { |
747 | /* Acer TravelMate C100 */ | ||
757 | .callback = dmi_matched, | 748 | .callback = dmi_matched, |
758 | .ident = "Acer TravelMate C100", | ||
759 | .matches = { | 749 | .matches = { |
760 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 750 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
761 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), | 751 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), |
@@ -763,8 +753,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
763 | .driver_data = keymap_acer_travelmate_300 | 753 | .driver_data = keymap_acer_travelmate_300 |
764 | }, | 754 | }, |
765 | { | 755 | { |
756 | /* Acer TravelMate C110 */ | ||
766 | .callback = dmi_matched, | 757 | .callback = dmi_matched, |
767 | .ident = "Acer TravelMate C110", | ||
768 | .matches = { | 758 | .matches = { |
769 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 759 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
770 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), | 760 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), |
@@ -772,8 +762,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
772 | .driver_data = keymap_acer_travelmate_110 | 762 | .driver_data = keymap_acer_travelmate_110 |
773 | }, | 763 | }, |
774 | { | 764 | { |
765 | /* Acer TravelMate 380 */ | ||
775 | .callback = dmi_matched, | 766 | .callback = dmi_matched, |
776 | .ident = "Acer TravelMate 380", | ||
777 | .matches = { | 767 | .matches = { |
778 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 768 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
779 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), | 769 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), |
@@ -781,8 +771,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
781 | .driver_data = keymap_acer_travelmate_380 | 771 | .driver_data = keymap_acer_travelmate_380 |
782 | }, | 772 | }, |
783 | { | 773 | { |
774 | /* Acer TravelMate 370 */ | ||
784 | .callback = dmi_matched, | 775 | .callback = dmi_matched, |
785 | .ident = "Acer TravelMate 370", | ||
786 | .matches = { | 776 | .matches = { |
787 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 777 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
788 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), | 778 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), |
@@ -790,8 +780,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
790 | .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ | 780 | .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ |
791 | }, | 781 | }, |
792 | { | 782 | { |
783 | /* Acer TravelMate 220 */ | ||
793 | .callback = dmi_matched, | 784 | .callback = dmi_matched, |
794 | .ident = "Acer TravelMate 220", | ||
795 | .matches = { | 785 | .matches = { |
796 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 786 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
797 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), | 787 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), |
@@ -799,8 +789,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
799 | .driver_data = keymap_acer_travelmate_220 | 789 | .driver_data = keymap_acer_travelmate_220 |
800 | }, | 790 | }, |
801 | { | 791 | { |
792 | /* Acer TravelMate 260 */ | ||
802 | .callback = dmi_matched, | 793 | .callback = dmi_matched, |
803 | .ident = "Acer TravelMate 260", | ||
804 | .matches = { | 794 | .matches = { |
805 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 795 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
806 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), | 796 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), |
@@ -808,8 +798,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
808 | .driver_data = keymap_acer_travelmate_220 | 798 | .driver_data = keymap_acer_travelmate_220 |
809 | }, | 799 | }, |
810 | { | 800 | { |
801 | /* Acer TravelMate 230 */ | ||
811 | .callback = dmi_matched, | 802 | .callback = dmi_matched, |
812 | .ident = "Acer TravelMate 230", | ||
813 | .matches = { | 803 | .matches = { |
814 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 804 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
815 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), | 805 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), |
@@ -818,8 +808,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
818 | .driver_data = keymap_acer_travelmate_230 | 808 | .driver_data = keymap_acer_travelmate_230 |
819 | }, | 809 | }, |
820 | { | 810 | { |
811 | /* Acer TravelMate 280 */ | ||
821 | .callback = dmi_matched, | 812 | .callback = dmi_matched, |
822 | .ident = "Acer TravelMate 280", | ||
823 | .matches = { | 813 | .matches = { |
824 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 814 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
825 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), | 815 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), |
@@ -827,8 +817,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
827 | .driver_data = keymap_acer_travelmate_230 | 817 | .driver_data = keymap_acer_travelmate_230 |
828 | }, | 818 | }, |
829 | { | 819 | { |
820 | /* Acer TravelMate 240 */ | ||
830 | .callback = dmi_matched, | 821 | .callback = dmi_matched, |
831 | .ident = "Acer TravelMate 240", | ||
832 | .matches = { | 822 | .matches = { |
833 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 823 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
834 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"), | 824 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"), |
@@ -836,8 +826,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
836 | .driver_data = keymap_acer_travelmate_240 | 826 | .driver_data = keymap_acer_travelmate_240 |
837 | }, | 827 | }, |
838 | { | 828 | { |
829 | /* Acer TravelMate 250 */ | ||
839 | .callback = dmi_matched, | 830 | .callback = dmi_matched, |
840 | .ident = "Acer TravelMate 250", | ||
841 | .matches = { | 831 | .matches = { |
842 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 832 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
843 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), | 833 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), |
@@ -845,8 +835,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
845 | .driver_data = keymap_acer_travelmate_240 | 835 | .driver_data = keymap_acer_travelmate_240 |
846 | }, | 836 | }, |
847 | { | 837 | { |
838 | /* Acer TravelMate 2424NWXCi */ | ||
848 | .callback = dmi_matched, | 839 | .callback = dmi_matched, |
849 | .ident = "Acer TravelMate 2424NWXCi", | ||
850 | .matches = { | 840 | .matches = { |
851 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 841 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
852 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"), | 842 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"), |
@@ -854,8 +844,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
854 | .driver_data = keymap_acer_travelmate_240 | 844 | .driver_data = keymap_acer_travelmate_240 |
855 | }, | 845 | }, |
856 | { | 846 | { |
847 | /* Acer TravelMate 350 */ | ||
857 | .callback = dmi_matched, | 848 | .callback = dmi_matched, |
858 | .ident = "Acer TravelMate 350", | ||
859 | .matches = { | 849 | .matches = { |
860 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 850 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
861 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), | 851 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), |
@@ -863,8 +853,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
863 | .driver_data = keymap_acer_travelmate_350 | 853 | .driver_data = keymap_acer_travelmate_350 |
864 | }, | 854 | }, |
865 | { | 855 | { |
856 | /* Acer TravelMate 360 */ | ||
866 | .callback = dmi_matched, | 857 | .callback = dmi_matched, |
867 | .ident = "Acer TravelMate 360", | ||
868 | .matches = { | 858 | .matches = { |
869 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 859 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
870 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), | 860 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), |
@@ -872,8 +862,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
872 | .driver_data = keymap_acer_travelmate_360 | 862 | .driver_data = keymap_acer_travelmate_360 |
873 | }, | 863 | }, |
874 | { | 864 | { |
865 | /* Acer TravelMate 610 */ | ||
875 | .callback = dmi_matched, | 866 | .callback = dmi_matched, |
876 | .ident = "Acer TravelMate 610", | ||
877 | .matches = { | 867 | .matches = { |
878 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | 868 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), |
879 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"), | 869 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"), |
@@ -881,8 +871,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
881 | .driver_data = keymap_acer_travelmate_610 | 871 | .driver_data = keymap_acer_travelmate_610 |
882 | }, | 872 | }, |
883 | { | 873 | { |
874 | /* Acer TravelMate 620 */ | ||
884 | .callback = dmi_matched, | 875 | .callback = dmi_matched, |
885 | .ident = "Acer TravelMate 620", | ||
886 | .matches = { | 876 | .matches = { |
887 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 877 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
888 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), | 878 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), |
@@ -890,8 +880,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
890 | .driver_data = keymap_acer_travelmate_630 | 880 | .driver_data = keymap_acer_travelmate_630 |
891 | }, | 881 | }, |
892 | { | 882 | { |
883 | /* Acer TravelMate 630 */ | ||
893 | .callback = dmi_matched, | 884 | .callback = dmi_matched, |
894 | .ident = "Acer TravelMate 630", | ||
895 | .matches = { | 885 | .matches = { |
896 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 886 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
897 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), | 887 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), |
@@ -899,8 +889,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
899 | .driver_data = keymap_acer_travelmate_630 | 889 | .driver_data = keymap_acer_travelmate_630 |
900 | }, | 890 | }, |
901 | { | 891 | { |
892 | /* AOpen 1559AS */ | ||
902 | .callback = dmi_matched, | 893 | .callback = dmi_matched, |
903 | .ident = "AOpen 1559AS", | ||
904 | .matches = { | 894 | .matches = { |
905 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), | 895 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), |
906 | DMI_MATCH(DMI_BOARD_NAME, "E2U"), | 896 | DMI_MATCH(DMI_BOARD_NAME, "E2U"), |
@@ -908,8 +898,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
908 | .driver_data = keymap_aopen_1559as | 898 | .driver_data = keymap_aopen_1559as |
909 | }, | 899 | }, |
910 | { | 900 | { |
901 | /* Medion MD 9783 */ | ||
911 | .callback = dmi_matched, | 902 | .callback = dmi_matched, |
912 | .ident = "Medion MD 9783", | ||
913 | .matches = { | 903 | .matches = { |
914 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 904 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
915 | DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), | 905 | DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), |
@@ -917,8 +907,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
917 | .driver_data = keymap_wistron_ms2111 | 907 | .driver_data = keymap_wistron_ms2111 |
918 | }, | 908 | }, |
919 | { | 909 | { |
910 | /* Medion MD 40100 */ | ||
920 | .callback = dmi_matched, | 911 | .callback = dmi_matched, |
921 | .ident = "Medion MD 40100", | ||
922 | .matches = { | 912 | .matches = { |
923 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 913 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
924 | DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), | 914 | DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), |
@@ -926,8 +916,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
926 | .driver_data = keymap_wistron_md40100 | 916 | .driver_data = keymap_wistron_md40100 |
927 | }, | 917 | }, |
928 | { | 918 | { |
919 | /* Medion MD 2900 */ | ||
929 | .callback = dmi_matched, | 920 | .callback = dmi_matched, |
930 | .ident = "Medion MD 2900", | ||
931 | .matches = { | 921 | .matches = { |
932 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 922 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
933 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), | 923 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), |
@@ -935,8 +925,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
935 | .driver_data = keymap_wistron_md2900 | 925 | .driver_data = keymap_wistron_md2900 |
936 | }, | 926 | }, |
937 | { | 927 | { |
928 | /* Medion MD 42200 */ | ||
938 | .callback = dmi_matched, | 929 | .callback = dmi_matched, |
939 | .ident = "Medion MD 42200", | ||
940 | .matches = { | 930 | .matches = { |
941 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), | 931 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), |
942 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), | 932 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), |
@@ -944,8 +934,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
944 | .driver_data = keymap_fs_amilo_pro_v2000 | 934 | .driver_data = keymap_fs_amilo_pro_v2000 |
945 | }, | 935 | }, |
946 | { | 936 | { |
937 | /* Medion MD 96500 */ | ||
947 | .callback = dmi_matched, | 938 | .callback = dmi_matched, |
948 | .ident = "Medion MD 96500", | ||
949 | .matches = { | 939 | .matches = { |
950 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | 940 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), |
951 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), | 941 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), |
@@ -953,8 +943,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
953 | .driver_data = keymap_wistron_md96500 | 943 | .driver_data = keymap_wistron_md96500 |
954 | }, | 944 | }, |
955 | { | 945 | { |
946 | /* Medion MD 95400 */ | ||
956 | .callback = dmi_matched, | 947 | .callback = dmi_matched, |
957 | .ident = "Medion MD 95400", | ||
958 | .matches = { | 948 | .matches = { |
959 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | 949 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), |
960 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), | 950 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), |
@@ -962,8 +952,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
962 | .driver_data = keymap_wistron_md96500 | 952 | .driver_data = keymap_wistron_md96500 |
963 | }, | 953 | }, |
964 | { | 954 | { |
955 | /* Fujitsu Siemens Amilo D7820 */ | ||
965 | .callback = dmi_matched, | 956 | .callback = dmi_matched, |
966 | .ident = "Fujitsu Siemens Amilo D7820", | ||
967 | .matches = { | 957 | .matches = { |
968 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ | 958 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ |
969 | DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), | 959 | DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), |
@@ -971,8 +961,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
971 | .driver_data = keymap_fs_amilo_d88x0 | 961 | .driver_data = keymap_fs_amilo_d88x0 |
972 | }, | 962 | }, |
973 | { | 963 | { |
964 | /* Fujitsu Siemens Amilo D88x0 */ | ||
974 | .callback = dmi_matched, | 965 | .callback = dmi_matched, |
975 | .ident = "Fujitsu Siemens Amilo D88x0", | ||
976 | .matches = { | 966 | .matches = { |
977 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 967 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
978 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"), | 968 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"), |
@@ -1037,21 +1027,6 @@ static unsigned long jiffies_last_press; | |||
1037 | static bool wifi_enabled; | 1027 | static bool wifi_enabled; |
1038 | static bool bluetooth_enabled; | 1028 | static bool bluetooth_enabled; |
1039 | 1029 | ||
1040 | static void report_key(struct input_dev *dev, unsigned int keycode) | ||
1041 | { | ||
1042 | input_report_key(dev, keycode, 1); | ||
1043 | input_sync(dev); | ||
1044 | input_report_key(dev, keycode, 0); | ||
1045 | input_sync(dev); | ||
1046 | } | ||
1047 | |||
1048 | static void report_switch(struct input_dev *dev, unsigned int code, int value) | ||
1049 | { | ||
1050 | input_report_switch(dev, code, value); | ||
1051 | input_sync(dev); | ||
1052 | } | ||
1053 | |||
1054 | |||
1055 | /* led management */ | 1030 | /* led management */ |
1056 | static void wistron_mail_led_set(struct led_classdev *led_cdev, | 1031 | static void wistron_mail_led_set(struct led_classdev *led_cdev, |
1057 | enum led_brightness value) | 1032 | enum led_brightness value) |
@@ -1128,43 +1103,13 @@ static inline void wistron_led_resume(void) | |||
1128 | led_classdev_resume(&wistron_wifi_led); | 1103 | led_classdev_resume(&wistron_wifi_led); |
1129 | } | 1104 | } |
1130 | 1105 | ||
1131 | static struct key_entry *wistron_get_entry_by_scancode(int code) | ||
1132 | { | ||
1133 | struct key_entry *key; | ||
1134 | |||
1135 | for (key = keymap; key->type != KE_END; key++) | ||
1136 | if (code == key->code) | ||
1137 | return key; | ||
1138 | |||
1139 | return NULL; | ||
1140 | } | ||
1141 | |||
1142 | static struct key_entry *wistron_get_entry_by_keycode(int keycode) | ||
1143 | { | ||
1144 | struct key_entry *key; | ||
1145 | |||
1146 | for (key = keymap; key->type != KE_END; key++) | ||
1147 | if (key->type == KE_KEY && keycode == key->keycode) | ||
1148 | return key; | ||
1149 | |||
1150 | return NULL; | ||
1151 | } | ||
1152 | |||
1153 | static void handle_key(u8 code) | 1106 | static void handle_key(u8 code) |
1154 | { | 1107 | { |
1155 | const struct key_entry *key = wistron_get_entry_by_scancode(code); | 1108 | const struct key_entry *key = |
1109 | sparse_keymap_entry_from_scancode(wistron_idev->input, code); | ||
1156 | 1110 | ||
1157 | if (key) { | 1111 | if (key) { |
1158 | switch (key->type) { | 1112 | switch (key->type) { |
1159 | case KE_KEY: | ||
1160 | report_key(wistron_idev->input, key->keycode); | ||
1161 | break; | ||
1162 | |||
1163 | case KE_SW: | ||
1164 | report_switch(wistron_idev->input, | ||
1165 | key->sw.code, key->sw.value); | ||
1166 | break; | ||
1167 | |||
1168 | case KE_WIFI: | 1113 | case KE_WIFI: |
1169 | if (have_wifi) { | 1114 | if (have_wifi) { |
1170 | wifi_enabled = !wifi_enabled; | 1115 | wifi_enabled = !wifi_enabled; |
@@ -1180,7 +1125,9 @@ static void handle_key(u8 code) | |||
1180 | break; | 1125 | break; |
1181 | 1126 | ||
1182 | default: | 1127 | default: |
1183 | BUG(); | 1128 | sparse_keymap_report_entry(wistron_idev->input, |
1129 | key, 1, true); | ||
1130 | break; | ||
1184 | } | 1131 | } |
1185 | jiffies_last_press = jiffies; | 1132 | jiffies_last_press = jiffies; |
1186 | } else | 1133 | } else |
@@ -1220,42 +1167,39 @@ static void wistron_poll(struct input_polled_dev *dev) | |||
1220 | dev->poll_interval = POLL_INTERVAL_DEFAULT; | 1167 | dev->poll_interval = POLL_INTERVAL_DEFAULT; |
1221 | } | 1168 | } |
1222 | 1169 | ||
1223 | static int wistron_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 1170 | static int __devinit wistron_setup_keymap(struct input_dev *dev, |
1171 | struct key_entry *entry) | ||
1224 | { | 1172 | { |
1225 | const struct key_entry *key = wistron_get_entry_by_scancode(scancode); | 1173 | switch (entry->type) { |
1226 | 1174 | ||
1227 | if (key && key->type == KE_KEY) { | 1175 | /* if wifi or bluetooth are not available, create normal keys */ |
1228 | *keycode = key->keycode; | 1176 | case KE_WIFI: |
1229 | return 0; | 1177 | if (!have_wifi) { |
1230 | } | 1178 | entry->type = KE_KEY; |
1231 | 1179 | entry->keycode = KEY_WLAN; | |
1232 | return -EINVAL; | 1180 | } |
1233 | } | 1181 | break; |
1234 | 1182 | ||
1235 | static int wistron_setkeycode(struct input_dev *dev, int scancode, int keycode) | 1183 | case KE_BLUETOOTH: |
1236 | { | 1184 | if (!have_bluetooth) { |
1237 | struct key_entry *key; | 1185 | entry->type = KE_KEY; |
1238 | int old_keycode; | 1186 | entry->keycode = KEY_BLUETOOTH; |
1239 | 1187 | } | |
1240 | if (keycode < 0 || keycode > KEY_MAX) | 1188 | break; |
1241 | return -EINVAL; | 1189 | |
1242 | 1190 | case KE_END: | |
1243 | key = wistron_get_entry_by_scancode(scancode); | 1191 | if (entry->code & FE_UNTESTED) |
1244 | if (key && key->type == KE_KEY) { | 1192 | printk(KERN_WARNING "Untested laptop multimedia keys, " |
1245 | old_keycode = key->keycode; | 1193 | "please report success or failure to " |
1246 | key->keycode = keycode; | 1194 | "eric.piel@tremplin-utc.net\n"); |
1247 | set_bit(keycode, dev->keybit); | 1195 | break; |
1248 | if (!wistron_get_entry_by_keycode(old_keycode)) | ||
1249 | clear_bit(old_keycode, dev->keybit); | ||
1250 | return 0; | ||
1251 | } | 1196 | } |
1252 | 1197 | ||
1253 | return -EINVAL; | 1198 | return 0; |
1254 | } | 1199 | } |
1255 | 1200 | ||
1256 | static int __devinit setup_input_dev(void) | 1201 | static int __devinit setup_input_dev(void) |
1257 | { | 1202 | { |
1258 | struct key_entry *key; | ||
1259 | struct input_dev *input_dev; | 1203 | struct input_dev *input_dev; |
1260 | int error; | 1204 | int error; |
1261 | 1205 | ||
@@ -1263,7 +1207,7 @@ static int __devinit setup_input_dev(void) | |||
1263 | if (!wistron_idev) | 1207 | if (!wistron_idev) |
1264 | return -ENOMEM; | 1208 | return -ENOMEM; |
1265 | 1209 | ||
1266 | wistron_idev->flush = wistron_flush; | 1210 | wistron_idev->open = wistron_flush; |
1267 | wistron_idev->poll = wistron_poll; | 1211 | wistron_idev->poll = wistron_poll; |
1268 | wistron_idev->poll_interval = POLL_INTERVAL_DEFAULT; | 1212 | wistron_idev->poll_interval = POLL_INTERVAL_DEFAULT; |
1269 | 1213 | ||
@@ -1273,56 +1217,21 @@ static int __devinit setup_input_dev(void) | |||
1273 | input_dev->id.bustype = BUS_HOST; | 1217 | input_dev->id.bustype = BUS_HOST; |
1274 | input_dev->dev.parent = &wistron_device->dev; | 1218 | input_dev->dev.parent = &wistron_device->dev; |
1275 | 1219 | ||
1276 | input_dev->getkeycode = wistron_getkeycode; | 1220 | error = sparse_keymap_setup(input_dev, keymap, wistron_setup_keymap); |
1277 | input_dev->setkeycode = wistron_setkeycode; | 1221 | if (error) |
1278 | 1222 | goto err_free_dev; | |
1279 | for (key = keymap; key->type != KE_END; key++) { | ||
1280 | switch (key->type) { | ||
1281 | case KE_KEY: | ||
1282 | set_bit(EV_KEY, input_dev->evbit); | ||
1283 | set_bit(key->keycode, input_dev->keybit); | ||
1284 | break; | ||
1285 | |||
1286 | case KE_SW: | ||
1287 | set_bit(EV_SW, input_dev->evbit); | ||
1288 | set_bit(key->sw.code, input_dev->swbit); | ||
1289 | break; | ||
1290 | |||
1291 | /* if wifi or bluetooth are not available, create normal keys */ | ||
1292 | case KE_WIFI: | ||
1293 | if (!have_wifi) { | ||
1294 | key->type = KE_KEY; | ||
1295 | key->keycode = KEY_WLAN; | ||
1296 | key--; | ||
1297 | } | ||
1298 | break; | ||
1299 | |||
1300 | case KE_BLUETOOTH: | ||
1301 | if (!have_bluetooth) { | ||
1302 | key->type = KE_KEY; | ||
1303 | key->keycode = KEY_BLUETOOTH; | ||
1304 | key--; | ||
1305 | } | ||
1306 | break; | ||
1307 | |||
1308 | default: | ||
1309 | break; | ||
1310 | } | ||
1311 | } | ||
1312 | |||
1313 | /* reads information flags on KE_END */ | ||
1314 | if (key->code & FE_UNTESTED) | ||
1315 | printk(KERN_WARNING "Untested laptop multimedia keys, " | ||
1316 | "please report success or failure to eric.piel" | ||
1317 | "@tremplin-utc.net\n"); | ||
1318 | 1223 | ||
1319 | error = input_register_polled_device(wistron_idev); | 1224 | error = input_register_polled_device(wistron_idev); |
1320 | if (error) { | 1225 | if (error) |
1321 | input_free_polled_device(wistron_idev); | 1226 | goto err_free_keymap; |
1322 | return error; | ||
1323 | } | ||
1324 | 1227 | ||
1325 | return 0; | 1228 | return 0; |
1229 | |||
1230 | err_free_keymap: | ||
1231 | sparse_keymap_free(input_dev); | ||
1232 | err_free_dev: | ||
1233 | input_free_polled_device(wistron_idev); | ||
1234 | return error; | ||
1326 | } | 1235 | } |
1327 | 1236 | ||
1328 | /* Driver core */ | 1237 | /* Driver core */ |
@@ -1371,6 +1280,7 @@ static int __devexit wistron_remove(struct platform_device *dev) | |||
1371 | { | 1280 | { |
1372 | wistron_led_remove(); | 1281 | wistron_led_remove(); |
1373 | input_unregister_polled_device(wistron_idev); | 1282 | input_unregister_polled_device(wistron_idev); |
1283 | sparse_keymap_free(wistron_idev->input); | ||
1374 | input_free_polled_device(wistron_idev); | 1284 | input_free_polled_device(wistron_idev); |
1375 | bios_detach(); | 1285 | bios_detach(); |
1376 | 1286 | ||