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