1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   *  HID driver for Lenovo:
4   *  - ThinkPad USB Keyboard with TrackPoint (tpkbd)
5   *  - ThinkPad Compact Bluetooth Keyboard with TrackPoint (cptkbd)
6   *  - ThinkPad Compact USB Keyboard with TrackPoint (cptkbd)
7   *  - ThinkPad TrackPoint Keyboard II USB/Bluetooth (cptkbd/tpIIkbd)
8   *
9   *  Copyright (c) 2012 Bernhard Seibold
10   *  Copyright (c) 2014 Jamie Lentin <jm@lentin.co.uk>
11   *
12   * Linux IBM/Lenovo Scrollpoint mouse driver:
13   * - IBM Scrollpoint III
14   * - IBM Scrollpoint Pro
15   * - IBM Scrollpoint Optical
16   * - IBM Scrollpoint Optical 800dpi
17   * - IBM Scrollpoint Optical 800dpi Pro
18   * - Lenovo Scrollpoint Optical
19   *
20   *  Copyright (c) 2012 Peter De Wachter <pdewacht@gmail.com>
21   *  Copyright (c) 2018 Peter Ganzhorn <peter.ganzhorn@gmail.com>
22   */
23  
24  /*
25   */
26  
27  #include <linux/module.h>
28  #include <linux/sysfs.h>
29  #include <linux/device.h>
30  #include <linux/hid.h>
31  #include <linux/input.h>
32  #include <linux/leds.h>
33  #include <linux/workqueue.h>
34  
35  #include "hid-ids.h"
36  
37  /* Userspace expects F20 for mic-mute KEY_MICMUTE does not work */
38  #define LENOVO_KEY_MICMUTE KEY_F20
39  
40  struct lenovo_drvdata {
41  	u8 led_report[3]; /* Must be first for proper alignment */
42  	int led_state;
43  	struct mutex led_report_mutex;
44  	struct led_classdev led_mute;
45  	struct led_classdev led_micmute;
46  	struct work_struct fn_lock_sync_work;
47  	struct hid_device *hdev;
48  	int press_to_select;
49  	int dragging;
50  	int release_to_select;
51  	int select_right;
52  	int sensitivity;
53  	int press_speed;
54  	/* 0: Up
55  	 * 1: Down (undecided)
56  	 * 2: Scrolling
57  	 */
58  	u8 middlebutton_state;
59  	bool fn_lock;
60  	bool middleclick_workaround_cptkbd;
61  };
62  
63  #define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
64  
65  #define TP10UBKBD_LED_OUTPUT_REPORT	9
66  
67  #define TP10UBKBD_FN_LOCK_LED		0x54
68  #define TP10UBKBD_MUTE_LED		0x64
69  #define TP10UBKBD_MICMUTE_LED		0x74
70  
71  #define TP10UBKBD_LED_OFF		1
72  #define TP10UBKBD_LED_ON		2
73  
lenovo_led_set_tp10ubkbd(struct hid_device * hdev,u8 led_code,enum led_brightness value)74  static int lenovo_led_set_tp10ubkbd(struct hid_device *hdev, u8 led_code,
75  				    enum led_brightness value)
76  {
77  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
78  	int ret;
79  
80  	mutex_lock(&data->led_report_mutex);
81  
82  	data->led_report[0] = TP10UBKBD_LED_OUTPUT_REPORT;
83  	data->led_report[1] = led_code;
84  	data->led_report[2] = value ? TP10UBKBD_LED_ON : TP10UBKBD_LED_OFF;
85  	ret = hid_hw_raw_request(hdev, data->led_report[0], data->led_report, 3,
86  				 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
87  	if (ret != 3) {
88  		if (ret != -ENODEV)
89  			hid_err(hdev, "Set LED output report error: %d\n", ret);
90  
91  		ret = ret < 0 ? ret : -EIO;
92  	} else {
93  		ret = 0;
94  	}
95  
96  	mutex_unlock(&data->led_report_mutex);
97  
98  	return ret;
99  }
100  
lenovo_tp10ubkbd_sync_fn_lock(struct work_struct * work)101  static void lenovo_tp10ubkbd_sync_fn_lock(struct work_struct *work)
102  {
103  	struct lenovo_drvdata *data =
104  		container_of(work, struct lenovo_drvdata, fn_lock_sync_work);
105  
106  	lenovo_led_set_tp10ubkbd(data->hdev, TP10UBKBD_FN_LOCK_LED,
107  				 data->fn_lock);
108  }
109  
110  static const __u8 lenovo_pro_dock_need_fixup_collection[] = {
111  	0x05, 0x88,		/* Usage Page (Vendor Usage Page 0x88)	*/
112  	0x09, 0x01,		/* Usage (Vendor Usage 0x01)		*/
113  	0xa1, 0x01,		/* Collection (Application)		*/
114  	0x85, 0x04,		/*  Report ID (4)			*/
115  	0x19, 0x00,		/*  Usage Minimum (0)			*/
116  	0x2a, 0xff, 0xff,	/*  Usage Maximum (65535)		*/
117  };
118  
119  /* Broken ThinkPad TrackPoint II collection (Bluetooth mode) */
120  static const __u8 lenovo_tpIIbtkbd_need_fixup_collection[] = {
121  	0x06, 0x00, 0xFF,	/* Usage Page (Vendor Defined 0xFF00) */
122  	0x09, 0x01,		/* Usage (0x01) */
123  	0xA1, 0x01,		/* Collection (Application) */
124  	0x85, 0x05,		/*   Report ID (5) */
125  	0x1A, 0xF1, 0x00,	/*   Usage Minimum (0xF1) */
126  	0x2A, 0xFC, 0x00,	/*   Usage Maximum (0xFC) */
127  	0x15, 0x00,		/*   Logical Minimum (0) */
128  	0x25, 0x01,		/*   Logical Maximum (1) */
129  	0x75, 0x01,		/*   Report Size (1) */
130  	0x95, 0x0D,		/*   Report Count (13) */
131  	0x81, 0x02,		/*   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) */
132  	0x95, 0x03,		/*   Report Count (3) */
133  	0x81, 0x01,		/*   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */
134  };
135  
lenovo_report_fixup(struct hid_device * hdev,__u8 * rdesc,unsigned int * rsize)136  static const __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
137  		unsigned int *rsize)
138  {
139  	switch (hdev->product) {
140  	case USB_DEVICE_ID_LENOVO_TPPRODOCK:
141  		/* the fixups that need to be done:
142  		 *   - get a reasonable usage max for the vendor collection
143  		 *     0x8801 from the report ID 4
144  		 */
145  		if (*rsize >= 153 &&
146  		    memcmp(&rdesc[140], lenovo_pro_dock_need_fixup_collection,
147  			  sizeof(lenovo_pro_dock_need_fixup_collection)) == 0) {
148  			rdesc[151] = 0x01;
149  			rdesc[152] = 0x00;
150  		}
151  		break;
152  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
153  		if (*rsize >= 263 &&
154  		    memcmp(&rdesc[234], lenovo_tpIIbtkbd_need_fixup_collection,
155  			  sizeof(lenovo_tpIIbtkbd_need_fixup_collection)) == 0) {
156  			rdesc[244] = 0x00; /* usage minimum = 0x00 */
157  			rdesc[247] = 0xff; /* usage maximum = 0xff */
158  			rdesc[252] = 0xff; /* logical maximum = 0xff */
159  			rdesc[254] = 0x08; /* report size = 0x08 */
160  			rdesc[256] = 0x01; /* report count = 0x01 */
161  			rdesc[258] = 0x00; /* input = 0x00 */
162  			rdesc[260] = 0x01; /* report count (2) = 0x01 */
163  		}
164  		break;
165  	}
166  	return rdesc;
167  }
168  
lenovo_input_mapping_tpkbd(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)169  static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
170  		struct hid_input *hi, struct hid_field *field,
171  		struct hid_usage *usage, unsigned long **bit, int *max)
172  {
173  	if (usage->hid == (HID_UP_BUTTON | 0x0010)) {
174  		/* This sub-device contains trackpoint, mark it */
175  		hid_set_drvdata(hdev, (void *)1);
176  		map_key_clear(LENOVO_KEY_MICMUTE);
177  		return 1;
178  	}
179  	return 0;
180  }
181  
lenovo_input_mapping_cptkbd(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)182  static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
183  		struct hid_input *hi, struct hid_field *field,
184  		struct hid_usage *usage, unsigned long **bit, int *max)
185  {
186  	/* HID_UP_LNVENDOR = USB, HID_UP_MSVENDOR = BT */
187  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR ||
188  	    (usage->hid & HID_USAGE_PAGE) == HID_UP_LNVENDOR) {
189  		switch (usage->hid & HID_USAGE) {
190  		case 0x00f1: /* Fn-F4: Mic mute */
191  			map_key_clear(LENOVO_KEY_MICMUTE);
192  			return 1;
193  		case 0x00f2: /* Fn-F5: Brightness down */
194  			map_key_clear(KEY_BRIGHTNESSDOWN);
195  			return 1;
196  		case 0x00f3: /* Fn-F6: Brightness up */
197  			map_key_clear(KEY_BRIGHTNESSUP);
198  			return 1;
199  		case 0x00f4: /* Fn-F7: External display (projector) */
200  			map_key_clear(KEY_SWITCHVIDEOMODE);
201  			return 1;
202  		case 0x00f5: /* Fn-F8: Wireless */
203  			map_key_clear(KEY_WLAN);
204  			return 1;
205  		case 0x00f6: /* Fn-F9: Control panel */
206  			map_key_clear(KEY_CONFIG);
207  			return 1;
208  		case 0x00f8: /* Fn-F11: View open applications (3 boxes) */
209  			map_key_clear(KEY_SCALE);
210  			return 1;
211  		case 0x00f9: /* Fn-F12: Open My computer (6 boxes) USB-only */
212  			/* NB: This mapping is invented in raw_event below */
213  			map_key_clear(KEY_FILE);
214  			return 1;
215  		case 0x00fa: /* Fn-Esc: Fn-lock toggle */
216  			map_key_clear(KEY_FN_ESC);
217  			return 1;
218  		case 0x00fb: /* Middle mouse button (in native mode) */
219  			map_key_clear(BTN_MIDDLE);
220  			return 1;
221  		}
222  	}
223  
224  	/* Compatibility middle/wheel mappings should be ignored */
225  	if (usage->hid == HID_GD_WHEEL)
226  		return -1;
227  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON &&
228  			(usage->hid & HID_USAGE) == 0x003)
229  		return -1;
230  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER &&
231  			(usage->hid & HID_USAGE) == 0x238)
232  		return -1;
233  
234  	/* Map wheel emulation reports: 0xffa1 = USB, 0xff10 = BT */
235  	if ((usage->hid & HID_USAGE_PAGE) == 0xff100000 ||
236  	    (usage->hid & HID_USAGE_PAGE) == 0xffa10000) {
237  		field->flags |= HID_MAIN_ITEM_RELATIVE | HID_MAIN_ITEM_VARIABLE;
238  		field->logical_minimum = -127;
239  		field->logical_maximum = 127;
240  
241  		switch (usage->hid & HID_USAGE) {
242  		case 0x0000:
243  			hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL);
244  			return 1;
245  		case 0x0001:
246  			hid_map_usage(hi, usage, bit, max, EV_REL, REL_WHEEL);
247  			return 1;
248  		default:
249  			return -1;
250  		}
251  	}
252  
253  	return 0;
254  }
255  
lenovo_input_mapping_tpIIkbd(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)256  static int lenovo_input_mapping_tpIIkbd(struct hid_device *hdev,
257  		struct hid_input *hi, struct hid_field *field,
258  		struct hid_usage *usage, unsigned long **bit, int *max)
259  {
260  	/*
261  	 * 0xff0a0000 = USB, HID_UP_MSVENDOR = BT.
262  	 *
263  	 * In BT mode, there are two HID_UP_MSVENDOR pages.
264  	 * Use only the page that contains report ID == 5.
265  	 */
266  	if (((usage->hid & HID_USAGE_PAGE) == 0xff0a0000 ||
267  	    (usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR) &&
268  	    field->report->id == 5) {
269  		switch (usage->hid & HID_USAGE) {
270  		case 0x00bb: /* Fn-F4: Mic mute */
271  			map_key_clear(LENOVO_KEY_MICMUTE);
272  			return 1;
273  		case 0x00c3: /* Fn-F5: Brightness down */
274  			map_key_clear(KEY_BRIGHTNESSDOWN);
275  			return 1;
276  		case 0x00c4: /* Fn-F6: Brightness up */
277  			map_key_clear(KEY_BRIGHTNESSUP);
278  			return 1;
279  		case 0x00c1: /* Fn-F8: Notification center */
280  			map_key_clear(KEY_NOTIFICATION_CENTER);
281  			return 1;
282  		case 0x00bc: /* Fn-F9: Control panel */
283  			map_key_clear(KEY_CONFIG);
284  			return 1;
285  		case 0x00b6: /* Fn-F10: Bluetooth */
286  			map_key_clear(KEY_BLUETOOTH);
287  			return 1;
288  		case 0x00b7: /* Fn-F11: Keyboard config */
289  			map_key_clear(KEY_KEYBOARD);
290  			return 1;
291  		case 0x00b8: /* Fn-F12: User function */
292  			map_key_clear(KEY_PROG1);
293  			return 1;
294  		case 0x00b9: /* Fn-PrtSc: Snipping tool */
295  			map_key_clear(KEY_SELECTIVE_SCREENSHOT);
296  			return 1;
297  		case 0x00b5: /* Fn-Esc: Fn-lock toggle */
298  			map_key_clear(KEY_FN_ESC);
299  			return 1;
300  		}
301  	}
302  
303  	if ((usage->hid & HID_USAGE_PAGE) == 0xffa00000) {
304  		switch (usage->hid & HID_USAGE) {
305  		case 0x00fb: /* Middle mouse (in native USB mode) */
306  			map_key_clear(BTN_MIDDLE);
307  			return 1;
308  		}
309  	}
310  
311  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR &&
312  	    field->report->id == 21) {
313  		switch (usage->hid & HID_USAGE) {
314  		case 0x0004: /* Middle mouse (in native Bluetooth mode) */
315  			map_key_clear(BTN_MIDDLE);
316  			return 1;
317  		}
318  	}
319  
320  	/* Compatibility middle/wheel mappings should be ignored */
321  	if (usage->hid == HID_GD_WHEEL)
322  		return -1;
323  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON &&
324  			(usage->hid & HID_USAGE) == 0x003)
325  		return -1;
326  	if ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER &&
327  			(usage->hid & HID_USAGE) == 0x238)
328  		return -1;
329  
330  	/* Map wheel emulation reports: 0xff10 */
331  	if ((usage->hid & HID_USAGE_PAGE) == 0xff100000) {
332  		field->flags |= HID_MAIN_ITEM_RELATIVE | HID_MAIN_ITEM_VARIABLE;
333  		field->logical_minimum = -127;
334  		field->logical_maximum = 127;
335  
336  		switch (usage->hid & HID_USAGE) {
337  		case 0x0000:
338  			hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL);
339  			return 1;
340  		case 0x0001:
341  			hid_map_usage(hi, usage, bit, max, EV_REL, REL_WHEEL);
342  			return 1;
343  		default:
344  			return -1;
345  		}
346  	}
347  
348  	return 0;
349  }
350  
lenovo_input_mapping_scrollpoint(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)351  static int lenovo_input_mapping_scrollpoint(struct hid_device *hdev,
352  		struct hid_input *hi, struct hid_field *field,
353  		struct hid_usage *usage, unsigned long **bit, int *max)
354  {
355  	if (usage->hid == HID_GD_Z) {
356  		hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL);
357  		return 1;
358  	}
359  	return 0;
360  }
361  
lenovo_input_mapping_tp10_ultrabook_kbd(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)362  static int lenovo_input_mapping_tp10_ultrabook_kbd(struct hid_device *hdev,
363  		struct hid_input *hi, struct hid_field *field,
364  		struct hid_usage *usage, unsigned long **bit, int *max)
365  {
366  	/*
367  	 * The ThinkPad 10 Ultrabook Keyboard uses 0x000c0001 usage for
368  	 * a bunch of keys which have no standard consumer page code.
369  	 */
370  	if (usage->hid == 0x000c0001) {
371  		switch (usage->usage_index) {
372  		case 8: /* Fn-Esc: Fn-lock toggle */
373  			map_key_clear(KEY_FN_ESC);
374  			return 1;
375  		case 9: /* Fn-F4: Mic mute */
376  			map_key_clear(LENOVO_KEY_MICMUTE);
377  			return 1;
378  		case 10: /* Fn-F7: Control panel */
379  			map_key_clear(KEY_CONFIG);
380  			return 1;
381  		case 11: /* Fn-F8: Search (magnifier glass) */
382  			map_key_clear(KEY_SEARCH);
383  			return 1;
384  		case 12: /* Fn-F10: Open My computer (6 boxes) */
385  			map_key_clear(KEY_FILE);
386  			return 1;
387  		}
388  	}
389  
390  	/*
391  	 * The Ultrabook Keyboard sends a spurious F23 key-press when resuming
392  	 * from suspend and it does not actually have a F23 key, ignore it.
393  	 */
394  	if (usage->hid == 0x00070072)
395  		return -1;
396  
397  	return 0;
398  }
399  
lenovo_input_mapping_x1_tab_kbd(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)400  static int lenovo_input_mapping_x1_tab_kbd(struct hid_device *hdev,
401  		struct hid_input *hi, struct hid_field *field,
402  		struct hid_usage *usage, unsigned long **bit, int *max)
403  {
404  	/*
405  	 * The ThinkPad X1 Tablet Thin Keyboard uses 0x000c0001 usage for
406  	 * a bunch of keys which have no standard consumer page code.
407  	 */
408  	if (usage->hid == 0x000c0001) {
409  		switch (usage->usage_index) {
410  		case 0: /* Fn-F10: Enable/disable bluetooth */
411  			map_key_clear(KEY_BLUETOOTH);
412  			return 1;
413  		case 1: /* Fn-F11: Keyboard settings */
414  			map_key_clear(KEY_KEYBOARD);
415  			return 1;
416  		case 2: /* Fn-F12: User function / Cortana */
417  			map_key_clear(KEY_MACRO1);
418  			return 1;
419  		case 3: /* Fn-PrtSc: Snipping tool */
420  			map_key_clear(KEY_SELECTIVE_SCREENSHOT);
421  			return 1;
422  		case 8: /* Fn-Esc: Fn-lock toggle */
423  			map_key_clear(KEY_FN_ESC);
424  			return 1;
425  		case 9: /* Fn-F4: Mute/unmute microphone */
426  			map_key_clear(KEY_MICMUTE);
427  			return 1;
428  		case 10: /* Fn-F9: Settings */
429  			map_key_clear(KEY_CONFIG);
430  			return 1;
431  		case 13: /* Fn-F7: Manage external displays */
432  			map_key_clear(KEY_SWITCHVIDEOMODE);
433  			return 1;
434  		case 14: /* Fn-F8: Enable/disable wifi */
435  			map_key_clear(KEY_WLAN);
436  			return 1;
437  		}
438  	}
439  
440  	if (usage->hid == (HID_UP_KEYBOARD | 0x009a)) {
441  		map_key_clear(KEY_SYSRQ);
442  		return 1;
443  	}
444  
445  	return 0;
446  }
447  
lenovo_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)448  static int lenovo_input_mapping(struct hid_device *hdev,
449  		struct hid_input *hi, struct hid_field *field,
450  		struct hid_usage *usage, unsigned long **bit, int *max)
451  {
452  	switch (hdev->product) {
453  	case USB_DEVICE_ID_LENOVO_TPKBD:
454  		return lenovo_input_mapping_tpkbd(hdev, hi, field,
455  							usage, bit, max);
456  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
457  	case USB_DEVICE_ID_LENOVO_CBTKBD:
458  		return lenovo_input_mapping_cptkbd(hdev, hi, field,
459  							usage, bit, max);
460  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
461  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
462  		return lenovo_input_mapping_tpIIkbd(hdev, hi, field,
463  							usage, bit, max);
464  	case USB_DEVICE_ID_IBM_SCROLLPOINT_III:
465  	case USB_DEVICE_ID_IBM_SCROLLPOINT_PRO:
466  	case USB_DEVICE_ID_IBM_SCROLLPOINT_OPTICAL:
467  	case USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL:
468  	case USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL_PRO:
469  	case USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL:
470  		return lenovo_input_mapping_scrollpoint(hdev, hi, field,
471  							usage, bit, max);
472  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
473  		return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
474  							       usage, bit, max);
475  	case USB_DEVICE_ID_LENOVO_X1_TAB:
476  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
477  		return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
478  	default:
479  		return 0;
480  	}
481  }
482  
483  #undef map_key_clear
484  
485  /* Send a config command to the keyboard */
lenovo_send_cmd_cptkbd(struct hid_device * hdev,unsigned char byte2,unsigned char byte3)486  static int lenovo_send_cmd_cptkbd(struct hid_device *hdev,
487  			unsigned char byte2, unsigned char byte3)
488  {
489  	int ret;
490  	unsigned char *buf;
491  
492  	buf = kzalloc(3, GFP_KERNEL);
493  	if (!buf)
494  		return -ENOMEM;
495  
496  	/*
497  	 * Feature report 0x13 is used for USB,
498  	 * output report 0x18 is used for Bluetooth.
499  	 * buf[0] is ignored by hid_hw_raw_request.
500  	 */
501  	buf[0] = 0x18;
502  	buf[1] = byte2;
503  	buf[2] = byte3;
504  
505  	switch (hdev->product) {
506  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
507  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
508  		ret = hid_hw_raw_request(hdev, 0x13, buf, 3,
509  					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
510  		break;
511  	case USB_DEVICE_ID_LENOVO_CBTKBD:
512  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
513  		ret = hid_hw_output_report(hdev, buf, 3);
514  		break;
515  	default:
516  		ret = -EINVAL;
517  		break;
518  	}
519  
520  	kfree(buf);
521  
522  	return ret < 0 ? ret : 0; /* BT returns 0, USB returns sizeof(buf) */
523  }
524  
lenovo_features_set_cptkbd(struct hid_device * hdev)525  static void lenovo_features_set_cptkbd(struct hid_device *hdev)
526  {
527  	int ret;
528  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
529  
530  	/*
531  	 * Tell the keyboard a driver understands it, and turn F7, F9, F11 into
532  	 * regular keys
533  	 */
534  	ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03);
535  	if (ret)
536  		hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
537  
538  	/* Switch middle button to native mode */
539  	ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01);
540  	if (ret)
541  		hid_warn(hdev, "Failed to switch middle button: %d\n", ret);
542  
543  	ret = lenovo_send_cmd_cptkbd(hdev, 0x05, cptkbd_data->fn_lock);
544  	if (ret)
545  		hid_err(hdev, "Fn-lock setting failed: %d\n", ret);
546  
547  	ret = lenovo_send_cmd_cptkbd(hdev, 0x02, cptkbd_data->sensitivity);
548  	if (ret)
549  		hid_err(hdev, "Sensitivity setting failed: %d\n", ret);
550  }
551  
attr_fn_lock_show(struct device * dev,struct device_attribute * attr,char * buf)552  static ssize_t attr_fn_lock_show(struct device *dev,
553  		struct device_attribute *attr,
554  		char *buf)
555  {
556  	struct hid_device *hdev = to_hid_device(dev);
557  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
558  
559  	return sysfs_emit(buf, "%u\n", data->fn_lock);
560  }
561  
attr_fn_lock_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)562  static ssize_t attr_fn_lock_store(struct device *dev,
563  		struct device_attribute *attr,
564  		const char *buf,
565  		size_t count)
566  {
567  	struct hid_device *hdev = to_hid_device(dev);
568  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
569  	int value, ret;
570  
571  	if (kstrtoint(buf, 10, &value))
572  		return -EINVAL;
573  	if (value < 0 || value > 1)
574  		return -EINVAL;
575  
576  	data->fn_lock = !!value;
577  
578  	switch (hdev->product) {
579  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
580  	case USB_DEVICE_ID_LENOVO_CBTKBD:
581  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
582  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
583  		lenovo_features_set_cptkbd(hdev);
584  		break;
585  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
586  	case USB_DEVICE_ID_LENOVO_X1_TAB:
587  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
588  		ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
589  		if (ret)
590  			return ret;
591  		break;
592  	}
593  
594  	return count;
595  }
596  
attr_sensitivity_show_cptkbd(struct device * dev,struct device_attribute * attr,char * buf)597  static ssize_t attr_sensitivity_show_cptkbd(struct device *dev,
598  		struct device_attribute *attr,
599  		char *buf)
600  {
601  	struct hid_device *hdev = to_hid_device(dev);
602  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
603  
604  	return sysfs_emit(buf, "%u\n", cptkbd_data->sensitivity);
605  }
606  
attr_sensitivity_store_cptkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)607  static ssize_t attr_sensitivity_store_cptkbd(struct device *dev,
608  		struct device_attribute *attr,
609  		const char *buf,
610  		size_t count)
611  {
612  	struct hid_device *hdev = to_hid_device(dev);
613  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
614  	int value;
615  
616  	if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
617  		return -EINVAL;
618  
619  	cptkbd_data->sensitivity = value;
620  	lenovo_features_set_cptkbd(hdev);
621  
622  	return count;
623  }
624  
attr_middleclick_workaround_show_cptkbd(struct device * dev,struct device_attribute * attr,char * buf)625  static ssize_t attr_middleclick_workaround_show_cptkbd(struct device *dev,
626  		struct device_attribute *attr,
627  		char *buf)
628  {
629  	struct hid_device *hdev = to_hid_device(dev);
630  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
631  
632  	return sysfs_emit(buf, "%u\n",
633  			  cptkbd_data->middleclick_workaround_cptkbd);
634  }
635  
attr_middleclick_workaround_store_cptkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)636  static ssize_t attr_middleclick_workaround_store_cptkbd(struct device *dev,
637  		struct device_attribute *attr,
638  		const char *buf,
639  		size_t count)
640  {
641  	struct hid_device *hdev = to_hid_device(dev);
642  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
643  	int value;
644  
645  	if (kstrtoint(buf, 10, &value))
646  		return -EINVAL;
647  	if (value < 0 || value > 1)
648  		return -EINVAL;
649  
650  	cptkbd_data->middleclick_workaround_cptkbd = !!value;
651  
652  	return count;
653  }
654  
655  
656  static struct device_attribute dev_attr_fn_lock =
657  	__ATTR(fn_lock, S_IWUSR | S_IRUGO,
658  			attr_fn_lock_show,
659  			attr_fn_lock_store);
660  
661  static struct device_attribute dev_attr_sensitivity_cptkbd =
662  	__ATTR(sensitivity, S_IWUSR | S_IRUGO,
663  			attr_sensitivity_show_cptkbd,
664  			attr_sensitivity_store_cptkbd);
665  
666  static struct device_attribute dev_attr_middleclick_workaround_cptkbd =
667  	__ATTR(middleclick_workaround, S_IWUSR | S_IRUGO,
668  			attr_middleclick_workaround_show_cptkbd,
669  			attr_middleclick_workaround_store_cptkbd);
670  
671  
672  static struct attribute *lenovo_attributes_cptkbd[] = {
673  	&dev_attr_fn_lock.attr,
674  	&dev_attr_sensitivity_cptkbd.attr,
675  	&dev_attr_middleclick_workaround_cptkbd.attr,
676  	NULL
677  };
678  
679  static const struct attribute_group lenovo_attr_group_cptkbd = {
680  	.attrs = lenovo_attributes_cptkbd,
681  };
682  
lenovo_raw_event(struct hid_device * hdev,struct hid_report * report,u8 * data,int size)683  static int lenovo_raw_event(struct hid_device *hdev,
684  			struct hid_report *report, u8 *data, int size)
685  {
686  	/*
687  	 * Compact USB keyboard's Fn-F12 report holds down many other keys, and
688  	 * its own key is outside the usage page range. Remove extra
689  	 * keypresses and remap to inside usage page.
690  	 */
691  	if (unlikely(hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD
692  			&& size == 3
693  			&& data[0] == 0x15
694  			&& data[1] == 0x94
695  			&& data[2] == 0x01)) {
696  		data[1] = 0x00;
697  		data[2] = 0x01;
698  	}
699  
700  	return 0;
701  }
702  
lenovo_event_tp10ubkbd(struct hid_device * hdev,struct hid_field * field,struct hid_usage * usage,__s32 value)703  static int lenovo_event_tp10ubkbd(struct hid_device *hdev,
704  		struct hid_field *field, struct hid_usage *usage, __s32 value)
705  {
706  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
707  
708  	if (usage->type == EV_KEY && usage->code == KEY_FN_ESC && value == 1) {
709  		/*
710  		 * The user has toggled the Fn-lock state. Toggle our own
711  		 * cached value of it and sync our value to the keyboard to
712  		 * ensure things are in sync (the sycning should be a no-op).
713  		 */
714  		data->fn_lock = !data->fn_lock;
715  		schedule_work(&data->fn_lock_sync_work);
716  	}
717  
718  	return 0;
719  }
720  
lenovo_event_cptkbd(struct hid_device * hdev,struct hid_field * field,struct hid_usage * usage,__s32 value)721  static int lenovo_event_cptkbd(struct hid_device *hdev,
722  		struct hid_field *field, struct hid_usage *usage, __s32 value)
723  {
724  	struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev);
725  
726  	if (cptkbd_data->middleclick_workaround_cptkbd) {
727  		/* "wheel" scroll events */
728  		if (usage->type == EV_REL && (usage->code == REL_WHEEL ||
729  				usage->code == REL_HWHEEL)) {
730  			/* Scroll events disable middle-click event */
731  			cptkbd_data->middlebutton_state = 2;
732  			return 0;
733  		}
734  
735  		/* Middle click events */
736  		if (usage->type == EV_KEY && usage->code == BTN_MIDDLE) {
737  			if (value == 1) {
738  				cptkbd_data->middlebutton_state = 1;
739  			} else if (value == 0) {
740  				if (cptkbd_data->middlebutton_state == 1) {
741  					/* No scrolling inbetween, send middle-click */
742  					input_event(field->hidinput->input,
743  						EV_KEY, BTN_MIDDLE, 1);
744  					input_sync(field->hidinput->input);
745  					input_event(field->hidinput->input,
746  						EV_KEY, BTN_MIDDLE, 0);
747  					input_sync(field->hidinput->input);
748  				}
749  				cptkbd_data->middlebutton_state = 0;
750  			}
751  			return 1;
752  		}
753  	}
754  
755  	if (usage->type == EV_KEY && usage->code == KEY_FN_ESC && value == 1) {
756  		/*
757  		 * The user has toggled the Fn-lock state. Toggle our own
758  		 * cached value of it and sync our value to the keyboard to
759  		 * ensure things are in sync (the syncing should be a no-op).
760  		 */
761  		cptkbd_data->fn_lock = !cptkbd_data->fn_lock;
762  	}
763  
764  	return 0;
765  }
766  
lenovo_event(struct hid_device * hdev,struct hid_field * field,struct hid_usage * usage,__s32 value)767  static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
768  		struct hid_usage *usage, __s32 value)
769  {
770  	if (!hid_get_drvdata(hdev))
771  		return 0;
772  
773  	switch (hdev->product) {
774  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
775  	case USB_DEVICE_ID_LENOVO_CBTKBD:
776  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
777  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
778  		return lenovo_event_cptkbd(hdev, field, usage, value);
779  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
780  	case USB_DEVICE_ID_LENOVO_X1_TAB:
781  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
782  		return lenovo_event_tp10ubkbd(hdev, field, usage, value);
783  	default:
784  		return 0;
785  	}
786  }
787  
lenovo_features_set_tpkbd(struct hid_device * hdev)788  static int lenovo_features_set_tpkbd(struct hid_device *hdev)
789  {
790  	struct hid_report *report;
791  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
792  
793  	report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[4];
794  
795  	report->field[0]->value[0]  = data_pointer->press_to_select   ? 0x01 : 0x02;
796  	report->field[0]->value[0] |= data_pointer->dragging          ? 0x04 : 0x08;
797  	report->field[0]->value[0] |= data_pointer->release_to_select ? 0x10 : 0x20;
798  	report->field[0]->value[0] |= data_pointer->select_right      ? 0x80 : 0x40;
799  	report->field[1]->value[0] = 0x03; // unknown setting, imitate windows driver
800  	report->field[2]->value[0] = data_pointer->sensitivity;
801  	report->field[3]->value[0] = data_pointer->press_speed;
802  
803  	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
804  	return 0;
805  }
806  
attr_press_to_select_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)807  static ssize_t attr_press_to_select_show_tpkbd(struct device *dev,
808  		struct device_attribute *attr,
809  		char *buf)
810  {
811  	struct hid_device *hdev = to_hid_device(dev);
812  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
813  
814  	return sysfs_emit(buf, "%u\n", data_pointer->press_to_select);
815  }
816  
attr_press_to_select_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)817  static ssize_t attr_press_to_select_store_tpkbd(struct device *dev,
818  		struct device_attribute *attr,
819  		const char *buf,
820  		size_t count)
821  {
822  	struct hid_device *hdev = to_hid_device(dev);
823  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
824  	int value;
825  
826  	if (kstrtoint(buf, 10, &value))
827  		return -EINVAL;
828  	if (value < 0 || value > 1)
829  		return -EINVAL;
830  
831  	data_pointer->press_to_select = value;
832  	lenovo_features_set_tpkbd(hdev);
833  
834  	return count;
835  }
836  
attr_dragging_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)837  static ssize_t attr_dragging_show_tpkbd(struct device *dev,
838  		struct device_attribute *attr,
839  		char *buf)
840  {
841  	struct hid_device *hdev = to_hid_device(dev);
842  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
843  
844  	return sysfs_emit(buf, "%u\n", data_pointer->dragging);
845  }
846  
attr_dragging_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)847  static ssize_t attr_dragging_store_tpkbd(struct device *dev,
848  		struct device_attribute *attr,
849  		const char *buf,
850  		size_t count)
851  {
852  	struct hid_device *hdev = to_hid_device(dev);
853  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
854  	int value;
855  
856  	if (kstrtoint(buf, 10, &value))
857  		return -EINVAL;
858  	if (value < 0 || value > 1)
859  		return -EINVAL;
860  
861  	data_pointer->dragging = value;
862  	lenovo_features_set_tpkbd(hdev);
863  
864  	return count;
865  }
866  
attr_release_to_select_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)867  static ssize_t attr_release_to_select_show_tpkbd(struct device *dev,
868  		struct device_attribute *attr,
869  		char *buf)
870  {
871  	struct hid_device *hdev = to_hid_device(dev);
872  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
873  
874  	return sysfs_emit(buf, "%u\n", data_pointer->release_to_select);
875  }
876  
attr_release_to_select_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)877  static ssize_t attr_release_to_select_store_tpkbd(struct device *dev,
878  		struct device_attribute *attr,
879  		const char *buf,
880  		size_t count)
881  {
882  	struct hid_device *hdev = to_hid_device(dev);
883  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
884  	int value;
885  
886  	if (kstrtoint(buf, 10, &value))
887  		return -EINVAL;
888  	if (value < 0 || value > 1)
889  		return -EINVAL;
890  
891  	data_pointer->release_to_select = value;
892  	lenovo_features_set_tpkbd(hdev);
893  
894  	return count;
895  }
896  
attr_select_right_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)897  static ssize_t attr_select_right_show_tpkbd(struct device *dev,
898  		struct device_attribute *attr,
899  		char *buf)
900  {
901  	struct hid_device *hdev = to_hid_device(dev);
902  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
903  
904  	return sysfs_emit(buf, "%u\n", data_pointer->select_right);
905  }
906  
attr_select_right_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)907  static ssize_t attr_select_right_store_tpkbd(struct device *dev,
908  		struct device_attribute *attr,
909  		const char *buf,
910  		size_t count)
911  {
912  	struct hid_device *hdev = to_hid_device(dev);
913  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
914  	int value;
915  
916  	if (kstrtoint(buf, 10, &value))
917  		return -EINVAL;
918  	if (value < 0 || value > 1)
919  		return -EINVAL;
920  
921  	data_pointer->select_right = value;
922  	lenovo_features_set_tpkbd(hdev);
923  
924  	return count;
925  }
926  
attr_sensitivity_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)927  static ssize_t attr_sensitivity_show_tpkbd(struct device *dev,
928  		struct device_attribute *attr,
929  		char *buf)
930  {
931  	struct hid_device *hdev = to_hid_device(dev);
932  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
933  
934  	return sysfs_emit(buf, "%u\n", data_pointer->sensitivity);
935  }
936  
attr_sensitivity_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)937  static ssize_t attr_sensitivity_store_tpkbd(struct device *dev,
938  		struct device_attribute *attr,
939  		const char *buf,
940  		size_t count)
941  {
942  	struct hid_device *hdev = to_hid_device(dev);
943  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
944  	int value;
945  
946  	if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
947  		return -EINVAL;
948  
949  	data_pointer->sensitivity = value;
950  	lenovo_features_set_tpkbd(hdev);
951  
952  	return count;
953  }
954  
attr_press_speed_show_tpkbd(struct device * dev,struct device_attribute * attr,char * buf)955  static ssize_t attr_press_speed_show_tpkbd(struct device *dev,
956  		struct device_attribute *attr,
957  		char *buf)
958  {
959  	struct hid_device *hdev = to_hid_device(dev);
960  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
961  
962  	return sysfs_emit(buf, "%u\n", data_pointer->press_speed);
963  }
964  
attr_press_speed_store_tpkbd(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)965  static ssize_t attr_press_speed_store_tpkbd(struct device *dev,
966  		struct device_attribute *attr,
967  		const char *buf,
968  		size_t count)
969  {
970  	struct hid_device *hdev = to_hid_device(dev);
971  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
972  	int value;
973  
974  	if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
975  		return -EINVAL;
976  
977  	data_pointer->press_speed = value;
978  	lenovo_features_set_tpkbd(hdev);
979  
980  	return count;
981  }
982  
983  static struct device_attribute dev_attr_press_to_select_tpkbd =
984  	__ATTR(press_to_select, S_IWUSR | S_IRUGO,
985  			attr_press_to_select_show_tpkbd,
986  			attr_press_to_select_store_tpkbd);
987  
988  static struct device_attribute dev_attr_dragging_tpkbd =
989  	__ATTR(dragging, S_IWUSR | S_IRUGO,
990  			attr_dragging_show_tpkbd,
991  			attr_dragging_store_tpkbd);
992  
993  static struct device_attribute dev_attr_release_to_select_tpkbd =
994  	__ATTR(release_to_select, S_IWUSR | S_IRUGO,
995  			attr_release_to_select_show_tpkbd,
996  			attr_release_to_select_store_tpkbd);
997  
998  static struct device_attribute dev_attr_select_right_tpkbd =
999  	__ATTR(select_right, S_IWUSR | S_IRUGO,
1000  			attr_select_right_show_tpkbd,
1001  			attr_select_right_store_tpkbd);
1002  
1003  static struct device_attribute dev_attr_sensitivity_tpkbd =
1004  	__ATTR(sensitivity, S_IWUSR | S_IRUGO,
1005  			attr_sensitivity_show_tpkbd,
1006  			attr_sensitivity_store_tpkbd);
1007  
1008  static struct device_attribute dev_attr_press_speed_tpkbd =
1009  	__ATTR(press_speed, S_IWUSR | S_IRUGO,
1010  			attr_press_speed_show_tpkbd,
1011  			attr_press_speed_store_tpkbd);
1012  
1013  static struct attribute *lenovo_attributes_tpkbd[] = {
1014  	&dev_attr_press_to_select_tpkbd.attr,
1015  	&dev_attr_dragging_tpkbd.attr,
1016  	&dev_attr_release_to_select_tpkbd.attr,
1017  	&dev_attr_select_right_tpkbd.attr,
1018  	&dev_attr_sensitivity_tpkbd.attr,
1019  	&dev_attr_press_speed_tpkbd.attr,
1020  	NULL
1021  };
1022  
1023  static const struct attribute_group lenovo_attr_group_tpkbd = {
1024  	.attrs = lenovo_attributes_tpkbd,
1025  };
1026  
lenovo_led_set_tpkbd(struct hid_device * hdev)1027  static void lenovo_led_set_tpkbd(struct hid_device *hdev)
1028  {
1029  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
1030  	struct hid_report *report;
1031  
1032  	report = hdev->report_enum[HID_OUTPUT_REPORT].report_id_hash[3];
1033  	report->field[0]->value[0] = (data_pointer->led_state >> 0) & 1;
1034  	report->field[0]->value[1] = (data_pointer->led_state >> 1) & 1;
1035  	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1036  }
1037  
lenovo_led_brightness_set(struct led_classdev * led_cdev,enum led_brightness value)1038  static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
1039  			enum led_brightness value)
1040  {
1041  	struct device *dev = led_cdev->dev->parent;
1042  	struct hid_device *hdev = to_hid_device(dev);
1043  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
1044  	static const u8 tp10ubkbd_led[] = { TP10UBKBD_MUTE_LED, TP10UBKBD_MICMUTE_LED };
1045  	int led_nr = 0;
1046  	int ret = 0;
1047  
1048  	if (led_cdev == &data_pointer->led_micmute)
1049  		led_nr = 1;
1050  
1051  	if (value == LED_OFF)
1052  		data_pointer->led_state &= ~(1 << led_nr);
1053  	else
1054  		data_pointer->led_state |= 1 << led_nr;
1055  
1056  	switch (hdev->product) {
1057  	case USB_DEVICE_ID_LENOVO_TPKBD:
1058  		lenovo_led_set_tpkbd(hdev);
1059  		break;
1060  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
1061  	case USB_DEVICE_ID_LENOVO_X1_TAB:
1062  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
1063  		ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
1064  		break;
1065  	}
1066  
1067  	return ret;
1068  }
1069  
lenovo_register_leds(struct hid_device * hdev)1070  static int lenovo_register_leds(struct hid_device *hdev)
1071  {
1072  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
1073  	size_t name_sz = strlen(dev_name(&hdev->dev)) + 16;
1074  	char *name_mute, *name_micm;
1075  	int ret;
1076  
1077  	name_mute = devm_kzalloc(&hdev->dev, name_sz, GFP_KERNEL);
1078  	name_micm = devm_kzalloc(&hdev->dev, name_sz, GFP_KERNEL);
1079  	if (name_mute == NULL || name_micm == NULL) {
1080  		hid_err(hdev, "Could not allocate memory for led data\n");
1081  		return -ENOMEM;
1082  	}
1083  	snprintf(name_mute, name_sz, "%s:amber:mute", dev_name(&hdev->dev));
1084  	snprintf(name_micm, name_sz, "%s:amber:micmute", dev_name(&hdev->dev));
1085  
1086  	data->led_mute.name = name_mute;
1087  	data->led_mute.default_trigger = "audio-mute";
1088  	data->led_mute.brightness_set_blocking = lenovo_led_brightness_set;
1089  	data->led_mute.max_brightness = 1;
1090  	data->led_mute.flags = LED_HW_PLUGGABLE;
1091  	data->led_mute.dev = &hdev->dev;
1092  	ret = led_classdev_register(&hdev->dev, &data->led_mute);
1093  	if (ret < 0)
1094  		return ret;
1095  
1096  	data->led_micmute.name = name_micm;
1097  	data->led_micmute.default_trigger = "audio-micmute";
1098  	data->led_micmute.brightness_set_blocking = lenovo_led_brightness_set;
1099  	data->led_micmute.max_brightness = 1;
1100  	data->led_micmute.flags = LED_HW_PLUGGABLE;
1101  	data->led_micmute.dev = &hdev->dev;
1102  	ret = led_classdev_register(&hdev->dev, &data->led_micmute);
1103  	if (ret < 0) {
1104  		led_classdev_unregister(&data->led_mute);
1105  		return ret;
1106  	}
1107  
1108  	return 0;
1109  }
1110  
lenovo_probe_tpkbd(struct hid_device * hdev)1111  static int lenovo_probe_tpkbd(struct hid_device *hdev)
1112  {
1113  	struct lenovo_drvdata *data_pointer;
1114  	int i, ret;
1115  
1116  	/*
1117  	 * Only register extra settings against subdevice where input_mapping
1118  	 * set drvdata to 1, i.e. the trackpoint.
1119  	 */
1120  	if (!hid_get_drvdata(hdev))
1121  		return 0;
1122  
1123  	hid_set_drvdata(hdev, NULL);
1124  
1125  	/* Validate required reports. */
1126  	for (i = 0; i < 4; i++) {
1127  		if (!hid_validate_values(hdev, HID_FEATURE_REPORT, 4, i, 1))
1128  			return -ENODEV;
1129  	}
1130  	if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 3, 0, 2))
1131  		return -ENODEV;
1132  
1133  	ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_tpkbd);
1134  	if (ret)
1135  		hid_warn(hdev, "Could not create sysfs group: %d\n", ret);
1136  
1137  	data_pointer = devm_kzalloc(&hdev->dev,
1138  				    sizeof(struct lenovo_drvdata),
1139  				    GFP_KERNEL);
1140  	if (data_pointer == NULL) {
1141  		hid_err(hdev, "Could not allocate memory for driver data\n");
1142  		ret = -ENOMEM;
1143  		goto err;
1144  	}
1145  
1146  	// set same default values as windows driver
1147  	data_pointer->sensitivity = 0xa0;
1148  	data_pointer->press_speed = 0x38;
1149  
1150  	hid_set_drvdata(hdev, data_pointer);
1151  
1152  	ret = lenovo_register_leds(hdev);
1153  	if (ret)
1154  		goto err;
1155  
1156  	lenovo_features_set_tpkbd(hdev);
1157  
1158  	return 0;
1159  err:
1160  	sysfs_remove_group(&hdev->dev.kobj, &lenovo_attr_group_tpkbd);
1161  	return ret;
1162  }
1163  
lenovo_probe_cptkbd(struct hid_device * hdev)1164  static int lenovo_probe_cptkbd(struct hid_device *hdev)
1165  {
1166  	int ret;
1167  	struct lenovo_drvdata *cptkbd_data;
1168  
1169  	/* All the custom action happens on the USBMOUSE device for USB */
1170  	if (((hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD) ||
1171  	    (hdev->product == USB_DEVICE_ID_LENOVO_TPIIUSBKBD)) &&
1172  	    hdev->type != HID_TYPE_USBMOUSE) {
1173  		hid_dbg(hdev, "Ignoring keyboard half of device\n");
1174  		return 0;
1175  	}
1176  
1177  	cptkbd_data = devm_kzalloc(&hdev->dev,
1178  					sizeof(*cptkbd_data),
1179  					GFP_KERNEL);
1180  	if (cptkbd_data == NULL) {
1181  		hid_err(hdev, "can't alloc keyboard descriptor\n");
1182  		return -ENOMEM;
1183  	}
1184  	hid_set_drvdata(hdev, cptkbd_data);
1185  
1186  	/* Set keyboard settings to known state */
1187  	cptkbd_data->middlebutton_state = 0;
1188  	cptkbd_data->fn_lock = true;
1189  	cptkbd_data->sensitivity = 0x05;
1190  	cptkbd_data->middleclick_workaround_cptkbd = true;
1191  	lenovo_features_set_cptkbd(hdev);
1192  
1193  	ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd);
1194  	if (ret)
1195  		hid_warn(hdev, "Could not create sysfs group: %d\n", ret);
1196  
1197  	return 0;
1198  }
1199  
1200  static struct attribute *lenovo_attributes_tp10ubkbd[] = {
1201  	&dev_attr_fn_lock.attr,
1202  	NULL
1203  };
1204  
1205  static const struct attribute_group lenovo_attr_group_tp10ubkbd = {
1206  	.attrs = lenovo_attributes_tp10ubkbd,
1207  };
1208  
lenovo_probe_tp10ubkbd(struct hid_device * hdev)1209  static int lenovo_probe_tp10ubkbd(struct hid_device *hdev)
1210  {
1211  	struct hid_report_enum *rep_enum;
1212  	struct lenovo_drvdata *data;
1213  	struct hid_report *rep;
1214  	bool found;
1215  	int ret;
1216  
1217  	/*
1218  	 * The LEDs and the Fn-lock functionality use output report 9,
1219  	 * with an application of 0xffa0001, add the LEDs on the interface
1220  	 * with this output report.
1221  	 */
1222  	found = false;
1223  	rep_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
1224  	list_for_each_entry(rep, &rep_enum->report_list, list) {
1225  		if (rep->application == 0xffa00001)
1226  			found = true;
1227  	}
1228  	if (!found)
1229  		return 0;
1230  
1231  	data = devm_kzalloc(&hdev->dev, sizeof(*data), GFP_KERNEL);
1232  	if (!data)
1233  		return -ENOMEM;
1234  
1235  	mutex_init(&data->led_report_mutex);
1236  	INIT_WORK(&data->fn_lock_sync_work, lenovo_tp10ubkbd_sync_fn_lock);
1237  	data->hdev = hdev;
1238  
1239  	hid_set_drvdata(hdev, data);
1240  
1241  	/*
1242  	 * The Thinkpad 10 ultrabook USB kbd dock's Fn-lock defaults to on.
1243  	 * We cannot read the state, only set it, so we force it to on here
1244  	 * (which should be a no-op) to make sure that our state matches the
1245  	 * keyboard's FN-lock state. This is the same as what Windows does.
1246  	 */
1247  	data->fn_lock = true;
1248  	lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, data->fn_lock);
1249  
1250  	ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_tp10ubkbd);
1251  	if (ret)
1252  		return ret;
1253  
1254  	ret = lenovo_register_leds(hdev);
1255  	if (ret)
1256  		goto err;
1257  
1258  	return 0;
1259  err:
1260  	sysfs_remove_group(&hdev->dev.kobj, &lenovo_attr_group_tp10ubkbd);
1261  	return ret;
1262  }
1263  
lenovo_probe(struct hid_device * hdev,const struct hid_device_id * id)1264  static int lenovo_probe(struct hid_device *hdev,
1265  		const struct hid_device_id *id)
1266  {
1267  	int ret;
1268  
1269  	ret = hid_parse(hdev);
1270  	if (ret) {
1271  		hid_err(hdev, "hid_parse failed\n");
1272  		goto err;
1273  	}
1274  
1275  	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1276  	if (ret) {
1277  		hid_err(hdev, "hid_hw_start failed\n");
1278  		goto err;
1279  	}
1280  
1281  	switch (hdev->product) {
1282  	case USB_DEVICE_ID_LENOVO_TPKBD:
1283  		ret = lenovo_probe_tpkbd(hdev);
1284  		break;
1285  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
1286  	case USB_DEVICE_ID_LENOVO_CBTKBD:
1287  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
1288  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
1289  		ret = lenovo_probe_cptkbd(hdev);
1290  		break;
1291  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
1292  	case USB_DEVICE_ID_LENOVO_X1_TAB:
1293  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
1294  		ret = lenovo_probe_tp10ubkbd(hdev);
1295  		break;
1296  	default:
1297  		ret = 0;
1298  		break;
1299  	}
1300  	if (ret)
1301  		goto err_hid;
1302  
1303  	return 0;
1304  err_hid:
1305  	hid_hw_stop(hdev);
1306  err:
1307  	return ret;
1308  }
1309  
1310  #ifdef CONFIG_PM
lenovo_reset_resume(struct hid_device * hdev)1311  static int lenovo_reset_resume(struct hid_device *hdev)
1312  {
1313  	switch (hdev->product) {
1314  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
1315  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
1316  		if (hdev->type == HID_TYPE_USBMOUSE)
1317  			lenovo_features_set_cptkbd(hdev);
1318  
1319  		break;
1320  	default:
1321  		break;
1322  	}
1323  
1324  	return 0;
1325  }
1326  #endif
1327  
lenovo_remove_tpkbd(struct hid_device * hdev)1328  static void lenovo_remove_tpkbd(struct hid_device *hdev)
1329  {
1330  	struct lenovo_drvdata *data_pointer = hid_get_drvdata(hdev);
1331  
1332  	/*
1333  	 * Only the trackpoint half of the keyboard has drvdata and stuff that
1334  	 * needs unregistering.
1335  	 */
1336  	if (data_pointer == NULL)
1337  		return;
1338  
1339  	sysfs_remove_group(&hdev->dev.kobj,
1340  			&lenovo_attr_group_tpkbd);
1341  
1342  	led_classdev_unregister(&data_pointer->led_micmute);
1343  	led_classdev_unregister(&data_pointer->led_mute);
1344  }
1345  
lenovo_remove_cptkbd(struct hid_device * hdev)1346  static void lenovo_remove_cptkbd(struct hid_device *hdev)
1347  {
1348  	sysfs_remove_group(&hdev->dev.kobj,
1349  			&lenovo_attr_group_cptkbd);
1350  }
1351  
lenovo_remove_tp10ubkbd(struct hid_device * hdev)1352  static void lenovo_remove_tp10ubkbd(struct hid_device *hdev)
1353  {
1354  	struct lenovo_drvdata *data = hid_get_drvdata(hdev);
1355  
1356  	if (data == NULL)
1357  		return;
1358  
1359  	led_classdev_unregister(&data->led_micmute);
1360  	led_classdev_unregister(&data->led_mute);
1361  
1362  	sysfs_remove_group(&hdev->dev.kobj, &lenovo_attr_group_tp10ubkbd);
1363  	cancel_work_sync(&data->fn_lock_sync_work);
1364  }
1365  
lenovo_remove(struct hid_device * hdev)1366  static void lenovo_remove(struct hid_device *hdev)
1367  {
1368  	switch (hdev->product) {
1369  	case USB_DEVICE_ID_LENOVO_TPKBD:
1370  		lenovo_remove_tpkbd(hdev);
1371  		break;
1372  	case USB_DEVICE_ID_LENOVO_CUSBKBD:
1373  	case USB_DEVICE_ID_LENOVO_CBTKBD:
1374  	case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
1375  	case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
1376  		lenovo_remove_cptkbd(hdev);
1377  		break;
1378  	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
1379  	case USB_DEVICE_ID_LENOVO_X1_TAB:
1380  	case USB_DEVICE_ID_LENOVO_X1_TAB3:
1381  		lenovo_remove_tp10ubkbd(hdev);
1382  		break;
1383  	}
1384  
1385  	hid_hw_stop(hdev);
1386  }
1387  
lenovo_input_configured(struct hid_device * hdev,struct hid_input * hi)1388  static int lenovo_input_configured(struct hid_device *hdev,
1389  		struct hid_input *hi)
1390  {
1391  	switch (hdev->product) {
1392  		case USB_DEVICE_ID_LENOVO_TPKBD:
1393  		case USB_DEVICE_ID_LENOVO_CUSBKBD:
1394  		case USB_DEVICE_ID_LENOVO_CBTKBD:
1395  		case USB_DEVICE_ID_LENOVO_TPIIUSBKBD:
1396  		case USB_DEVICE_ID_LENOVO_TPIIBTKBD:
1397  			if (test_bit(EV_REL, hi->input->evbit)) {
1398  				/* set only for trackpoint device */
1399  				__set_bit(INPUT_PROP_POINTER, hi->input->propbit);
1400  				__set_bit(INPUT_PROP_POINTING_STICK,
1401  						hi->input->propbit);
1402  			}
1403  			break;
1404  	}
1405  
1406  	return 0;
1407  }
1408  
1409  
1410  static const struct hid_device_id lenovo_devices[] = {
1411  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
1412  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
1413  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPIIUSBKBD) },
1414  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
1415  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPIIBTKBD) },
1416  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPPRODOCK) },
1417  	{ HID_USB_DEVICE(USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_SCROLLPOINT_III) },
1418  	{ HID_USB_DEVICE(USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_SCROLLPOINT_PRO) },
1419  	{ HID_USB_DEVICE(USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_SCROLLPOINT_OPTICAL) },
1420  	{ HID_USB_DEVICE(USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL) },
1421  	{ HID_USB_DEVICE(USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL_PRO) },
1422  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL) },
1423  	{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TP10UBKBD) },
1424  	/*
1425  	 * Note bind to the HID_GROUP_GENERIC group, so that we only bind to the keyboard
1426  	 * part, while letting hid-multitouch.c handle the touchpad and trackpoint.
1427  	 */
1428  	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
1429  		     USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
1430  	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
1431  		     USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) },
1432  	{ }
1433  };
1434  
1435  MODULE_DEVICE_TABLE(hid, lenovo_devices);
1436  
1437  static struct hid_driver lenovo_driver = {
1438  	.name = "lenovo",
1439  	.id_table = lenovo_devices,
1440  	.input_configured = lenovo_input_configured,
1441  	.input_mapping = lenovo_input_mapping,
1442  	.probe = lenovo_probe,
1443  	.remove = lenovo_remove,
1444  	.raw_event = lenovo_raw_event,
1445  	.event = lenovo_event,
1446  	.report_fixup = lenovo_report_fixup,
1447  #ifdef CONFIG_PM
1448  	.reset_resume = lenovo_reset_resume,
1449  #endif
1450  };
1451  module_hid_driver(lenovo_driver);
1452  
1453  MODULE_DESCRIPTION("HID driver for IBM/Lenovo");
1454  MODULE_LICENSE("GPL");
1455