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