aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2014-04-01 13:06:41 -0400
committerJiri Kosina <jkosina@suse.cz>2014-04-01 13:06:41 -0400
commit6cf8c85f8bc320ca0273c5261cc13ee1491d7b92 (patch)
tree418b338bcb2014768ede10e73179c7afbaf1736d /drivers
parentded75664d1a7d74c1976da0969ddb31ad9839d4c (diff)
parent34e75dca4e6313249c9a2faa8effeddce89b91ac (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.c1
-rw-r--r--drivers/hid/hid-ids.h1
-rw-r--r--drivers/hid/hid-input.c3
-rw-r--r--drivers/hid/hid-microsoft.c74
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,
83static int ms_presenter_8k_quirk(struct hid_input *hi, struct hid_usage *usage, 122static 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:
194static const struct hid_device_id ms_devices[] = { 258static 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),