@@ -266,6 +266,54 @@ static int lenovo_input_mapping_tp10_ultrabook_kbd(struct hid_device *hdev,
266
266
return 0 ;
267
267
}
268
268
269
+ static int lenovo_input_mapping_x1_tab_kbd (struct hid_device * hdev ,
270
+ struct hid_input * hi , struct hid_field * field ,
271
+ struct hid_usage * usage , unsigned long * * bit , int * max )
272
+ {
273
+ /*
274
+ * The ThinkPad X1 Tablet Thin Keyboard uses 0x000c0001 usage for
275
+ * a bunch of keys which have no standard consumer page code.
276
+ */
277
+ if (usage -> hid == 0x000c0001 ) {
278
+ switch (usage -> usage_index ) {
279
+ case 0 : /* Fn-F10: Enable/disable bluetooth */
280
+ map_key_clear (KEY_BLUETOOTH );
281
+ return 1 ;
282
+ case 1 : /* Fn-F11: Keyboard settings */
283
+ map_key_clear (KEY_KEYBOARD );
284
+ return 1 ;
285
+ case 2 : /* Fn-F12: User function / Cortana */
286
+ map_key_clear (KEY_MACRO1 );
287
+ return 1 ;
288
+ case 3 : /* Fn-PrtSc: Snipping tool */
289
+ map_key_clear (KEY_SELECTIVE_SCREENSHOT );
290
+ return 1 ;
291
+ case 8 : /* Fn-Esc: Fn-lock toggle */
292
+ map_key_clear (KEY_FN_ESC );
293
+ return 1 ;
294
+ case 9 : /* Fn-F4: Mute/unmute microphone */
295
+ map_key_clear (KEY_MICMUTE );
296
+ return 1 ;
297
+ case 10 : /* Fn-F9: Settings */
298
+ map_key_clear (KEY_CONFIG );
299
+ return 1 ;
300
+ case 13 : /* Fn-F7: Manage external displays */
301
+ map_key_clear (KEY_SWITCHVIDEOMODE );
302
+ return 1 ;
303
+ case 14 : /* Fn-F8: Enable/disable wifi */
304
+ map_key_clear (KEY_WLAN );
305
+ return 1 ;
306
+ }
307
+ }
308
+
309
+ if (usage -> hid == (HID_UP_KEYBOARD | 0x009a )) {
310
+ map_key_clear (KEY_SYSRQ );
311
+ return 1 ;
312
+ }
313
+
314
+ return 0 ;
315
+ }
316
+
269
317
static int lenovo_input_mapping (struct hid_device * hdev ,
270
318
struct hid_input * hi , struct hid_field * field ,
271
319
struct hid_usage * usage , unsigned long * * bit , int * max )
@@ -289,6 +337,8 @@ static int lenovo_input_mapping(struct hid_device *hdev,
289
337
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
290
338
return lenovo_input_mapping_tp10_ultrabook_kbd (hdev , hi , field ,
291
339
usage , bit , max );
340
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
341
+ return lenovo_input_mapping_x1_tab_kbd (hdev , hi , field , usage , bit , max );
292
342
default :
293
343
return 0 ;
294
344
}
@@ -375,6 +425,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
375
425
lenovo_features_set_cptkbd (hdev );
376
426
break ;
377
427
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
428
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
378
429
ret = lenovo_led_set_tp10ubkbd (hdev , TP10UBKBD_FN_LOCK_LED , value );
379
430
if (ret )
380
431
return ret ;
@@ -519,6 +570,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
519
570
case USB_DEVICE_ID_LENOVO_CBTKBD :
520
571
return lenovo_event_cptkbd (hdev , field , usage , value );
521
572
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
573
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
522
574
return lenovo_event_tp10ubkbd (hdev , field , usage , value );
523
575
default :
524
576
return 0 ;
@@ -800,6 +852,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
800
852
lenovo_led_set_tpkbd (hdev );
801
853
break ;
802
854
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
855
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
803
856
ret = lenovo_led_set_tp10ubkbd (hdev , tp10ubkbd_led [led_nr ], value );
804
857
break ;
805
858
}
@@ -1038,6 +1091,7 @@ static int lenovo_probe(struct hid_device *hdev,
1038
1091
ret = lenovo_probe_cptkbd (hdev );
1039
1092
break ;
1040
1093
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
1094
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
1041
1095
ret = lenovo_probe_tp10ubkbd (hdev );
1042
1096
break ;
1043
1097
default :
@@ -1103,6 +1157,7 @@ static void lenovo_remove(struct hid_device *hdev)
1103
1157
lenovo_remove_cptkbd (hdev );
1104
1158
break ;
1105
1159
case USB_DEVICE_ID_LENOVO_TP10UBKBD :
1160
+ case USB_DEVICE_ID_LENOVO_X1_TAB :
1106
1161
lenovo_remove_tp10ubkbd (hdev );
1107
1162
break ;
1108
1163
}
@@ -1142,6 +1197,12 @@ static const struct hid_device_id lenovo_devices[] = {
1142
1197
{ HID_USB_DEVICE (USB_VENDOR_ID_IBM , USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL_PRO ) },
1143
1198
{ HID_USB_DEVICE (USB_VENDOR_ID_LENOVO , USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL ) },
1144
1199
{ HID_USB_DEVICE (USB_VENDOR_ID_LENOVO , USB_DEVICE_ID_LENOVO_TP10UBKBD ) },
1200
+ /*
1201
+ * Note bind to the HID_GROUP_GENERIC group, so that we only bind to the keyboard
1202
+ * part, while letting hid-multitouch.c handle the touchpad and trackpoint.
1203
+ */
1204
+ { HID_DEVICE (BUS_USB , HID_GROUP_GENERIC ,
1205
+ USB_VENDOR_ID_LENOVO , USB_DEVICE_ID_LENOVO_X1_TAB ) },
1145
1206
{ }
1146
1207
};
1147
1208
0 commit comments