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