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