diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-04-01 13:06:41 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-04-01 13:06:41 -0400 |
commit | 6cf8c85f8bc320ca0273c5261cc13ee1491d7b92 (patch) | |
tree | 418b338bcb2014768ede10e73179c7afbaf1736d /drivers | |
parent | ded75664d1a7d74c1976da0969ddb31ad9839d4c (diff) | |
parent | 34e75dca4e6313249c9a2faa8effeddce89b91ac (diff) |
Merge branch 'for-3.15/microsoft' into for-linus
Conflicts:
drivers/hid/hid-core.c
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hid/hid-core.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 1 | ||||
-rw-r--r-- | drivers/hid/hid-input.c | 3 | ||||
-rw-r--r-- | drivers/hid/hid-microsoft.c | 74 |
4 files changed, 75 insertions, 4 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 3736f6a121b7..dbe548b22b2a 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1823,6 +1823,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1823 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, | 1823 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, |
1824 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2) }, | 1824 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2) }, |
1825 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2) }, | 1825 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2) }, |
1826 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) }, | ||
1826 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, | 1827 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, |
1827 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, | 1828 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, |
1828 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) }, | 1829 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 5c34e658fd59..af15a631bb24 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -615,6 +615,7 @@ | |||
615 | 615 | ||
616 | #define USB_VENDOR_ID_MICROSOFT 0x045e | 616 | #define USB_VENDOR_ID_MICROSOFT 0x045e |
617 | #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b | 617 | #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b |
618 | #define USB_DEVICE_ID_MS_OFFICE_KB 0x0048 | ||
618 | #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d | 619 | #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d |
619 | #define USB_DEVICE_ID_MS_NE4K 0x00db | 620 | #define USB_DEVICE_ID_MS_NE4K 0x00db |
620 | #define USB_DEVICE_ID_MS_NE4K_JP 0x00dc | 621 | #define USB_DEVICE_ID_MS_NE4K_JP 0x00dc |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 333190f771f5..e7e8b19a9284 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -789,10 +789,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
789 | case 0x199: map_key_clear(KEY_CHAT); break; | 789 | case 0x199: map_key_clear(KEY_CHAT); break; |
790 | case 0x19c: map_key_clear(KEY_LOGOFF); break; | 790 | case 0x19c: map_key_clear(KEY_LOGOFF); break; |
791 | case 0x19e: map_key_clear(KEY_COFFEE); break; | 791 | case 0x19e: map_key_clear(KEY_COFFEE); break; |
792 | case 0x1a3: map_key_clear(KEY_NEXT); break; | ||
793 | case 0x1a4: map_key_clear(KEY_PREVIOUS); break; | ||
792 | case 0x1a6: map_key_clear(KEY_HELP); break; | 794 | case 0x1a6: map_key_clear(KEY_HELP); break; |
793 | case 0x1a7: map_key_clear(KEY_DOCUMENTS); break; | 795 | case 0x1a7: map_key_clear(KEY_DOCUMENTS); break; |
794 | case 0x1ab: map_key_clear(KEY_SPELLCHECK); break; | 796 | case 0x1ab: map_key_clear(KEY_SPELLCHECK); break; |
795 | case 0x1ae: map_key_clear(KEY_KEYBOARD); break; | 797 | case 0x1ae: map_key_clear(KEY_KEYBOARD); break; |
798 | case 0x1b4: map_key_clear(KEY_FILE); break; | ||
796 | case 0x1b6: map_key_clear(KEY_IMAGES); break; | 799 | case 0x1b6: map_key_clear(KEY_IMAGES); break; |
797 | case 0x1b7: map_key_clear(KEY_AUDIO); break; | 800 | case 0x1b7: map_key_clear(KEY_AUDIO); break; |
798 | case 0x1b8: map_key_clear(KEY_VIDEO); break; | 801 | case 0x1b8: map_key_clear(KEY_VIDEO); break; |
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c index 404a3a8a82f1..6fd58175a291 100644 --- a/drivers/hid/hid-microsoft.c +++ b/drivers/hid/hid-microsoft.c | |||
@@ -62,9 +62,48 @@ static int ms_ergonomy_kb_quirk(struct hid_input *hi, struct hid_usage *usage, | |||
62 | { | 62 | { |
63 | struct input_dev *input = hi->input; | 63 | struct input_dev *input = hi->input; |
64 | 64 | ||
65 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER) { | ||
66 | switch (usage->hid & HID_USAGE) { | ||
67 | /* | ||
68 | * Microsoft uses these 2 reserved usage ids for 2 keys on | ||
69 | * the MS office kb labelled "Office Home" and "Task Pane". | ||
70 | */ | ||
71 | case 0x29d: | ||
72 | ms_map_key_clear(KEY_PROG1); | ||
73 | return 1; | ||
74 | case 0x29e: | ||
75 | ms_map_key_clear(KEY_PROG2); | ||
76 | return 1; | ||
77 | } | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR) | ||
82 | return 0; | ||
83 | |||
65 | switch (usage->hid & HID_USAGE) { | 84 | switch (usage->hid & HID_USAGE) { |
66 | case 0xfd06: ms_map_key_clear(KEY_CHAT); break; | 85 | case 0xfd06: ms_map_key_clear(KEY_CHAT); break; |
67 | case 0xfd07: ms_map_key_clear(KEY_PHONE); break; | 86 | case 0xfd07: ms_map_key_clear(KEY_PHONE); break; |
87 | case 0xff00: | ||
88 | /* Special keypad keys */ | ||
89 | ms_map_key_clear(KEY_KPEQUAL); | ||
90 | set_bit(KEY_KPLEFTPAREN, input->keybit); | ||
91 | set_bit(KEY_KPRIGHTPAREN, input->keybit); | ||
92 | break; | ||
93 | case 0xff01: | ||
94 | /* Scroll wheel */ | ||
95 | hid_map_usage_clear(hi, usage, bit, max, EV_REL, REL_WHEEL); | ||
96 | break; | ||
97 | case 0xff02: | ||
98 | /* | ||
99 | * This byte contains a copy of the modifier keys byte of a | ||
100 | * standard hid keyboard report, as send by interface 0 | ||
101 | * (this usage is found on interface 1). | ||
102 | * | ||
103 | * This byte only gets send when another key in the same report | ||
104 | * changes state, and as such is useless, ignore it. | ||
105 | */ | ||
106 | return -1; | ||
68 | case 0xff05: | 107 | case 0xff05: |
69 | set_bit(EV_REP, input->evbit); | 108 | set_bit(EV_REP, input->evbit); |
70 | ms_map_key_clear(KEY_F13); | 109 | ms_map_key_clear(KEY_F13); |
@@ -83,6 +122,9 @@ static int ms_ergonomy_kb_quirk(struct hid_input *hi, struct hid_usage *usage, | |||
83 | static int ms_presenter_8k_quirk(struct hid_input *hi, struct hid_usage *usage, | 122 | static int ms_presenter_8k_quirk(struct hid_input *hi, struct hid_usage *usage, |
84 | unsigned long **bit, int *max) | 123 | unsigned long **bit, int *max) |
85 | { | 124 | { |
125 | if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR) | ||
126 | return 0; | ||
127 | |||
86 | set_bit(EV_REP, hi->input->evbit); | 128 | set_bit(EV_REP, hi->input->evbit); |
87 | switch (usage->hid & HID_USAGE) { | 129 | switch (usage->hid & HID_USAGE) { |
88 | case 0xfd08: ms_map_key_clear(KEY_FORWARD); break; | 130 | case 0xfd08: ms_map_key_clear(KEY_FORWARD); break; |
@@ -102,9 +144,6 @@ static int ms_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
102 | { | 144 | { |
103 | unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); | 145 | unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); |
104 | 146 | ||
105 | if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR) | ||
106 | return 0; | ||
107 | |||
108 | if (quirks & MS_ERGONOMY) { | 147 | if (quirks & MS_ERGONOMY) { |
109 | int ret = ms_ergonomy_kb_quirk(hi, usage, bit, max); | 148 | int ret = ms_ergonomy_kb_quirk(hi, usage, bit, max); |
110 | if (ret) | 149 | if (ret) |
@@ -134,14 +173,39 @@ static int ms_event(struct hid_device *hdev, struct hid_field *field, | |||
134 | struct hid_usage *usage, __s32 value) | 173 | struct hid_usage *usage, __s32 value) |
135 | { | 174 | { |
136 | unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); | 175 | unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); |
176 | struct input_dev *input; | ||
137 | 177 | ||
138 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || | 178 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || |
139 | !usage->type) | 179 | !usage->type) |
140 | return 0; | 180 | return 0; |
141 | 181 | ||
182 | input = field->hidinput->input; | ||
183 | |||
142 | /* Handling MS keyboards special buttons */ | 184 | /* Handling MS keyboards special buttons */ |
185 | if (quirks & MS_ERGONOMY && usage->hid == (HID_UP_MSVENDOR | 0xff00)) { | ||
186 | /* Special keypad keys */ | ||
187 | input_report_key(input, KEY_KPEQUAL, value & 0x01); | ||
188 | input_report_key(input, KEY_KPLEFTPAREN, value & 0x02); | ||
189 | input_report_key(input, KEY_KPRIGHTPAREN, value & 0x04); | ||
190 | return 1; | ||
191 | } | ||
192 | |||
193 | if (quirks & MS_ERGONOMY && usage->hid == (HID_UP_MSVENDOR | 0xff01)) { | ||
194 | /* Scroll wheel */ | ||
195 | int step = ((value & 0x60) >> 5) + 1; | ||
196 | |||
197 | switch (value & 0x1f) { | ||
198 | case 0x01: | ||
199 | input_report_rel(input, REL_WHEEL, step); | ||
200 | break; | ||
201 | case 0x1f: | ||
202 | input_report_rel(input, REL_WHEEL, -step); | ||
203 | break; | ||
204 | } | ||
205 | return 1; | ||
206 | } | ||
207 | |||
143 | if (quirks & MS_ERGONOMY && usage->hid == (HID_UP_MSVENDOR | 0xff05)) { | 208 | if (quirks & MS_ERGONOMY && usage->hid == (HID_UP_MSVENDOR | 0xff05)) { |
144 | struct input_dev *input = field->hidinput->input; | ||
145 | static unsigned int last_key = 0; | 209 | static unsigned int last_key = 0; |
146 | unsigned int key = 0; | 210 | unsigned int key = 0; |
147 | switch (value) { | 211 | switch (value) { |
@@ -194,6 +258,8 @@ err_free: | |||
194 | static const struct hid_device_id ms_devices[] = { | 258 | static const struct hid_device_id ms_devices[] = { |
195 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV), | 259 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV), |
196 | .driver_data = MS_HIDINPUT }, | 260 | .driver_data = MS_HIDINPUT }, |
261 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB), | ||
262 | .driver_data = MS_ERGONOMY }, | ||
197 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K), | 263 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K), |
198 | .driver_data = MS_ERGONOMY }, | 264 | .driver_data = MS_ERGONOMY }, |
199 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K_JP), | 265 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K_JP), |