cpuidle: psci: Do not suspend topology CPUs on PREEMPT_RT
[linux-2.6-microblaze.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 | LINUX_KERNEL_SW_ID,
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         struct usb_device_descriptor *udesc;
2552         u16 bcdDevice;
2553         struct ff_device *ff;
2554         int error, j, num_slots = data->num_effects;
2555         u8 version;
2556
2557         if (!hid_is_usb(hid)) {
2558                 hid_err(hid, "device is not USB\n");
2559                 return -ENODEV;
2560         }
2561
2562         if (list_empty(&hid->inputs)) {
2563                 hid_err(hid, "no inputs found\n");
2564                 return -ENODEV;
2565         }
2566         hidinput = list_entry(hid->inputs.next, struct hid_input, list);
2567         dev = hidinput->input;
2568
2569         if (!dev) {
2570                 hid_err(hid, "Struct input_dev not set!\n");
2571                 return -EINVAL;
2572         }
2573
2574         /* Get firmware release */
2575         udesc = &(hid_to_usb_dev(hid)->descriptor);
2576         bcdDevice = le16_to_cpu(udesc->bcdDevice);
2577         version = bcdDevice & 255;
2578
2579         /* Set supported force feedback capabilities */
2580         for (j = 0; hidpp_ff_effects[j] >= 0; j++)
2581                 set_bit(hidpp_ff_effects[j], dev->ffbit);
2582         if (version > 1)
2583                 for (j = 0; hidpp_ff_effects_v2[j] >= 0; j++)
2584                         set_bit(hidpp_ff_effects_v2[j], dev->ffbit);
2585
2586         error = input_ff_create(dev, num_slots);
2587
2588         if (error) {
2589                 hid_err(dev, "Failed to create FF device!\n");
2590                 return error;
2591         }
2592         /*
2593          * Create a copy of passed data, so we can transfer memory
2594          * ownership to FF core
2595          */
2596         data = kmemdup(data, sizeof(*data), GFP_KERNEL);
2597         if (!data)
2598                 return -ENOMEM;
2599         data->effect_ids = kcalloc(num_slots, sizeof(int), GFP_KERNEL);
2600         if (!data->effect_ids) {
2601                 kfree(data);
2602                 return -ENOMEM;
2603         }
2604         data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue");
2605         if (!data->wq) {
2606                 kfree(data->effect_ids);
2607                 kfree(data);
2608                 return -ENOMEM;
2609         }
2610
2611         data->hidpp = hidpp;
2612         data->version = version;
2613         for (j = 0; j < num_slots; j++)
2614                 data->effect_ids[j] = -1;
2615
2616         ff = dev->ff;
2617         ff->private = data;
2618
2619         ff->upload = hidpp_ff_upload_effect;
2620         ff->erase = hidpp_ff_erase_effect;
2621         ff->playback = hidpp_ff_playback;
2622         ff->set_gain = hidpp_ff_set_gain;
2623         ff->set_autocenter = hidpp_ff_set_autocenter;
2624         ff->destroy = hidpp_ff_destroy;
2625
2626         /* Create sysfs interface */
2627         error = device_create_file(&(hidpp->hid_dev->dev), &dev_attr_range);
2628         if (error)
2629                 hid_warn(hidpp->hid_dev, "Unable to create sysfs interface for \"range\", errno %d!\n", error);
2630
2631         /* init the hardware command queue */
2632         atomic_set(&data->workqueue_size, 0);
2633
2634         hid_info(hid, "Force feedback support loaded (firmware release %d).\n",
2635                  version);
2636
2637         return 0;
2638 }
2639
2640 /* ************************************************************************** */
2641 /*                                                                            */
2642 /* Device Support                                                             */
2643 /*                                                                            */
2644 /* ************************************************************************** */
2645
2646 /* -------------------------------------------------------------------------- */
2647 /* Touchpad HID++ devices                                                     */
2648 /* -------------------------------------------------------------------------- */
2649
2650 #define WTP_MANUAL_RESOLUTION                           39
2651
2652 struct wtp_data {
2653         u16 x_size, y_size;
2654         u8 finger_count;
2655         u8 mt_feature_index;
2656         u8 button_feature_index;
2657         u8 maxcontacts;
2658         bool flip_y;
2659         unsigned int resolution;
2660 };
2661
2662 static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2663                 struct hid_field *field, struct hid_usage *usage,
2664                 unsigned long **bit, int *max)
2665 {
2666         return -1;
2667 }
2668
2669 static void wtp_populate_input(struct hidpp_device *hidpp,
2670                                struct input_dev *input_dev)
2671 {
2672         struct wtp_data *wd = hidpp->private_data;
2673
2674         __set_bit(EV_ABS, input_dev->evbit);
2675         __set_bit(EV_KEY, input_dev->evbit);
2676         __clear_bit(EV_REL, input_dev->evbit);
2677         __clear_bit(EV_LED, input_dev->evbit);
2678
2679         input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, wd->x_size, 0, 0);
2680         input_abs_set_res(input_dev, ABS_MT_POSITION_X, wd->resolution);
2681         input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, wd->y_size, 0, 0);
2682         input_abs_set_res(input_dev, ABS_MT_POSITION_Y, wd->resolution);
2683
2684         /* Max pressure is not given by the devices, pick one */
2685         input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 50, 0, 0);
2686
2687         input_set_capability(input_dev, EV_KEY, BTN_LEFT);
2688
2689         if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS)
2690                 input_set_capability(input_dev, EV_KEY, BTN_RIGHT);
2691         else
2692                 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
2693
2694         input_mt_init_slots(input_dev, wd->maxcontacts, INPUT_MT_POINTER |
2695                 INPUT_MT_DROP_UNUSED);
2696 }
2697
2698 static void wtp_touch_event(struct hidpp_device *hidpp,
2699         struct hidpp_touchpad_raw_xy_finger *touch_report)
2700 {
2701         struct wtp_data *wd = hidpp->private_data;
2702         int slot;
2703
2704         if (!touch_report->finger_id || touch_report->contact_type)
2705                 /* no actual data */
2706                 return;
2707
2708         slot = input_mt_get_slot_by_key(hidpp->input, touch_report->finger_id);
2709
2710         input_mt_slot(hidpp->input, slot);
2711         input_mt_report_slot_state(hidpp->input, MT_TOOL_FINGER,
2712                                         touch_report->contact_status);
2713         if (touch_report->contact_status) {
2714                 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_X,
2715                                 touch_report->x);
2716                 input_event(hidpp->input, EV_ABS, ABS_MT_POSITION_Y,
2717                                 wd->flip_y ? wd->y_size - touch_report->y :
2718                                              touch_report->y);
2719                 input_event(hidpp->input, EV_ABS, ABS_MT_PRESSURE,
2720                                 touch_report->area);
2721         }
2722 }
2723
2724 static void wtp_send_raw_xy_event(struct hidpp_device *hidpp,
2725                 struct hidpp_touchpad_raw_xy *raw)
2726 {
2727         int i;
2728
2729         for (i = 0; i < 2; i++)
2730                 wtp_touch_event(hidpp, &(raw->fingers[i]));
2731
2732         if (raw->end_of_frame &&
2733             !(hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS))
2734                 input_event(hidpp->input, EV_KEY, BTN_LEFT, raw->button);
2735
2736         if (raw->end_of_frame || raw->finger_count <= 2) {
2737                 input_mt_sync_frame(hidpp->input);
2738                 input_sync(hidpp->input);
2739         }
2740 }
2741
2742 static int wtp_mouse_raw_xy_event(struct hidpp_device *hidpp, u8 *data)
2743 {
2744         struct wtp_data *wd = hidpp->private_data;
2745         u8 c1_area = ((data[7] & 0xf) * (data[7] & 0xf) +
2746                       (data[7] >> 4) * (data[7] >> 4)) / 2;
2747         u8 c2_area = ((data[13] & 0xf) * (data[13] & 0xf) +
2748                       (data[13] >> 4) * (data[13] >> 4)) / 2;
2749         struct hidpp_touchpad_raw_xy raw = {
2750                 .timestamp = data[1],
2751                 .fingers = {
2752                         {
2753                                 .contact_type = 0,
2754                                 .contact_status = !!data[7],
2755                                 .x = get_unaligned_le16(&data[3]),
2756                                 .y = get_unaligned_le16(&data[5]),
2757                                 .z = c1_area,
2758                                 .area = c1_area,
2759                                 .finger_id = data[2],
2760                         }, {
2761                                 .contact_type = 0,
2762                                 .contact_status = !!data[13],
2763                                 .x = get_unaligned_le16(&data[9]),
2764                                 .y = get_unaligned_le16(&data[11]),
2765                                 .z = c2_area,
2766                                 .area = c2_area,
2767                                 .finger_id = data[8],
2768                         }
2769                 },
2770                 .finger_count = wd->maxcontacts,
2771                 .spurious_flag = 0,
2772                 .end_of_frame = (data[0] >> 7) == 0,
2773                 .button = data[0] & 0x01,
2774         };
2775
2776         wtp_send_raw_xy_event(hidpp, &raw);
2777
2778         return 1;
2779 }
2780
2781 static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size)
2782 {
2783         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2784         struct wtp_data *wd = hidpp->private_data;
2785         struct hidpp_report *report = (struct hidpp_report *)data;
2786         struct hidpp_touchpad_raw_xy raw;
2787
2788         if (!wd || !hidpp->input)
2789                 return 1;
2790
2791         switch (data[0]) {
2792         case 0x02:
2793                 if (size < 2) {
2794                         hid_err(hdev, "Received HID report of bad size (%d)",
2795                                 size);
2796                         return 1;
2797                 }
2798                 if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) {
2799                         input_event(hidpp->input, EV_KEY, BTN_LEFT,
2800                                         !!(data[1] & 0x01));
2801                         input_event(hidpp->input, EV_KEY, BTN_RIGHT,
2802                                         !!(data[1] & 0x02));
2803                         input_sync(hidpp->input);
2804                         return 0;
2805                 } else {
2806                         if (size < 21)
2807                                 return 1;
2808                         return wtp_mouse_raw_xy_event(hidpp, &data[7]);
2809                 }
2810         case REPORT_ID_HIDPP_LONG:
2811                 /* size is already checked in hidpp_raw_event. */
2812                 if ((report->fap.feature_index != wd->mt_feature_index) ||
2813                     (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY))
2814                         return 1;
2815                 hidpp_touchpad_raw_xy_event(hidpp, data + 4, &raw);
2816
2817                 wtp_send_raw_xy_event(hidpp, &raw);
2818                 return 0;
2819         }
2820
2821         return 0;
2822 }
2823
2824 static int wtp_get_config(struct hidpp_device *hidpp)
2825 {
2826         struct wtp_data *wd = hidpp->private_data;
2827         struct hidpp_touchpad_raw_info raw_info = {0};
2828         u8 feature_type;
2829         int ret;
2830
2831         ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_TOUCHPAD_RAW_XY,
2832                 &wd->mt_feature_index, &feature_type);
2833         if (ret)
2834                 /* means that the device is not powered up */
2835                 return ret;
2836
2837         ret = hidpp_touchpad_get_raw_info(hidpp, wd->mt_feature_index,
2838                 &raw_info);
2839         if (ret)
2840                 return ret;
2841
2842         wd->x_size = raw_info.x_size;
2843         wd->y_size = raw_info.y_size;
2844         wd->maxcontacts = raw_info.maxcontacts;
2845         wd->flip_y = raw_info.origin == TOUCHPAD_RAW_XY_ORIGIN_LOWER_LEFT;
2846         wd->resolution = raw_info.res;
2847         if (!wd->resolution)
2848                 wd->resolution = WTP_MANUAL_RESOLUTION;
2849
2850         return 0;
2851 }
2852
2853 static int wtp_allocate(struct hid_device *hdev, const struct hid_device_id *id)
2854 {
2855         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2856         struct wtp_data *wd;
2857
2858         wd = devm_kzalloc(&hdev->dev, sizeof(struct wtp_data),
2859                         GFP_KERNEL);
2860         if (!wd)
2861                 return -ENOMEM;
2862
2863         hidpp->private_data = wd;
2864
2865         return 0;
2866 };
2867
2868 static int wtp_connect(struct hid_device *hdev, bool connected)
2869 {
2870         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2871         struct wtp_data *wd = hidpp->private_data;
2872         int ret;
2873
2874         if (!wd->x_size) {
2875                 ret = wtp_get_config(hidpp);
2876                 if (ret) {
2877                         hid_err(hdev, "Can not get wtp config: %d\n", ret);
2878                         return ret;
2879                 }
2880         }
2881
2882         return hidpp_touchpad_set_raw_report_state(hidpp, wd->mt_feature_index,
2883                         true, true);
2884 }
2885
2886 /* ------------------------------------------------------------------------- */
2887 /* Logitech M560 devices                                                     */
2888 /* ------------------------------------------------------------------------- */
2889
2890 /*
2891  * Logitech M560 protocol overview
2892  *
2893  * The Logitech M560 mouse, is designed for windows 8. When the middle and/or
2894  * the sides buttons are pressed, it sends some keyboard keys events
2895  * instead of buttons ones.
2896  * To complicate things further, the middle button keys sequence
2897  * is different from the odd press and the even press.
2898  *
2899  * forward button -> Super_R
2900  * backward button -> Super_L+'d' (press only)
2901  * middle button -> 1st time: Alt_L+SuperL+XF86TouchpadOff (press only)
2902  *                  2nd time: left-click (press only)
2903  * NB: press-only means that when the button is pressed, the
2904  * KeyPress/ButtonPress and KeyRelease/ButtonRelease events are generated
2905  * together sequentially; instead when the button is released, no event is
2906  * generated !
2907  *
2908  * With the command
2909  *      10<xx>0a 3500af03 (where <xx> is the mouse id),
2910  * the mouse reacts differently:
2911  * - it never sends a keyboard key event
2912  * - for the three mouse button it sends:
2913  *      middle button               press   11<xx>0a 3500af00...
2914  *      side 1 button (forward)     press   11<xx>0a 3500b000...
2915  *      side 2 button (backward)    press   11<xx>0a 3500ae00...
2916  *      middle/side1/side2 button   release 11<xx>0a 35000000...
2917  */
2918
2919 static const u8 m560_config_parameter[] = {0x00, 0xaf, 0x03};
2920
2921 /* how buttons are mapped in the report */
2922 #define M560_MOUSE_BTN_LEFT             0x01
2923 #define M560_MOUSE_BTN_RIGHT            0x02
2924 #define M560_MOUSE_BTN_WHEEL_LEFT       0x08
2925 #define M560_MOUSE_BTN_WHEEL_RIGHT      0x10
2926
2927 #define M560_SUB_ID                     0x0a
2928 #define M560_BUTTON_MODE_REGISTER       0x35
2929
2930 static int m560_send_config_command(struct hid_device *hdev, bool connected)
2931 {
2932         struct hidpp_report response;
2933         struct hidpp_device *hidpp_dev;
2934
2935         hidpp_dev = hid_get_drvdata(hdev);
2936
2937         return hidpp_send_rap_command_sync(
2938                 hidpp_dev,
2939                 REPORT_ID_HIDPP_SHORT,
2940                 M560_SUB_ID,
2941                 M560_BUTTON_MODE_REGISTER,
2942                 (u8 *)m560_config_parameter,
2943                 sizeof(m560_config_parameter),
2944                 &response
2945         );
2946 }
2947
2948 static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
2949 {
2950         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
2951
2952         /* sanity check */
2953         if (!hidpp->input) {
2954                 hid_err(hdev, "error in parameter\n");
2955                 return -EINVAL;
2956         }
2957
2958         if (size < 7) {
2959                 hid_err(hdev, "error in report\n");
2960                 return 0;
2961         }
2962
2963         if (data[0] == REPORT_ID_HIDPP_LONG &&
2964             data[2] == M560_SUB_ID && data[6] == 0x00) {
2965                 /*
2966                  * m560 mouse report for middle, forward and backward button
2967                  *
2968                  * data[0] = 0x11
2969                  * data[1] = device-id
2970                  * data[2] = 0x0a
2971                  * data[5] = 0xaf -> middle
2972                  *           0xb0 -> forward
2973                  *           0xae -> backward
2974                  *           0x00 -> release all
2975                  * data[6] = 0x00
2976                  */
2977
2978                 switch (data[5]) {
2979                 case 0xaf:
2980                         input_report_key(hidpp->input, BTN_MIDDLE, 1);
2981                         break;
2982                 case 0xb0:
2983                         input_report_key(hidpp->input, BTN_FORWARD, 1);
2984                         break;
2985                 case 0xae:
2986                         input_report_key(hidpp->input, BTN_BACK, 1);
2987                         break;
2988                 case 0x00:
2989                         input_report_key(hidpp->input, BTN_BACK, 0);
2990                         input_report_key(hidpp->input, BTN_FORWARD, 0);
2991                         input_report_key(hidpp->input, BTN_MIDDLE, 0);
2992                         break;
2993                 default:
2994                         hid_err(hdev, "error in report\n");
2995                         return 0;
2996                 }
2997                 input_sync(hidpp->input);
2998
2999         } else if (data[0] == 0x02) {
3000                 /*
3001                  * Logitech M560 mouse report
3002                  *
3003                  * data[0] = type (0x02)
3004                  * data[1..2] = buttons
3005                  * data[3..5] = xy
3006                  * data[6] = wheel
3007                  */
3008
3009                 int v;
3010
3011                 input_report_key(hidpp->input, BTN_LEFT,
3012                         !!(data[1] & M560_MOUSE_BTN_LEFT));
3013                 input_report_key(hidpp->input, BTN_RIGHT,
3014                         !!(data[1] & M560_MOUSE_BTN_RIGHT));
3015
3016                 if (data[1] & M560_MOUSE_BTN_WHEEL_LEFT) {
3017                         input_report_rel(hidpp->input, REL_HWHEEL, -1);
3018                         input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3019                                          -120);
3020                 } else if (data[1] & M560_MOUSE_BTN_WHEEL_RIGHT) {
3021                         input_report_rel(hidpp->input, REL_HWHEEL, 1);
3022                         input_report_rel(hidpp->input, REL_HWHEEL_HI_RES,
3023                                          120);
3024                 }
3025
3026                 v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
3027                 input_report_rel(hidpp->input, REL_X, v);
3028
3029                 v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
3030                 input_report_rel(hidpp->input, REL_Y, v);
3031
3032                 v = hid_snto32(data[6], 8);
3033                 if (v != 0)
3034                         hidpp_scroll_counter_handle_scroll(hidpp->input,
3035                                         &hidpp->vertical_wheel_counter, v);
3036
3037                 input_sync(hidpp->input);
3038         }
3039
3040         return 1;
3041 }
3042
3043 static void m560_populate_input(struct hidpp_device *hidpp,
3044                                 struct input_dev *input_dev)
3045 {
3046         __set_bit(EV_KEY, input_dev->evbit);
3047         __set_bit(BTN_MIDDLE, input_dev->keybit);
3048         __set_bit(BTN_RIGHT, input_dev->keybit);
3049         __set_bit(BTN_LEFT, input_dev->keybit);
3050         __set_bit(BTN_BACK, input_dev->keybit);
3051         __set_bit(BTN_FORWARD, input_dev->keybit);
3052
3053         __set_bit(EV_REL, input_dev->evbit);
3054         __set_bit(REL_X, input_dev->relbit);
3055         __set_bit(REL_Y, input_dev->relbit);
3056         __set_bit(REL_WHEEL, input_dev->relbit);
3057         __set_bit(REL_HWHEEL, input_dev->relbit);
3058         __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3059         __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3060 }
3061
3062 static int m560_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3063                 struct hid_field *field, struct hid_usage *usage,
3064                 unsigned long **bit, int *max)
3065 {
3066         return -1;
3067 }
3068
3069 /* ------------------------------------------------------------------------- */
3070 /* Logitech K400 devices                                                     */
3071 /* ------------------------------------------------------------------------- */
3072
3073 /*
3074  * The Logitech K400 keyboard has an embedded touchpad which is seen
3075  * as a mouse from the OS point of view. There is a hardware shortcut to disable
3076  * tap-to-click but the setting is not remembered accross reset, annoying some
3077  * users.
3078  *
3079  * We can toggle this feature from the host by using the feature 0x6010:
3080  * Touchpad FW items
3081  */
3082
3083 struct k400_private_data {
3084         u8 feature_index;
3085 };
3086
3087 static int k400_disable_tap_to_click(struct hidpp_device *hidpp)
3088 {
3089         struct k400_private_data *k400 = hidpp->private_data;
3090         struct hidpp_touchpad_fw_items items = {};
3091         int ret;
3092         u8 feature_type;
3093
3094         if (!k400->feature_index) {
3095                 ret = hidpp_root_get_feature(hidpp,
3096                         HIDPP_PAGE_TOUCHPAD_FW_ITEMS,
3097                         &k400->feature_index, &feature_type);
3098                 if (ret)
3099                         /* means that the device is not powered up */
3100                         return ret;
3101         }
3102
3103         ret = hidpp_touchpad_fw_items_set(hidpp, k400->feature_index, &items);
3104         if (ret)
3105                 return ret;
3106
3107         return 0;
3108 }
3109
3110 static int k400_allocate(struct hid_device *hdev)
3111 {
3112         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3113         struct k400_private_data *k400;
3114
3115         k400 = devm_kzalloc(&hdev->dev, sizeof(struct k400_private_data),
3116                             GFP_KERNEL);
3117         if (!k400)
3118                 return -ENOMEM;
3119
3120         hidpp->private_data = k400;
3121
3122         return 0;
3123 };
3124
3125 static int k400_connect(struct hid_device *hdev, bool connected)
3126 {
3127         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3128
3129         if (!disable_tap_to_click)
3130                 return 0;
3131
3132         return k400_disable_tap_to_click(hidpp);
3133 }
3134
3135 /* ------------------------------------------------------------------------- */
3136 /* Logitech G920 Driving Force Racing Wheel for Xbox One                     */
3137 /* ------------------------------------------------------------------------- */
3138
3139 #define HIDPP_PAGE_G920_FORCE_FEEDBACK                  0x8123
3140
3141 static int g920_ff_set_autocenter(struct hidpp_device *hidpp,
3142                                   struct hidpp_ff_private_data *data)
3143 {
3144         struct hidpp_report response;
3145         u8 params[HIDPP_AUTOCENTER_PARAMS_LENGTH] = {
3146                 [1] = HIDPP_FF_EFFECT_SPRING | HIDPP_FF_EFFECT_AUTOSTART,
3147         };
3148         int ret;
3149
3150         /* initialize with zero autocenter to get wheel in usable state */
3151
3152         dbg_hid("Setting autocenter to 0.\n");
3153         ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3154                                           HIDPP_FF_DOWNLOAD_EFFECT,
3155                                           params, ARRAY_SIZE(params),
3156                                           &response);
3157         if (ret)
3158                 hid_warn(hidpp->hid_dev, "Failed to autocenter device!\n");
3159         else
3160                 data->slot_autocenter = response.fap.params[0];
3161
3162         return ret;
3163 }
3164
3165 static int g920_get_config(struct hidpp_device *hidpp,
3166                            struct hidpp_ff_private_data *data)
3167 {
3168         struct hidpp_report response;
3169         u8 feature_type;
3170         int ret;
3171
3172         memset(data, 0, sizeof(*data));
3173
3174         /* Find feature and store for later use */
3175         ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_G920_FORCE_FEEDBACK,
3176                                      &data->feature_index, &feature_type);
3177         if (ret)
3178                 return ret;
3179
3180         /* Read number of slots available in device */
3181         ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3182                                           HIDPP_FF_GET_INFO,
3183                                           NULL, 0,
3184                                           &response);
3185         if (ret) {
3186                 if (ret < 0)
3187                         return ret;
3188                 hid_err(hidpp->hid_dev,
3189                         "%s: received protocol error 0x%02x\n", __func__, ret);
3190                 return -EPROTO;
3191         }
3192
3193         data->num_effects = response.fap.params[0] - HIDPP_FF_RESERVED_SLOTS;
3194
3195         /* reset all forces */
3196         ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3197                                           HIDPP_FF_RESET_ALL,
3198                                           NULL, 0,
3199                                           &response);
3200         if (ret)
3201                 hid_warn(hidpp->hid_dev, "Failed to reset all forces!\n");
3202
3203         ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3204                                           HIDPP_FF_GET_APERTURE,
3205                                           NULL, 0,
3206                                           &response);
3207         if (ret) {
3208                 hid_warn(hidpp->hid_dev,
3209                          "Failed to read range from device!\n");
3210         }
3211         data->range = ret ?
3212                 900 : get_unaligned_be16(&response.fap.params[0]);
3213
3214         /* Read the current gain values */
3215         ret = hidpp_send_fap_command_sync(hidpp, data->feature_index,
3216                                           HIDPP_FF_GET_GLOBAL_GAINS,
3217                                           NULL, 0,
3218                                           &response);
3219         if (ret)
3220                 hid_warn(hidpp->hid_dev,
3221                          "Failed to read gain values from device!\n");
3222         data->gain = ret ?
3223                 0xffff : get_unaligned_be16(&response.fap.params[0]);
3224
3225         /* ignore boost value at response.fap.params[2] */
3226
3227         return g920_ff_set_autocenter(hidpp, data);
3228 }
3229
3230 /* -------------------------------------------------------------------------- */
3231 /* Logitech Dinovo Mini keyboard with builtin touchpad                        */
3232 /* -------------------------------------------------------------------------- */
3233 #define DINOVO_MINI_PRODUCT_ID          0xb30c
3234
3235 static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3236                 struct hid_field *field, struct hid_usage *usage,
3237                 unsigned long **bit, int *max)
3238 {
3239         if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
3240                 return 0;
3241
3242         switch (usage->hid & HID_USAGE) {
3243         case 0x00d: lg_map_key_clear(KEY_MEDIA);        break;
3244         default:
3245                 return 0;
3246         }
3247         return 1;
3248 }
3249
3250 /* -------------------------------------------------------------------------- */
3251 /* HID++1.0 devices which use HID++ reports for their wheels                  */
3252 /* -------------------------------------------------------------------------- */
3253 static int hidpp10_wheel_connect(struct hidpp_device *hidpp)
3254 {
3255         return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3256                         HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT,
3257                         HIDPP_ENABLE_WHEEL_REPORT | HIDPP_ENABLE_HWHEEL_REPORT);
3258 }
3259
3260 static int hidpp10_wheel_raw_event(struct hidpp_device *hidpp,
3261                                    u8 *data, int size)
3262 {
3263         s8 value, hvalue;
3264
3265         if (!hidpp->input)
3266                 return -EINVAL;
3267
3268         if (size < 7)
3269                 return 0;
3270
3271         if (data[0] != REPORT_ID_HIDPP_SHORT || data[2] != HIDPP_SUB_ID_ROLLER)
3272                 return 0;
3273
3274         value = data[3];
3275         hvalue = data[4];
3276
3277         input_report_rel(hidpp->input, REL_WHEEL, value);
3278         input_report_rel(hidpp->input, REL_WHEEL_HI_RES, value * 120);
3279         input_report_rel(hidpp->input, REL_HWHEEL, hvalue);
3280         input_report_rel(hidpp->input, REL_HWHEEL_HI_RES, hvalue * 120);
3281         input_sync(hidpp->input);
3282
3283         return 1;
3284 }
3285
3286 static void hidpp10_wheel_populate_input(struct hidpp_device *hidpp,
3287                                          struct input_dev *input_dev)
3288 {
3289         __set_bit(EV_REL, input_dev->evbit);
3290         __set_bit(REL_WHEEL, input_dev->relbit);
3291         __set_bit(REL_WHEEL_HI_RES, input_dev->relbit);
3292         __set_bit(REL_HWHEEL, input_dev->relbit);
3293         __set_bit(REL_HWHEEL_HI_RES, input_dev->relbit);
3294 }
3295
3296 /* -------------------------------------------------------------------------- */
3297 /* HID++1.0 mice which use HID++ reports for extra mouse buttons              */
3298 /* -------------------------------------------------------------------------- */
3299 static int hidpp10_extra_mouse_buttons_connect(struct hidpp_device *hidpp)
3300 {
3301         return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3302                                     HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT,
3303                                     HIDPP_ENABLE_MOUSE_EXTRA_BTN_REPORT);
3304 }
3305
3306 static int hidpp10_extra_mouse_buttons_raw_event(struct hidpp_device *hidpp,
3307                                     u8 *data, int size)
3308 {
3309         int i;
3310
3311         if (!hidpp->input)
3312                 return -EINVAL;
3313
3314         if (size < 7)
3315                 return 0;
3316
3317         if (data[0] != REPORT_ID_HIDPP_SHORT ||
3318             data[2] != HIDPP_SUB_ID_MOUSE_EXTRA_BTNS)
3319                 return 0;
3320
3321         /*
3322          * Buttons are either delivered through the regular mouse report *or*
3323          * through the extra buttons report. At least for button 6 how it is
3324          * delivered differs per receiver firmware version. Even receivers with
3325          * the same usb-id show different behavior, so we handle both cases.
3326          */
3327         for (i = 0; i < 8; i++)
3328                 input_report_key(hidpp->input, BTN_MOUSE + i,
3329                                  (data[3] & (1 << i)));
3330
3331         /* Some mice report events on button 9+, use BTN_MISC */
3332         for (i = 0; i < 8; i++)
3333                 input_report_key(hidpp->input, BTN_MISC + i,
3334                                  (data[4] & (1 << i)));
3335
3336         input_sync(hidpp->input);
3337         return 1;
3338 }
3339
3340 static void hidpp10_extra_mouse_buttons_populate_input(
3341                         struct hidpp_device *hidpp, struct input_dev *input_dev)
3342 {
3343         /* BTN_MOUSE - BTN_MOUSE+7 are set already by the descriptor */
3344         __set_bit(BTN_0, input_dev->keybit);
3345         __set_bit(BTN_1, input_dev->keybit);
3346         __set_bit(BTN_2, input_dev->keybit);
3347         __set_bit(BTN_3, input_dev->keybit);
3348         __set_bit(BTN_4, input_dev->keybit);
3349         __set_bit(BTN_5, input_dev->keybit);
3350         __set_bit(BTN_6, input_dev->keybit);
3351         __set_bit(BTN_7, input_dev->keybit);
3352 }
3353
3354 /* -------------------------------------------------------------------------- */
3355 /* HID++1.0 kbds which only report 0x10xx consumer usages through sub-id 0x03 */
3356 /* -------------------------------------------------------------------------- */
3357
3358 /* Find the consumer-page input report desc and change Maximums to 0x107f */
3359 static u8 *hidpp10_consumer_keys_report_fixup(struct hidpp_device *hidpp,
3360                                               u8 *_rdesc, unsigned int *rsize)
3361 {
3362         /* Note 0 terminated so we can use strnstr to search for this. */
3363         static const char consumer_rdesc_start[] = {
3364                 0x05, 0x0C,     /* USAGE_PAGE (Consumer Devices)       */
3365                 0x09, 0x01,     /* USAGE (Consumer Control)            */
3366                 0xA1, 0x01,     /* COLLECTION (Application)            */
3367                 0x85, 0x03,     /* REPORT_ID = 3                       */
3368                 0x75, 0x10,     /* REPORT_SIZE (16)                    */
3369                 0x95, 0x02,     /* REPORT_COUNT (2)                    */
3370                 0x15, 0x01,     /* LOGICAL_MIN (1)                     */
3371                 0x26, 0x00      /* LOGICAL_MAX (...                    */
3372         };
3373         char *consumer_rdesc, *rdesc = (char *)_rdesc;
3374         unsigned int size;
3375
3376         consumer_rdesc = strnstr(rdesc, consumer_rdesc_start, *rsize);
3377         size = *rsize - (consumer_rdesc - rdesc);
3378         if (consumer_rdesc && size >= 25) {
3379                 consumer_rdesc[15] = 0x7f;
3380                 consumer_rdesc[16] = 0x10;
3381                 consumer_rdesc[20] = 0x7f;
3382                 consumer_rdesc[21] = 0x10;
3383         }
3384         return _rdesc;
3385 }
3386
3387 static int hidpp10_consumer_keys_connect(struct hidpp_device *hidpp)
3388 {
3389         return hidpp10_set_register(hidpp, HIDPP_REG_ENABLE_REPORTS, 0,
3390                                     HIDPP_ENABLE_CONSUMER_REPORT,
3391                                     HIDPP_ENABLE_CONSUMER_REPORT);
3392 }
3393
3394 static int hidpp10_consumer_keys_raw_event(struct hidpp_device *hidpp,
3395                                            u8 *data, int size)
3396 {
3397         u8 consumer_report[5];
3398
3399         if (size < 7)
3400                 return 0;
3401
3402         if (data[0] != REPORT_ID_HIDPP_SHORT ||
3403             data[2] != HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS)
3404                 return 0;
3405
3406         /*
3407          * Build a normal consumer report (3) out of the data, this detour
3408          * is necessary to get some keyboards to report their 0x10xx usages.
3409          */
3410         consumer_report[0] = 0x03;
3411         memcpy(&consumer_report[1], &data[3], 4);
3412         /* We are called from atomic context */
3413         hid_report_raw_event(hidpp->hid_dev, HID_INPUT_REPORT,
3414                              consumer_report, 5, 1);
3415
3416         return 1;
3417 }
3418
3419 /* -------------------------------------------------------------------------- */
3420 /* High-resolution scroll wheels                                              */
3421 /* -------------------------------------------------------------------------- */
3422
3423 static int hi_res_scroll_enable(struct hidpp_device *hidpp)
3424 {
3425         int ret;
3426         u8 multiplier = 1;
3427
3428         if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL) {
3429                 ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
3430                 if (ret == 0)
3431                         ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
3432         } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL) {
3433                 ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
3434                                                            &multiplier);
3435         } else /* if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL) */ {
3436                 ret = hidpp10_enable_scrolling_acceleration(hidpp);
3437                 multiplier = 8;
3438         }
3439         if (ret)
3440                 return ret;
3441
3442         if (multiplier == 0)
3443                 multiplier = 1;
3444
3445         hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
3446         hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
3447         return 0;
3448 }
3449
3450 static int hidpp_initialize_hires_scroll(struct hidpp_device *hidpp)
3451 {
3452         int ret;
3453         unsigned long capabilities;
3454
3455         capabilities = hidpp->capabilities;
3456
3457         if (hidpp->protocol_major >= 2) {
3458                 u8 feature_index;
3459                 u8 feature_type;
3460
3461                 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
3462                                              &feature_index, &feature_type);
3463                 if (!ret) {
3464                         hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL;
3465                         hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scroll wheel\n");
3466                         return 0;
3467                 }
3468                 ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HI_RESOLUTION_SCROLLING,
3469                                              &feature_index, &feature_type);
3470                 if (!ret) {
3471                         hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL;
3472                         hid_dbg(hidpp->hid_dev, "Detected HID++ 2.0 hi-res scrolling\n");
3473                 }
3474         } else {
3475                 struct hidpp_report response;
3476
3477                 ret = hidpp_send_rap_command_sync(hidpp,
3478                                                   REPORT_ID_HIDPP_SHORT,
3479                                                   HIDPP_GET_REGISTER,
3480                                                   HIDPP_ENABLE_FAST_SCROLL,
3481                                                   NULL, 0, &response);
3482                 if (!ret) {
3483                         hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_FAST_SCROLL;
3484                         hid_dbg(hidpp->hid_dev, "Detected HID++ 1.0 fast scroll\n");
3485                 }
3486         }
3487
3488         if (hidpp->capabilities == capabilities)
3489                 hid_dbg(hidpp->hid_dev, "Did not detect HID++ hi-res scrolling hardware support\n");
3490         return 0;
3491 }
3492
3493 /* -------------------------------------------------------------------------- */
3494 /* Generic HID++ devices                                                      */
3495 /* -------------------------------------------------------------------------- */
3496
3497 static u8 *hidpp_report_fixup(struct hid_device *hdev, u8 *rdesc,
3498                               unsigned int *rsize)
3499 {
3500         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3501
3502         if (!hidpp)
3503                 return rdesc;
3504
3505         /* For 27 MHz keyboards the quirk gets set after hid_parse. */
3506         if (hdev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE ||
3507             (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS))
3508                 rdesc = hidpp10_consumer_keys_report_fixup(hidpp, rdesc, rsize);
3509
3510         return rdesc;
3511 }
3512
3513 static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
3514                 struct hid_field *field, struct hid_usage *usage,
3515                 unsigned long **bit, int *max)
3516 {
3517         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3518
3519         if (!hidpp)
3520                 return 0;
3521
3522         if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3523                 return wtp_input_mapping(hdev, hi, field, usage, bit, max);
3524         else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 &&
3525                         field->application != HID_GD_MOUSE)
3526                 return m560_input_mapping(hdev, hi, field, usage, bit, max);
3527
3528         if (hdev->product == DINOVO_MINI_PRODUCT_ID)
3529                 return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
3530
3531         return 0;
3532 }
3533
3534 static int hidpp_input_mapped(struct hid_device *hdev, struct hid_input *hi,
3535                 struct hid_field *field, struct hid_usage *usage,
3536                 unsigned long **bit, int *max)
3537 {
3538         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3539
3540         if (!hidpp)
3541                 return 0;
3542
3543         /* Ensure that Logitech G920 is not given a default fuzz/flat value */
3544         if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
3545                 if (usage->type == EV_ABS && (usage->code == ABS_X ||
3546                                 usage->code == ABS_Y || usage->code == ABS_Z ||
3547                                 usage->code == ABS_RZ)) {
3548                         field->application = HID_GD_MULTIAXIS;
3549                 }
3550         }
3551
3552         return 0;
3553 }
3554
3555
3556 static void hidpp_populate_input(struct hidpp_device *hidpp,
3557                                  struct input_dev *input)
3558 {
3559         hidpp->input = input;
3560
3561         if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3562                 wtp_populate_input(hidpp, input);
3563         else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3564                 m560_populate_input(hidpp, input);
3565
3566         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS)
3567                 hidpp10_wheel_populate_input(hidpp, input);
3568
3569         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS)
3570                 hidpp10_extra_mouse_buttons_populate_input(hidpp, input);
3571 }
3572
3573 static int hidpp_input_configured(struct hid_device *hdev,
3574                                 struct hid_input *hidinput)
3575 {
3576         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3577         struct input_dev *input = hidinput->input;
3578
3579         if (!hidpp)
3580                 return 0;
3581
3582         hidpp_populate_input(hidpp, input);
3583
3584         return 0;
3585 }
3586
3587 static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
3588                 int size)
3589 {
3590         struct hidpp_report *question = hidpp->send_receive_buf;
3591         struct hidpp_report *answer = hidpp->send_receive_buf;
3592         struct hidpp_report *report = (struct hidpp_report *)data;
3593         int ret;
3594
3595         /*
3596          * If the mutex is locked then we have a pending answer from a
3597          * previously sent command.
3598          */
3599         if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
3600                 /*
3601                  * Check for a correct hidpp20 answer or the corresponding
3602                  * error
3603                  */
3604                 if (hidpp_match_answer(question, report) ||
3605                                 hidpp_match_error(question, report)) {
3606                         *answer = *report;
3607                         hidpp->answer_available = true;
3608                         wake_up(&hidpp->wait);
3609                         /*
3610                          * This was an answer to a command that this driver sent
3611                          * We return 1 to hid-core to avoid forwarding the
3612                          * command upstream as it has been treated by the driver
3613                          */
3614
3615                         return 1;
3616                 }
3617         }
3618
3619         if (unlikely(hidpp_report_is_connect_event(hidpp, report))) {
3620                 atomic_set(&hidpp->connected,
3621                                 !(report->rap.params[0] & (1 << 6)));
3622                 if (schedule_work(&hidpp->work) == 0)
3623                         dbg_hid("%s: connect event already queued\n", __func__);
3624                 return 1;
3625         }
3626
3627         if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
3628             data[0] == REPORT_ID_HIDPP_SHORT &&
3629             data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
3630             (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
3631                 dev_err_ratelimited(&hidpp->hid_dev->dev,
3632                         "Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
3633                 dev_err_ratelimited(&hidpp->hid_dev->dev,
3634                         "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
3635         }
3636
3637         if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3638                 ret = hidpp20_battery_event_1000(hidpp, data, size);
3639                 if (ret != 0)
3640                         return ret;
3641                 ret = hidpp20_battery_event_1004(hidpp, data, size);
3642                 if (ret != 0)
3643                         return ret;
3644                 ret = hidpp_solar_battery_event(hidpp, data, size);
3645                 if (ret != 0)
3646                         return ret;
3647                 ret = hidpp20_battery_voltage_event(hidpp, data, size);
3648                 if (ret != 0)
3649                         return ret;
3650         }
3651
3652         if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3653                 ret = hidpp10_battery_event(hidpp, data, size);
3654                 if (ret != 0)
3655                         return ret;
3656         }
3657
3658         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3659                 ret = hidpp10_wheel_raw_event(hidpp, data, size);
3660                 if (ret != 0)
3661                         return ret;
3662         }
3663
3664         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3665                 ret = hidpp10_extra_mouse_buttons_raw_event(hidpp, data, size);
3666                 if (ret != 0)
3667                         return ret;
3668         }
3669
3670         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3671                 ret = hidpp10_consumer_keys_raw_event(hidpp, data, size);
3672                 if (ret != 0)
3673                         return ret;
3674         }
3675
3676         return 0;
3677 }
3678
3679 static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
3680                 u8 *data, int size)
3681 {
3682         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3683         int ret = 0;
3684
3685         if (!hidpp)
3686                 return 0;
3687
3688         /* Generic HID++ processing. */
3689         switch (data[0]) {
3690         case REPORT_ID_HIDPP_VERY_LONG:
3691                 if (size != hidpp->very_long_report_length) {
3692                         hid_err(hdev, "received hid++ report of bad size (%d)",
3693                                 size);
3694                         return 1;
3695                 }
3696                 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3697                 break;
3698         case REPORT_ID_HIDPP_LONG:
3699                 if (size != HIDPP_REPORT_LONG_LENGTH) {
3700                         hid_err(hdev, "received hid++ report of bad size (%d)",
3701                                 size);
3702                         return 1;
3703                 }
3704                 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3705                 break;
3706         case REPORT_ID_HIDPP_SHORT:
3707                 if (size != HIDPP_REPORT_SHORT_LENGTH) {
3708                         hid_err(hdev, "received hid++ report of bad size (%d)",
3709                                 size);
3710                         return 1;
3711                 }
3712                 ret = hidpp_raw_hidpp_event(hidpp, data, size);
3713                 break;
3714         }
3715
3716         /* If no report is available for further processing, skip calling
3717          * raw_event of subclasses. */
3718         if (ret != 0)
3719                 return ret;
3720
3721         if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
3722                 return wtp_raw_event(hdev, data, size);
3723         else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560)
3724                 return m560_raw_event(hdev, data, size);
3725
3726         return 0;
3727 }
3728
3729 static int hidpp_event(struct hid_device *hdev, struct hid_field *field,
3730         struct hid_usage *usage, __s32 value)
3731 {
3732         /* This function will only be called for scroll events, due to the
3733          * restriction imposed in hidpp_usages.
3734          */
3735         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3736         struct hidpp_scroll_counter *counter;
3737
3738         if (!hidpp)
3739                 return 0;
3740
3741         counter = &hidpp->vertical_wheel_counter;
3742         /* A scroll event may occur before the multiplier has been retrieved or
3743          * the input device set, or high-res scroll enabling may fail. In such
3744          * cases we must return early (falling back to default behaviour) to
3745          * avoid a crash in hidpp_scroll_counter_handle_scroll.
3746          */
3747         if (!(hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
3748             || value == 0 || hidpp->input == NULL
3749             || counter->wheel_multiplier == 0)
3750                 return 0;
3751
3752         hidpp_scroll_counter_handle_scroll(hidpp->input, counter, value);
3753         return 1;
3754 }
3755
3756 static int hidpp_initialize_battery(struct hidpp_device *hidpp)
3757 {
3758         static atomic_t battery_no = ATOMIC_INIT(0);
3759         struct power_supply_config cfg = { .drv_data = hidpp };
3760         struct power_supply_desc *desc = &hidpp->battery.desc;
3761         enum power_supply_property *battery_props;
3762         struct hidpp_battery *battery;
3763         unsigned int num_battery_props;
3764         unsigned long n;
3765         int ret;
3766
3767         if (hidpp->battery.ps)
3768                 return 0;
3769
3770         hidpp->battery.feature_index = 0xff;
3771         hidpp->battery.solar_feature_index = 0xff;
3772         hidpp->battery.voltage_feature_index = 0xff;
3773
3774         if (hidpp->protocol_major >= 2) {
3775                 if (hidpp->quirks & HIDPP_QUIRK_CLASS_K750)
3776                         ret = hidpp_solar_request_battery_event(hidpp);
3777                 else {
3778                         /* we only support one battery feature right now, so let's
3779                            first check the ones that support battery level first
3780                            and leave voltage for last */
3781                         ret = hidpp20_query_battery_info_1000(hidpp);
3782                         if (ret)
3783                                 ret = hidpp20_query_battery_info_1004(hidpp);
3784                         if (ret)
3785                                 ret = hidpp20_query_battery_voltage_info(hidpp);
3786                 }
3787
3788                 if (ret)
3789                         return ret;
3790                 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP20_BATTERY;
3791         } else {
3792                 ret = hidpp10_query_battery_status(hidpp);
3793                 if (ret) {
3794                         ret = hidpp10_query_battery_mileage(hidpp);
3795                         if (ret)
3796                                 return -ENOENT;
3797                         hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_MILEAGE;
3798                 } else {
3799                         hidpp->capabilities |= HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS;
3800                 }
3801                 hidpp->capabilities |= HIDPP_CAPABILITY_HIDPP10_BATTERY;
3802         }
3803
3804         battery_props = devm_kmemdup(&hidpp->hid_dev->dev,
3805                                      hidpp_battery_props,
3806                                      sizeof(hidpp_battery_props),
3807                                      GFP_KERNEL);
3808         if (!battery_props)
3809                 return -ENOMEM;
3810
3811         num_battery_props = ARRAY_SIZE(hidpp_battery_props) - 3;
3812
3813         if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE ||
3814             hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_PERCENTAGE ||
3815             hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3816                 battery_props[num_battery_props++] =
3817                                 POWER_SUPPLY_PROP_CAPACITY;
3818
3819         if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS)
3820                 battery_props[num_battery_props++] =
3821                                 POWER_SUPPLY_PROP_CAPACITY_LEVEL;
3822
3823         if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3824                 battery_props[num_battery_props++] =
3825                         POWER_SUPPLY_PROP_VOLTAGE_NOW;
3826
3827         battery = &hidpp->battery;
3828
3829         n = atomic_inc_return(&battery_no) - 1;
3830         desc->properties = battery_props;
3831         desc->num_properties = num_battery_props;
3832         desc->get_property = hidpp_battery_get_property;
3833         sprintf(battery->name, "hidpp_battery_%ld", n);
3834         desc->name = battery->name;
3835         desc->type = POWER_SUPPLY_TYPE_BATTERY;
3836         desc->use_for_apm = 0;
3837
3838         battery->ps = devm_power_supply_register(&hidpp->hid_dev->dev,
3839                                                  &battery->desc,
3840                                                  &cfg);
3841         if (IS_ERR(battery->ps))
3842                 return PTR_ERR(battery->ps);
3843
3844         power_supply_powers(battery->ps, &hidpp->hid_dev->dev);
3845
3846         return ret;
3847 }
3848
3849 static void hidpp_overwrite_name(struct hid_device *hdev)
3850 {
3851         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3852         char *name;
3853
3854         if (hidpp->protocol_major < 2)
3855                 return;
3856
3857         name = hidpp_get_device_name(hidpp);
3858
3859         if (!name) {
3860                 hid_err(hdev, "unable to retrieve the name of the device");
3861         } else {
3862                 dbg_hid("HID++: Got name: %s\n", name);
3863                 snprintf(hdev->name, sizeof(hdev->name), "%s", name);
3864         }
3865
3866         kfree(name);
3867 }
3868
3869 static int hidpp_input_open(struct input_dev *dev)
3870 {
3871         struct hid_device *hid = input_get_drvdata(dev);
3872
3873         return hid_hw_open(hid);
3874 }
3875
3876 static void hidpp_input_close(struct input_dev *dev)
3877 {
3878         struct hid_device *hid = input_get_drvdata(dev);
3879
3880         hid_hw_close(hid);
3881 }
3882
3883 static struct input_dev *hidpp_allocate_input(struct hid_device *hdev)
3884 {
3885         struct input_dev *input_dev = devm_input_allocate_device(&hdev->dev);
3886         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
3887
3888         if (!input_dev)
3889                 return NULL;
3890
3891         input_set_drvdata(input_dev, hdev);
3892         input_dev->open = hidpp_input_open;
3893         input_dev->close = hidpp_input_close;
3894
3895         input_dev->name = hidpp->name;
3896         input_dev->phys = hdev->phys;
3897         input_dev->uniq = hdev->uniq;
3898         input_dev->id.bustype = hdev->bus;
3899         input_dev->id.vendor  = hdev->vendor;
3900         input_dev->id.product = hdev->product;
3901         input_dev->id.version = hdev->version;
3902         input_dev->dev.parent = &hdev->dev;
3903
3904         return input_dev;
3905 }
3906
3907 static void hidpp_connect_event(struct hidpp_device *hidpp)
3908 {
3909         struct hid_device *hdev = hidpp->hid_dev;
3910         int ret = 0;
3911         bool connected = atomic_read(&hidpp->connected);
3912         struct input_dev *input;
3913         char *name, *devm_name;
3914
3915         if (!connected) {
3916                 if (hidpp->battery.ps) {
3917                         hidpp->battery.online = false;
3918                         hidpp->battery.status = POWER_SUPPLY_STATUS_UNKNOWN;
3919                         hidpp->battery.level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
3920                         power_supply_changed(hidpp->battery.ps);
3921                 }
3922                 return;
3923         }
3924
3925         if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
3926                 ret = wtp_connect(hdev, connected);
3927                 if (ret)
3928                         return;
3929         } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560) {
3930                 ret = m560_send_config_command(hdev, connected);
3931                 if (ret)
3932                         return;
3933         } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
3934                 ret = k400_connect(hdev, connected);
3935                 if (ret)
3936                         return;
3937         }
3938
3939         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
3940                 ret = hidpp10_wheel_connect(hidpp);
3941                 if (ret)
3942                         return;
3943         }
3944
3945         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS) {
3946                 ret = hidpp10_extra_mouse_buttons_connect(hidpp);
3947                 if (ret)
3948                         return;
3949         }
3950
3951         if (hidpp->quirks & HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS) {
3952                 ret = hidpp10_consumer_keys_connect(hidpp);
3953                 if (ret)
3954                         return;
3955         }
3956
3957         /* the device is already connected, we can ask for its name and
3958          * protocol */
3959         if (!hidpp->protocol_major) {
3960                 ret = hidpp_root_get_protocol_version(hidpp);
3961                 if (ret) {
3962                         hid_err(hdev, "Can not get the protocol version.\n");
3963                         return;
3964                 }
3965         }
3966
3967         if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
3968                 name = hidpp_get_device_name(hidpp);
3969                 if (name) {
3970                         devm_name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
3971                                                    "%s", name);
3972                         kfree(name);
3973                         if (!devm_name)
3974                                 return;
3975
3976                         hidpp->name = devm_name;
3977                 }
3978         }
3979
3980         hidpp_initialize_battery(hidpp);
3981         hidpp_initialize_hires_scroll(hidpp);
3982
3983         /* forward current battery state */
3984         if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {
3985                 hidpp10_enable_battery_reporting(hidpp);
3986                 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_MILEAGE)
3987                         hidpp10_query_battery_mileage(hidpp);
3988                 else
3989                         hidpp10_query_battery_status(hidpp);
3990         } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
3991                 if (hidpp->capabilities & HIDPP_CAPABILITY_BATTERY_VOLTAGE)
3992                         hidpp20_query_battery_voltage_info(hidpp);
3993                 else if (hidpp->capabilities & HIDPP_CAPABILITY_UNIFIED_BATTERY)
3994                         hidpp20_query_battery_info_1004(hidpp);
3995                 else
3996                         hidpp20_query_battery_info_1000(hidpp);
3997         }
3998         if (hidpp->battery.ps)
3999                 power_supply_changed(hidpp->battery.ps);
4000
4001         if (hidpp->capabilities & HIDPP_CAPABILITY_HI_RES_SCROLL)
4002                 hi_res_scroll_enable(hidpp);
4003
4004         if (!(hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) || hidpp->delayed_input)
4005                 /* if the input nodes are already created, we can stop now */
4006                 return;
4007
4008         input = hidpp_allocate_input(hdev);
4009         if (!input) {
4010                 hid_err(hdev, "cannot allocate new input device: %d\n", ret);
4011                 return;
4012         }
4013
4014         hidpp_populate_input(hidpp, input);
4015
4016         ret = input_register_device(input);
4017         if (ret) {
4018                 input_free_device(input);
4019                 return;
4020         }
4021
4022         hidpp->delayed_input = input;
4023 }
4024
4025 static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
4026
4027 static struct attribute *sysfs_attrs[] = {
4028         &dev_attr_builtin_power_supply.attr,
4029         NULL
4030 };
4031
4032 static const struct attribute_group ps_attribute_group = {
4033         .attrs = sysfs_attrs
4034 };
4035
4036 static int hidpp_get_report_length(struct hid_device *hdev, int id)
4037 {
4038         struct hid_report_enum *re;
4039         struct hid_report *report;
4040
4041         re = &(hdev->report_enum[HID_OUTPUT_REPORT]);
4042         report = re->report_id_hash[id];
4043         if (!report)
4044                 return 0;
4045
4046         return report->field[0]->report_count + 1;
4047 }
4048
4049 static u8 hidpp_validate_device(struct hid_device *hdev)
4050 {
4051         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4052         int id, report_length;
4053         u8 supported_reports = 0;
4054
4055         id = REPORT_ID_HIDPP_SHORT;
4056         report_length = hidpp_get_report_length(hdev, id);
4057         if (report_length) {
4058                 if (report_length < HIDPP_REPORT_SHORT_LENGTH)
4059                         goto bad_device;
4060
4061                 supported_reports |= HIDPP_REPORT_SHORT_SUPPORTED;
4062         }
4063
4064         id = REPORT_ID_HIDPP_LONG;
4065         report_length = hidpp_get_report_length(hdev, id);
4066         if (report_length) {
4067                 if (report_length < HIDPP_REPORT_LONG_LENGTH)
4068                         goto bad_device;
4069
4070                 supported_reports |= HIDPP_REPORT_LONG_SUPPORTED;
4071         }
4072
4073         id = REPORT_ID_HIDPP_VERY_LONG;
4074         report_length = hidpp_get_report_length(hdev, id);
4075         if (report_length) {
4076                 if (report_length < HIDPP_REPORT_LONG_LENGTH ||
4077                     report_length > HIDPP_REPORT_VERY_LONG_MAX_LENGTH)
4078                         goto bad_device;
4079
4080                 supported_reports |= HIDPP_REPORT_VERY_LONG_SUPPORTED;
4081                 hidpp->very_long_report_length = report_length;
4082         }
4083
4084         return supported_reports;
4085
4086 bad_device:
4087         hid_warn(hdev, "not enough values in hidpp report %d\n", id);
4088         return false;
4089 }
4090
4091 static bool hidpp_application_equals(struct hid_device *hdev,
4092                                      unsigned int application)
4093 {
4094         struct list_head *report_list;
4095         struct hid_report *report;
4096
4097         report_list = &hdev->report_enum[HID_INPUT_REPORT].report_list;
4098         report = list_first_entry_or_null(report_list, struct hid_report, list);
4099         return report && report->application == application;
4100 }
4101
4102 static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
4103 {
4104         struct hidpp_device *hidpp;
4105         int ret;
4106         bool connected;
4107         unsigned int connect_mask = HID_CONNECT_DEFAULT;
4108         struct hidpp_ff_private_data data;
4109
4110         /* report_fixup needs drvdata to be set before we call hid_parse */
4111         hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
4112         if (!hidpp)
4113                 return -ENOMEM;
4114
4115         hidpp->hid_dev = hdev;
4116         hidpp->name = hdev->name;
4117         hidpp->quirks = id->driver_data;
4118         hid_set_drvdata(hdev, hidpp);
4119
4120         ret = hid_parse(hdev);
4121         if (ret) {
4122                 hid_err(hdev, "%s:parse failed\n", __func__);
4123                 return ret;
4124         }
4125
4126         /*
4127          * Make sure the device is HID++ capable, otherwise treat as generic HID
4128          */
4129         hidpp->supported_reports = hidpp_validate_device(hdev);
4130
4131         if (!hidpp->supported_reports) {
4132                 hid_set_drvdata(hdev, NULL);
4133                 devm_kfree(&hdev->dev, hidpp);
4134                 return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
4135         }
4136
4137         if (id->group == HID_GROUP_LOGITECH_DJ_DEVICE)
4138                 hidpp->quirks |= HIDPP_QUIRK_UNIFYING;
4139
4140         if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4141             hidpp_application_equals(hdev, HID_GD_MOUSE))
4142                 hidpp->quirks |= HIDPP_QUIRK_HIDPP_WHEELS |
4143                                  HIDPP_QUIRK_HIDPP_EXTRA_MOUSE_BTNS;
4144
4145         if (id->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
4146             hidpp_application_equals(hdev, HID_GD_KEYBOARD))
4147                 hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
4148
4149         if (disable_raw_mode) {
4150                 hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP;
4151                 hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT;
4152         }
4153
4154         if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
4155                 ret = wtp_allocate(hdev, id);
4156                 if (ret)
4157                         return ret;
4158         } else if (hidpp->quirks & HIDPP_QUIRK_CLASS_K400) {
4159                 ret = k400_allocate(hdev);
4160                 if (ret)
4161                         return ret;
4162         }
4163
4164         INIT_WORK(&hidpp->work, delayed_work_cb);
4165         mutex_init(&hidpp->send_mutex);
4166         init_waitqueue_head(&hidpp->wait);
4167
4168         /* indicates we are handling the battery properties in the kernel */
4169         ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
4170         if (ret)
4171                 hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
4172                          hdev->name);
4173
4174         /*
4175          * Plain USB connections need to actually call start and open
4176          * on the transport driver to allow incoming data.
4177          */
4178         ret = hid_hw_start(hdev, 0);
4179         if (ret) {
4180                 hid_err(hdev, "hw start failed\n");
4181                 goto hid_hw_start_fail;
4182         }
4183
4184         ret = hid_hw_open(hdev);
4185         if (ret < 0) {
4186                 dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
4187                         __func__, ret);
4188                 goto hid_hw_open_fail;
4189         }
4190
4191         /* Allow incoming packets */
4192         hid_device_io_start(hdev);
4193
4194         if (hidpp->quirks & HIDPP_QUIRK_UNIFYING)
4195                 hidpp_unifying_init(hidpp);
4196
4197         connected = hidpp_root_get_protocol_version(hidpp) == 0;
4198         atomic_set(&hidpp->connected, connected);
4199         if (!(hidpp->quirks & HIDPP_QUIRK_UNIFYING)) {
4200                 if (!connected) {
4201                         ret = -ENODEV;
4202                         hid_err(hdev, "Device not connected");
4203                         goto hid_hw_init_fail;
4204                 }
4205
4206                 hidpp_overwrite_name(hdev);
4207         }
4208
4209         if (connected && hidpp->protocol_major >= 2) {
4210                 ret = hidpp_set_wireless_feature_index(hidpp);
4211                 if (ret == -ENOENT)
4212                         hidpp->wireless_feature_index = 0;
4213                 else if (ret)
4214                         goto hid_hw_init_fail;
4215         }
4216
4217         if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
4218                 ret = wtp_get_config(hidpp);
4219                 if (ret)
4220                         goto hid_hw_init_fail;
4221         } else if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_G920)) {
4222                 ret = g920_get_config(hidpp, &data);
4223                 if (ret)
4224                         goto hid_hw_init_fail;
4225         }
4226
4227         hidpp_connect_event(hidpp);
4228
4229         /* Reset the HID node state */
4230         hid_device_io_stop(hdev);
4231         hid_hw_close(hdev);
4232         hid_hw_stop(hdev);
4233
4234         if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
4235                 connect_mask &= ~HID_CONNECT_HIDINPUT;
4236
4237         /* Now export the actual inputs and hidraw nodes to the world */
4238         ret = hid_hw_start(hdev, connect_mask);
4239         if (ret) {
4240                 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
4241                 goto hid_hw_start_fail;
4242         }
4243
4244         if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
4245                 ret = hidpp_ff_init(hidpp, &data);
4246                 if (ret)
4247                         hid_warn(hidpp->hid_dev,
4248                      "Unable to initialize force feedback support, errno %d\n",
4249                                  ret);
4250         }
4251
4252         return ret;
4253
4254 hid_hw_init_fail:
4255         hid_hw_close(hdev);
4256 hid_hw_open_fail:
4257         hid_hw_stop(hdev);
4258 hid_hw_start_fail:
4259         sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4260         cancel_work_sync(&hidpp->work);
4261         mutex_destroy(&hidpp->send_mutex);
4262         return ret;
4263 }
4264
4265 static void hidpp_remove(struct hid_device *hdev)
4266 {
4267         struct hidpp_device *hidpp = hid_get_drvdata(hdev);
4268
4269         if (!hidpp)
4270                 return hid_hw_stop(hdev);
4271
4272         sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
4273
4274         hid_hw_stop(hdev);
4275         cancel_work_sync(&hidpp->work);
4276         mutex_destroy(&hidpp->send_mutex);
4277 }
4278
4279 #define LDJ_DEVICE(product) \
4280         HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, \
4281                    USB_VENDOR_ID_LOGITECH, (product))
4282
4283 #define L27MHZ_DEVICE(product) \
4284         HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_27MHZ_DEVICE, \
4285                    USB_VENDOR_ID_LOGITECH, (product))
4286
4287 static const struct hid_device_id hidpp_devices[] = {
4288         { /* wireless touchpad */
4289           LDJ_DEVICE(0x4011),
4290           .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT |
4291                          HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS },
4292         { /* wireless touchpad T650 */
4293           LDJ_DEVICE(0x4101),
4294           .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
4295         { /* wireless touchpad T651 */
4296           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
4297                 USB_DEVICE_ID_LOGITECH_T651),
4298           .driver_data = HIDPP_QUIRK_CLASS_WTP },
4299         { /* Mouse logitech M560 */
4300           LDJ_DEVICE(0x402d),
4301           .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_CLASS_M560 },
4302         { /* Keyboard logitech K400 */
4303           LDJ_DEVICE(0x4024),
4304           .driver_data = HIDPP_QUIRK_CLASS_K400 },
4305         { /* Solar Keyboard Logitech K750 */
4306           LDJ_DEVICE(0x4002),
4307           .driver_data = HIDPP_QUIRK_CLASS_K750 },
4308         { /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */
4309           LDJ_DEVICE(0xb305),
4310           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4311         { /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */
4312           LDJ_DEVICE(0xb309),
4313           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4314         { /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
4315           LDJ_DEVICE(0xb30b),
4316           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4317
4318         { LDJ_DEVICE(HID_ANY_ID) },
4319
4320         { /* Keyboard LX501 (Y-RR53) */
4321           L27MHZ_DEVICE(0x0049),
4322           .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4323         { /* Keyboard MX3000 (Y-RAM74) */
4324           L27MHZ_DEVICE(0x0057),
4325           .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4326         { /* Keyboard MX3200 (Y-RAV80) */
4327           L27MHZ_DEVICE(0x005c),
4328           .driver_data = HIDPP_QUIRK_KBD_ZOOM_WHEEL },
4329         { /* S510 Media Remote */
4330           L27MHZ_DEVICE(0x00fe),
4331           .driver_data = HIDPP_QUIRK_KBD_SCROLL_WHEEL },
4332
4333         { L27MHZ_DEVICE(HID_ANY_ID) },
4334
4335         { /* Logitech G403 Wireless Gaming Mouse over USB */
4336           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC082) },
4337         { /* Logitech G703 Gaming Mouse over USB */
4338           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC087) },
4339         { /* Logitech G703 Hero Gaming Mouse over USB */
4340           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC090) },
4341         { /* Logitech G900 Gaming Mouse over USB */
4342           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC081) },
4343         { /* Logitech G903 Gaming Mouse over USB */
4344           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
4345         { /* Logitech G903 Hero Gaming Mouse over USB */
4346           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
4347         { /* Logitech G920 Wheel over USB */
4348           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
4349                 .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
4350         { /* Logitech G Pro Gaming Mouse over USB */
4351           HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC088) },
4352
4353         { /* MX5000 keyboard over Bluetooth */
4354           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305),
4355           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4356         { /* Dinovo Edge keyboard over Bluetooth */
4357           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309),
4358           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4359         { /* MX5500 keyboard over Bluetooth */
4360           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
4361           .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
4362         { /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
4363           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
4364         { /* MX Master mouse over Bluetooth */
4365           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb012) },
4366         { /* MX Ergo trackball over Bluetooth */
4367           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01d) },
4368         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb01e) },
4369         { /* MX Master 3 mouse over Bluetooth */
4370           HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
4371         {}
4372 };
4373
4374 MODULE_DEVICE_TABLE(hid, hidpp_devices);
4375
4376 static const struct hid_usage_id hidpp_usages[] = {
4377         { HID_GD_WHEEL, EV_REL, REL_WHEEL_HI_RES },
4378         { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1}
4379 };
4380
4381 static struct hid_driver hidpp_driver = {
4382         .name = "logitech-hidpp-device",
4383         .id_table = hidpp_devices,
4384         .report_fixup = hidpp_report_fixup,
4385         .probe = hidpp_probe,
4386         .remove = hidpp_remove,
4387         .raw_event = hidpp_raw_event,
4388         .usage_table = hidpp_usages,
4389         .event = hidpp_event,
4390         .input_configured = hidpp_input_configured,
4391         .input_mapping = hidpp_input_mapping,
4392         .input_mapped = hidpp_input_mapped,
4393 };
4394
4395 module_hid_driver(hidpp_driver);