1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  HIDPP protocol for Logitech receivers
4  *
5  *  Copyright (c) 2011 Logitech (c)
6  *  Copyright (c) 2012-2013 Google (c)
7  *  Copyright (c) 2013-2014 Red Hat Inc.
8  */
9 
10 
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12 
13 #include <linux/device.h>
14 #include <linux/input.h>
15 #include <linux/usb.h>
16 #include <linux/hid.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/sched.h>
20 #include <linux/sched/clock.h>
21 #include <linux/kfifo.h>
22 #include <linux/input/mt.h>
23 #include <linux/workqueue.h>
24 #include <linux/atomic.h>
25 #include <linux/fixp-arith.h>
26 #include <asm/unaligned.h>
27 #include "usbhid/usbhid.h"
28 #include "hid-ids.h"
29 
30 MODULE_LICENSE("GPL");
31 MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
32 MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
33 
34 static bool disable_raw_mode;
35 module_param(disable_raw_mode, bool, 0644);
36 MODULE_PARM_DESC(disable_raw_mode,
37 	"Disable Raw mode reporting for touchpads and keep firmware gestures.");
38 
39 static bool disable_tap_to_click;
40 module_param(disable_tap_to_click, bool, 0644);
41 MODULE_PARM_DESC(disable_tap_to_click,
42 	"Disable Tap-To-Click mode reporting for touchpads (only on the K400 currently).");
43 
44 #define REPORT_ID_HIDPP_SHORT			0x10
45 #define REPORT_ID_HIDPP_LONG			0x11
46 #define REPORT_ID_HIDPP_VERY_LONG		0x12
47 
48 #define HIDPP_REPORT_SHORT_LENGTH		7
49 #define HIDPP_REPORT_LONG_LENGTH		20
50 #define HIDPP_REPORT_VERY_LONG_MAX_LENGTH	64
51 
52 #define HIDPP_REPORT_SHORT_SUPPORTED		BIT(0)
53 #define HIDPP_REPORT_LONG_SUPPORTED		BIT(1)
54 #define HIDPP_REPORT_VERY_LONG_SUPPORTED	BIT(2)
55 
56 #define HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS	0x03
57 #define HIDPP_SUB_ID_ROLLER			0x05
58 #define HIDPP_SUB_ID_MOUSE_EXTRA_BTNS		0x06
59 #define HIDPP_SUB_ID_USER_IFACE_EVENT		0x08
60 #define HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST	BIT(5)
61 
62 #define HIDPP_QUIRK_CLASS_WTP			BIT(0)
63 #define HIDPP_QUIRK_CLASS_M560			BIT(1)
64 #define HIDPP_QUIRK_CLASS_K400			BIT(2)
65 #define HIDPP_QUIRK_CLASS_G920			BIT(3)
66 #define HIDPP_QUIRK_CLASS_K750			BIT(4)
67 
68 /* bits 2..20 are reserved for classes */
69 /* #define HIDPP_QUIRK_CONNECT_EVENTS		BIT(21) disabled */
70 #define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS	BIT(22)
71 #define HIDPP_QUIRK_NO_HIDINPUT			BIT(23)
72 #define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS	BIT(24)
73 #define HIDPP_QUIRK_UNIFYING			BIT(25)
74 #define HIDPP_QUIRK_HI_RES_SCROLL_1P0		BIT(26)
75 #define HIDPP_QUIRK_HI_RES_SCROLL_X2120		BIT(27)
76 #define HIDPP_QUIRK_HI_RES_SCROLL_X2121		BIT(28)
77 #define HIDPP_QUIRK_HIDPP_WHEELS		BIT(29)
78 #define HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS	BIT(30)
79 #define HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS	BIT(31)
80 
81 /* These are just aliases for now */
82 #define HIDPP_QUIRK_KBD_SCROLL_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
83 #define HIDPP_QUIRK_KBD_ZOOM_WHEEL   HIDPP_QUIRK_HIDPP_WHEELS
84 
85 /* Convenience constant to check for any high-res support. */
86 #define HIDPP_QUIRK_HI_RES_SCROLL	(HIDPP_QUIRK_HI_RES_SCROLL_1P0 | \
87 					 HIDPP_QUIRK_HI_RES_SCROLL_X2120 | \
88 					 HIDPP_QUIRK_HI_RES_SCROLL_X2121)
89 
90 #define HIDPP_QUIRK_DELAYED_INIT		HIDPP_QUIRK_NO_HIDINPUT
91 
92 #define HIDPP_CAPABILITY_HIDPP10_BATTERY	BIT(0)
93 #define HIDPP_CAPABILITY_HIDPP20_BATTERY	BIT(1)
94 #define HIDPP_CAPABILITY_BATTERY_MILEAGE	BIT(2)
95 #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS	BIT(3)
96 #define HIDPP_CAPABILITY_BATTERY_VOLTAGE	BIT(4)
97 #define HIDPP_CAPABILITY_BATTERY_PERCENTAGE	BIT(5)
98 #define HIDPP_CAPABILITY_UNIFIED_BATTERY	BIT(6)
99 
100 #define lg_map_key_clear(c)  hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
101 
102 /*
103  * There are two hidpp protocols in use, the first version hidpp10 is known
104  * as register access protocol or RAP, the second version hidpp20 is known as
105  * feature access protocol or FAP
106  *
107  * Most older devices (including the Unifying usb receiver) use the RAP protocol
108  * where as most newer devices use the FAP protocol. Both protocols are
109  * compatible with the underlying transport, which could be usb, Unifiying, or
110  * bluetooth. The message lengths are defined by the hid vendor specific report
111  * descriptor for the HIDPP_SHORT report type (total message lenth 7 bytes) and
112  * the HIDPP_LONG report type (total message length 20 bytes)
113  *
114  * The RAP protocol uses both report types, whereas the FAP only uses HIDPP_LONG
115  * messages. The Unifying receiver itself responds to RAP messages (device index
116  * is 0xFF for the receiver), and all messages (short or long) with a device
117  * index between 1 and 6 are passed untouched to the corresponding paired
118  * Unifying device.
119  *
120  * The paired device can be RAP or FAP, it will receive the message untouched
121  * from the Unifiying receiver.
122  */
123 
124 struct fap {
125 	u8 feature_index;
126 	u8 funcindex_clientid;
127 	u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
128 };
129 
130 struct rap {
131 	u8 sub_id;
132 	u8 reg_address;
133 	u8 params[HIDPP_REPORT_VERY_LONG_MAX_LENGTH - 4U];
134 };
135 
136 struct hidpp_report {
137 	u8 report_id;
138 	u8 device_index;
139 	union {
140 		struct fap fap;
141 		struct rap rap;
142 		u8 rawbytes[sizeof(struct fap)];
143 	};
144 } __packed;
145 
146 struct hidpp_battery {
147 	u8 feature_index;
148 	u8 solar_feature_index;
149 	u8 voltage_feature_index;
150 	struct power_supply_desc desc;
151 	struct power_supply *ps;
152 	char name[64];
153 	int status;
154 	int capacity;
155 	int level;
156 	int voltage;
157 	int charge_type;
158 	bool online;
159 	u8 supported_levels_1004;
160 };
161 
162 /**
163  * struct hidpp_scroll_counter - Utility class for processing high-resolution
164  *                             scroll events.
165  * @dev: the input device for which events should be reported.
166  * @wheel_multiplier: the scalar multiplier to be applied to each wheel event
167  * @remainder: counts the number of high-resolution units moved since the last
168  *             low-resolution event (REL_WHEEL or REL_HWHEEL) was sent. Should
169  *             only be used by class methods.
170  * @direction: direction of last movement (1 or -1)
171  * @last_time: last event time, used to reset remainder after inactivity
172  */
173 struct hidpp_scroll_counter {
174 	int wheel_multiplier;
175 	int remainder;
176 	int direction;
177 	unsigned long long last_time;
178 };
179 
180 struct hidpp_device {
181 	struct hid_device *hid_dev;
182 	struct input_dev *input;
183 	struct mutex send_mutex;
184 	void *send_receive_buf;
185 	char *name;		/* will never be NULL and should not be freed */
186 	wait_queue_head_t wait;
187 	int very_long_report_length;
188 	bool answer_available;
189 	u8 protocol_major;
190 	u8 protocol_minor;
191 
192 	void *private_data;
193 
194 	struct work_struct work;
195 	struct kfifo delayed_work_fifo;
196 	atomic_t connected;
197 	struct input_dev *delayed_input;
198 
199 	unsigned long quirks;
200 	unsigned long capabilities;
201 	u8 supported_reports;
202 
203 	struct hidpp_battery battery;
204 	struct hidpp_scroll_counter vertical_wheel_counter;
205 
206 	u8 wireless_feature_index;
207 };
208 
209 /* HID++ 1.0 error codes */
210 #define HIDPP_ERROR				0x8f
211 #define HIDPP_ERROR_SUCCESS			0x00
212 #define HIDPP_ERROR_INVALID_SUBID		0x01
213 #define HIDPP_ERROR_INVALID_ADRESS		0x02
214 #define HIDPP_ERROR_INVALID_VALUE		0x03
215 #define HIDPP_ERROR_CONNECT_FAIL		0x04
216 #define HIDPP_ERROR_TOO_MANY_DEVICES		0x05
217 #define HIDPP_ERROR_ALREADY_EXISTS		0x06
218 #define HIDPP_ERROR_BUSY			0x07
219 #define HIDPP_ERROR_UNKNOWN_DEVICE		0x08
220 #define HIDPP_ERROR_RESOURCE_ERROR		0x09
221 #define HIDPP_ERROR_REQUEST_UNAVAILABLE		0x0a
222 #define HIDPP_ERROR_INVALID_PARAM_VALUE		0x0b
223 #define HIDPP_ERROR_WRONG_PIN_CODE		0x0c
224 /* HID++ 2.0 error codes */
225 #define HIDPP20_ERROR				0xff
226 
227 static void hidpp_connect_event(struct hidpp_device *hidpp_dev);
228 
__hidpp_send_report(struct hid_device * hdev,struct hidpp_report * hidpp_report)229 static int __hidpp_send_report(struct hid_device *hdev,
230 				struct hidpp_report *hidpp_report)
231 {
232 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
233 	int fields_count, ret;
234 
235 	switch (hidpp_report->report_id) {
236 	case REPORT_ID_HIDPP_SHORT:
237 		fields_count = HIDPP_REPORT_SHORT_LENGTH;
238 		break;
239 	case REPORT_ID_HIDPP_LONG:
240 		fields_count = HIDPP_REPORT_LONG_LENGTH;
241 		break;
242 	case REPORT_ID_HIDPP_VERY_LONG:
243 		fields_count = hidpp->very_long_report_length;
244 		break;
245 	default:
246 		return -ENODEV;
247 	}
248 
249 	/*
250 	 * set the device_index as the receiver, it will be overwritten by
251 	 * hid_hw_request if needed
252 	 */
253 	hidpp_report->device_index = 0xff;
254 
255 	if (hidpp->quirks & HIDPP_QUIRK_FORCE_OUTPUT_REPORTS) {
256 		ret = hid_hw_output_report(hdev, (u8 *)hidpp_report, fields_count);
257 	} else {
258 		ret = hid_hw_raw_request(hdev, hidpp_report->report_id,
259 			(u8 *)hidpp_report, fields_count, HID_OUTPUT_REPORT,
260 			HID_REQ_SET_REPORT);
261 	}
262 
263 	return ret == fields_count ? 0 : -1;
264 }
265 
266 /*
267  * hidpp_send_message_sync() returns 0 in case of success, and something else
268  * in case of a failure.
269  * - If ' something else' is positive, that means that an error has been raised
270  *   by the protocol itself.
271  * - If ' something else' is negative, that means that we had a classic error
272  *   (-ENOMEM, -EPIPE, etc...)
273  */
hidpp_send_message_sync(struct hidpp_device * hidpp,struct hidpp_report * message,struct hidpp_report * response)274 static int hidpp_send_message_sync(struct hidpp_device *hidpp,
275 	struct hidpp_report *message,
276 	struct hidpp_report *response)
277 {
278 	int ret;
279 
280 	mutex_lock(&hidpp->send_mutex);
281 
282 	hidpp->send_receive_buf = response;
283 	hidpp->answer_available = false;
284 
285 	/*
286 	 * So that we can later validate the answer when it arrives
287 	 * in hidpp_raw_event
288 	 */
289 	*response = *message;
290 
291 	ret = __hidpp_send_report(hidpp->hid_dev, message);
292 
293 	if (ret) {
294 		dbg_hid("__hidpp_send_report returned err: %d\n", ret);
295 		memset(response, 0, sizeof(struct hidpp_report));
296 		goto exit;
297 	}
298 
299 	if (!wait_event_timeout(hidpp->wait, hidpp->answer_available,
300 				5*HZ)) {
301 		dbg_hid("%s:timeout waiting for response\n", __func__);
302 		memset(response, 0, sizeof(struct hidpp_report));
303 		ret = -ETIMEDOUT;
304 	}
305 
306 	if (response->report_id == REPORT_ID_HIDPP_SHORT &&
307 	    response->rap.sub_id == HIDPP_ERROR) {
308 		ret = response->rap.params[1];
309 		dbg_hid("%s:got hidpp error %02X\n", __func__, ret);
310 		goto exit;
311 	}
312 
313 	if ((response->report_id == REPORT_ID_HIDPP_LONG ||
314 			response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
315 			response->fap.feature_index == HIDPP20_ERROR) {
316 		ret = response->fap.params[1];
317 		dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
318 		goto exit;
319 	}
320 
321 exit:
322 	mutex_unlock(&hidpp->send_mutex);
323 	return ret;
324 
325 }
326 
hidpp_send_fap_command_sync(struct hidpp_device * hidpp,u8 feat_index,u8 funcindex_clientid,u8 * params,int param_count,struct hidpp_report * response)327 static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
328 	u8 feat_index, u8 funcindex_clientid, u8 *params, int param_count,
329 	struct hidpp_report *response)
330 {
331 	struct hidpp_report *message;
332 	int ret;
333 
334 	if (param_count > sizeof(message->fap.params))
335 		return -EINVAL;
336 
337 	message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
338 	if (!message)
339 		return -ENOMEM;
340 
341 	if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
342 		message->report_id = REPORT_ID_HIDPP_VERY_LONG;
343 	else
344 		message->report_id = REPORT_ID_HIDPP_LONG;
345 	message->fap.feature_index = feat_index;
346 	message->fap.funcindex_clientid = funcindex_clientid;
347 	memcpy(&message->fap.params, params, param_count);
348 
349 	ret = hidpp_send_message_sync(hidpp, message, response);
350 	kfree(message);
351 	return ret;
352 }
353 
hidpp_send_rap_command_sync(struct hidpp_device * hidpp_dev,u8 report_id,u8 sub_id,u8 reg_address,u8 * params,int param_count,struct hidpp_report * response)354 static int hidpp_send_rap_command_sync(struct hidpp_device *hidpp_dev,
355 	u8 report_id, u8 sub_id, u8 reg_address, u8 *params, int param_count,
356 	struct hidpp_report *response)
357 {
358 	struct hidpp_report *message;
359 	int ret, max_count;
360 
361 	/* Send as long report if short reports are not supported. */
362 	if (report_id == REPORT_ID_HIDPP_SHORT &&
363 	    !(hidpp_dev->supported_reports & HIDPP_REPORT_SHORT_SUPPORTED))
364 		report_id = REPORT_ID_HIDPP_LONG;
365 
366 	switch (report_id) {
367 	case REPORT_ID_HIDPP_SHORT:
368 		max_count = HIDPP_REPORT_SHORT_LENGTH - 4;
369 		break;
370 	case REPORT_ID_HIDPP_LONG:
371 		max_count = HIDPP_REPORT_LONG_LENGTH - 4;
372 		break;
373 	case REPORT_ID_HIDPP_VERY_LONG:
374 		max_count = hidpp_dev->very_long_report_length - 4;
375 		break;
376 	default:
377 		return -EINVAL;
378 	}
379 
380 	if (param_count > max_count)
381 		return -EINVAL;
382 
383 	message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
384 	if (!message)
385 		return -ENOMEM;
386 	message->report_id = report_id;
387 	message->rap.sub_id = sub_id;
388 	message->rap.reg_address = reg_address;
389 	memcpy(&message->rap.params, params, param_count);
390 
391 	ret = hidpp_send_message_sync(hidpp_dev, message, response);
392 	kfree(message);
393 	return ret;
394 }
395 
delayed_work_cb(struct work_struct * work)396 static void delayed_work_cb(struct work_struct *work)
397 {
398 	struct hidpp_device *hidpp = container_of(work, struct hidpp_device,
399 							work);
400 	hidpp_connect_event(hidpp);
401 }
402 
hidpp_match_answer(struct hidpp_report * question,struct hidpp_report * answer)403 static inline bool hidpp_match_answer(struct hidpp_report *question,
404 		struct hidpp_report *answer)
405 {
406 	return (answer->fap.feature_index == question->fap.feature_index) &&
407 	   (answer->fap.funcindex_clientid == question->fap.funcindex_clientid);
408 }
409 
hidpp_match_error(struct hidpp_report * question,struct hidpp_report * answer)410 static inline bool hidpp_match_error(struct hidpp_report *question,
411 		struct hidpp_report *answer)
412 {
413 	return ((answer->rap.sub_id == HIDPP_ERROR) ||
414 	    (answer->fap.feature_index == HIDPP20_ERROR)) &&
415 	    (answer->fap.funcindex_clientid == question->fap.feature_index) &&
416 	    (answer->fap.params[0] == question->fap.funcindex_clientid);
417 }
418 
hidpp_report_is_connect_event(struct hidpp_device * hidpp,struct hidpp_report * report)419 static inline bool hidpp_report_is_connect_event(struct hidpp_device *hidpp,
420 		struct hidpp_report *report)
421 {
422 	return (hidpp->wireless_feature_index &&
423 		(report->fap.feature_index == hidpp->wireless_feature_index)) ||
424 		((report->report_id == REPORT_ID_HIDPP_SHORT) &&
425 		(report->rap.sub_id == 0x41));
426 }
427 
428 /*
429  * hidpp_prefix_name() prefixes the current given name with "Logitech ".
430  */
hidpp_prefix_name(char ** name,int name_length)431 static void hidpp_prefix_name(char **name, int name_length)
432 {
433 #define PREFIX_LENGTH 9 /* "Logitech " */
434 
435 	int new_length;
436 	char *new_name;
437 
438 	if (name_length > PREFIX_LENGTH &&
439 	    strncmp(*name, "Logitech ", PREFIX_LENGTH) == 0)
440 		/* The prefix has is already in the name */
441 		return;
442 
443 	new_length = PREFIX_LENGTH + name_length;
444 	new_name = kzalloc(new_length, GFP_KERNEL);
445 	if (!new_name)
446 		return;
447 
448 	snprintf(new_name, new_length, "Logitech %s", *name);
449 
450 	kfree(*name);
451 
452 	*name = new_name;
453 }
454 
455 /**
456  * hidpp_scroll_counter_handle_scroll() - Send high- and low-resolution scroll
457  *                                        events given a high-resolution wheel
458  *                                        movement.
459  * @input_dev: Pointer to the input device
460  * @counter: a hid_scroll_counter struct describing the wheel.
461  * @hi_res_value: the movement of the wheel, in the mouse's high-resolution
462  *                units.
463  *
464  * Given a high-resolution movement, this function converts the movement into
465  * fractions of 120 and emits high-resolution scroll events for the input
466  * device. It also uses the multiplier from &struct hid_scroll_counter to
467  * emit low-resolution scroll events when appropriate for
468  * backwards-compatibility with userspace input libraries.
469  */
hidpp_scroll_counter_handle_scroll(struct input_dev * input_dev,struct hidpp_scroll_counter * counter,int hi_res_value)470 static void hidpp_scroll_counter_handle_scroll(struct input_dev *input_dev,
471 					       struct hidpp_scroll_counter *counter,
472 					       int hi_res_value)
473 {
474 	int low_res_value, remainder, direction;
475 	unsigned long long now, previous;
476 
477 	hi_res_value = hi_res_value * 120/counter->wheel_multiplier;
478 	input_report_rel(input_dev, REL_WHEEL_HI_RES, hi_res_value);
479 
480 	remainder = counter->remainder;
481 	direction = hi_res_value > 0 ? 1 : -1;
482 
483 	now = sched_clock();
484 	previous = counter->last_time;
485 	counter->last_time = now;
486 	/*
487 	 * Reset the remainder after a period of inactivity or when the
488 	 * direction changes. This prevents the REL_WHEEL emulation point
489 	 * from sliding for devices that don't always provide the same
490 	 * number of movements per detent.
491 	 */
492 	if (now - previous > 1000000000 || direction != counter->direction)
493 		remainder = 0;
494 
495 	counter->direction = direction;
496 	remainder += hi_res_value;
497 
498 	/* Some wheels will rest 7/8ths of a detent from the previous detent
499 	 * after slow movement, so we want the threshold for low-res events to
500 	 * be in the middle between two detents (e.g. after 4/8ths) as
501 	 * opposed to on the detents themselves (8/8ths).
502 	 */
503 	if (abs(remainder) >= 60) {
504 		/* Add (or subtract) 1 because we want to trigger when the wheel
505 		 * is half-way to the next detent (i.e. scroll 1 detent after a
506 		 * 1/2 detent movement, 2 detents after a 1 1/2 detent movement,
507 		 * etc.).
508 		 */
509 		low_res_value = remainder / 120;
510 		if (low_res_value == 0)
511 			low_res_value = (hi_res_value > 0 ? 1 : -1);
512 		input_report_rel(input_dev, REL_WHEEL, low_res_value);
513 		remainder -= low_res_value * 120;
514 	}
515 	counter->remainder = remainder;
516 }
517 
518 /* -------------------------------------------------------------------------- */
519 /* HIDP++ 1.0 commands                                                        */
520 /* -------------------------------------------------------------------------- */
521 
522 #define HIDPP_SET_REGISTER				0x80
523 #define HIDPP_GET_REGISTER				0x81
524 #define HIDPP_SET_LONG_REGISTER				0x82
525 #define HIDPP_GET_LONG_REGISTER				0x83
526 
527 /**
528  * hidpp10_set_register - Modify a HID++ 1.0 register.
529  * @hidpp_dev: the device to set the register on.
530  * @register_address: the address of the register to modify.
531  * @byte: the byte of the register to modify. Should be less than 3.
532  * @mask: mask of the bits to modify
533  * @value: new values for the bits in mask
534  * Return: 0 if successful, otherwise a negative error code.
535  */
hidpp10_set_register(struct hidpp_device * hidpp_dev,u8 register_address,u8 byte,u8 mask,u8 value)536 static int hidpp10_set_register(struct hidpp_device *hidpp_dev,
537 	u8 register_address, u8 byte, u8 mask, u8 value)
538 {
539 	struct hidpp_report response;
540 	int ret;
541 	u8 params[3] = { 0 };
542 
543 	ret = hidpp_send_rap_command_sync(hidpp_dev,
544 					  REPORT_ID_HIDPP_SHORT,
545 					  HIDPP_GET_REGISTER,
546 					  register_address,
547 					  NULL, 0, &response);
548 	if (ret)
549 		return ret;
550 
551 	memcpy(params, response.rap.params, 3);
552 
553 	params[byte] &= ~mask;
554 	params[byte] |= value & mask;
555 
556 	return hidpp_send_rap_command_sync(hidpp_dev,
557 					   REPORT_ID_HIDPP_SHORT,
558 					   HIDPP_SET_REGISTER,
559 					   register_address,
560 					   params, 3, &response);
561 }
562 
563 #define HIDPP_REG_ENABLE_REPORTS			0x00
564 #define HIDPP_ENABLE_CONSUMER_REPORT			BIT(0)
565 #define HIDPP_ENABLE_WHEEL_REPORT			BIT(2)
566 #define HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT		BIT(3)
567 #define HIDPP_ENABLE_BAT_REPORT				BIT(4)
568 #define HIDPP_ENABLE_HWHEEL_REPORT			BIT(5)
569 
hidpp10_enable_battery_reporting(struct hidpp_device * hidpp_dev)570 static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev)
571 {
572 	return hidpp10_set_register(hidpp_dev, HIDPP_REG_ENABLE_REPORTS, 0,
573 			  HIDPP_ENABLE_BAT_REPORT, HIDPP_ENABLE_BAT_REPORT);
574 }
575 
576 #define HIDPP_REG_FEATURES				0x01
577 #define HIDPP_ENABLE_SPECIAL_BUTTON_FUNC		BIT(1)
578 #define HIDPP_ENABLE_FAST_SCROLL			BIT(6)
579 
580 /* On HID++ 1.0 devices, high-res scroll was called "scrolling acceleration". */
hidpp10_enable_scrolling_acceleration(struct hidpp_device * hidpp_dev)581 static int hidpp10_enable_scrolling_acceleration(struct hidpp_device *hidpp_dev)
582 {
583 	return hidpp10_set_register(hidpp_dev, HIDPP_REG_FEATURES, 0,
584 			  HIDPP_ENABLE_FAST_SCROLL, HIDPP_ENABLE_FAST_SCROLL);
585 }
586 
587 #define HIDPP_REG_BATTERY_STATUS			0x07
588 
hidpp10_battery_status_map_level(u8 param)589 static int hidpp10_battery_status_map_level(u8 param)
590 {
591 	int level;
592 
593 	switch (param) {
594 	case 1 ... 2:
595 		level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
596 		break;
597 	case 3 ... 4:
598 		level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
599 		break;
600 	case 5 ... 6:
601 		level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
602 		break;
603 	case 7:
604 		level = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
605 		break;
606 	default:
607 		level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
608 	}
609 
610 	return level;
611 }
612 
hidpp10_battery_status_map_status(u8 param)613 static int hidpp10_battery_status_map_status(u8 param)
614 {
615 	int status;
616 
617 	switch (param) {
618 	case 0x00:
619 		/* discharging (in use) */
620 		status = POWER_SUPPLY_STATUS_DISCHARGING;
621 		break;
622 	case 0x21: /* (standard) charging */
623 	case 0x24: /* fast charging */
624 	case 0x25: /* slow charging */
625 		status = POWER_SUPPLY_STATUS_CHARGING;
626 		break;
627 	case 0x26: /* topping charge */
628 	case 0x22: /* charge complete */
629 		status = POWER_SUPPLY_STATUS_FULL;
630 		break;
631 	case 0x20: /* unknown */
632 		status = POWER_SUPPLY_STATUS_UNKNOWN;
633 		break;
634 	/*
635 	 * 0x01...0x1F = reserved (not charging)
636 	 * 0x23 = charging error
637 	 * 0x27..0xff = reserved
638 	 */
639 	default:
640 		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
641 		break;
642 	}
643 
644 	return status;
645 }
646 
hidpp10_query_battery_status(struct hidpp_device * hidpp)647 static int hidpp10_query_battery_status(struct hidpp_device *hidpp)
648 {
649 	struct hidpp_report response;
650 	int ret, status;
651 
652 	ret = hidpp_send_rap_command_sync(hidpp,
653 					REPORT_ID_HIDPP_SHORT,
654 					HIDPP_GET_REGISTER,
655 					HIDPP_REG_BATTERY_STATUS,
656 					NULL, 0, &response);
657 	if (ret)
658 		return ret;
659 
660 	hidpp->battery.level =
661 		hidpp10_battery_status_map_level(response.rap.params[0]);
662 	status = hidpp10_battery_status_map_status(response.rap.params[1]);
663 	hidpp->battery.status = status;
664 	/* the capacity is only available when discharging or full */
665 	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
666 				status == POWER_SUPPLY_STATUS_FULL;
667 
668 	return 0;
669 }
670 
671 #define HIDPP_REG_BATTERY_MILEAGE			0x0D
672 
hidpp10_battery_mileage_map_status(u8 param)673 static int hidpp10_battery_mileage_map_status(u8 param)
674 {
675 	int status;
676 
677 	switch (param >> 6) {
678 	case 0x00:
679 		/* discharging (in use) */
680 		status = POWER_SUPPLY_STATUS_DISCHARGING;
681 		break;
682 	case 0x01: /* charging */
683 		status = POWER_SUPPLY_STATUS_CHARGING;
684 		break;
685 	case 0x02: /* charge complete */
686 		status = POWER_SUPPLY_STATUS_FULL;
687 		break;
688 	/*
689 	 * 0x03 = charging error
690 	 */
691 	default:
692 		status = POWER_SUPPLY_STATUS_NOT_CHARGING;
693 		break;
694 	}
695 
696 	return status;
697 }
698 
hidpp10_query_battery_mileage(struct hidpp_device * hidpp)699 static int hidpp10_query_battery_mileage(struct hidpp_device *hidpp)
700 {
701 	struct hidpp_report response;
702 	int ret, status;
703 
704 	ret = hidpp_send_rap_command_sync(hidpp,
705 					REPORT_ID_HIDPP_SHORT,
706 					HIDPP_GET_REGISTER,
707 					HIDPP_REG_BATTERY_MILEAGE,
708 					NULL, 0, &response);
709 	if (ret)
710 		return ret;
711 
712 	hidpp->battery.capacity = response.rap.params[0];
713 	status = hidpp10_battery_mileage_map_status(response.rap.params[2]);
714 	hidpp->battery.status = status;
715 	/* the capacity is only available when discharging or full */
716 	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
717 				status == POWER_SUPPLY_STATUS_FULL;
718 
719 	return 0;
720 }
721 
hidpp10_battery_event(struct hidpp_device * hidpp,u8 * data,int size)722 static int hidpp10_battery_event(struct hidpp_device *hidpp, u8 *data, int size)
723 {
724 	struct hidpp_report *report = (struct hidpp_report *)data;
725 	int status, capacity, level;
726 	bool changed;
727 
728 	if (report->report_id != REPORT_ID_HIDPP_SHORT)
729 		return 0;
730 
731 	switch (report->rap.sub_id) {
732 	case HIDPP_REG_BATTERY_STATUS:
733 		capacity = hidpp->battery.capacity;
734 		level = hidpp10_battery_status_map_level(report->rawbytes[1]);
735 		status = hidpp10_battery_status_map_status(report->rawbytes[2]);
736 		break;
737 	case HIDPP_REG_BATTERY_MILEAGE:
738 		capacity = report->rap.params[0];
739 		level = hidpp->battery.level;
740 		status = hidpp10_battery_mileage_map_status(report->rawbytes[3]);
741 		break;
742 	default:
743 		return 0;
744 	}
745 
746 	changed = capacity != hidpp->battery.capacity ||
747 		  level != hidpp->battery.level ||
748 		  status != hidpp->battery.status;
749 
750 	/* the capacity is only available when discharging or full */
751 	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
752 				status == POWER_SUPPLY_STATUS_FULL;
753 
754 	if (changed) {
755 		hidpp->battery.level = level;
756 		hidpp->battery.status = status;
757 		if (hidpp->battery.ps)
758 			power_supply_changed(hidpp->battery.ps);
759 	}
760 
761 	return 0;
762 }
763 
764 #define HIDPP_REG_PAIRING_INFORMATION			0xB5
765 #define HIDPP_EXTENDED_PAIRING				0x30
766 #define HIDPP_DEVICE_NAME				0x40
767 
hidpp_unifying_get_name(struct hidpp_device * hidpp_dev)768 static char *hidpp_unifying_get_name(struct hidpp_device *hidpp_dev)
769 {
770 	struct hidpp_report response;
771 	int ret;
772 	u8 params[1] = { HIDPP_DEVICE_NAME };
773 	char *name;
774 	int len;
775 
776 	ret = hidpp_send_rap_command_sync(hidpp_dev,
777 					REPORT_ID_HIDPP_SHORT,
778 					HIDPP_GET_LONG_REGISTER,
779 					HIDPP_REG_PAIRING_INFORMATION,
780 					params, 1, &response);
781 	if (ret)
782 		return NULL;
783 
784 	len = response.rap.params[1];
785 
786 	if (2 + len > sizeof(response.rap.params))
787 		return NULL;
788 
789 	if (len < 4) /* logitech devices are usually at least Xddd */
790 		return NULL;
791 
792 	name = kzalloc(len + 1, GFP_KERNEL);
793 	if (!name)
794 		return NULL;
795 
796 	memcpy(name, &response.rap.params[2], len);
797 
798 	/* include the terminating '\0' */
799 	hidpp_prefix_name(&name, len + 1);
800 
801 	return name;
802 }
803 
hidpp_unifying_get_serial(struct hidpp_device * hidpp,u32 * serial)804 static int hidpp_unifying_get_serial(struct hidpp_device *hidpp, u32 *serial)
805 {
806 	struct hidpp_report response;
807 	int ret;
808 	u8 params[1] = { HIDPP_EXTENDED_PAIRING };
809 
810 	ret = hidpp_send_rap_command_sync(hidpp,
811 					REPORT_ID_HIDPP_SHORT,
812 					HIDPP_GET_LONG_REGISTER,
813 					HIDPP_REG_PAIRING_INFORMATION,
814 					params, 1, &response);
815 	if (ret)
816 		return ret;
817 
818 	/*
819 	 * We don't care about LE or BE, we will output it as a string
820 	 * with %4phD, so we need to keep the order.
821 	 */
822 	*serial = *((u32 *)&response.rap.params[1]);
823 	return 0;
824 }
825 
hidpp_unifying_init(struct hidpp_device * hidpp)826 static int hidpp_unifying_init(struct hidpp_device *hidpp)
827 {
828 	struct hid_device *hdev = hidpp->hid_dev;
829 	const char *name;
830 	u32 serial;
831 	int ret;
832 
833 	ret = hidpp_unifying_get_serial(hidpp, &serial);
834 	if (ret)
835 		return ret;
836 
837 	snprintf(hdev->uniq, sizeof(hdev->uniq), "%04x-%4phD",
838 		 hdev->product, &serial);
839 	dbg_hid("HID++ Unifying: Got serial: %s\n", hdev->uniq);
840 
841 	name = hidpp_unifying_get_name(hidpp);
842 	if (!name)
843 		return -EIO;
844 
845 	snprintf(hdev->name, sizeof(hdev->name), "%s", name);
846 	dbg_hid("HID++ Unifying: Got name: %s\n", name);
847 
848 	kfree(name);
849 	return 0;
850 }
851 
852 /* -------------------------------------------------------------------------- */
853 /* 0x0000: Root                                                               */
854 /* -------------------------------------------------------------------------- */
855 
856 #define HIDPP_PAGE_ROOT					0x0000
857 #define HIDPP_PAGE_ROOT_IDX				0x00
858 
859 #define CMD_ROOT_GET_FEATURE				0x01
860 #define CMD_ROOT_GET_PROTOCOL_VERSION			0x11
861 
hidpp_root_get_feature(struct hidpp_device * hidpp,u16 feature,u8 * feature_index,u8 * feature_type)862 static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,
863 	u8 *feature_index, u8 *feature_type)
864 {
865 	struct hidpp_report response;
866 	int ret;
867 	u8 params[2] = { feature >> 8, feature & 0x00FF };
868 
869 	ret = hidpp_send_fap_command_sync(hidpp,
870 			HIDPP_PAGE_ROOT_IDX,
871 			CMD_ROOT_GET_FEATURE,
872 			params, 2, &response);
873 	if (ret)
874 		return ret;
875 
876 	if (response.fap.params[0] == 0)
877 		return -ENOENT;
878 
879 	*feature_index = response.fap.params[0];
880 	*feature_type = response.fap.params[1];
881 
882 	return ret;
883 }
884 
hidpp_root_get_protocol_version(struct hidpp_device * hidpp)885 static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
886 {
887 	const u8 ping_byte = 0x5a;
888 	u8 ping_data[3] = { 0, 0, ping_byte };
889 	struct hidpp_report response;
890 	int ret;
891 
892 	ret = hidpp_send_rap_command_sync(hidpp,
893 			REPORT_ID_HIDPP_SHORT,
894 			HIDPP_PAGE_ROOT_IDX,
895 			CMD_ROOT_GET_PROTOCOL_VERSION,
896 			ping_data, sizeof(ping_data), &response);
897 
898 	if (ret == HIDPP_ERROR_INVALID_SUBID) {
899 		hidpp->protocol_major = 1;
900 		hidpp->protocol_minor = 0;
901 		goto print_version;
902 	}
903 
904 	/* the device might not be connected */
905 	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
906 		return -EIO;
907 
908 	if (ret > 0) {
909 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
910 			__func__, ret);
911 		return -EPROTO;
912 	}
913 	if (ret)
914 		return ret;
915 
916 	if (response.rap.params[2] != ping_byte) {
917 		hid_err(hidpp->hid_dev, "%s: ping mismatch 0x%02x != 0x%02x\n",
918 			__func__, response.rap.params[2], ping_byte);
919 		return -EPROTO;
920 	}
921 
922 	hidpp->protocol_major = response.rap.params[0];
923 	hidpp->protocol_minor = response.rap.params[1];
924 
925 print_version:
926 	hid_info(hidpp->hid_dev, "HID++ %u.%u device connected.\n",
927 		 hidpp->protocol_major, hidpp->protocol_minor);
928 	return 0;
929 }
930 
931 /* -------------------------------------------------------------------------- */
932 /* 0x0005: GetDeviceNameType                                                  */
933 /* -------------------------------------------------------------------------- */
934 
935 #define HIDPP_PAGE_GET_DEVICE_NAME_TYPE			0x0005
936 
937 #define CMD_GET_DEVICE_NAME_TYPE_GET_COUNT		0x01
938 #define CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME	0x11
939 #define CMD_GET_DEVICE_NAME_TYPE_GET_TYPE		0x21
940 
hidpp_devicenametype_get_count(struct hidpp_device * hidpp,u8 feature_index,u8 * nameLength)941 static int hidpp_devicenametype_get_count(struct hidpp_device *hidpp,
942 	u8 feature_index, u8 *nameLength)
943 {
944 	struct hidpp_report response;
945 	int ret;
946 
947 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
948 		CMD_GET_DEVICE_NAME_TYPE_GET_COUNT, NULL, 0, &response);
949 
950 	if (ret > 0) {
951 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
952 			__func__, ret);
953 		return -EPROTO;
954 	}
955 	if (ret)
956 		return ret;
957 
958 	*nameLength = response.fap.params[0];
959 
960 	return ret;
961 }
962 
hidpp_devicenametype_get_device_name(struct hidpp_device * hidpp,u8 feature_index,u8 char_index,char * device_name,int len_buf)963 static int hidpp_devicenametype_get_device_name(struct hidpp_device *hidpp,
964 	u8 feature_index, u8 char_index, char *device_name, int len_buf)
965 {
966 	struct hidpp_report response;
967 	int ret, i;
968 	int count;
969 
970 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
971 		CMD_GET_DEVICE_NAME_TYPE_GET_DEVICE_NAME, &char_index, 1,
972 		&response);
973 
974 	if (ret > 0) {
975 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
976 			__func__, ret);
977 		return -EPROTO;
978 	}
979 	if (ret)
980 		return ret;
981 
982 	switch (response.report_id) {
983 	case REPORT_ID_HIDPP_VERY_LONG:
984 		count = hidpp->very_long_report_length - 4;
985 		break;
986 	case REPORT_ID_HIDPP_LONG:
987 		count = HIDPP_REPORT_LONG_LENGTH - 4;
988 		break;
989 	case REPORT_ID_HIDPP_SHORT:
990 		count = HIDPP_REPORT_SHORT_LENGTH - 4;
991 		break;
992 	default:
993 		return -EPROTO;
994 	}
995 
996 	if (len_buf < count)
997 		count = len_buf;
998 
999 	for (i = 0; i < count; i++)
1000 		device_name[i] = response.fap.params[i];
1001 
1002 	return count;
1003 }
1004 
hidpp_get_device_name(struct hidpp_device * hidpp)1005 static char *hidpp_get_device_name(struct hidpp_device *hidpp)
1006 {
1007 	u8 feature_type;
1008 	u8 feature_index;
1009 	u8 __name_length;
1010 	char *name;
1011 	unsigned index = 0;
1012 	int ret;
1013 
1014 	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_GET_DEVICE_NAME_TYPE,
1015 		&feature_index, &feature_type);
1016 	if (ret)
1017 		return NULL;
1018 
1019 	ret = hidpp_devicenametype_get_count(hidpp, feature_index,
1020 		&__name_length);
1021 	if (ret)
1022 		return NULL;
1023 
1024 	name = kzalloc(__name_length + 1, GFP_KERNEL);
1025 	if (!name)
1026 		return NULL;
1027 
1028 	while (index < __name_length) {
1029 		ret = hidpp_devicenametype_get_device_name(hidpp,
1030 			feature_index, index, name + index,
1031 			__name_length - index);
1032 		if (ret <= 0) {
1033 			kfree(name);
1034 			return NULL;
1035 		}
1036 		index += ret;
1037 	}
1038 
1039 	/* include the terminating '\0' */
1040 	hidpp_prefix_name(&name, __name_length + 1);
1041 
1042 	return name;
1043 }
1044 
1045 /* -------------------------------------------------------------------------- */
1046 /* 0x1000: Battery level status                                               */
1047 /* -------------------------------------------------------------------------- */
1048 
1049 #define HIDPP_PAGE_BATTERY_LEVEL_STATUS				0x1000
1050 
1051 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS	0x00
1052 #define CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY		0x10
1053 
1054 #define EVENT_BATTERY_LEVEL_STATUS_BROADCAST			0x00
1055 
1056 #define FLAG_BATTERY_LEVEL_DISABLE_OSD				BIT(0)
1057 #define FLAG_BATTERY_LEVEL_MILEAGE				BIT(1)
1058 #define FLAG_BATTERY_LEVEL_RECHARGEABLE				BIT(2)
1059 
hidpp_map_battery_level(int capacity)1060 static int hidpp_map_battery_level(int capacity)
1061 {
1062 	if (capacity < 11)
1063 		return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1064 	/*
1065 	 * The spec says this should be < 31 but some devices report 30
1066 	 * with brand new batteries and Windows reports 30 as "Good".
1067 	 */
1068 	else if (capacity < 30)
1069 		return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1070 	else if (capacity < 81)
1071 		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1072 	return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1073 }
1074 
hidpp20_batterylevel_map_status_capacity(u8 data[3],int * capacity,int * next_capacity,int * level)1075 static int hidpp20_batterylevel_map_status_capacity(u8 data[3], int *capacity,
1076 						    int *next_capacity,
1077 						    int *level)
1078 {
1079 	int status;
1080 
1081 	*capacity = data[0];
1082 	*next_capacity = data[1];
1083 	*level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1084 
1085 	/* When discharging, we can rely on the device reported capacity.
1086 	 * For all other states the device reports 0 (unknown).
1087 	 */
1088 	switch (data[2]) {
1089 		case 0: /* discharging (in use) */
1090 			status = POWER_SUPPLY_STATUS_DISCHARGING;
1091 			*level = hidpp_map_battery_level(*capacity);
1092 			break;
1093 		case 1: /* recharging */
1094 			status = POWER_SUPPLY_STATUS_CHARGING;
1095 			break;
1096 		case 2: /* charge in final stage */
1097 			status = POWER_SUPPLY_STATUS_CHARGING;
1098 			break;
1099 		case 3: /* charge complete */
1100 			status = POWER_SUPPLY_STATUS_FULL;
1101 			*level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1102 			*capacity = 100;
1103 			break;
1104 		case 4: /* recharging below optimal speed */
1105 			status = POWER_SUPPLY_STATUS_CHARGING;
1106 			break;
1107 		/* 5 = invalid battery type
1108 		   6 = thermal error
1109 		   7 = other charging error */
1110 		default:
1111 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1112 			break;
1113 	}
1114 
1115 	return status;
1116 }
1117 
hidpp20_batterylevel_get_battery_capacity(struct hidpp_device * hidpp,u8 feature_index,int * status,int * capacity,int * next_capacity,int * level)1118 static int hidpp20_batterylevel_get_battery_capacity(struct hidpp_device *hidpp,
1119 						     u8 feature_index,
1120 						     int *status,
1121 						     int *capacity,
1122 						     int *next_capacity,
1123 						     int *level)
1124 {
1125 	struct hidpp_report response;
1126 	int ret;
1127 	u8 *params = (u8 *)response.fap.params;
1128 
1129 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1130 					  CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_LEVEL_STATUS,
1131 					  NULL, 0, &response);
1132 	/* Ignore these intermittent errors */
1133 	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1134 		return -EIO;
1135 	if (ret > 0) {
1136 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1137 			__func__, ret);
1138 		return -EPROTO;
1139 	}
1140 	if (ret)
1141 		return ret;
1142 
1143 	*status = hidpp20_batterylevel_map_status_capacity(params, capacity,
1144 							   next_capacity,
1145 							   level);
1146 
1147 	return 0;
1148 }
1149 
hidpp20_batterylevel_get_battery_info(struct hidpp_device * hidpp,u8 feature_index)1150 static int hidpp20_batterylevel_get_battery_info(struct hidpp_device *hidpp,
1151 						  u8 feature_index)
1152 {
1153 	struct hidpp_report response;
1154 	int ret;
1155 	u8 *params = (u8 *)response.fap.params;
1156 	unsigned int level_count, flags;
1157 
1158 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1159 					  CMD_BATTERY_LEVEL_STATUS_GET_BATTERY_CAPABILITY,
1160 					  NULL, 0, &response);
1161 	if (ret > 0) {
1162 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1163 			__func__, ret);
1164 		return -EPROTO;
1165 	}
1166 	if (ret)
1167 		return ret;
1168 
1169 	level_count = params[0];
1170 	flags = params[1];
1171 
1172 	if (level_count < 10 || !(flags & FLAG_BATTERY_LEVEL_MILEAGE))
1173 		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1174 	else
1175 		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
1176 
1177 	return 0;
1178 }
1179 
hidpp20_query_battery_info_1000(struct hidpp_device * hidpp)1180 static int hidpp20_query_battery_info_1000(struct hidpp_device *hidpp)
1181 {
1182 	u8 feature_type;
1183 	int ret;
1184 	int status, capacity, next_capacity, level;
1185 
1186 	if (hidpp->battery.feature_index == 0xff) {
1187 		ret = hidpp_root_get_feature(hidpp,
1188 					     HIDPP_PAGE_BATTERY_LEVEL_STATUS,
1189 					     &hidpp->battery.feature_index,
1190 					     &feature_type);
1191 		if (ret)
1192 			return ret;
1193 	}
1194 
1195 	ret = hidpp20_batterylevel_get_battery_capacity(hidpp,
1196 						hidpp->battery.feature_index,
1197 						&status, &capacity,
1198 						&next_capacity, &level);
1199 	if (ret)
1200 		return ret;
1201 
1202 	ret = hidpp20_batterylevel_get_battery_info(hidpp,
1203 						hidpp->battery.feature_index);
1204 	if (ret)
1205 		return ret;
1206 
1207 	hidpp->battery.status = status;
1208 	hidpp->battery.capacity = capacity;
1209 	hidpp->battery.level = level;
1210 	/* the capacity is only available when discharging or full */
1211 	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1212 				status == POWER_SUPPLY_STATUS_FULL;
1213 
1214 	return 0;
1215 }
1216 
hidpp20_battery_event_1000(struct hidpp_device * hidpp,u8 * data,int size)1217 static int hidpp20_battery_event_1000(struct hidpp_device *hidpp,
1218 				 u8 *data, int size)
1219 {
1220 	struct hidpp_report *report = (struct hidpp_report *)data;
1221 	int status, capacity, next_capacity, level;
1222 	bool changed;
1223 
1224 	if (report->fap.feature_index != hidpp->battery.feature_index ||
1225 	    report->fap.funcindex_clientid != EVENT_BATTERY_LEVEL_STATUS_BROADCAST)
1226 		return 0;
1227 
1228 	status = hidpp20_batterylevel_map_status_capacity(report->fap.params,
1229 							  &capacity,
1230 							  &next_capacity,
1231 							  &level);
1232 
1233 	/* the capacity is only available when discharging or full */
1234 	hidpp->battery.online = status == POWER_SUPPLY_STATUS_DISCHARGING ||
1235 				status == POWER_SUPPLY_STATUS_FULL;
1236 
1237 	changed = capacity != hidpp->battery.capacity ||
1238 		  level != hidpp->battery.level ||
1239 		  status != hidpp->battery.status;
1240 
1241 	if (changed) {
1242 		hidpp->battery.level = level;
1243 		hidpp->battery.capacity = capacity;
1244 		hidpp->battery.status = status;
1245 		if (hidpp->battery.ps)
1246 			power_supply_changed(hidpp->battery.ps);
1247 	}
1248 
1249 	return 0;
1250 }
1251 
1252 /* -------------------------------------------------------------------------- */
1253 /* 0x1001: Battery voltage                                                    */
1254 /* -------------------------------------------------------------------------- */
1255 
1256 #define HIDPP_PAGE_BATTERY_VOLTAGE 0x1001
1257 
1258 #define CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE 0x00
1259 
1260 #define EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST 0x00
1261 
hidpp20_battery_map_status_voltage(u8 data[3],int * voltage,int * level,int * charge_type)1262 static int hidpp20_battery_map_status_voltage(u8 data[3], int *voltage,
1263 						int *level, int *charge_type)
1264 {
1265 	int status;
1266 
1267 	long flags = (long) data[2];
1268 	*level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1269 
1270 	if (flags & 0x80)
1271 		switch (flags & 0x07) {
1272 		case 0:
1273 			status = POWER_SUPPLY_STATUS_CHARGING;
1274 			break;
1275 		case 1:
1276 			status = POWER_SUPPLY_STATUS_FULL;
1277 			*level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1278 			break;
1279 		case 2:
1280 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1281 			break;
1282 		default:
1283 			status = POWER_SUPPLY_STATUS_UNKNOWN;
1284 			break;
1285 		}
1286 	else
1287 		status = POWER_SUPPLY_STATUS_DISCHARGING;
1288 
1289 	*charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
1290 	if (test_bit(3, &flags)) {
1291 		*charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
1292 	}
1293 	if (test_bit(4, &flags)) {
1294 		*charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1295 	}
1296 	if (test_bit(5, &flags)) {
1297 		*level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1298 	}
1299 
1300 	*voltage = get_unaligned_be16(data);
1301 
1302 	return status;
1303 }
1304 
hidpp20_battery_get_battery_voltage(struct hidpp_device * hidpp,u8 feature_index,int * status,int * voltage,int * level,int * charge_type)1305 static int hidpp20_battery_get_battery_voltage(struct hidpp_device *hidpp,
1306 						 u8 feature_index,
1307 						 int *status, int *voltage,
1308 						 int *level, int *charge_type)
1309 {
1310 	struct hidpp_report response;
1311 	int ret;
1312 	u8 *params = (u8 *)response.fap.params;
1313 
1314 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1315 					  CMD_BATTERY_VOLTAGE_GET_BATTERY_VOLTAGE,
1316 					  NULL, 0, &response);
1317 
1318 	if (ret > 0) {
1319 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1320 			__func__, ret);
1321 		return -EPROTO;
1322 	}
1323 	if (ret)
1324 		return ret;
1325 
1326 	hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_VOLTAGE;
1327 
1328 	*status = hidpp20_battery_map_status_voltage(params, voltage,
1329 						     level, charge_type);
1330 
1331 	return 0;
1332 }
1333 
hidpp20_map_battery_capacity(struct hid_device * hid_dev,int voltage)1334 static int hidpp20_map_battery_capacity(struct hid_device *hid_dev, int voltage)
1335 {
1336 	/* NB: This voltage curve doesn't necessarily map perfectly to all
1337 	 * devices that implement the BATTERY_VOLTAGE feature. This is because
1338 	 * there are a few devices that use different battery technology.
1339 	 */
1340 
1341 	static const int voltages[] = {
1342 		4186, 4156, 4143, 4133, 4122, 4113, 4103, 4094, 4086, 4075,
1343 		4067, 4059, 4051, 4043, 4035, 4027, 4019, 4011, 4003, 3997,
1344 		3989, 3983, 3976, 3969, 3961, 3955, 3949, 3942, 3935, 3929,
1345 		3922, 3916, 3909, 3902, 3896, 3890, 3883, 3877, 3870, 3865,
1346 		3859, 3853, 3848, 3842, 3837, 3833, 3828, 3824, 3819, 3815,
1347 		3811, 3808, 3804, 3800, 3797, 3793, 3790, 3787, 3784, 3781,
1348 		3778, 3775, 3772, 3770, 3767, 3764, 3762, 3759, 3757, 3754,
1349 		3751, 3748, 3744, 3741, 3737, 3734, 3730, 3726, 3724, 3720,
1350 		3717, 3714, 3710, 3706, 3702, 3697, 3693, 3688, 3683, 3677,
1351 		3671, 3666, 3662, 3658, 3654, 3646, 3633, 3612, 3579, 3537
1352 	};
1353 
1354 	int i;
1355 
1356 	BUILD_BUG_ON(ARRAY_SIZE(voltages) != 100);
1357 
1358 	if (unlikely(voltage < 3500 || voltage >= 5000))
1359 		hid_warn_once(hid_dev,
1360 			      "%s: possibly using the wrong voltage curve\n",
1361 			      __func__);
1362 
1363 	for (i = 0; i < ARRAY_SIZE(voltages); i++) {
1364 		if (voltage >= voltages[i])
1365 			return ARRAY_SIZE(voltages) - i;
1366 	}
1367 
1368 	return 0;
1369 }
1370 
hidpp20_query_battery_voltage_info(struct hidpp_device * hidpp)1371 static int hidpp20_query_battery_voltage_info(struct hidpp_device *hidpp)
1372 {
1373 	u8 feature_type;
1374 	int ret;
1375 	int status, voltage, level, charge_type;
1376 
1377 	if (hidpp->battery.voltage_feature_index == 0xff) {
1378 		ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_BATTERY_VOLTAGE,
1379 					     &hidpp->battery.voltage_feature_index,
1380 					     &feature_type);
1381 		if (ret)
1382 			return ret;
1383 	}
1384 
1385 	ret = hidpp20_battery_get_battery_voltage(hidpp,
1386 						  hidpp->battery.voltage_feature_index,
1387 						  &status, &voltage, &level, &charge_type);
1388 
1389 	if (ret)
1390 		return ret;
1391 
1392 	hidpp->battery.status = status;
1393 	hidpp->battery.voltage = voltage;
1394 	hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1395 							       voltage);
1396 	hidpp->battery.level = level;
1397 	hidpp->battery.charge_type = charge_type;
1398 	hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1399 
1400 	return 0;
1401 }
1402 
hidpp20_battery_voltage_event(struct hidpp_device * hidpp,u8 * data,int size)1403 static int hidpp20_battery_voltage_event(struct hidpp_device *hidpp,
1404 					    u8 *data, int size)
1405 {
1406 	struct hidpp_report *report = (struct hidpp_report *)data;
1407 	int status, voltage, level, charge_type;
1408 
1409 	if (report->fap.feature_index != hidpp->battery.voltage_feature_index ||
1410 		report->fap.funcindex_clientid != EVENT_BATTERY_VOLTAGE_STATUS_BROADCAST)
1411 		return 0;
1412 
1413 	status = hidpp20_battery_map_status_voltage(report->fap.params, &voltage,
1414 						    &level, &charge_type);
1415 
1416 	hidpp->battery.online = status != POWER_SUPPLY_STATUS_NOT_CHARGING;
1417 
1418 	if (voltage != hidpp->battery.voltage || status != hidpp->battery.status) {
1419 		hidpp->battery.voltage = voltage;
1420 		hidpp->battery.capacity = hidpp20_map_battery_capacity(hidpp->hid_dev,
1421 								       voltage);
1422 		hidpp->battery.status = status;
1423 		hidpp->battery.level = level;
1424 		hidpp->battery.charge_type = charge_type;
1425 		if (hidpp->battery.ps)
1426 			power_supply_changed(hidpp->battery.ps);
1427 	}
1428 	return 0;
1429 }
1430 
1431 /* -------------------------------------------------------------------------- */
1432 /* 0x1004: Unified battery                                                    */
1433 /* -------------------------------------------------------------------------- */
1434 
1435 #define HIDPP_PAGE_UNIFIED_BATTERY				0x1004
1436 
1437 #define CMD_UNIFIED_BATTERY_GET_CAPABILITIES			0x00
1438 #define CMD_UNIFIED_BATTERY_GET_STATUS				0x10
1439 
1440 #define EVENT_UNIFIED_BATTERY_STATUS_EVENT			0x00
1441 
1442 #define FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL			BIT(0)
1443 #define FLAG_UNIFIED_BATTERY_LEVEL_LOW				BIT(1)
1444 #define FLAG_UNIFIED_BATTERY_LEVEL_GOOD				BIT(2)
1445 #define FLAG_UNIFIED_BATTERY_LEVEL_FULL				BIT(3)
1446 
1447 #define FLAG_UNIFIED_BATTERY_FLAGS_RECHARGEABLE			BIT(0)
1448 #define FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE		BIT(1)
1449 
hidpp20_unifiedbattery_get_capabilities(struct hidpp_device * hidpp,u8 feature_index)1450 static int hidpp20_unifiedbattery_get_capabilities(struct hidpp_device *hidpp,
1451 						   u8 feature_index)
1452 {
1453 	struct hidpp_report response;
1454 	int ret;
1455 	u8 *params = (u8 *)response.fap.params;
1456 
1457 	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS ||
1458 	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) {
1459 		/* we have already set the device capabilities, so let's skip */
1460 		return 0;
1461 	}
1462 
1463 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1464 					  CMD_UNIFIED_BATTERY_GET_CAPABILITIES,
1465 					  NULL, 0, &response);
1466 	/* Ignore these intermittent errors */
1467 	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1468 		return -EIO;
1469 	if (ret > 0) {
1470 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1471 			__func__, ret);
1472 		return -EPROTO;
1473 	}
1474 	if (ret)
1475 		return ret;
1476 
1477 	/*
1478 	 * If the device supports state of charge (battery percentage) we won't
1479 	 * export the battery level information. there are 4 possible battery
1480 	 * levels and they all are optional, this means that the device might
1481 	 * not support any of them, we are just better off with the battery
1482 	 * percentage.
1483 	 */
1484 	if (params[1] & FLAG_UNIFIED_BATTERY_FLAGS_STATE_OF_CHARGE) {
1485 		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_PERCENTAGE;
1486 		hidpp->battery.supported_levels_1004 = 0;
1487 	} else {
1488 		hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
1489 		hidpp->battery.supported_levels_1004 = params[0];
1490 	}
1491 
1492 	return 0;
1493 }
1494 
hidpp20_unifiedbattery_map_status(struct hidpp_device * hidpp,u8 charging_status,u8 external_power_status)1495 static int hidpp20_unifiedbattery_map_status(struct hidpp_device *hidpp,
1496 					     u8 charging_status,
1497 					     u8 external_power_status)
1498 {
1499 	int status;
1500 
1501 	switch (charging_status) {
1502 		case 0: /* discharging */
1503 			status = POWER_SUPPLY_STATUS_DISCHARGING;
1504 			break;
1505 		case 1: /* charging */
1506 		case 2: /* charging slow */
1507 			status = POWER_SUPPLY_STATUS_CHARGING;
1508 			break;
1509 		case 3: /* complete */
1510 			status = POWER_SUPPLY_STATUS_FULL;
1511 			break;
1512 		case 4: /* error */
1513 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1514 			hid_info(hidpp->hid_dev, "%s: charging error",
1515 				 hidpp->name);
1516 			break;
1517 		default:
1518 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1519 			break;
1520 	}
1521 
1522 	return status;
1523 }
1524 
hidpp20_unifiedbattery_map_level(struct hidpp_device * hidpp,u8 battery_level)1525 static int hidpp20_unifiedbattery_map_level(struct hidpp_device *hidpp,
1526 					    u8 battery_level)
1527 {
1528 	/* cler unsupported level bits */
1529 	battery_level &= hidpp->battery.supported_levels_1004;
1530 
1531 	if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_FULL)
1532 		return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1533 	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_GOOD)
1534 		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1535 	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_LOW)
1536 		return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1537 	else if (battery_level & FLAG_UNIFIED_BATTERY_LEVEL_CRITICAL)
1538 		return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1539 
1540 	return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1541 }
1542 
hidpp20_unifiedbattery_get_status(struct hidpp_device * hidpp,u8 feature_index,u8 * state_of_charge,int * status,int * level)1543 static int hidpp20_unifiedbattery_get_status(struct hidpp_device *hidpp,
1544 					     u8 feature_index,
1545 					     u8 *state_of_charge,
1546 					     int *status,
1547 					     int *level)
1548 {
1549 	struct hidpp_report response;
1550 	int ret;
1551 	u8 *params = (u8 *)response.fap.params;
1552 
1553 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1554 					  CMD_UNIFIED_BATTERY_GET_STATUS,
1555 					  NULL, 0, &response);
1556 	/* Ignore these intermittent errors */
1557 	if (ret == HIDPP_ERROR_RESOURCE_ERROR)
1558 		return -EIO;
1559 	if (ret > 0) {
1560 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1561 			__func__, ret);
1562 		return -EPROTO;
1563 	}
1564 	if (ret)
1565 		return ret;
1566 
1567 	*state_of_charge = params[0];
1568 	*status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1569 	*level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1570 
1571 	return 0;
1572 }
1573 
hidpp20_query_battery_info_1004(struct hidpp_device * hidpp)1574 static int hidpp20_query_battery_info_1004(struct hidpp_device *hidpp)
1575 {
1576 	u8 feature_type;
1577 	int ret;
1578 	u8 state_of_charge;
1579 	int status, level;
1580 
1581 	if (hidpp->battery.feature_index == 0xff) {
1582 		ret = hidpp_root_get_feature(hidpp,
1583 					     HIDPP_PAGE_UNIFIED_BATTERY,
1584 					     &hidpp->battery.feature_index,
1585 					     &feature_type);
1586 		if (ret)
1587 			return ret;
1588 	}
1589 
1590 	ret = hidpp20_unifiedbattery_get_capabilities(hidpp,
1591 					hidpp->battery.feature_index);
1592 	if (ret)
1593 		return ret;
1594 
1595 	ret = hidpp20_unifiedbattery_get_status(hidpp,
1596 						hidpp->battery.feature_index,
1597 						&state_of_charge,
1598 						&status,
1599 						&level);
1600 	if (ret)
1601 		return ret;
1602 
1603 	hidpp->capabilities |= HIDPP_CAPABILITY_UNIFIED_BATTERY;
1604 	hidpp->battery.capacity = state_of_charge;
1605 	hidpp->battery.status = status;
1606 	hidpp->battery.level = level;
1607 	hidpp->battery.online = true;
1608 
1609 	return 0;
1610 }
1611 
hidpp20_battery_event_1004(struct hidpp_device * hidpp,u8 * data,int size)1612 static int hidpp20_battery_event_1004(struct hidpp_device *hidpp,
1613 				 u8 *data, int size)
1614 {
1615 	struct hidpp_report *report = (struct hidpp_report *)data;
1616 	u8 *params = (u8 *)report->fap.params;
1617 	int state_of_charge, status, level;
1618 	bool changed;
1619 
1620 	if (report->fap.feature_index != hidpp->battery.feature_index ||
1621 	    report->fap.funcindex_clientid != EVENT_UNIFIED_BATTERY_STATUS_EVENT)
1622 		return 0;
1623 
1624 	state_of_charge = params[0];
1625 	status = hidpp20_unifiedbattery_map_status(hidpp, params[2], params[3]);
1626 	level = hidpp20_unifiedbattery_map_level(hidpp, params[1]);
1627 
1628 	changed = status != hidpp->battery.status ||
1629 		  (state_of_charge != hidpp->battery.capacity &&
1630 		   hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE) ||
1631 		  (level != hidpp->battery.level &&
1632 		   hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS);
1633 
1634 	if (changed) {
1635 		hidpp->battery.capacity = state_of_charge;
1636 		hidpp->battery.status = status;
1637 		hidpp->battery.level = level;
1638 		if (hidpp->battery.ps)
1639 			power_supply_changed(hidpp->battery.ps);
1640 	}
1641 
1642 	return 0;
1643 }
1644 
1645 /* -------------------------------------------------------------------------- */
1646 /* Battery feature helpers                                                    */
1647 /* -------------------------------------------------------------------------- */
1648 
1649 static enum power_supply_property hidpp_battery_props[] = {
1650 	POWER_SUPPLY_PROP_ONLINE,
1651 	POWER_SUPPLY_PROP_STATUS,
1652 	POWER_SUPPLY_PROP_SCOPE,
1653 	POWER_SUPPLY_PROP_MODEL_NAME,
1654 	POWER_SUPPLY_PROP_MANUFACTURER,
1655 	POWER_SUPPLY_PROP_SERIAL_NUMBER,
1656 	0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY, */
1657 	0, /* placeholder for POWER_SUPPLY_PROP_CAPACITY_LEVEL, */
1658 	0, /* placeholder for POWER_SUPPLY_PROP_VOLTAGE_NOW, */
1659 };
1660 
hidpp_battery_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)1661 static int hidpp_battery_get_property(struct power_supply *psy,
1662 				      enum power_supply_property psp,
1663 				      union power_supply_propval *val)
1664 {
1665 	struct hidpp_device *hidpp = power_supply_get_drvdata(psy);
1666 	int ret = 0;
1667 
1668 	switch(psp) {
1669 		case POWER_SUPPLY_PROP_STATUS:
1670 			val->intval = hidpp->battery.status;
1671 			break;
1672 		case POWER_SUPPLY_PROP_CAPACITY:
1673 			val->intval = hidpp->battery.capacity;
1674 			break;
1675 		case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
1676 			val->intval = hidpp->battery.level;
1677 			break;
1678 		case POWER_SUPPLY_PROP_SCOPE:
1679 			val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1680 			break;
1681 		case POWER_SUPPLY_PROP_ONLINE:
1682 			val->intval = hidpp->battery.online;
1683 			break;
1684 		case POWER_SUPPLY_PROP_MODEL_NAME:
1685 			if (!strncmp(hidpp->name, "Logitech ", 9))
1686 				val->strval = hidpp->name + 9;
1687 			else
1688 				val->strval = hidpp->name;
1689 			break;
1690 		case POWER_SUPPLY_PROP_MANUFACTURER:
1691 			val->strval = "Logitech";
1692 			break;
1693 		case POWER_SUPPLY_PROP_SERIAL_NUMBER:
1694 			val->strval = hidpp->hid_dev->uniq;
1695 			break;
1696 		case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1697 			/* hardware reports voltage in in mV. sysfs expects uV */
1698 			val->intval = hidpp->battery.voltage * 1000;
1699 			break;
1700 		case POWER_SUPPLY_PROP_CHARGE_TYPE:
1701 			val->intval = hidpp->battery.charge_type;
1702 			break;
1703 		default:
1704 			ret = -EINVAL;
1705 			break;
1706 	}
1707 
1708 	return ret;
1709 }
1710 
1711 /* -------------------------------------------------------------------------- */
1712 /* 0x1d4b: Wireless device status                                             */
1713 /* -------------------------------------------------------------------------- */
1714 #define HIDPP_PAGE_WIRELESS_DEVICE_STATUS			0x1d4b
1715 
hidpp_set_wireless_feature_index(struct hidpp_device * hidpp)1716 static int hidpp_set_wireless_feature_index(struct hidpp_device *hidpp)
1717 {
1718 	u8 feature_type;
1719 	int ret;
1720 
1721 	ret = hidpp_root_get_feature(hidpp,
1722 				     HIDPP_PAGE_WIRELESS_DEVICE_STATUS,
1723 				     &hidpp->wireless_feature_index,
1724 				     &feature_type);
1725 
1726 	return ret;
1727 }
1728 
1729 /* -------------------------------------------------------------------------- */
1730 /* 0x2120: Hi-resolution scrolling                                            */
1731 /* -------------------------------------------------------------------------- */
1732 
1733 #define HIDPP_PAGE_HI_RESOLUTION_SCROLLING			0x2120
1734 
1735 #define CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE	0x10
1736 
hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device * hidpp,bool enabled,u8 * multiplier)1737 static int hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device *hidpp,
1738 	bool enabled, u8 *multiplier)
1739 {
1740 	u8 feature_index;
1741 	u8 feature_type;
1742 	int ret;
1743 	u8 params[1];
1744 	struct hidpp_report response;
1745 
1746 	ret = hidpp_root_get_feature(hidpp,
1747 				     HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
1748 				     &feature_index,
1749 				     &feature_type);
1750 	if (ret)
1751 		return ret;
1752 
1753 	params[0] = enabled ? BIT(0) : 0;
1754 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1755 					  CMD_HI_RESOLUTION_SCROLLING_SET_HIGHRES_SCROLLING_MODE,
1756 					  params, sizeof(params), &response);
1757 	if (ret)
1758 		return ret;
1759 	*multiplier = response.fap.params[1];
1760 	return 0;
1761 }
1762 
1763 /* -------------------------------------------------------------------------- */
1764 /* 0x2121: HiRes Wheel                                                        */
1765 /* -------------------------------------------------------------------------- */
1766 
1767 #define HIDPP_PAGE_HIRES_WHEEL		0x2121
1768 
1769 #define CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY	0x00
1770 #define CMD_HIRES_WHEEL_SET_WHEEL_MODE		0x20
1771 
hidpp_hrw_get_wheel_capability(struct hidpp_device * hidpp,u8 * multiplier)1772 static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
1773 	u8 *multiplier)
1774 {
1775 	u8 feature_index;
1776 	u8 feature_type;
1777 	int ret;
1778 	struct hidpp_report response;
1779 
1780 	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
1781 				     &feature_index, &feature_type);
1782 	if (ret)
1783 		goto return_default;
1784 
1785 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1786 					  CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY,
1787 					  NULL, 0, &response);
1788 	if (ret)
1789 		goto return_default;
1790 
1791 	*multiplier = response.fap.params[0];
1792 	return 0;
1793 return_default:
1794 	hid_warn(hidpp->hid_dev,
1795 		 "Couldn't get wheel multiplier (error %d)\n", ret);
1796 	return ret;
1797 }
1798 
hidpp_hrw_set_wheel_mode(struct hidpp_device * hidpp,bool invert,bool high_resolution,bool use_hidpp)1799 static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
1800 	bool high_resolution, bool use_hidpp)
1801 {
1802 	u8 feature_index;
1803 	u8 feature_type;
1804 	int ret;
1805 	u8 params[1];
1806 	struct hidpp_report response;
1807 
1808 	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
1809 				     &feature_index, &feature_type);
1810 	if (ret)
1811 		return ret;
1812 
1813 	params[0] = (invert          ? BIT(2) : 0) |
1814 		    (high_resolution ? BIT(1) : 0) |
1815 		    (use_hidpp       ? BIT(0) : 0);
1816 
1817 	return hidpp_send_fap_command_sync(hidpp, feature_index,
1818 					   CMD_HIRES_WHEEL_SET_WHEEL_MODE,
1819 					   params, sizeof(params), &response);
1820 }
1821 
1822 /* -------------------------------------------------------------------------- */
1823 /* 0x4301: Solar Keyboard                                                     */
1824 /* -------------------------------------------------------------------------- */
1825 
1826 #define HIDPP_PAGE_SOLAR_KEYBOARD			0x4301
1827 
1828 #define CMD_SOLAR_SET_LIGHT_MEASURE			0x00
1829 
1830 #define EVENT_SOLAR_BATTERY_BROADCAST			0x00
1831 #define EVENT_SOLAR_BATTERY_LIGHT_MEASURE		0x10
1832 #define EVENT_SOLAR_CHECK_LIGHT_BUTTON			0x20
1833 
hidpp_solar_request_battery_event(struct hidpp_device * hidpp)1834 static int hidpp_solar_request_battery_event(struct hidpp_device *hidpp)
1835 {
1836 	struct hidpp_report response;
1837 	u8 params[2] = { 1, 1 };
1838 	u8 feature_type;
1839 	int ret;
1840 
1841 	if (hidpp->battery.feature_index == 0xff) {
1842 		ret = hidpp_root_get_feature(hidpp,
1843 					     HIDPP_PAGE_SOLAR_KEYBOARD,
1844 					     &hidpp->battery.solar_feature_index,
1845 					     &feature_type);
1846 		if (ret)
1847 			return ret;
1848 	}
1849 
1850 	ret = hidpp_send_fap_command_sync(hidpp,
1851 					  hidpp->battery.solar_feature_index,
1852 					  CMD_SOLAR_SET_LIGHT_MEASURE,
1853 					  params, 2, &response);
1854 	if (ret > 0) {
1855 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1856 			__func__, ret);
1857 		return -EPROTO;
1858 	}
1859 	if (ret)
1860 		return ret;
1861 
1862 	hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
1863 
1864 	return 0;
1865 }
1866 
hidpp_solar_battery_event(struct hidpp_device * hidpp,u8 * data,int size)1867 static int hidpp_solar_battery_event(struct hidpp_device *hidpp,
1868 				     u8 *data, int size)
1869 {
1870 	struct hidpp_report *report = (struct hidpp_report *)data;
1871 	int capacity, lux, status;
1872 	u8 function;
1873 
1874 	function = report->fap.funcindex_clientid;
1875 
1876 
1877 	if (report->fap.feature_index != hidpp->battery.solar_feature_index ||
1878 	    !(function == EVENT_SOLAR_BATTERY_BROADCAST ||
1879 	      function == EVENT_SOLAR_BATTERY_LIGHT_MEASURE ||
1880 	      function == EVENT_SOLAR_CHECK_LIGHT_BUTTON))
1881 		return 0;
1882 
1883 	capacity = report->fap.params[0];
1884 
1885 	switch (function) {
1886 	case EVENT_SOLAR_BATTERY_LIGHT_MEASURE:
1887 		lux = (report->fap.params[1] << 8) | report->fap.params[2];
1888 		if (lux > 200)
1889 			status = POWER_SUPPLY_STATUS_CHARGING;
1890 		else
1891 			status = POWER_SUPPLY_STATUS_DISCHARGING;
1892 		break;
1893 	case EVENT_SOLAR_CHECK_LIGHT_BUTTON:
1894 	default:
1895 		if (capacity < hidpp->battery.capacity)
1896 			status = POWER_SUPPLY_STATUS_DISCHARGING;
1897 		else
1898 			status = POWER_SUPPLY_STATUS_CHARGING;
1899 
1900 	}
1901 
1902 	if (capacity == 100)
1903 		status = POWER_SUPPLY_STATUS_FULL;
1904 
1905 	hidpp->battery.online = true;
1906 	if (capacity != hidpp->battery.capacity ||
1907 	    status != hidpp->battery.status) {
1908 		hidpp->battery.capacity = capacity;
1909 		hidpp->battery.status = status;
1910 		if (hidpp->battery.ps)
1911 			power_supply_changed(hidpp->battery.ps);
1912 	}
1913 
1914 	return 0;
1915 }
1916 
1917 /* -------------------------------------------------------------------------- */
1918 /* 0x6010: Touchpad FW items                                                  */
1919 /* -------------------------------------------------------------------------- */
1920 
1921 #define HIDPP_PAGE_TOUCHPAD_FW_ITEMS			0x6010
1922 
1923 #define CMD_TOUCHPAD_FW_ITEMS_SET			0x10
1924 
1925 struct hidpp_touchpad_fw_items {
1926 	uint8_t presence;
1927 	uint8_t desired_state;
1928 	uint8_t state;
1929 	uint8_t persistent;
1930 };
1931 
1932 /*
1933  * send a set state command to the device by reading the current items->state
1934  * field. items is then filled with the current state.
1935  */
hidpp_touchpad_fw_items_set(struct hidpp_device * hidpp,u8 feature_index,struct hidpp_touchpad_fw_items * items)1936 static int hidpp_touchpad_fw_items_set(struct hidpp_device *hidpp,
1937 				       u8 feature_index,
1938 				       struct hidpp_touchpad_fw_items *items)
1939 {
1940 	struct hidpp_report response;
1941 	int ret;
1942 	u8 *params = (u8 *)response.fap.params;
1943 
1944 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
1945 		CMD_TOUCHPAD_FW_ITEMS_SET, &items->state, 1, &response);
1946 
1947 	if (ret > 0) {
1948 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
1949 			__func__, ret);
1950 		return -EPROTO;
1951 	}
1952 	if (ret)
1953 		return ret;
1954 
1955 	items->presence = params[0];
1956 	items->desired_state = params[1];
1957 	items->state = params[2];
1958 	items->persistent = params[3];
1959 
1960 	return 0;
1961 }
1962 
1963 /* -------------------------------------------------------------------------- */
1964 /* 0x6100: TouchPadRawXY                                                      */
1965 /* -------------------------------------------------------------------------- */
1966 
1967 #define HIDPP_PAGE_TOUCHPAD_RAW_XY			0x6100
1968 
1969 #define CMD_TOUCHPAD_GET_RAW_INFO			0x01
1970 #define CMD_TOUCHPAD_SET_RAW_REPORT_STATE		0x21
1971 
1972 #define EVENT_TOUCHPAD_RAW_XY				0x00
1973 
1974 #define TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT		0x01
1975 #define TOUCHPAD_RAW_XY_ORIGIN_UPPER_LEFT		0x03
1976 
1977 struct hidpp_touchpad_raw_info {
1978 	u16 x_size;
1979 	u16 y_size;
1980 	u8 z_range;
1981 	u8 area_range;
1982 	u8 timestamp_unit;
1983 	u8 maxcontacts;
1984 	u8 origin;
1985 	u16 res;
1986 };
1987 
1988 struct hidpp_touchpad_raw_xy_finger {
1989 	u8 contact_type;
1990 	u8 contact_status;
1991 	u16 x;
1992 	u16 y;
1993 	u8 z;
1994 	u8 area;
1995 	u8 finger_id;
1996 };
1997 
1998 struct hidpp_touchpad_raw_xy {
1999 	u16 timestamp;
2000 	struct hidpp_touchpad_raw_xy_finger fingers[2];
2001 	u8 spurious_flag;
2002 	u8 end_of_frame;
2003 	u8 finger_count;
2004 	u8 button;
2005 };
2006 
hidpp_touchpad_get_raw_info(struct hidpp_device * hidpp,u8 feature_index,struct hidpp_touchpad_raw_info * raw_info)2007 static int hidpp_touchpad_get_raw_info(struct hidpp_device *hidpp,
2008 	u8 feature_index, struct hidpp_touchpad_raw_info *raw_info)
2009 {
2010 	struct hidpp_report response;
2011 	int ret;
2012 	u8 *params = (u8 *)response.fap.params;
2013 
2014 	ret = hidpp_send_fap_command_sync(hidpp, feature_index,
2015 		CMD_TOUCHPAD_GET_RAW_INFO, NULL, 0, &response);
2016 
2017 	if (ret > 0) {
2018 		hid_err(hidpp->hid_dev, "%s: received protocol error 0x%02x\n",
2019 			__func__, ret);
2020 		return -EPROTO;
2021 	}
2022 	if (ret)
2023 		return ret;
2024 
2025 	raw_info->x_size = get_unaligned_be16(&params[0]);
2026 	raw_info->y_size = get_unaligned_be16(&params[2]);
2027 	raw_info->z_range = params[4];
2028 	raw_info->area_range = params[5];
2029 	raw_info->maxcontacts = params[7];
2030 	raw_info->origin = params[8];
2031 	/* res is given in unit per inch */
2032 	raw_info->res = get_unaligned_be16(&params[13]) * 2 / 51;
2033 
2034 	return ret;
2035 }
2036 
hidpp_touchpad_set_raw_report_state(struct hidpp_device * hidpp_dev,u8 feature_index,bool send_raw_reports,bool sensor_enhanced_settings)2037 static int hidpp_touchpad_set_raw_report_state(struct hidpp_device *hidpp_dev,
2038 		u8 feature_index, bool send_raw_reports,
2039 		bool sensor_enhanced_settings)
2040 {
2041 	struct hidpp_report response;
2042 
2043 	/*
2044 	 * Params:
2045 	 *   bit 0 - enable raw
2046 	 *   bit 1 - 16bit Z, no area
2047 	 *   bit 2 - enhanced sensitivity
2048 	 *   bit 3 - width, height (4 bits each) instead of area
2049 	 *   bit 4 - send raw + gestures (degrades smoothness)
2050 	 *   remaining bits - reserved
2051 	 */
2052 	u8 params = send_raw_reports | (sensor_enhanced_settings << 2);
2053 
2054 	return hidpp_send_fap_command_sync(hidpp_dev, feature_index,
2055 		CMD_TOUCHPAD_SET_RAW_REPORT_STATE, &params, 1, &response);
2056 }
2057 
hidpp_touchpad_touch_event(u8 * data,struct hidpp_touchpad_raw_xy_finger * finger)2058 static void hidpp_touchpad_touch_event(u8 *data,
2059 	struct hidpp_touchpad_raw_xy_finger *finger)
2060 {
2061 	u8 x_m = data[0] << 2;
2062 	u8 y_m = data[2] << 2;
2063 
2064 	finger->x = x_m << 6 | data[1];
2065 	finger->y = y_m << 6 | data[3];
2066 
2067 	finger->contact_type = data[0] >> 6;
2068 	finger->contact_status = data[2] >> 6;
2069 
2070 	finger->z = data[4];
2071 	finger->area = data[5];
2072 	finger->finger_id = data[6] >> 4;
2073 }
2074 
hidpp_touchpad_raw_xy_event(struct hidpp_device * hidpp_dev,u8 * data,struct hidpp_touchpad_raw_xy * raw_xy)2075 static void hidpp_touchpad_raw_xy_event(struct hidpp_device *hidpp_dev,
2076 		u8 *data, struct hidpp_touchpad_raw_xy *raw_xy)
2077 {
2078 	memset(raw_xy, 0, sizeof(struct hidpp_touchpad_raw_xy));
2079 	raw_xy->end_of_frame = data[8] & 0x01;
2080 	raw_xy->spurious_flag = (data[8] >> 1) & 0x01;
2081 	raw_xy->finger_count = data[15] & 0x0f;
2082 	raw_xy->button = (data[8] >> 2) & 0x01;
2083 
2084 	if (raw_xy->finger_count) {
2085 		hidpp_touchpad_touch_event(&data[2], &raw_xy->fingers[0]);
2086 		hidpp_touchpad_touch_event(&data[9], &raw_xy->fingers[1]);
2087 	}
2088 }
2089 
2090 /* -------------------------------------------------------------------------- */
2091 /* 0x8123: Force feedback support                                             */
2092 /* -------------------------------------------------------------------------- */
2093 
2094 #define HIDPP_FF_GET_INFO		0x01
2095 #define HIDPP_FF_RESET_ALL		0x11
2096 #define HIDPP_FF_DOWNLOAD_EFFECT	0x21
2097 #define HIDPP_FF_SET_EFFECT_STATE	0x31
2098 #define HIDPP_FF_DESTROY_EFFECT		0x41
2099 #define HIDPP_FF_GET_APERTURE		0x51
2100 #define HIDPP_FF_SET_APERTURE		0x61
2101 #define HIDPP_FF_GET_GLOBAL_GAINS	0x71
2102 #define HIDPP_FF_SET_GLOBAL_GAINS	0x81
2103 
2104 #define HIDPP_FF_EFFECT_STATE_GET	0x00
2105 #define HIDPP_FF_EFFECT_STATE_STOP	0x01
2106 #define HIDPP_FF_EFFECT_STATE_PLAY	0x02
2107 #define HIDPP_FF_EFFECT_STATE_PAUSE	0x03
2108 
2109 #define HIDPP_FF_EFFECT_CONSTANT	0x00
2110 #define HIDPP_FF_EFFECT_PERIODIC_SINE		0x01
2111 #define HIDPP_FF_EFFECT_PERIODIC_SQUARE		0x02
2112 #define HIDPP_FF_EFFECT_PERIODIC_TRIANGLE	0x03
2113 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP	0x04
2114 #define HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN	0x05
2115 #define HIDPP_FF_EFFECT_SPRING		0x06
2116 #define HIDPP_FF_EFFECT_DAMPER		0x07
2117 #define HIDPP_FF_EFFECT_FRICTION	0x08
2118 #define HIDPP_FF_EFFECT_INERTIA		0x09
2119 #define HIDPP_FF_EFFECT_RAMP		0x0A
2120 
2121 #define HIDPP_FF_EFFECT_AUTOSTART	0x80
2122 
2123 #define HIDPP_FF_EFFECTID_NONE		-1
2124 #define HIDPP_FF_EFFECTID_AUTOCENTER	-2
2125 #define HIDPP_AUTOCENTER_PARAMS_LENGTH	18
2126 
2127 #define HIDPP_FF_MAX_PARAMS	20
2128 #define HIDPP_FF_RESERVED_SLOTS	1
2129 
2130 struct hidpp_ff_private_data {
2131 	struct hidpp_device *hidpp;
2132 	u8 feature_index;
2133 	u8 version;
2134 	u16 gain;
2135 	s16 range;
2136 	u8 slot_autocenter;
2137 	u8 num_effects;
2138 	int *effect_ids;
2139 	struct workqueue_struct *wq;
2140 	atomic_t workqueue_size;
2141 };
2142 
2143 struct hidpp_ff_work_data {
2144 	struct work_struct work;
2145 	struct hidpp_ff_private_data *data;
2146 	int effect_id;
2147 	u8 command;
2148 	u8 params[HIDPP_FF_MAX_PARAMS];
2149 	u8 size;
2150 };
2151 
2152 static const signed short hidpp_ff_effects[] = {
2153 	FF_CONSTANT,
2154 	FF_PERIODIC,
2155 	FF_SINE,
2156 	FF_SQUARE,
2157 	FF_SAW_UP,
2158 	FF_SAW_DOWN,
2159 	FF_TRIANGLE,
2160 	FF_SPRING,
2161 	FF_DAMPER,
2162 	FF_AUTOCENTER,
2163 	FF_GAIN,
2164 	-1
2165 };
2166 
2167 static const signed short hidpp_ff_effects_v2[] = {
2168 	FF_RAMP,
2169 	FF_FRICTION,
2170 	FF_INERTIA,
2171 	-1
2172 };
2173 
2174 static const u8 HIDPP_FF_CONDITION_CMDS[] = {
2175 	HIDPP_FF_EFFECT_SPRING,
2176 	HIDPP_FF_EFFECT_FRICTION,
2177 	HIDPP_FF_EFFECT_DAMPER,
2178 	HIDPP_FF_EFFECT_INERTIA
2179 };
2180 
2181 static const char *HIDPP_FF_CONDITION_NAMES[] = {
2182 	"spring",
2183 	"friction",
2184 	"damper",
2185 	"inertia"
2186 };
2187 
2188 
hidpp_ff_find_effect(struct hidpp_ff_private_data * data,int effect_id)2189 static u8 hidpp_ff_find_effect(struct hidpp_ff_private_data *data, int effect_id)
2190 {
2191 	int i;
2192 
2193 	for (i = 0; i < data->num_effects; i++)
2194 		if (data->effect_ids[i] == effect_id)
2195 			return i+1;
2196 
2197 	return 0;
2198 }
2199 
hidpp_ff_work_handler(struct work_struct * w)2200 static void hidpp_ff_work_handler(struct work_struct *w)
2201 {
2202 	struct hidpp_ff_work_data *wd = container_of(w, struct hidpp_ff_work_data, work);
2203 	struct hidpp_ff_private_data *data = wd->data;
2204 	struct hidpp_report response;
2205 	u8 slot;
2206 	int ret;
2207 
2208 	/* add slot number if needed */
2209 	switch (wd->effect_id) {
2210 	case HIDPP_FF_EFFECTID_AUTOCENTER:
2211 		wd->params[0] = data->slot_autocenter;
2212 		break;
2213 	case HIDPP_FF_EFFECTID_NONE:
2214 		/* leave slot as zero */
2215 		break;
2216 	default:
2217 		/* find current slot for effect */
2218 		wd->params[0] = hidpp_ff_find_effect(data, wd->effect_id);
2219 		break;
2220 	}
2221 
2222 	/* send command and wait for reply */
2223 	ret = hidpp_send_fap_command_sync(data->hidpp, data->feature_index,
2224 		wd->command, wd->params, wd->size, &response);
2225 
2226 	if (ret) {
2227 		hid_err(data->hidpp->hid_dev, "Failed to send command to device!\n");
2228 		goto out;
2229 	}
2230 
2231 	/* parse return data */
2232 	switch (wd->command) {
2233 	case HIDPP_FF_DOWNLOAD_EFFECT:
2234 		slot = response.fap.params[0];
2235 		if (slot > 0 && slot <= data->num_effects) {
2236 			if (wd->effect_id >= 0)
2237 				/* regular effect uploaded */
2238 				data->effect_ids[slot-1] = wd->effect_id;
2239 			else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2240 				/* autocenter spring uploaded */
2241 				data->slot_autocenter = slot;
2242 		}
2243 		break;
2244 	case HIDPP_FF_DESTROY_EFFECT:
2245 		if (wd->effect_id >= 0)
2246 			/* regular effect destroyed */
2247 			data->effect_ids[wd->params[0]-1] = -1;
2248 		else if (wd->effect_id >= HIDPP_FF_EFFECTID_AUTOCENTER)
2249 			/* autocenter spring destoyed */
2250 			data->slot_autocenter = 0;
2251 		break;
2252 	case HIDPP_FF_SET_GLOBAL_GAINS:
2253 		data->gain = (wd->params[0] << 8) + wd->params[1];
2254 		break;
2255 	case HIDPP_FF_SET_APERTURE:
2256 		data->range = (wd->params[0] << 8) + wd->params[1];
2257 		break;
2258 	default:
2259 		/* no action needed */
2260 		break;
2261 	}
2262 
2263 out:
2264 	atomic_dec(&data->workqueue_size);
2265 	kfree(wd);
2266 }
2267 
hidpp_ff_queue_work(struct hidpp_ff_private_data * data,int effect_id,u8 command,u8 * params,u8 size)2268 static int hidpp_ff_queue_work(struct hidpp_ff_private_data *data, int effect_id, u8 command, u8 *params, u8 size)
2269 {
2270 	struct hidpp_ff_work_data *wd = kzalloc(sizeof(*wd), GFP_KERNEL);
2271 	int s;
2272 
2273 	if (!wd)
2274 		return -ENOMEM;
2275 
2276 	INIT_WORK(&wd->work, hidpp_ff_work_handler);
2277 
2278 	wd->data = data;
2279 	wd->effect_id = effect_id;
2280 	wd->command = command;
2281 	wd->size = size;
2282 	memcpy(wd->params, params, size);
2283 
2284 	s = atomic_inc_return(&data->workqueue_size);
2285 	queue_work(data->wq, &wd->work);
2286 
2287 	/* warn about excessive queue size */
2288 	if (s >= 20 && s % 20 == 0)
2289 		hid_warn(data->hidpp->hid_dev, "Force feedback command queue contains %d commands, causing substantial delays!", s);
2290 
2291 	return 0;
2292 }
2293 
hidpp_ff_upload_effect(struct input_dev * dev,struct ff_effect * effect,struct ff_effect * old)2294 static int hidpp_ff_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
2295 {
2296 	struct hidpp_ff_private_data *data = dev->ff->private;
2297 	u8 params[20];
2298 	u8 size;
2299 	int force;
2300 
2301 	/* set common parameters */
2302 	params[2] = effect->replay.length >> 8;
2303 	params[3] = effect->replay.length & 255;
2304 	params[4] = effect->replay.delay >> 8;
2305 	params[5] = effect->replay.delay & 255;
2306 
2307 	switch (effect->type) {
2308 	case FF_CONSTANT:
2309 		force = (effect->u.constant.level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2310 		params[1] = HIDPP_FF_EFFECT_CONSTANT;
2311 		params[6] = force >> 8;
2312 		params[7] = force & 255;
2313 		params[8] = effect->u.constant.envelope.attack_level >> 7;
2314 		params[9] = effect->u.constant.envelope.attack_length >> 8;
2315 		params[10] = effect->u.constant.envelope.attack_length & 255;
2316 		params[11] = effect->u.constant.envelope.fade_level >> 7;
2317 		params[12] = effect->u.constant.envelope.fade_length >> 8;
2318 		params[13] = effect->u.constant.envelope.fade_length & 255;
2319 		size = 14;
2320 		dbg_hid("Uploading constant force level=%d in dir %d = %d\n",
2321 				effect->u.constant.level,
2322 				effect->direction, force);
2323 		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2324 				effect->u.constant.envelope.attack_level,
2325 				effect->u.constant.envelope.attack_length,
2326 				effect->u.constant.envelope.fade_level,
2327 				effect->u.constant.envelope.fade_length);
2328 		break;
2329 	case FF_PERIODIC:
2330 	{
2331 		switch (effect->u.periodic.waveform) {
2332 		case FF_SINE:
2333 			params[1] = HIDPP_FF_EFFECT_PERIODIC_SINE;
2334 			break;
2335 		case FF_SQUARE:
2336 			params[1] = HIDPP_FF_EFFECT_PERIODIC_SQUARE;
2337 			break;
2338 		case FF_SAW_UP:
2339 			params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHUP;
2340 			break;
2341 		case FF_SAW_DOWN:
2342 			params[1] = HIDPP_FF_EFFECT_PERIODIC_SAWTOOTHDOWN;
2343 			break;
2344 		case FF_TRIANGLE:
2345 			params[1] = HIDPP_FF_EFFECT_PERIODIC_TRIANGLE;
2346 			break;
2347 		default:
2348 			hid_err(data->hidpp->hid_dev, "Unexpected periodic waveform type %i!\n", effect->u.periodic.waveform);
2349 			return -EINVAL;
2350 		}
2351 		force = (effect->u.periodic.magnitude * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2352 		params[6] = effect->u.periodic.magnitude >> 8;
2353 		params[7] = effect->u.periodic.magnitude & 255;
2354 		params[8] = effect->u.periodic.offset >> 8;
2355 		params[9] = effect->u.periodic.offset & 255;
2356 		params[10] = effect->u.periodic.period >> 8;
2357 		params[11] = effect->u.periodic.period & 255;
2358 		params[12] = effect->u.periodic.phase >> 8;
2359 		params[13] = effect->u.periodic.phase & 255;
2360 		params[14] = effect->u.periodic.envelope.attack_level >> 7;
2361 		params[15] = effect->u.periodic.envelope.attack_length >> 8;
2362 		params[16] = effect->u.periodic.envelope.attack_length & 255;
2363 		params[17] = effect->u.periodic.envelope.fade_level >> 7;
2364 		params[18] = effect->u.periodic.envelope.fade_length >> 8;
2365 		params[19] = effect->u.periodic.envelope.fade_length & 255;
2366 		size = 20;
2367 		dbg_hid("Uploading periodic force mag=%d/dir=%d, offset=%d, period=%d ms, phase=%d\n",
2368 				effect->u.periodic.magnitude, effect->direction,
2369 				effect->u.periodic.offset,
2370 				effect->u.periodic.period,
2371 				effect->u.periodic.phase);
2372 		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2373 				effect->u.periodic.envelope.attack_level,
2374 				effect->u.periodic.envelope.attack_length,
2375 				effect->u.periodic.envelope.fade_level,
2376 				effect->u.periodic.envelope.fade_length);
2377 		break;
2378 	}
2379 	case FF_RAMP:
2380 		params[1] = HIDPP_FF_EFFECT_RAMP;
2381 		force = (effect->u.ramp.start_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2382 		params[6] = force >> 8;
2383 		params[7] = force & 255;
2384 		force = (effect->u.ramp.end_level * fixp_sin16((effect->direction * 360) >> 16)) >> 15;
2385 		params[8] = force >> 8;
2386 		params[9] = force & 255;
2387 		params[10] = effect->u.ramp.envelope.attack_level >> 7;
2388 		params[11] = effect->u.ramp.envelope.attack_length >> 8;
2389 		params[12] = effect->u.ramp.envelope.attack_length & 255;
2390 		params[13] = effect->u.ramp.envelope.fade_level >> 7;
2391 		params[14] = effect->u.ramp.envelope.fade_length >> 8;
2392 		params[15] = effect->u.ramp.envelope.fade_length & 255;
2393 		size = 16;
2394 		dbg_hid("Uploading ramp force level=%d -> %d in dir %d = %d\n",
2395 				effect->u.ramp.start_level,
2396 				effect->u.ramp.end_level,
2397 				effect->direction, force);
2398 		dbg_hid("          envelope attack=(%d, %d ms) fade=(%d, %d ms)\n",
2399 				effect->u.ramp.envelope.attack_level,
2400 				effect->u.ramp.envelope.attack_length,
2401 				effect->u.ramp.envelope.fade_level,
2402 				effect->u.ramp.envelope.fade_length);
2403 		break;
2404 	case FF_FRICTION:
2405 	case FF_INERTIA:
2406 	case FF_SPRING:
2407 	case FF_DAMPER:
2408 		params[1] = HIDPP_FF_CONDITION_CMDS[effect->type - FF_SPRING];
2409 		params[6] = effect->u.condition[0].left_saturation >> 9;
2410 		params[7] = (effect->u.condition[0].left_saturation >> 1) & 255;
2411 		params[8] = effect->u.condition[0].left_coeff >> 8;
2412 		params[9] = effect->u.condition[0].left_coeff & 255;
2413 		params[10] = effect->u.condition[0].deadband >> 9;
2414 		params[11] = (effect->u.condition[0].deadband >> 1) & 255;
2415 		params[12] = effect->u.condition[0].center >> 8;
2416 		params[13] = effect->u.condition[0].center & 255;
2417 		params[14] = effect->u.condition[0].right_coeff >> 8;
2418 		params[15] = effect->u.condition[0].right_coeff & 255;
2419 		params[16] = effect->u.condition[0].right_saturation >> 9;
2420 		params[17] = (effect->u.condition[0].right_saturation >> 1) & 255;
2421 		size = 18;
2422 		dbg_hid("Uploading %s force left coeff=%d, left sat=%d, right coeff=%d, right sat=%d\n",
2423 				HIDPP_FF_CONDITION_NAMES[effect->type - FF_SPRING],
2424 				effect->u.condition[0].left_coeff,
2425 				effect->u.condition[0].left_saturation,
2426 				effect->u.condition[0].right_coeff,
2427 				effect->u.condition[0].right_saturation);
2428 		dbg_hid("          deadband=%d, center=%d\n",
2429 				effect->u.condition[0].deadband,
2430 				effect->u.condition[0].center);
2431 		break;
2432 	default:
2433 		hid_err(data->hidpp->hid_dev, "Unexpected force type %i!\n", effect->type);
2434 		return -EINVAL;
2435 	}
2436 
2437 	return hidpp_ff_queue_work(data, effect->id, HIDPP_FF_DOWNLOAD_EFFECT, params, size);
2438 }
2439 
hidpp_ff_playback(struct input_dev * dev,int effect_id,int value)2440 static int hidpp_ff_playback(struct input_dev *dev, int effect_id, int value)
2441 {
2442 	struct hidpp_ff_private_data *data = dev->ff->private;
2443 	u8 params[2];
2444 
2445 	params[1] = value ? HIDPP_FF_EFFECT_STATE_PLAY : HIDPP_FF_EFFECT_STATE_STOP;
2446 
2447 	dbg_hid("St%sing playback of effect %d.\n", value?"art":"opp", effect_id);
2448 
2449 	return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_SET_EFFECT_STATE, params, ARRAY_SIZE(params));
2450 }
2451 
hidpp_ff_erase_effect(struct input_dev * dev,int effect_id)2452 static int hidpp_ff_erase_effect(struct input_dev *dev, int effect_id)
2453 {
2454 	struct hidpp_ff_private_data *data = dev->ff->private;
2455 	u8 slot = 0;
2456 
2457 	dbg_hid("Erasing effect %d.\n", effect_id);
2458 
2459 	return hidpp_ff_queue_work(data, effect_id, HIDPP_FF_DESTROY_EFFECT, &slot, 1);
2460 }
2461 
hidpp_ff_set_autocenter(struct input_dev * dev,u16 magnitude)2462 static void hidpp_ff_set_autocenter(struct input_dev *dev, u16 magnitude)
2463 {
2464 	struct hidpp_ff_private_data *data = dev->ff->private;
2465 	u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH];
2466 
2467 	dbg_hid("Setting autocenter to %d.\n", magnitude);
2468 
2469 	/* start a standard spring effect */
2470 	params[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART;
2471 	/* zero delay and duration */
2472 	params[2] = params[3] = params[4] = params[5] = 0;
2473 	/* set coeff to 25% of saturation */
2474 	params[8] = params[14] = magnitude >> 11;
2475 	params[9] = params[15] = (magnitude >> 3) & 255;
2476 	params[6] = params[16] = magnitude >> 9;
2477 	params[7] = params[17] = (magnitude >> 1) & 255;
2478 	/* zero deadband and center */
2479 	params[10] = params[11] = params[12] = params[13] = 0;
2480 
2481 	hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_AUTOCENTER, HIDPP_FF_DOWNLOAD_EFFECT, params, ARRAY_SIZE(params));
2482 }
2483 
hidpp_ff_set_gain(struct input_dev * dev,u16 gain)2484 static void hidpp_ff_set_gain(struct input_dev *dev, u16 gain)
2485 {
2486 	struct hidpp_ff_private_data *data = dev->ff->private;
2487 	u8 params[4];
2488 
2489 	dbg_hid("Setting gain to %d.\n", gain);
2490 
2491 	params[0] = gain >> 8;
2492 	params[1] = gain & 255;
2493 	params[2] = 0; /* no boost */
2494 	params[3] = 0;
2495 
2496 	hidpp_ff_queue_work(data, HIDPP_FF_EFFECTID_NONE, HIDPP_FF_SET_GLOBAL_GAINS, params, ARRAY_SIZE(params));
2497 }
2498 
hidpp_ff_range_show(struct device * dev,struct device_attribute * attr,char * buf)2499 static ssize_t hidpp_ff_range_show(struct device *dev, struct device_attribute *attr, char *buf)
2500 {
2501 	struct hid_device *hid = to_hid_device(dev);
2502 	struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2503 	struct input_dev *idev = hidinput->input;
2504 	struct hidpp_ff_private_data *data = idev->ff->private;
2505 
2506 	return scnprintf(buf, PAGE_SIZE, "%u\n", data->range);
2507 }
2508 
hidpp_ff_range_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2509 static ssize_t hidpp_ff_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
2510 {
2511 	struct hid_device *hid = to_hid_device(dev);
2512 	struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2513 	struct input_dev *idev = hidinput->input;
2514 	struct hidpp_ff_private_data *data = idev->ff->private;
2515 	u8 params[2];
2516 	int range = simple_strtoul(buf, NULL, 10);
2517 
2518 	range = clamp(range, 180, 900);
2519 
2520 	params[0] = range >> 8;
2521 	params[1] = range & 0x00FF;
2522 
2523 	hidpp_ff_queue_work(data, -1, HIDPP_FF_SET_APERTURE, params, ARRAY_SIZE(params));
2524 
2525 	return count;
2526 }
2527 
2528 static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, hidpp_ff_range_show, hidpp_ff_range_store);
2529 
hidpp_ff_destroy(struct ff_device * ff)2530 static void hidpp_ff_destroy(struct ff_device *ff)
2531 {
2532 	struct hidpp_ff_private_data *data = ff->private;
2533 	struct hid_device *hid = data->hidpp->hid_dev;
2534 
2535 	hid_info(hid, "Unloading HID++ force feedback.\n");
2536 
2537 	device_remove_file(&hid->dev, &dev_attr_range);
2538 	destroy_workqueue(data->wq);
2539 	kfree(data->effect_ids);
2540 }
2541 
hidpp_ff_init(struct hidpp_device * hidpp,struct hidpp_ff_private_data * data)2542 static int hidpp_ff_init(struct hidpp_device *hidpp,
2543 			 struct hidpp_ff_private_data *data)
2544 {
2545 	struct hid_device *hid = hidpp->hid_dev;
2546 	struct hid_input *hidinput;
2547 	struct input_dev *dev;
2548 	const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor);
2549 	const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice);
2550 	struct ff_device *ff;
2551 	int error, j, num_slots = data->num_effects;
2552 	u8 version;
2553 
2554 	if (list_empty(&hid->inputs)) {
2555 		hid_err(hid, "no inputs found\n");
2556 		return -ENODEV;
2557 	}
2558 	hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2559 	dev = hidinput->input;
2560 
2561 	if (!dev) {
2562 		hid_err(hid, "Struct input_dev not set!\n");
2563 		return -EINVAL;
2564 	}
2565 
2566 	/* Get firmware release */
2567 	version = bcdDevice & 255;
2568 
2569 	/* Set supported force feedback capabilities */
2570 	for (j = 0; hidpp_ff_effects[j] >= 0; j++)
2571 		set_bit(hidpp_ff_effects[j], dev->ffbit);
2572 	if (version > 1)
2573 		for (j = 0; hidpp_ff_effects_v2[j] >= 0; j++)
2574 			set_bit(hidpp_ff_effects_v2[j], dev->ffbit);
2575 
2576 	error = input_ff_create(dev, num_slots);
2577 
2578 	if (error) {
2579 		hid_err(dev, "Failed to create FF device!\n");
2580 		return error;
2581 	}
2582 	/*
2583 	 * Create a copy of passed data, so we can transfer memory
2584 	 * ownership to FF core
2585 	 */
2586 	data = kmemdup(data, sizeof(*data), GFP_KERNEL);
2587 	if (!data)
2588 		return -ENOMEM;
2589 	data->effect_ids = kcalloc(num_slots, sizeof(int), GFP_KERNEL);
2590 	if (!data->effect_ids) {
2591 		kfree(data);
2592 		return -ENOMEM;
2593 	}
2594 	data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
2595 	if (!data->wq) {
2596 		kfree(data->effect_ids);
2597 		kfree(data);
2598 		return -ENOMEM;
2599 	}
2600 
2601 	data->hidpp = hidpp;
2602 	data->version = version;
2603 	for (j = 0; j < num_slots; j++)
2604 		data->effect_ids[j] = -1;
2605 
2606 	ff = dev->ff;
2607 	ff->private = data;
2608 
2609 	ff->upload = hidpp_ff_upload_effect;
2610 	ff->erase = hidpp_ff_erase_effect;
2611 	ff->playback = hidpp_ff_playback;
2612 	ff->set_gain = hidpp_ff_set_gain;
2613 	ff->set_autocenter = hidpp_ff_set_autocenter;
2614 	ff->destroy = hidpp_ff_destroy;
2615 
2616 	/* Create sysfs interface */
2617 	error = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
2618 	if (error)
2619 		hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d!\n", error);
2620 
2621 	/* init the hardware command queue */
2622 	atomic_set(&data->workqueue_size, 0);
2623 
2624 	hid_info(hid, "Force feedback support loaded (firmware release %d).\n",
2625 		 version);
2626 
2627 	return 0;
2628 }
2629 
2630 /* ************************************************************************** */
2631 /*                                                                            */
2632 /* Device Support                                                             */
2633 /*                                                                            */
2634 /* ************************************************************************** */
2635 
2636 /* -------------------------------------------------------------------------- */
2637 /* Touchpad HID++ devices                                                     */
2638 /* -------------------------------------------------------------------------- */
2639 
2640 #define WTP_MANUAL_RESOLUTION				39
2641 
2642 struct wtp_data {
2643 	u16 x_size, y_size;
2644 	u8 finger_count;
2645 	u8 mt_feature_index;
2646 	u8 button_feature_index;
2647 	u8 maxcontacts;
2648 	bool flip_y;
2649 	unsigned int resolution;
2650 };
2651 
wtp_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)2652 static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2653 		struct hid_field *field, struct hid_usage *usage,
2654 		unsigned long **bit, int *max)
2655 {
2656 	return -1;
2657 }
2658 
wtp_populate_input(struct hidpp_device * hidpp,struct input_dev * input_dev)2659 static void wtp_populate_input(struct hidpp_device *hidpp,
2660 			       struct input_dev *input_dev)
2661 {
2662 	struct wtp_data *wd = hidpp->private_data;
2663 
2664 	__set_bit(EV_ABS, input_dev->evbit);
2665 	__set_bit(EV_KEY, input_dev->evbit);
2666 	__clear_bit(EV_REL, input_dev->evbit);
2667 	__clear_bit(EV_LED, input_dev->evbit);
2668 
2669 	input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, wd->x_size, 0, 0);
2670 	input_abs_set_res(input_dev, ABS_MT_POSITION_X, wd->resolution);
2671 	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, wd->y_size, 0, 0);
2672 	input_abs_set_res(input_dev, ABS_MT_POSITION_Y, wd->resolution);
2673 
2674 	/* Max pressure is not given by the devices, pick one */
2675 	input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 50, 0, 0);
2676 
2677 	input_set_capability(input_dev, EV_KEY, BTN_LEFT);
2678 
2679 	if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS)
2680 		input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
2681 	else
2682 		__set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
2683 
2684 	input_mt_init_slots(input_dev, wd->maxcontacts, INPUT_MT_POINTER |
2685 		INPUT_MT_DROP_UNUSED);
2686 }
2687 
wtp_touch_event(struct hidpp_device * hidpp,struct hidpp_touchpad_raw_xy_finger * touch_report)2688 static void wtp_touch_event(struct hidpp_device *hidpp,
2689 	struct hidpp_touchpad_raw_xy_finger *touch_report)
2690 {
2691 	struct wtp_data *wd = hidpp->private_data;
2692 	int slot;
2693 
2694 	if (!touch_report->finger_id || touch_report->contact_type)
2695 		/* no actual data */
2696 		return;
2697 
2698 	slot = input_mt_get_slot_by_key(hidpp->input, touch_report->finger_id);
2699 
2700 	input_mt_slot(hidpp->input, slot);
2701 	input_mt_report_slot_state(hidpp->input, MT_TOOL_FINGER,
2702 					touch_report->contact_status);
2703 	if (touch_report->contact_status) {
2704 		input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_X,
2705 				touch_report->x);
2706 		input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_Y,
2707 				wd->flip_y ? wd->y_size - touch_report->y :
2708 					     touch_report->y);
2709 		input_event(hidpp->input, EV_ABS, ABS_MT_PRESSURE,
2710 				touch_report->area);
2711 	}
2712 }
2713 
wtp_send_raw_xy_event(struct hidpp_device * hidpp,struct hidpp_touchpad_raw_xy * raw)2714 static void wtp_send_raw_xy_event(struct hidpp_device *hidpp,
2715 		struct hidpp_touchpad_raw_xy *raw)
2716 {
2717 	int i;
2718 
2719 	for (i = 0; i < 2; i++)
2720 		wtp_touch_event(hidpp, &(raw->fingers[i]));
2721 
2722 	if (raw->end_of_frame &&
2723 	    !(hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS))
2724 		input_event(hidpp->input, EV_KEY, BTN_LEFT, raw->button);
2725 
2726 	if (raw->end_of_frame || raw->finger_count <= 2) {
2727 		input_mt_sync_frame(hidpp->input);
2728 		input_sync(hidpp->input);
2729 	}
2730 }
2731 
wtp_mouse_raw_xy_event(struct hidpp_device * hidpp,u8 * data)2732 static int wtp_mouse_raw_xy_event(struct hidpp_device *hidpp, u8 *data)
2733 {
2734 	struct wtp_data *wd = hidpp->private_data;
2735 	u8 c1_area = ((data[7] & 0xf) * (data[7] & 0xf) +
2736 		      (data[7] >> 4) * (data[7] >> 4)) / 2;
2737 	u8 c2_area = ((data[13] & 0xf) * (data[13] & 0xf) +
2738 		      (data[13] >> 4) * (data[13] >> 4)) / 2;
2739 	struct hidpp_touchpad_raw_xy raw = {
2740 		.timestamp = data[1],
2741 		.fingers = {
2742 			{
2743 				.contact_type = 0,
2744 				.contact_status = !!data[7],
2745 				.x = get_unaligned_le16(&data[3]),
2746 				.y = get_unaligned_le16(&data[5]),
2747 				.z = c1_area,
2748 				.area = c1_area,
2749 				.finger_id = data[2],
2750 			}, {
2751 				.contact_type = 0,
2752 				.contact_status = !!data[13],
2753 				.x = get_unaligned_le16(&data[9]),
2754 				.y = get_unaligned_le16(&data[11]),
2755 				.z = c2_area,
2756 				.area = c2_area,
2757 				.finger_id = data[8],
2758 			}
2759 		},
2760 		.finger_count = wd->maxcontacts,
2761 		.spurious_flag = 0,
2762 		.end_of_frame = (data[0] >> 7) == 0,
2763 		.button = data[0] & 0x01,
2764 	};
2765 
2766 	wtp_send_raw_xy_event(hidpp, &raw);
2767 
2768 	return 1;
2769 }
2770 
wtp_raw_event(struct hid_device * hdev,u8 * data,int size)2771 static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size)
2772 {
2773 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2774 	struct wtp_data *wd = hidpp->private_data;
2775 	struct hidpp_report *report = (struct hidpp_report *)data;
2776 	struct hidpp_touchpad_raw_xy raw;
2777 
2778 	if (!wd || !hidpp->input)
2779 		return 1;
2780 
2781 	switch (data[0]) {
2782 	case 0x02:
2783 		if (size < 2) {
2784 			hid_err(hdev, "Received HID report of bad size (%d)",
2785 				size);
2786 			return 1;
2787 		}
2788 		if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) {
2789 			input_event(hidpp->input, EV_KEY, BTN_LEFT,
2790 					!!(data[1] & 0x01));
2791 			input_event(hidpp->input, EV_KEY, BTN_RIGHT,
2792 					!!(data[1] & 0x02));
2793 			input_sync(hidpp->input);
2794 			return 0;
2795 		} else {
2796 			if (size < 21)
2797 				return 1;
2798 			return wtp_mouse_raw_xy_event(hidpp, &data[7]);
2799 		}
2800 	case REPORT_ID_HIDPP_LONG:
2801 		/* size is already checked in hidpp_raw_event. */
2802 		if ((report->fap.feature_index != wd->mt_feature_index) ||
2803 		    (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY))
2804 			return 1;
2805 		hidpp_touchpad_raw_xy_event(hidpp, data + 4, &raw);
2806 
2807 		wtp_send_raw_xy_event(hidpp, &raw);
2808 		return 0;
2809 	}
2810 
2811 	return 0;
2812 }
2813 
wtp_get_config(struct hidpp_device * hidpp)2814 static int wtp_get_config(struct hidpp_device *hidpp)
2815 {
2816 	struct wtp_data *wd = hidpp->private_data;
2817 	struct hidpp_touchpad_raw_info raw_info = {0};
2818 	u8 feature_type;
2819 	int ret;
2820 
2821 	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_TOUCHPAD_RAW_XY,
2822 		&wd->mt_feature_index, &feature_type);
2823 	if (ret)
2824 		/* means that the device is not powered up */
2825 		return ret;
2826 
2827 	ret = hidpp_touchpad_get_raw_info(hidpp, wd->mt_feature_index,
2828 		&raw_info);
2829 	if (ret)
2830 		return ret;
2831 
2832 	wd->x_size = raw_info.x_size;
2833 	wd->y_size = raw_info.y_size;
2834 	wd->maxcontacts = raw_info.maxcontacts;
2835 	wd->flip_y = raw_info.origin == TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT;
2836 	wd->resolution = raw_info.res;
2837 	if (!wd->resolution)
2838 		wd->resolution = WTP_MANUAL_RESOLUTION;
2839 
2840 	return 0;
2841 }
2842 
wtp_allocate(struct hid_device * hdev,const struct hid_device_id * id)2843 static int wtp_allocate(struct hid_device *hdev, const struct hid_device_id *id)
2844 {
2845 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2846 	struct wtp_data *wd;
2847 
2848 	wd = devm_kzalloc(&hdev->dev, sizeof(struct wtp_data),
2849 			GFP_KERNEL);
2850 	if (!wd)
2851 		return -ENOMEM;
2852 
2853 	hidpp->private_data = wd;
2854 
2855 	return 0;
2856 };
2857 
wtp_connect(struct hid_device * hdev,bool connected)2858 static int wtp_connect(struct hid_device *hdev, bool connected)
2859 {
2860 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2861 	struct wtp_data *wd = hidpp->private_data;
2862 	int ret;
2863 
2864 	if (!wd->x_size) {
2865 		ret = wtp_get_config(hidpp);
2866 		if (ret) {
2867 			hid_err(hdev, "Can not get wtp config: %d\n", ret);
2868 			return ret;
2869 		}
2870 	}
2871 
2872 	return hidpp_touchpad_set_raw_report_state(hidpp, wd->mt_feature_index,
2873 			true, true);
2874 }
2875 
2876 /* ------------------------------------------------------------------------- */
2877 /* Logitech M560 devices                                                     */
2878 /* ------------------------------------------------------------------------- */
2879 
2880 /*
2881  * Logitech M560 protocol overview
2882  *
2883  * The Logitech M560 mouse, is designed for windows 8. When the middle and/or
2884  * the sides buttons are pressed, it sends some keyboard keys events
2885  * instead of buttons ones.
2886  * To complicate things further, the middle button keys sequence
2887  * is different from the odd press and the even press.
2888  *
2889  * forward button -> Super_R
2890  * backward button -> Super_L+'d' (press only)
2891  * middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
2892  *                  2nd time: left-click (press only)
2893  * NB: press-only means that when the button is pressed, the
2894  * KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
2895  * together sequentially; instead when the button is released, no event is
2896  * generated !
2897  *
2898  * With the command
2899  *	10<xx>0a 3500af03 (where <xx> is the mouse id),
2900  * the mouse reacts differently:
2901  * - it never sends a keyboard key event
2902  * - for the three mouse button it sends:
2903  *	middle button               press   11<xx>0a 3500af00...
2904  *	side 1 button (forward)     press   11<xx>0a 3500b000...
2905  *	side 2 button (backward)    press   11<xx>0a 3500ae00...
2906  *	middle/side1/side2 button   release 11<xx>0a 35000000...
2907  */
2908 
2909 static const u8 m560_config_parameter[] = {0x00, 0xaf, 0x03};
2910 
2911 /* how buttons are mapped in the report */
2912 #define M560_MOUSE_BTN_LEFT		0x01
2913 #define M560_MOUSE_BTN_RIGHT		0x02
2914 #define M560_MOUSE_BTN_WHEEL_LEFT	0x08
2915 #define M560_MOUSE_BTN_WHEEL_RIGHT	0x10
2916 
2917 #define M560_SUB_ID			0x0a
2918 #define M560_BUTTON_MODE_REGISTER	0x35
2919 
m560_send_config_command(struct hid_device * hdev,bool connected)2920 static int m560_send_config_command(struct hid_device *hdev, bool connected)
2921 {
2922 	struct hidpp_report response;
2923 	struct hidpp_device *hidpp_dev;
2924 
2925 	hidpp_dev = hid_get_drvdata(hdev);
2926 
2927 	return hidpp_send_rap_command_sync(
2928 		hidpp_dev,
2929 		REPORT_ID_HIDPP_SHORT,
2930 		M560_SUB_ID,
2931 		M560_BUTTON_MODE_REGISTER,
2932 		(u8 *)m560_config_parameter,
2933 		sizeof(m560_config_parameter),
2934 		&response
2935 	);
2936 }
2937 
m560_raw_event(struct hid_device * hdev,u8 * data,int size)2938 static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
2939 {
2940 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2941 
2942 	/* sanity check */
2943 	if (!hidpp->input) {
2944 		hid_err(hdev, "error in parameter\n");
2945 		return -EINVAL;
2946 	}
2947 
2948 	if (size < 7) {
2949 		hid_err(hdev, "error in report\n");
2950 		return 0;
2951 	}
2952 
2953 	if (data[0] == REPORT_ID_HIDPP_LONG &&
2954 	    data[2] == M560_SUB_ID && data[6] == 0x00) {
2955 		/*
2956 		 * m560 mouse report for middle, forward and backward button
2957 		 *
2958 		 * data[0] = 0x11
2959 		 * data[1] = device-id
2960 		 * data[2] = 0x0a
2961 		 * data[5] = 0xaf -> middle
2962 		 *	     0xb0 -> forward
2963 		 *	     0xae -> backward
2964 		 *	     0x00 -> release all
2965 		 * data[6] = 0x00
2966 		 */
2967 
2968 		switch (data[5]) {
2969 		case 0xaf:
2970 			input_report_key(hidpp->input, BTN_MIDDLE, 1);
2971 			break;
2972 		case 0xb0:
2973 			input_report_key(hidpp->input, BTN_FORWARD, 1);
2974 			break;
2975 		case 0xae:
2976 			input_report_key(hidpp->input, BTN_BACK, 1);
2977 			break;
2978 		case 0x00:
2979 			input_report_key(hidpp->input, BTN_BACK, 0);
2980 			input_report_key(hidpp->input, BTN_FORWARD, 0);
2981 			input_report_key(hidpp->input, BTN_MIDDLE, 0);
2982 			break;
2983 		default:
2984 			hid_err(hdev, "error in report\n");
2985 			return 0;
2986 		}
2987 		input_sync(hidpp->input);
2988 
2989 	} else if (data[0] == 0x02) {
2990 		/*
2991 		 * Logitech M560 mouse report
2992 		 *
2993 		 * data[0] = type (0x02)
2994 		 * data[1..2] = buttons
2995 		 * data[3..5] = xy
2996 		 * data[6] = wheel
2997 		 */
2998 
2999 		int v;
3000 
3001 		input_report_key(hidpp->input, BTN_LEFT,
3002 			!!(data[1] & M560_MOUSE_BTN_LEFT));
3003 		input_report_key(hidpp->input, BTN_RIGHT,
3004 			!!(data[1] & M560_MOUSE_BTN_RIGHT));
3005 
3006 		if (data[1] & M560_MOUSE_BTN_WHEEL_LEFT) {
3007 			input_report_rel(hidpp->input, REL_HWHEEL, -1);
3008 			input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3009 					 -120);
3010 		} else if (data[1] & M560_MOUSE_BTN_WHEEL_RIGHT) {
3011 			input_report_rel(hidpp->input, REL_HWHEEL, 1);
3012 			input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3013 					 120);
3014 		}
3015 
3016 		v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
3017 		input_report_rel(hidpp->input, REL_X, v);
3018 
3019 		v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
3020 		input_report_rel(hidpp->input, REL_Y, v);
3021 
3022 		v = hid_snto32(data[6], 8);
3023 		if (v != 0)
3024 			hidpp_scroll_counter_handle_scroll(hidpp->input,
3025 					&hidpp->vertical_wheel_counter, v);
3026 
3027 		input_sync(hidpp->input);
3028 	}
3029 
3030 	return 1;
3031 }
3032 
m560_populate_input(struct hidpp_device * hidpp,struct input_dev * input_dev)3033 static void m560_populate_input(struct hidpp_device *hidpp,
3034 				struct input_dev *input_dev)
3035 {
3036 	__set_bit(EV_KEY, input_dev->evbit);
3037 	__set_bit(BTN_MIDDLE, input_dev->keybit);
3038 	__set_bit(BTN_RIGHT, input_dev->keybit);
3039 	__set_bit(BTN_LEFT, input_dev->keybit);
3040 	__set_bit(BTN_BACK, input_dev->keybit);
3041 	__set_bit(BTN_FORWARD, input_dev->keybit);
3042 
3043 	__set_bit(EV_REL, input_dev->evbit);
3044 	__set_bit(REL_X, input_dev->relbit);
3045 	__set_bit(REL_Y, input_dev->relbit);
3046 	__set_bit(REL_WHEEL, input_dev->relbit);
3047 	__set_bit(REL_HWHEEL, input_dev->relbit);
3048 	__set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3049 	__set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3050 }
3051 
m560_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)3052 static int m560_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3053 		struct hid_field *field, struct hid_usage *usage,
3054 		unsigned long **bit, int *max)
3055 {
3056 	return -1;
3057 }
3058 
3059 /* ------------------------------------------------------------------------- */
3060 /* Logitech K400 devices                                                     */
3061 /* ------------------------------------------------------------------------- */
3062 
3063 /*
3064  * The Logitech K400 keyboard has an embedded touchpad which is seen
3065  * as a mouse from the OS point of view. There is a hardware shortcut to disable
3066  * tap-to-click but the setting is not remembered accross reset, annoying some
3067  * users.
3068  *
3069  * We can toggle this feature from the host by using the feature 0x6010:
3070  * Touchpad FW items
3071  */
3072 
3073 struct k400_private_data {
3074 	u8 feature_index;
3075 };
3076 
k400_disable_tap_to_click(struct hidpp_device * hidpp)3077 static int k400_disable_tap_to_click(struct hidpp_device *hidpp)
3078 {
3079 	struct k400_private_data *k400 = hidpp->private_data;
3080 	struct hidpp_touchpad_fw_items items = {};
3081 	int ret;
3082 	u8 feature_type;
3083 
3084 	if (!k400->feature_index) {
3085 		ret = hidpp_root_get_feature(hidpp,
3086 			HIDPP_PAGE_TOUCHPAD_FW_ITEMS,
3087 			&k400->feature_index, &feature_type);
3088 		if (ret)
3089 			/* means that the device is not powered up */
3090 			return ret;
3091 	}
3092 
3093 	ret = hidpp_touchpad_fw_items_set(hidpp, k400->feature_index, &items);
3094 	if (ret)
3095 		return ret;
3096 
3097 	return 0;
3098 }
3099 
k400_allocate(struct hid_device * hdev)3100 static int k400_allocate(struct hid_device *hdev)
3101 {
3102 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3103 	struct k400_private_data *k400;
3104 
3105 	k400 = devm_kzalloc(&hdev->dev, sizeof(struct k400_private_data),
3106 			    GFP_KERNEL);
3107 	if (!k400)
3108 		return -ENOMEM;
3109 
3110 	hidpp->private_data = k400;
3111 
3112 	return 0;
3113 };
3114 
k400_connect(struct hid_device * hdev,bool connected)3115 static int k400_connect(struct hid_device *hdev, bool connected)
3116 {
3117 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3118 
3119 	if (!disable_tap_to_click)
3120 		return 0;
3121 
3122 	return k400_disable_tap_to_click(hidpp);
3123 }
3124 
3125 /* ------------------------------------------------------------------------- */
3126 /* Logitech G920 Driving Force Racing Wheel for Xbox One                     */
3127 /* ------------------------------------------------------------------------- */
3128 
3129 #define HIDPP_PAGE_G920_FORCE_FEEDBACK			0x8123
3130 
g920_ff_set_autocenter(struct hidpp_device * hidpp,struct hidpp_ff_private_data * data)3131 static int g920_ff_set_autocenter(struct hidpp_device *hidpp,
3132 				  struct hidpp_ff_private_data *data)
3133 {
3134 	struct hidpp_report response;
3135 	u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH] = {
3136 		[1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART,
3137 	};
3138 	int ret;
3139 
3140 	/* initialize with zero autocenter to get wheel in usable state */
3141 
3142 	dbg_hid("Setting autocenter to 0.\n");
3143 	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3144 					  HIDPP_FF_DOWNLOAD_EFFECT,
3145 					  params, ARRAY_SIZE(params),
3146 					  &response);
3147 	if (ret)
3148 		hid_warn(hidpp->hid_dev, "Failed to autocenter device!\n");
3149 	else
3150 		data->slot_autocenter = response.fap.params[0];
3151 
3152 	return ret;
3153 }
3154 
g920_get_config(struct hidpp_device * hidpp,struct hidpp_ff_private_data * data)3155 static int g920_get_config(struct hidpp_device *hidpp,
3156 			   struct hidpp_ff_private_data *data)
3157 {
3158 	struct hidpp_report response;
3159 	u8 feature_type;
3160 	int ret;
3161 
3162 	memset(data, 0, sizeof(*data));
3163 
3164 	/* Find feature and store for later use */
3165 	ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
3166 				     &data->feature_index, &feature_type);
3167 	if (ret)
3168 		return ret;
3169 
3170 	/* Read number of slots available in device */
3171 	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3172 					  HIDPP_FF_GET_INFO,
3173 					  NULL, 0,
3174 					  &response);
3175 	if (ret) {
3176 		if (ret < 0)
3177 			return ret;
3178 		hid_err(hidpp->hid_dev,
3179 			"%s: received protocol error 0x%02x\n", __func__, ret);
3180 		return -EPROTO;
3181 	}
3182 
3183 	data->num_effects = response.fap.params[0] - HIDPP_FF_RESERVED_SLOTS;
3184 
3185 	/* reset all forces */
3186 	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3187 					  HIDPP_FF_RESET_ALL,
3188 					  NULL, 0,
3189 					  &response);
3190 	if (ret)
3191 		hid_warn(hidpp->hid_dev, "Failed to reset all forces!\n");
3192 
3193 	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3194 					  HIDPP_FF_GET_APERTURE,
3195 					  NULL, 0,
3196 					  &response);
3197 	if (ret) {
3198 		hid_warn(hidpp->hid_dev,
3199 			 "Failed to read range from device!\n");
3200 	}
3201 	data->range = ret ?
3202 		900 : get_unaligned_be16(&response.fap.params[0]);
3203 
3204 	/* Read the current gain values */
3205 	ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3206 					  HIDPP_FF_GET_GLOBAL_GAINS,
3207 					  NULL, 0,
3208 					  &response);
3209 	if (ret)
3210 		hid_warn(hidpp->hid_dev,
3211 			 "Failed to read gain values from device!\n");
3212 	data->gain = ret ?
3213 		0xffff : get_unaligned_be16(&response.fap.params[0]);
3214 
3215 	/* ignore boost value at response.fap.params[2] */
3216 
3217 	return g920_ff_set_autocenter(hidpp, data);
3218 }
3219 
3220 /* -------------------------------------------------------------------------- */
3221 /* Logitech Dinovo Mini keyboard with builtin touchpad                        */
3222 /* -------------------------------------------------------------------------- */
3223 #define DINOVO_MINI_PRODUCT_ID		0xb30c
3224 
lg_dinovo_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)3225 static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3226 		struct hid_field *field, struct hid_usage *usage,
3227 		unsigned long **bit, int *max)
3228 {
3229 	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
3230 		return 0;
3231 
3232 	switch (usage->hid & HID_USAGE) {
3233 	case 0x00d: lg_map_key_clear(KEY_MEDIA);	break;
3234 	default:
3235 		return 0;
3236 	}
3237 	return 1;
3238 }
3239 
3240 /* -------------------------------------------------------------------------- */
3241 /* HID++1.0 devices which use HID++ reports for their wheels                  */
3242 /* -------------------------------------------------------------------------- */
hidpp10_wheel_connect(struct hidpp_device * hidpp)3243 static int hidpp10_wheel_connect(struct hidpp_device *hidpp)
3244 {
3245 	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3246 			HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT,
3247 			HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT);
3248 }
3249 
hidpp10_wheel_raw_event(struct hidpp_device * hidpp,u8 * data,int size)3250 static int hidpp10_wheel_raw_event(struct hidpp_device *hidpp,
3251 				   u8 *data, int size)
3252 {
3253 	s8 value, hvalue;
3254 
3255 	if (!hidpp->input)
3256 		return -EINVAL;
3257 
3258 	if (size < 7)
3259 		return 0;
3260 
3261 	if (data[0] != REPORT_ID_HIDPP_SHORT || data[2] != HIDPP_SUB_ID_ROLLER)
3262 		return 0;
3263 
3264 	value = data[3];
3265 	hvalue = data[4];
3266 
3267 	input_report_rel(hidpp->input, REL_WHEEL, value);
3268 	input_report_rel(hidpp->input, REL_WHEEL_HI_RES, value * 120);
3269 	input_report_rel(hidpp->input, REL_HWHEEL, hvalue);
3270 	input_report_rel(hidpp->input, REL_HWHEEL_HI_RES, hvalue * 120);
3271 	input_sync(hidpp->input);
3272 
3273 	return 1;
3274 }
3275 
hidpp10_wheel_populate_input(struct hidpp_device * hidpp,struct input_dev * input_dev)3276 static void hidpp10_wheel_populate_input(struct hidpp_device *hidpp,
3277 					 struct input_dev *input_dev)
3278 {
3279 	__set_bit(EV_REL, input_dev->evbit);
3280 	__set_bit(REL_WHEEL, input_dev->relbit);
3281 	__set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3282 	__set_bit(REL_HWHEEL, input_dev->relbit);
3283 	__set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3284 }
3285 
3286 /* -------------------------------------------------------------------------- */
3287 /* HID++1.0 mice which use HID++ reports for extra mouse buttons              */
3288 /* -------------------------------------------------------------------------- */
hidpp10_extra_mouse_buttons_connect(struct hidpp_device * hidpp)3289 static int hidpp10_extra_mouse_buttons_connect(struct hidpp_device *hidpp)
3290 {
3291 	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3292 				    HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT,
3293 				    HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT);
3294 }
3295 
hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device * hidpp,u8 * data,int size)3296 static int hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
3297 				    u8 *data, int size)
3298 {
3299 	int i;
3300 
3301 	if (!hidpp->input)
3302 		return -EINVAL;
3303 
3304 	if (size < 7)
3305 		return 0;
3306 
3307 	if (data[0] != REPORT_ID_HIDPP_SHORT ||
3308 	    data[2] != HIDPP_SUB_ID_MOUSE_EXTRA_BTNS)
3309 		return 0;
3310 
3311 	/*
3312 	 * Buttons are either delivered through the regular mouse report *or*
3313 	 * through the extra buttons report. At least for button 6 how it is
3314 	 * delivered differs per receiver firmware version. Even receivers with
3315 	 * the same usb-id show different behavior, so we handle both cases.
3316 	 */
3317 	for (i = 0; i < 8; i++)
3318 		input_report_key(hidpp->input, BTN_MOUSE + i,
3319 				 (data[3] & (1 << i)));
3320 
3321 	/* Some mice report events on button 9+, use BTN_MISC */
3322 	for (i = 0; i < 8; i++)
3323 		input_report_key(hidpp->input, BTN_MISC + i,
3324 				 (data[4] & (1 << i)));
3325 
3326 	input_sync(hidpp->input);
3327 	return 1;
3328 }
3329 
hidpp10_extra_mouse_buttons_populate_input(struct hidpp_device * hidpp,struct input_dev * input_dev)3330 static void hidpp10_extra_mouse_buttons_populate_input(
3331 			struct hidpp_device *hidpp, struct input_dev *input_dev)
3332 {
3333 	/* BTN_MOUSE - BTN_MOUSE+7 are set already by the descriptor */
3334 	__set_bit(BTN_0, input_dev->keybit);
3335 	__set_bit(BTN_1, input_dev->keybit);
3336 	__set_bit(BTN_2, input_dev->keybit);
3337 	__set_bit(BTN_3, input_dev->keybit);
3338 	__set_bit(BTN_4, input_dev->keybit);
3339 	__set_bit(BTN_5, input_dev->keybit);
3340 	__set_bit(BTN_6, input_dev->keybit);
3341 	__set_bit(BTN_7, input_dev->keybit);
3342 }
3343 
3344 /* -------------------------------------------------------------------------- */
3345 /* HID++1.0 kbds which only report 0x10xx consumer usages through sub-id 0x03 */
3346 /* -------------------------------------------------------------------------- */
3347 
3348 /* Find the consumer-page input report desc and change Maximums to 0x107f */
hidpp10_consumer_keys_report_fixup(struct hidpp_device * hidpp,u8 * _rdesc,unsigned int * rsize)3349 static u8 *hidpp10_consumer_keys_report_fixup(struct hidpp_device *hidpp,
3350 					      u8 *_rdesc, unsigned int *rsize)
3351 {
3352 	/* Note 0 terminated so we can use strnstr to search for this. */
3353 	static const char consumer_rdesc_start[] = {
3354 		0x05, 0x0C,	/* USAGE_PAGE (Consumer Devices)       */
3355 		0x09, 0x01,	/* USAGE (Consumer Control)            */
3356 		0xA1, 0x01,	/* COLLECTION (Application)            */
3357 		0x85, 0x03,	/* REPORT_ID = 3                       */
3358 		0x75, 0x10,	/* REPORT_SIZE (16)                    */
3359 		0x95, 0x02,	/* REPORT_COUNT (2)                    */
3360 		0x15, 0x01,	/* LOGICAL_MIN (1)                     */
3361 		0x26, 0x00	/* LOGICAL_MAX (...                    */
3362 	};
3363 	char *consumer_rdesc, *rdesc = (char *)_rdesc;
3364 	unsigned int size;
3365 
3366 	consumer_rdesc = strnstr(rdesc, consumer_rdesc_start, *rsize);
3367 	size = *rsize - (consumer_rdesc - rdesc);
3368 	if (consumer_rdesc && size >= 25) {
3369 		consumer_rdesc[15] = 0x7f;
3370 		consumer_rdesc[16] = 0x10;
3371 		consumer_rdesc[20] = 0x7f;
3372 		consumer_rdesc[21] = 0x10;
3373 	}
3374 	return _rdesc;
3375 }
3376 
hidpp10_consumer_keys_connect(struct hidpp_device * hidpp)3377 static int hidpp10_consumer_keys_connect(struct hidpp_device *hidpp)
3378 {
3379 	return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3380 				    HIDPP_ENABLE_CONSUMER_REPORT,
3381 				    HIDPP_ENABLE_CONSUMER_REPORT);
3382 }
3383 
hidpp10_consumer_keys_raw_event(struct hidpp_device * hidpp,u8 * data,int size)3384 static int hidpp10_consumer_keys_raw_event(struct hidpp_device *hidpp,
3385 					   u8 *data, int size)
3386 {
3387 	u8 consumer_report[5];
3388 
3389 	if (size < 7)
3390 		return 0;
3391 
3392 	if (data[0] != REPORT_ID_HIDPP_SHORT ||
3393 	    data[2] != HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS)
3394 		return 0;
3395 
3396 	/*
3397 	 * Build a normal consumer report (3) out of the data, this detour
3398 	 * is necessary to get some keyboards to report their 0x10xx usages.
3399 	 */
3400 	consumer_report[0] = 0x03;
3401 	memcpy(&consumer_report[1], &data[3], 4);
3402 	/* We are called from atomic context */
3403 	hid_report_raw_event(hidpp->hid_dev, HID_INPUT_REPORT,
3404 			     consumer_report, 5, 1);
3405 
3406 	return 1;
3407 }
3408 
3409 /* -------------------------------------------------------------------------- */
3410 /* High-resolution scroll wheels                                              */
3411 /* -------------------------------------------------------------------------- */
3412 
hi_res_scroll_enable(struct hidpp_device * hidpp)3413 static int hi_res_scroll_enable(struct hidpp_device *hidpp)
3414 {
3415 	int ret;
3416 	u8 multiplier = 1;
3417 
3418 	if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_X2121) {
3419 		ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
3420 		if (ret == 0)
3421 			ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
3422 	} else if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_X2120) {
3423 		ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
3424 							   &multiplier);
3425 	} else /* if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL_1P0) */ {
3426 		ret = hidpp10_enable_scrolling_acceleration(hidpp);
3427 		multiplier = 8;
3428 	}
3429 	if (ret)
3430 		return ret;
3431 
3432 	if (multiplier == 0)
3433 		multiplier = 1;
3434 
3435 	hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
3436 	hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
3437 	return 0;
3438 }
3439 
3440 /* -------------------------------------------------------------------------- */
3441 /* Generic HID++ devices                                                      */
3442 /* -------------------------------------------------------------------------- */
3443 
hidpp_report_fixup(struct hid_device * hdev,u8 * rdesc,unsigned int * rsize)3444 static u8 *hidpp_report_fixup(struct hid_device *hdev, u8 *rdesc,
3445 			      unsigned int *rsize)
3446 {
3447 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3448 
3449 	if (!hidpp)
3450 		return rdesc;
3451 
3452 	/* For 27 MHz keyboards the quirk gets set after hid_parse. */
3453 	if (hdev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE ||
3454 	    (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS))
3455 		rdesc = hidpp10_consumer_keys_report_fixup(hidpp, rdesc, rsize);
3456 
3457 	return rdesc;
3458 }
3459 
hidpp_input_mapping(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)3460 static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3461 		struct hid_field *field, struct hid_usage *usage,
3462 		unsigned long **bit, int *max)
3463 {
3464 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3465 
3466 	if (!hidpp)
3467 		return 0;
3468 
3469 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3470 		return wtp_input_mapping(hdev, hi, field, usage, bit, max);
3471 	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 &&
3472 			field->application != HID_GD_MOUSE)
3473 		return m560_input_mapping(hdev, hi, field, usage, bit, max);
3474 
3475 	if (hdev->product == DINOVO_MINI_PRODUCT_ID)
3476 		return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
3477 
3478 	return 0;
3479 }
3480 
hidpp_input_mapped(struct hid_device * hdev,struct hid_input * hi,struct hid_field * field,struct hid_usage * usage,unsigned long ** bit,int * max)3481 static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
3482 		struct hid_field *field, struct hid_usage *usage,
3483 		unsigned long **bit, int *max)
3484 {
3485 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3486 
3487 	if (!hidpp)
3488 		return 0;
3489 
3490 	/* Ensure that Logitech G920 is not given a default fuzz/flat value */
3491 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
3492 		if (usage->type == EV_ABS && (usage->code == ABS_X ||
3493 				usage->code == ABS_Y || usage->code == ABS_Z ||
3494 				usage->code == ABS_RZ)) {
3495 			field->application = HID_GD_MULTIAXIS;
3496 		}
3497 	}
3498 
3499 	return 0;
3500 }
3501 
3502 
hidpp_populate_input(struct hidpp_device * hidpp,struct input_dev * input)3503 static void hidpp_populate_input(struct hidpp_device *hidpp,
3504 				 struct input_dev *input)
3505 {
3506 	hidpp->input = input;
3507 
3508 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3509 		wtp_populate_input(hidpp, input);
3510 	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3511 		m560_populate_input(hidpp, input);
3512 
3513 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS)
3514 		hidpp10_wheel_populate_input(hidpp, input);
3515 
3516 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS)
3517 		hidpp10_extra_mouse_buttons_populate_input(hidpp, input);
3518 }
3519 
hidpp_input_configured(struct hid_device * hdev,struct hid_input * hidinput)3520 static int hidpp_input_configured(struct hid_device *hdev,
3521 				struct hid_input *hidinput)
3522 {
3523 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3524 	struct input_dev *input = hidinput->input;
3525 
3526 	if (!hidpp)
3527 		return 0;
3528 
3529 	hidpp_populate_input(hidpp, input);
3530 
3531 	return 0;
3532 }
3533 
hidpp_raw_hidpp_event(struct hidpp_device * hidpp,u8 * data,int size)3534 static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
3535 		int size)
3536 {
3537 	struct hidpp_report *question = hidpp->send_receive_buf;
3538 	struct hidpp_report *answer = hidpp->send_receive_buf;
3539 	struct hidpp_report *report = (struct hidpp_report *)data;
3540 	int ret;
3541 
3542 	/*
3543 	 * If the mutex is locked then we have a pending answer from a
3544 	 * previously sent command.
3545 	 */
3546 	if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
3547 		/*
3548 		 * Check for a correct hidpp20 answer or the corresponding
3549 		 * error
3550 		 */
3551 		if (hidpp_match_answer(question, report) ||
3552 				hidpp_match_error(question, report)) {
3553 			*answer = *report;
3554 			hidpp->answer_available = true;
3555 			wake_up(&hidpp->wait);
3556 			/*
3557 			 * This was an answer to a command that this driver sent
3558 			 * We return 1 to hid-core to avoid forwarding the
3559 			 * command upstream as it has been treated by the driver
3560 			 */
3561 
3562 			return 1;
3563 		}
3564 	}
3565 
3566 	if (unlikely(hidpp_report_is_connect_event(hidpp, report))) {
3567 		atomic_set(&hidpp->connected,
3568 				!(report->rap.params[0] & (1 << 6)));
3569 		if (schedule_work(&hidpp->work) == 0)
3570 			dbg_hid("%s: connect event already queued\n", __func__);
3571 		return 1;
3572 	}
3573 
3574 	if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
3575 	    data[0] == REPORT_ID_HIDPP_SHORT &&
3576 	    data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
3577 	    (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
3578 		dev_err_ratelimited(&hidpp->hid_dev->dev,
3579 			"Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
3580 		dev_err_ratelimited(&hidpp->hid_dev->dev,
3581 			"See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
3582 	}
3583 
3584 	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3585 		ret = hidpp20_battery_event_1000(hidpp, data, size);
3586 		if (ret != 0)
3587 			return ret;
3588 		ret = hidpp20_battery_event_1004(hidpp, data, size);
3589 		if (ret != 0)
3590 			return ret;
3591 		ret = hidpp_solar_battery_event(hidpp, data, size);
3592 		if (ret != 0)
3593 			return ret;
3594 		ret = hidpp20_battery_voltage_event(hidpp, data, size);
3595 		if (ret != 0)
3596 			return ret;
3597 	}
3598 
3599 	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3600 		ret = hidpp10_battery_event(hidpp, data, size);
3601 		if (ret != 0)
3602 			return ret;
3603 	}
3604 
3605 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3606 		ret = hidpp10_wheel_raw_event(hidpp, data, size);
3607 		if (ret != 0)
3608 			return ret;
3609 	}
3610 
3611 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3612 		ret = hidpp10_extra_mouse_buttons_raw_event(hidpp, data, size);
3613 		if (ret != 0)
3614 			return ret;
3615 	}
3616 
3617 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3618 		ret = hidpp10_consumer_keys_raw_event(hidpp, data, size);
3619 		if (ret != 0)
3620 			return ret;
3621 	}
3622 
3623 	return 0;
3624 }
3625 
hidpp_raw_event(struct hid_device * hdev,struct hid_report * report,u8 * data,int size)3626 static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
3627 		u8 *data, int size)
3628 {
3629 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3630 	int ret = 0;
3631 
3632 	if (!hidpp)
3633 		return 0;
3634 
3635 	/* Generic HID++ processing. */
3636 	switch (data[0]) {
3637 	case REPORT_ID_HIDPP_VERY_LONG:
3638 		if (size != hidpp->very_long_report_length) {
3639 			hid_err(hdev, "received hid++ report of bad size (%d)",
3640 				size);
3641 			return 1;
3642 		}
3643 		ret = hidpp_raw_hidpp_event(hidpp, data, size);
3644 		break;
3645 	case REPORT_ID_HIDPP_LONG:
3646 		if (size != HIDPP_REPORT_LONG_LENGTH) {
3647 			hid_err(hdev, "received hid++ report of bad size (%d)",
3648 				size);
3649 			return 1;
3650 		}
3651 		ret = hidpp_raw_hidpp_event(hidpp, data, size);
3652 		break;
3653 	case REPORT_ID_HIDPP_SHORT:
3654 		if (size != HIDPP_REPORT_SHORT_LENGTH) {
3655 			hid_err(hdev, "received hid++ report of bad size (%d)",
3656 				size);
3657 			return 1;
3658 		}
3659 		ret = hidpp_raw_hidpp_event(hidpp, data, size);
3660 		break;
3661 	}
3662 
3663 	/* If no report is available for further processing, skip calling
3664 	 * raw_event of subclasses. */
3665 	if (ret != 0)
3666 		return ret;
3667 
3668 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3669 		return wtp_raw_event(hdev, data, size);
3670 	else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3671 		return m560_raw_event(hdev, data, size);
3672 
3673 	return 0;
3674 }
3675 
hidpp_event(struct hid_device * hdev,struct hid_field * field,struct hid_usage * usage,__s32 value)3676 static int hidpp_event(struct hid_device *hdev, struct hid_field *field,
3677 	struct hid_usage *usage, __s32 value)
3678 {
3679 	/* This function will only be called for scroll events, due to the
3680 	 * restriction imposed in hidpp_usages.
3681 	 */
3682 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3683 	struct hidpp_scroll_counter *counter;
3684 
3685 	if (!hidpp)
3686 		return 0;
3687 
3688 	counter = &hidpp->vertical_wheel_counter;
3689 	/* A scroll event may occur before the multiplier has been retrieved or
3690 	 * the input device set, or high-res scroll enabling may fail. In such
3691 	 * cases we must return early (falling back to default behaviour) to
3692 	 * avoid a crash in hidpp_scroll_counter_handle_scroll.
3693 	 */
3694 	if (!(hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL) || value == 0
3695 	    || hidpp->input == NULL || counter->wheel_multiplier == 0)
3696 		return 0;
3697 
3698 	hidpp_scroll_counter_handle_scroll(hidpp->input, counter, value);
3699 	return 1;
3700 }
3701 
hidpp_initialize_battery(struct hidpp_device * hidpp)3702 static int hidpp_initialize_battery(struct hidpp_device *hidpp)
3703 {
3704 	static atomic_t battery_no = ATOMIC_INIT(0);
3705 	struct power_supply_config cfg = { .drv_data = hidpp };
3706 	struct power_supply_desc *desc = &hidpp->battery.desc;
3707 	enum power_supply_property *battery_props;
3708 	struct hidpp_battery *battery;
3709 	unsigned int num_battery_props;
3710 	unsigned long n;
3711 	int ret;
3712 
3713 	if (hidpp->battery.ps)
3714 		return 0;
3715 
3716 	hidpp->battery.feature_index = 0xff;
3717 	hidpp->battery.solar_feature_index = 0xff;
3718 	hidpp->battery.voltage_feature_index = 0xff;
3719 
3720 	if (hidpp->protocol_major >= 2) {
3721 		if (hidpp->quirks & HIDPP_QUIRK_CLASS_K750)
3722 			ret = hidpp_solar_request_battery_event(hidpp);
3723 		else {
3724 			/* we only support one battery feature right now, so let's
3725 			   first check the ones that support battery level first
3726 			   and leave voltage for last */
3727 			ret = hidpp20_query_battery_info_1000(hidpp);
3728 			if (ret)
3729 				ret = hidpp20_query_battery_info_1004(hidpp);
3730 			if (ret)
3731 				ret = hidpp20_query_battery_voltage_info(hidpp);
3732 		}
3733 
3734 		if (ret)
3735 			return ret;
3736 		hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_BATTERY;
3737 	} else {
3738 		ret = hidpp10_query_battery_status(hidpp);
3739 		if (ret) {
3740 			ret = hidpp10_query_battery_mileage(hidpp);
3741 			if (ret)
3742 				return -ENOENT;
3743 			hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
3744 		} else {
3745 			hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
3746 		}
3747 		hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_BATTERY;
3748 	}
3749 
3750 	battery_props = devm_kmemdup(&hidpp->hid_dev->dev,
3751 				     hidpp_battery_props,
3752 				     sizeof(hidpp_battery_props),
3753 				     GFP_KERNEL);
3754 	if (!battery_props)
3755 		return -ENOMEM;
3756 
3757 	num_battery_props = ARRAY_SIZE(hidpp_battery_props) - 3;
3758 
3759 	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE ||
3760 	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE ||
3761 	    hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3762 		battery_props[num_battery_props++] =
3763 				POWER_SUPPLY_PROP_CAPACITY;
3764 
3765 	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS)
3766 		battery_props[num_battery_props++] =
3767 				POWER_SUPPLY_PROP_CAPACITY_LEVEL;
3768 
3769 	if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3770 		battery_props[num_battery_props++] =
3771 			POWER_SUPPLY_PROP_VOLTAGE_NOW;
3772 
3773 	battery = &hidpp->battery;
3774 
3775 	n = atomic_inc_return(&battery_no) - 1;
3776 	desc->properties = battery_props;
3777 	desc->num_properties = num_battery_props;
3778 	desc->get_property = hidpp_battery_get_property;
3779 	sprintf(battery->name, "hidpp_battery_%ld", n);
3780 	desc->name = battery->name;
3781 	desc->type = POWER_SUPPLY_TYPE_BATTERY;
3782 	desc->use_for_apm = 0;
3783 
3784 	battery->ps = devm_power_supply_register(&hidpp->hid_dev->dev,
3785 						 &battery->desc,
3786 						 &cfg);
3787 	if (IS_ERR(battery->ps))
3788 		return PTR_ERR(battery->ps);
3789 
3790 	power_supply_powers(battery->ps, &hidpp->hid_dev->dev);
3791 
3792 	return ret;
3793 }
3794 
hidpp_overwrite_name(struct hid_device * hdev)3795 static void hidpp_overwrite_name(struct hid_device *hdev)
3796 {
3797 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3798 	char *name;
3799 
3800 	if (hidpp->protocol_major < 2)
3801 		return;
3802 
3803 	name = hidpp_get_device_name(hidpp);
3804 
3805 	if (!name) {
3806 		hid_err(hdev, "unable to retrieve the name of the device");
3807 	} else {
3808 		dbg_hid("HID++: Got name: %s\n", name);
3809 		snprintf(hdev->name, sizeof(hdev->name), "%s", name);
3810 	}
3811 
3812 	kfree(name);
3813 }
3814 
hidpp_input_open(struct input_dev * dev)3815 static int hidpp_input_open(struct input_dev *dev)
3816 {
3817 	struct hid_device *hid = input_get_drvdata(dev);
3818 
3819 	return hid_hw_open(hid);
3820 }
3821 
hidpp_input_close(struct input_dev * dev)3822 static void hidpp_input_close(struct input_dev *dev)
3823 {
3824 	struct hid_device *hid = input_get_drvdata(dev);
3825 
3826 	hid_hw_close(hid);
3827 }
3828 
hidpp_allocate_input(struct hid_device * hdev)3829 static struct input_dev *hidpp_allocate_input(struct hid_device *hdev)
3830 {
3831 	struct input_dev *input_dev = devm_input_allocate_device(&hdev->dev);
3832 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3833 
3834 	if (!input_dev)
3835 		return NULL;
3836 
3837 	input_set_drvdata(input_dev, hdev);
3838 	input_dev->open = hidpp_input_open;
3839 	input_dev->close = hidpp_input_close;
3840 
3841 	input_dev->name = hidpp->name;
3842 	input_dev->phys = hdev->phys;
3843 	input_dev->uniq = hdev->uniq;
3844 	input_dev->id.bustype = hdev->bus;
3845 	input_dev->id.vendor  = hdev->vendor;
3846 	input_dev->id.product = hdev->product;
3847 	input_dev->id.version = hdev->version;
3848 	input_dev->dev.parent = &hdev->dev;
3849 
3850 	return input_dev;
3851 }
3852 
hidpp_connect_event(struct hidpp_device * hidpp)3853 static void hidpp_connect_event(struct hidpp_device *hidpp)
3854 {
3855 	struct hid_device *hdev = hidpp->hid_dev;
3856 	int ret = 0;
3857 	bool connected = atomic_read(&hidpp->connected);
3858 	struct input_dev *input;
3859 	char *name, *devm_name;
3860 
3861 	if (!connected) {
3862 		if (hidpp->battery.ps) {
3863 			hidpp->battery.online = false;
3864 			hidpp->battery.status = POWER_SUPPLY_STATUS_UNKNOWN;
3865 			hidpp->battery.level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
3866 			power_supply_changed(hidpp->battery.ps);
3867 		}
3868 		return;
3869 	}
3870 
3871 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
3872 		ret = wtp_connect(hdev, connected);
3873 		if (ret)
3874 			return;
3875 	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560) {
3876 		ret = m560_send_config_command(hdev, connected);
3877 		if (ret)
3878 			return;
3879 	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
3880 		ret = k400_connect(hdev, connected);
3881 		if (ret)
3882 			return;
3883 	}
3884 
3885 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3886 		ret = hidpp10_wheel_connect(hidpp);
3887 		if (ret)
3888 			return;
3889 	}
3890 
3891 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3892 		ret = hidpp10_extra_mouse_buttons_connect(hidpp);
3893 		if (ret)
3894 			return;
3895 	}
3896 
3897 	if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3898 		ret = hidpp10_consumer_keys_connect(hidpp);
3899 		if (ret)
3900 			return;
3901 	}
3902 
3903 	/* the device is already connected, we can ask for its name and
3904 	 * protocol */
3905 	if (!hidpp->protocol_major) {
3906 		ret = hidpp_root_get_protocol_version(hidpp);
3907 		if (ret) {
3908 			hid_err(hdev, "Can not get the protocol version.\n");
3909 			return;
3910 		}
3911 	}
3912 
3913 	if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
3914 		name = hidpp_get_device_name(hidpp);
3915 		if (name) {
3916 			devm_name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
3917 						   "%s", name);
3918 			kfree(name);
3919 			if (!devm_name)
3920 				return;
3921 
3922 			hidpp->name = devm_name;
3923 		}
3924 	}
3925 
3926 	hidpp_initialize_battery(hidpp);
3927 
3928 	/* forward current battery state */
3929 	if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3930 		hidpp10_enable_battery_reporting(hidpp);
3931 		if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE)
3932 			hidpp10_query_battery_mileage(hidpp);
3933 		else
3934 			hidpp10_query_battery_status(hidpp);
3935 	} else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3936 		if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3937 			hidpp20_query_battery_voltage_info(hidpp);
3938 		else if (hidpp->capabilities & HIDPP_CAPABILITY_UNIFIED_BATTERY)
3939 			hidpp20_query_battery_info_1004(hidpp);
3940 		else
3941 			hidpp20_query_battery_info_1000(hidpp);
3942 	}
3943 	if (hidpp->battery.ps)
3944 		power_supply_changed(hidpp->battery.ps);
3945 
3946 	if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL)
3947 		hi_res_scroll_enable(hidpp);
3948 
3949 	if (!(hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) || hidpp->delayed_input)
3950 		/* if the input nodes are already created, we can stop now */
3951 		return;
3952 
3953 	input = hidpp_allocate_input(hdev);
3954 	if (!input) {
3955 		hid_err(hdev, "cannot allocate new input device: %d\n", ret);
3956 		return;
3957 	}
3958 
3959 	hidpp_populate_input(hidpp, input);
3960 
3961 	ret = input_register_device(input);
3962 	if (ret)
3963 		input_free_device(input);
3964 
3965 	hidpp->delayed_input = input;
3966 }
3967 
3968 static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
3969 
3970 static struct attribute *sysfs_attrs[] = {
3971 	&dev_attr_builtin_power_supply.attr,
3972 	NULL
3973 };
3974 
3975 static const struct attribute_group ps_attribute_group = {
3976 	.attrs = sysfs_attrs
3977 };
3978 
hidpp_get_report_length(struct hid_device * hdev,int id)3979 static int hidpp_get_report_length(struct hid_device *hdev, int id)
3980 {
3981 	struct hid_report_enum *re;
3982 	struct hid_report *report;
3983 
3984 	re = &(hdev->report_enum[HID_OUTPUT_REPORT]);
3985 	report = re->report_id_hash[id];
3986 	if (!report)
3987 		return 0;
3988 
3989 	return report->field[0]->report_count + 1;
3990 }
3991 
hidpp_validate_device(struct hid_device * hdev)3992 static u8 hidpp_validate_device(struct hid_device *hdev)
3993 {
3994 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3995 	int id, report_length;
3996 	u8 supported_reports = 0;
3997 
3998 	id = REPORT_ID_HIDPP_SHORT;
3999 	report_length = hidpp_get_report_length(hdev, id);
4000 	if (report_length) {
4001 		if (report_length < HIDPP_REPORT_SHORT_LENGTH)
4002 			goto bad_device;
4003 
4004 		supported_reports |= HIDPP_REPORT_SHORT_SUPPORTED;
4005 	}
4006 
4007 	id = REPORT_ID_HIDPP_LONG;
4008 	report_length = hidpp_get_report_length(hdev, id);
4009 	if (report_length) {
4010 		if (report_length < HIDPP_REPORT_LONG_LENGTH)
4011 			goto bad_device;
4012 
4013 		supported_reports |= HIDPP_REPORT_LONG_SUPPORTED;
4014 	}
4015 
4016 	id = REPORT_ID_HIDPP_VERY_LONG;
4017 	report_length = hidpp_get_report_length(hdev, id);
4018 	if (report_length) {
4019 		if (report_length < HIDPP_REPORT_LONG_LENGTH ||
4020 		    report_length > HIDPP_REPORT_VERY_LONG_MAX_LENGTH)
4021 			goto bad_device;
4022 
4023 		supported_reports |= HIDPP_REPORT_VERY_LONG_SUPPORTED;
4024 		hidpp->very_long_report_length = report_length;
4025 	}
4026 
4027 	return supported_reports;
4028 
4029 bad_device:
4030 	hid_warn(hdev, "not enough values in hidpp report %d\n", id);
4031 	return false;
4032 }
4033 
hidpp_application_equals(struct hid_device * hdev,unsigned int application)4034 static bool hidpp_application_equals(struct hid_device *hdev,
4035 				     unsigned int application)
4036 {
4037 	struct list_head *report_list;
4038 	struct hid_report *report;
4039 
4040 	report_list = &hdev->report_enum[HID_INPUT_REPORT].report_list;
4041 	report = list_first_entry_or_null(report_list, struct hid_report, list);
4042 	return report && report->application == application;
4043 }
4044 
hidpp_probe(struct hid_device * hdev,const struct hid_device_id * id)4045 static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
4046 {
4047 	struct hidpp_device *hidpp;
4048 	int ret;
4049 	bool connected;
4050 	unsigned int connect_mask = HID_CONNECT_DEFAULT;
4051 	struct hidpp_ff_private_data data;
4052 
4053 	/* report_fixup needs drvdata to be set before we call hid_parse */
4054 	hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
4055 	if (!hidpp)
4056 		return -ENOMEM;
4057 
4058 	hidpp->hid_dev = hdev;
4059 	hidpp->name = hdev->name;
4060 	hidpp->quirks = id->driver_data;
4061 	hid_set_drvdata(hdev, hidpp);
4062 
4063 	ret = hid_parse(hdev);
4064 	if (ret) {
4065 		hid_err(hdev, "%s:parse failed\n", __func__);
4066 		return ret;
4067 	}
4068 
4069 	/*
4070 	 * Make sure the device is HID++ capable, otherwise treat as generic HID
4071 	 */
4072 	hidpp->supported_reports = hidpp_validate_device(hdev);
4073 
4074 	if (!hidpp->supported_reports) {
4075 		hid_set_drvdata(hdev, NULL);
4076 		devm_kfree(&hdev->dev, hidpp);
4077 		return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
4078 	}
4079 
4080 	if (id->group == HID_GROUP_LOGITECH_DJ_DEVICE)
4081 		hidpp->quirks |= HIDPP_QUIRK_UNIFYING;
4082 
4083 	if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4084 	    hidpp_application_equals(hdev, HID_GD_MOUSE))
4085 		hidpp->quirks |= HIDPP_QUIRK_HIDPP_WHEELS |
4086 				 HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS;
4087 
4088 	if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4089 	    hidpp_application_equals(hdev, HID_GD_KEYBOARD))
4090 		hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
4091 
4092 	if (disable_raw_mode) {
4093 		hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP;
4094 		hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT;
4095 	}
4096 
4097 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
4098 		ret = wtp_allocate(hdev, id);
4099 		if (ret)
4100 			return ret;
4101 	} else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
4102 		ret = k400_allocate(hdev);
4103 		if (ret)
4104 			return ret;
4105 	}
4106 
4107 	INIT_WORK(&hidpp->work, delayed_work_cb);
4108 	mutex_init(&hidpp->send_mutex);
4109 	init_waitqueue_head(&hidpp->wait);
4110 
4111 	/* indicates we are handling the battery properties in the kernel */
4112 	ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
4113 	if (ret)
4114 		hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
4115 			 hdev->name);
4116 
4117 	/*
4118 	 * Plain USB connections need to actually call start and open
4119 	 * on the transport driver to allow incoming data.
4120 	 */
4121 	ret = hid_hw_start(hdev, 0);
4122 	if (ret) {
4123 		hid_err(hdev, "hw start failed\n");
4124 		goto hid_hw_start_fail;
4125 	}
4126 
4127 	ret = hid_hw_open(hdev);
4128 	if (ret < 0) {
4129 		dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
4130 			__func__, ret);
4131 		goto hid_hw_open_fail;
4132 	}
4133 
4134 	/* Allow incoming packets */
4135 	hid_device_io_start(hdev);
4136 
4137 	if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4138 		hidpp_unifying_init(hidpp);
4139 
4140 	connected = hidpp_root_get_protocol_version(hidpp) == 0;
4141 	atomic_set(&hidpp->connected, connected);
4142 	if (!(hidpp->quirks & HIDPP_QUIRK_UNIFYING)) {
4143 		if (!connected) {
4144 			ret = -ENODEV;
4145 			hid_err(hdev, "Device not connected");
4146 			goto hid_hw_init_fail;
4147 		}
4148 
4149 		hidpp_overwrite_name(hdev);
4150 	}
4151 
4152 	if (connected && hidpp->protocol_major >= 2) {
4153 		ret = hidpp_set_wireless_feature_index(hidpp);
4154 		if (ret == -ENOENT)
4155 			hidpp->wireless_feature_index = 0;
4156 		else if (ret)
4157 			goto hid_hw_init_fail;
4158 	}
4159 
4160 	if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
4161 		ret = wtp_get_config(hidpp);
4162 		if (ret)
4163 			goto hid_hw_init_fail;
4164 	} else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
4165 		ret = g920_get_config(hidpp, &data);
4166 		if (ret)
4167 			goto hid_hw_init_fail;
4168 	}
4169 
4170 	hidpp_connect_event(hidpp);
4171 
4172 	/* Reset the HID node state */
4173 	hid_device_io_stop(hdev);
4174 	hid_hw_close(hdev);
4175 	hid_hw_stop(hdev);
4176 
4177 	if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
4178 		connect_mask &= ~HID_CONNECT_HIDINPUT;
4179 
4180 	/* Now export the actual inputs and hidraw nodes to the world */
4181 	ret = hid_hw_start(hdev, connect_mask);
4182 	if (ret) {
4183 		hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
4184 		goto hid_hw_start_fail;
4185 	}
4186 
4187 	if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
4188 		ret = hidpp_ff_init(hidpp, &data);
4189 		if (ret)
4190 			hid_warn(hidpp->hid_dev,
4191 		     "Unable to initialize force feedback support, errno %d\n",
4192 				 ret);
4193 	}
4194 
4195 	return ret;
4196 
4197 hid_hw_init_fail:
4198 	hid_hw_close(hdev);
4199 hid_hw_open_fail:
4200 	hid_hw_stop(hdev);
4201 hid_hw_start_fail:
4202 	sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4203 	cancel_work_sync(&hidpp->work);
4204 	mutex_destroy(&hidpp->send_mutex);
4205 	return ret;
4206 }
4207 
hidpp_remove(struct hid_device * hdev)4208 static void hidpp_remove(struct hid_device *hdev)
4209 {
4210 	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4211 
4212 	if (!hidpp)
4213 		return hid_hw_stop(hdev);
4214 
4215 	sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4216 
4217 	hid_hw_stop(hdev);
4218 	cancel_work_sync(&hidpp->work);
4219 	mutex_destroy(&hidpp->send_mutex);
4220 }
4221 
4222 #define LDJ_DEVICE(product) \
4223 	HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, \
4224 		   USB_VENDOR_ID_LOGITECH, (product))
4225 
4226 #define L27MHZ_DEVICE(product) \
4227 	HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_27MHZ_DEVICE, \
4228 		   USB_VENDOR_ID_LOGITECH, (product))
4229 
4230 static const struct hid_device_id hidpp_devices[] = {
4231 	{ /* wireless touchpad */
4232 	  LDJ_DEVICE(0x4011),
4233 	  .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT |
4234 			 HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS },
4235 	{ /* wireless touchpad T650 */
4236 	  LDJ_DEVICE(0x4101),
4237 	  .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
4238 	{ /* wireless touchpad T651 */
4239 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
4240 		USB_DEVICE_ID_LOGITECH_T651),
4241 	  .driver_data = HIDPP_QUIRK_CLASS_WTP },
4242 	{ /* Mouse Logitech Anywhere MX */
4243 	  LDJ_DEVICE(0x1017), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4244 	{ /* Mouse Logitech Cube */
4245 	  LDJ_DEVICE(0x4010), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
4246 	{ /* Mouse Logitech M335 */
4247 	  LDJ_DEVICE(0x4050), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4248 	{ /* Mouse Logitech M515 */
4249 	  LDJ_DEVICE(0x4007), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
4250 	{ /* Mouse logitech M560 */
4251 	  LDJ_DEVICE(0x402d),
4252 	  .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_CLASS_M560
4253 		| HIDPP_QUIRK_HI_RES_SCROLL_X2120 },
4254 	{ /* Mouse Logitech M705 (firmware RQM17) */
4255 	  LDJ_DEVICE(0x101b), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4256 	{ /* Mouse Logitech M705 (firmware RQM67) */
4257 	  LDJ_DEVICE(0x406d), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4258 	{ /* Mouse Logitech M720 */
4259 	  LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4260 	{ /* Mouse Logitech MX Anywhere 2 */
4261 	  LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4262 	{ LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4263 	{ LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4264 	{ LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4265 	{ LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4266 	{ /* Mouse Logitech MX Anywhere 2S */
4267 	  LDJ_DEVICE(0x406a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4268 	{ /* Mouse Logitech MX Master */
4269 	  LDJ_DEVICE(0x4041), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4270 	{ LDJ_DEVICE(0x4060), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4271 	{ LDJ_DEVICE(0x4071), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4272 	{ /* Mouse Logitech MX Master 2S */
4273 	  LDJ_DEVICE(0x4069), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4274 	{ /* Mouse Logitech MX Master 3 */
4275 	  LDJ_DEVICE(0x4082), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4276 	{ /* Mouse Logitech Performance MX */
4277 	  LDJ_DEVICE(0x101a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
4278 	{ /* Keyboard logitech K400 */
4279 	  LDJ_DEVICE(0x4024),
4280 	  .driver_data = HIDPP_QUIRK_CLASS_K400 },
4281 	{ /* Solar Keyboard Logitech K750 */
4282 	  LDJ_DEVICE(0x4002),
4283 	  .driver_data = HIDPP_QUIRK_CLASS_K750 },
4284 	{ /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
4285 	  LDJ_DEVICE(0xb305),
4286 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4287 	{ /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
4288 	  LDJ_DEVICE(0xb309),
4289 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4290 	{ /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
4291 	  LDJ_DEVICE(0xb30b),
4292 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4293 
4294 	{ LDJ_DEVICE(HID_ANY_ID) },
4295 
4296 	{ /* Keyboard LX501 (Y-RR53) */
4297 	  L27MHZ_DEVICE(0x0049),
4298 	  .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4299 	{ /* Keyboard MX3000 (Y-RAM74) */
4300 	  L27MHZ_DEVICE(0x0057),
4301 	  .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4302 	{ /* Keyboard MX3200 (Y-RAV80) */
4303 	  L27MHZ_DEVICE(0x005c),
4304 	  .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4305 	{ /* S510 Media Remote */
4306 	  L27MHZ_DEVICE(0x00fe),
4307 	  .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4308 
4309 	{ L27MHZ_DEVICE(HID_ANY_ID) },
4310 
4311 	{ /* Logitech G403 Wireless Gaming Mouse over USB */
4312 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC082) },
4313 	{ /* Logitech G703 Gaming Mouse over USB */
4314 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC087) },
4315 	{ /* Logitech G703 Hero Gaming Mouse over USB */
4316 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC090) },
4317 	{ /* Logitech G900 Gaming Mouse over USB */
4318 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC081) },
4319 	{ /* Logitech G903 Gaming Mouse over USB */
4320 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
4321 	{ /* Logitech G903 Hero Gaming Mouse over USB */
4322 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
4323 	{ /* Logitech G920 Wheel over USB */
4324 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
4325 		.driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
4326 	{ /* Logitech G Pro Gaming Mouse over USB */
4327 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC088) },
4328 
4329 	{ /* MX5000 keyboard over Bluetooth */
4330 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
4331 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4332 	{ /* Dinovo Edge keyboard over Bluetooth */
4333 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
4334 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4335 	{ /* MX5500 keyboard over Bluetooth */
4336 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
4337 	  .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4338 	{ /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
4339 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
4340 	{ /* MX Master mouse over Bluetooth */
4341 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb012),
4342 	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4343 	{ /* MX Ergo trackball over Bluetooth */
4344 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01d) },
4345 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01e),
4346 	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4347 	{ /* MX Master 3 mouse over Bluetooth */
4348 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023),
4349 	  .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
4350 	{}
4351 };
4352 
4353 MODULE_DEVICE_TABLE(hid, hidpp_devices);
4354 
4355 static const struct hid_usage_id hidpp_usages[] = {
4356 	{ HID_GD_WHEEL, EV_REL, REL_WHEEL_HI_RES },
4357 	{ HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
4358 };
4359 
4360 static struct hid_driver hidpp_driver = {
4361 	.name = "logitech-hidpp-device",
4362 	.id_table = hidpp_devices,
4363 	.report_fixup = hidpp_report_fixup,
4364 	.probe = hidpp_probe,
4365 	.remove = hidpp_remove,
4366 	.raw_event = hidpp_raw_event,
4367 	.usage_table = hidpp_usages,
4368 	.event = hidpp_event,
4369 	.input_configured = hidpp_input_configured,
4370 	.input_mapping = hidpp_input_mapping,
4371 	.input_mapped = hidpp_input_mapped,
4372 };
4373 
4374 module_hid_driver(hidpp_driver);
4375