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