Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus-2022121301' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid

Pull HID updates from Jiri Kosina:

- iio support for the MCP2221 HID driver (Matt Ranostay)

- support for more than one hinge sensor in hid-sensor-custom (Yauhen
Kharuzhy)

- PS DualShock 4 controller support (Roderick Colenbrander)

- XP-PEN Deco LW support (José Expósito)

- other assorted code cleanups and device ID/quirk addtions

* tag 'for-linus-2022121301' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: (51 commits)
HID: logitech HID++: Send SwID in GetProtocolVersion
HID: hid-elan: use default remove for hid device
HID: hid-alps: use default remove for hid device
HID: hid-sensor-custom: set fixed size for custom attributes
HID: i2c: let RMI devices decide what constitutes wakeup event
HID: playstation: fix DualShock4 bluetooth CRC endian issue.
HID: playstation: fix DualShock4 bluetooth memory corruption bug.
HID: apple: Swap Control and Command keys on Apple keyboards
HID: intel-ish-hid: ishtp: remove variable rb_count
HID: uclogic: Standardize test name prefix
HID: hid-sensor-custom: Allow more than one hinge angle sensor
HID: ft260: fix 'cast to restricted' kernel CI bot warnings
HID: ft260: missed NACK from busy device
HID: ft260: fix a NULL pointer dereference in ft260_i2c_write
HID: ft260: wake up device from power saving mode
HID: ft260: missed NACK from big i2c read
HID: ft260: remove SMBus Quick command support
HID: ft260: skip unexpected HID input reports
HID: ft260: do not populate /dev/hidraw device
HID: ft260: improve i2c large reads performance
...

+2056 -295
+2 -1
drivers/hid/Kconfig
··· 1252 1252 config HID_MCP2221 1253 1253 tristate "Microchip MCP2221 HID USB-to-I2C/SMbus host support" 1254 1254 depends on USB_HID && I2C 1255 - depends on GPIOLIB 1255 + imply GPIOLIB 1256 + imply IIO 1256 1257 help 1257 1258 Provides I2C and SMBUS host adapter functionality over USB-HID 1258 1259 through MCP2221 device.
-6
drivers/hid/hid-alps.c
··· 820 820 return 0; 821 821 } 822 822 823 - static void alps_remove(struct hid_device *hdev) 824 - { 825 - hid_hw_stop(hdev); 826 - } 827 - 828 823 static const struct hid_device_id alps_id[] = { 829 824 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, 830 825 USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) }, ··· 837 842 .name = "hid-alps", 838 843 .id_table = alps_id, 839 844 .probe = alps_probe, 840 - .remove = alps_remove, 841 845 .raw_event = alps_raw_event, 842 846 .input_mapping = alps_input_mapping, 843 847 .input_configured = alps_input_configured,
+74 -67
drivers/hid/hid-apple.c
··· 59 59 "(For people who want to keep Windows PC keyboard muscle memory. " 60 60 "[0] = as-is, Mac layout. 1 = swapped, Windows layout.)"); 61 61 62 + static unsigned int swap_ctrl_cmd; 63 + module_param(swap_ctrl_cmd, uint, 0644); 64 + MODULE_PARM_DESC(swap_ctrl_cmd, "Swap the Control (\"Ctrl\") and Command (\"Flag\") keys. " 65 + "(For people who are used to Mac shortcuts involving Command instead of Control. " 66 + "[0] = No change. 1 = Swapped.)"); 67 + 62 68 static unsigned int swap_fn_leftctrl; 63 69 module_param(swap_fn_leftctrl, uint, 0644); 64 70 MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. " ··· 314 308 { KEY_LEFTALT, KEY_LEFTMETA }, 315 309 { KEY_LEFTMETA, KEY_LEFTALT }, 316 310 { KEY_RIGHTALT, KEY_RIGHTMETA }, 317 - { KEY_RIGHTMETA,KEY_RIGHTALT }, 311 + { KEY_RIGHTMETA, KEY_RIGHTALT }, 312 + { } 313 + }; 314 + 315 + static const struct apple_key_translation swapped_ctrl_cmd_keys[] = { 316 + { KEY_LEFTCTRL, KEY_LEFTMETA }, 317 + { KEY_LEFTMETA, KEY_LEFTCTRL }, 318 + { KEY_RIGHTCTRL, KEY_RIGHTMETA }, 319 + { KEY_RIGHTMETA, KEY_RIGHTCTRL }, 318 320 { } 319 321 }; 320 322 321 323 static const struct apple_key_translation swapped_fn_leftctrl_keys[] = { 322 324 { KEY_FN, KEY_LEFTCTRL }, 325 + { KEY_LEFTCTRL, KEY_FN }, 323 326 { } 324 327 }; 325 328 ··· 390 375 struct apple_sc *asc = hid_get_drvdata(hid); 391 376 const struct apple_key_translation *trans, *table; 392 377 bool do_translate; 393 - u16 code = 0; 378 + u16 code = usage->code; 394 379 unsigned int real_fnmode; 395 - 396 - u16 fn_keycode = (swap_fn_leftctrl) ? (KEY_LEFTCTRL) : (KEY_FN); 397 - 398 - if (usage->code == fn_keycode) { 399 - asc->fn_on = !!value; 400 - input_event_with_scancode(input, usage->type, KEY_FN, 401 - usage->hid, value); 402 - return 1; 403 - } 404 380 405 381 if (fnmode == 3) { 406 382 real_fnmode = (asc->quirks & APPLE_IS_NON_APPLE) ? 2 : 1; 407 383 } else { 408 384 real_fnmode = fnmode; 409 385 } 386 + 387 + if (swap_fn_leftctrl) { 388 + trans = apple_find_translation(swapped_fn_leftctrl_keys, code); 389 + 390 + if (trans) 391 + code = trans->to; 392 + } 393 + 394 + if (iso_layout > 0 || (iso_layout < 0 && (asc->quirks & APPLE_ISO_TILDE_QUIRK) && 395 + hid->country == HID_COUNTRY_INTERNATIONAL_ISO)) { 396 + trans = apple_find_translation(apple_iso_keyboard, code); 397 + 398 + if (trans) 399 + code = trans->to; 400 + } 401 + 402 + if (swap_opt_cmd) { 403 + trans = apple_find_translation(swapped_option_cmd_keys, code); 404 + 405 + if (trans) 406 + code = trans->to; 407 + } 408 + 409 + if (swap_ctrl_cmd) { 410 + trans = apple_find_translation(swapped_ctrl_cmd_keys, code); 411 + 412 + if (trans) 413 + code = trans->to; 414 + } 415 + 416 + if (code == KEY_FN) 417 + asc->fn_on = !!value; 410 418 411 419 if (real_fnmode) { 412 420 if (hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI || ··· 468 430 else 469 431 table = apple_fn_keys; 470 432 471 - trans = apple_find_translation (table, usage->code); 433 + trans = apple_find_translation(table, code); 472 434 473 435 if (trans) { 474 - if (test_bit(trans->from, input->key)) 436 + bool from_is_set = test_bit(trans->from, input->key); 437 + bool to_is_set = test_bit(trans->to, input->key); 438 + 439 + if (from_is_set) 475 440 code = trans->from; 476 - else if (test_bit(trans->to, input->key)) 441 + else if (to_is_set) 477 442 code = trans->to; 478 443 479 - if (!code) { 444 + if (!(from_is_set || to_is_set)) { 480 445 if (trans->flags & APPLE_FLAG_FKEY) { 481 446 switch (real_fnmode) { 482 447 case 1: ··· 496 455 do_translate = asc->fn_on; 497 456 } 498 457 499 - code = do_translate ? trans->to : trans->from; 458 + if (do_translate) 459 + code = trans->to; 500 460 } 501 - 502 - input_event_with_scancode(input, usage->type, code, 503 - usage->hid, value); 504 - return 1; 505 461 } 506 462 507 463 if (asc->quirks & APPLE_NUMLOCK_EMULATION && 508 - (test_bit(usage->code, asc->pressed_numlock) || 464 + (test_bit(code, asc->pressed_numlock) || 509 465 test_bit(LED_NUML, input->led))) { 510 - trans = apple_find_translation(powerbook_numlock_keys, 511 - usage->code); 466 + trans = apple_find_translation(powerbook_numlock_keys, code); 512 467 513 468 if (trans) { 514 469 if (value) 515 - set_bit(usage->code, 516 - asc->pressed_numlock); 470 + set_bit(code, asc->pressed_numlock); 517 471 else 518 - clear_bit(usage->code, 519 - asc->pressed_numlock); 472 + clear_bit(code, asc->pressed_numlock); 520 473 521 - input_event_with_scancode(input, usage->type, 522 - trans->to, usage->hid, value); 474 + code = trans->to; 523 475 } 524 - 525 - return 1; 526 476 } 527 477 } 528 478 529 - if (iso_layout > 0 || (iso_layout < 0 && (asc->quirks & APPLE_ISO_TILDE_QUIRK) && 530 - hid->country == HID_COUNTRY_INTERNATIONAL_ISO)) { 531 - trans = apple_find_translation(apple_iso_keyboard, usage->code); 532 - if (trans) { 533 - input_event_with_scancode(input, usage->type, 534 - trans->to, usage->hid, value); 535 - return 1; 536 - } 537 - } 479 + if (usage->code != code) { 480 + input_event_with_scancode(input, usage->type, code, usage->hid, value); 538 481 539 - if (swap_opt_cmd) { 540 - trans = apple_find_translation(swapped_option_cmd_keys, usage->code); 541 - if (trans) { 542 - input_event_with_scancode(input, usage->type, 543 - trans->to, usage->hid, value); 544 - return 1; 545 - } 546 - } 547 - 548 - if (swap_fn_leftctrl) { 549 - trans = apple_find_translation(swapped_fn_leftctrl_keys, usage->code); 550 - if (trans) { 551 - input_event_with_scancode(input, usage->type, 552 - trans->to, usage->hid, value); 553 - return 1; 554 - } 482 + return 1; 555 483 } 556 484 557 485 return 0; ··· 650 640 apple_setup_key_translation(input, apple2021_fn_keys); 651 641 apple_setup_key_translation(input, macbookpro_no_esc_fn_keys); 652 642 apple_setup_key_translation(input, macbookpro_dedicated_esc_fn_keys); 653 - 654 - if (swap_fn_leftctrl) 655 - apple_setup_key_translation(input, swapped_fn_leftctrl_keys); 656 643 } 657 644 658 645 static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi, ··· 1018 1011 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), 1019 1012 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 1020 1013 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K), 1021 - .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL }, 1014 + .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK }, 1022 1015 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132), 1023 - .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL }, 1016 + .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK }, 1024 1017 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680), 1025 - .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL }, 1018 + .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK }, 1026 1019 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213), 1027 - .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL }, 1020 + .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK }, 1028 1021 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K), 1029 - .driver_data = APPLE_HAS_FN }, 1022 + .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, 1030 1023 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223), 1031 - .driver_data = APPLE_HAS_FN }, 1024 + .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, 1032 1025 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K), 1033 - .driver_data = APPLE_HAS_FN }, 1026 + .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, 1034 1027 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F), 1035 - .driver_data = APPLE_HAS_FN }, 1028 + .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, 1036 1029 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), 1037 1030 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 1038 1031 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
-6
drivers/hid/hid-elan.c
··· 507 507 return ret; 508 508 } 509 509 510 - static void elan_remove(struct hid_device *hdev) 511 - { 512 - hid_hw_stop(hdev); 513 - } 514 - 515 510 static const struct hid_device_id elan_devices[] = { 516 511 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_HP_X2), 517 512 .driver_data = ELAN_HAS_LED }, ··· 524 529 .input_configured = elan_input_configured, 525 530 .raw_event = elan_raw_event, 526 531 .probe = elan_probe, 527 - .remove = elan_remove, 528 532 }; 529 533 530 534 module_hid_driver(elan_driver);
+191 -134
drivers/hid/hid-ft260.c
··· 30 30 31 31 #define FT260_REPORT_MAX_LENGTH (64) 32 32 #define FT260_I2C_DATA_REPORT_ID(len) (FT260_I2C_REPORT_MIN + (len - 1) / 4) 33 + 34 + #define FT260_WAKEUP_NEEDED_AFTER_MS (4800) /* 5s minus 200ms margin */ 35 + 33 36 /* 34 - * The input report format assigns 62 bytes for the data payload, but ft260 35 - * returns 60 and 2 in two separate transactions. To minimize transfer time 36 - * in reading chunks mode, set the maximum read payload length to 60 bytes. 37 - */ 38 - #define FT260_RD_DATA_MAX (60) 37 + * The ft260 input report format defines 62 bytes for the data payload, but 38 + * when requested 62 bytes, the controller returns 60 and 2 in separate input 39 + * reports. To achieve better performance with the multi-report read data 40 + * transfers, we set the maximum read payload length to a multiple of 60. 41 + * With a 100 kHz I2C clock, one 240 bytes read takes about 1/27 second, 42 + * which is excessive; On the other hand, some higher layer drivers like at24 43 + * or optoe limit the i2c reads to 128 bytes. To not block other drivers out 44 + * of I2C for potentially troublesome amounts of time, we select the maximum 45 + * read payload length to be 180 bytes. 46 + */ 47 + #define FT260_RD_DATA_MAX (180) 39 48 #define FT260_WR_DATA_MAX (60) 40 49 41 50 /* ··· 239 230 struct completion wait; 240 231 struct mutex lock; 241 232 u8 write_buf[FT260_REPORT_MAX_LENGTH]; 233 + unsigned long need_wakeup_at; 242 234 u8 *read_buf; 243 235 u16 read_idx; 244 236 u16 read_len; ··· 303 293 return ret; 304 294 } 305 295 306 - static int ft260_xfer_status(struct ft260_device *dev) 296 + static int ft260_xfer_status(struct ft260_device *dev, u8 bus_busy) 307 297 { 308 298 struct hid_device *hdev = dev->hdev; 309 299 struct ft260_get_i2c_status_report report; 310 300 int ret; 301 + 302 + if (time_is_before_jiffies(dev->need_wakeup_at)) { 303 + ret = ft260_hid_feature_report_get(hdev, FT260_I2C_STATUS, 304 + (u8 *)&report, sizeof(report)); 305 + if (unlikely(ret < 0)) { 306 + hid_err(hdev, "failed to retrieve status: %d, no wakeup\n", 307 + ret); 308 + } else { 309 + dev->need_wakeup_at = jiffies + 310 + msecs_to_jiffies(FT260_WAKEUP_NEEDED_AFTER_MS); 311 + ft260_dbg("bus_status %#02x, wakeup\n", 312 + report.bus_status); 313 + } 314 + } 311 315 312 316 ret = ft260_hid_feature_report_get(hdev, FT260_I2C_STATUS, 313 317 (u8 *)&report, sizeof(report)); ··· 334 310 ft260_dbg("bus_status %#02x, clock %u\n", report.bus_status, 335 311 dev->clock); 336 312 337 - if (report.bus_status & FT260_I2C_STATUS_CTRL_BUSY) 313 + if (report.bus_status & (FT260_I2C_STATUS_CTRL_BUSY | bus_busy)) 338 314 return -EAGAIN; 339 315 340 - if (report.bus_status & FT260_I2C_STATUS_BUS_BUSY) 341 - return -EBUSY; 342 - 343 - if (report.bus_status & FT260_I2C_STATUS_ERROR) 316 + /* 317 + * The error condition (bit 1) is a status bit reflecting any 318 + * error conditions. When any of the bits 2, 3, or 4 are raised 319 + * to 1, bit 1 is also set to 1. 320 + */ 321 + if (report.bus_status & FT260_I2C_STATUS_ERROR) { 322 + hid_err(hdev, "i2c bus error: %#02x\n", report.bus_status); 344 323 return -EIO; 324 + } 345 325 346 - ret = -EIO; 347 - 348 - if (report.bus_status & FT260_I2C_STATUS_ADDR_NO_ACK) 349 - ft260_dbg("unacknowledged address\n"); 350 - 351 - if (report.bus_status & FT260_I2C_STATUS_DATA_NO_ACK) 352 - ft260_dbg("unacknowledged data\n"); 353 - 354 - if (report.bus_status & FT260_I2C_STATUS_ARBITR_LOST) 355 - ft260_dbg("arbitration loss\n"); 356 - 357 - if (report.bus_status & FT260_I2C_STATUS_CTRL_IDLE) 358 - ret = 0; 359 - 360 - return ret; 326 + return 0; 361 327 } 362 328 363 329 static int ft260_hid_output_report(struct hid_device *hdev, u8 *data, ··· 369 355 static int ft260_hid_output_report_check_status(struct ft260_device *dev, 370 356 u8 *data, int len) 371 357 { 372 - int ret, usec, try = 3; 358 + u8 bus_busy; 359 + int ret, usec, try = 100; 373 360 struct hid_device *hdev = dev->hdev; 361 + struct ft260_i2c_write_request_report *rep = 362 + (struct ft260_i2c_write_request_report *)data; 374 363 375 364 ret = ft260_hid_output_report(hdev, data, len); 376 365 if (ret < 0) { ··· 383 366 return ret; 384 367 } 385 368 386 - /* transfer time = 1 / clock(KHz) * 10 bits * bytes */ 387 - usec = 10000 / dev->clock * len; 388 - usleep_range(usec, usec + 100); 389 - ft260_dbg("wait %d usec, len %d\n", usec, len); 369 + /* transfer time = 1 / clock(KHz) * 9 bits * bytes */ 370 + usec = len * 9000 / dev->clock; 371 + if (usec > 2000) { 372 + usec -= 1500; 373 + usleep_range(usec, usec + 100); 374 + ft260_dbg("wait %d usec, len %d\n", usec, len); 375 + } 376 + 377 + /* 378 + * Do not check the busy bit for combined transactions 379 + * since the controller keeps the bus busy between writing 380 + * and reading IOs to ensure an atomic operation. 381 + */ 382 + if (rep->flag == FT260_FLAG_START) 383 + bus_busy = 0; 384 + else 385 + bus_busy = FT260_I2C_STATUS_BUS_BUSY; 386 + 390 387 do { 391 - ret = ft260_xfer_status(dev); 388 + ret = ft260_xfer_status(dev, bus_busy); 392 389 if (ret != -EAGAIN) 393 390 break; 394 391 } while (--try); 395 392 396 - if (ret == 0 || ret == -EBUSY) 393 + if (ret == 0) 397 394 return 0; 398 395 399 396 ft260_i2c_reset(hdev); ··· 415 384 } 416 385 417 386 static int ft260_i2c_write(struct ft260_device *dev, u8 addr, u8 *data, 418 - int data_len, u8 flag) 387 + int len, u8 flag) 419 388 { 420 - int len, ret, idx = 0; 389 + int ret, wr_len, idx = 0; 421 390 struct hid_device *hdev = dev->hdev; 422 391 struct ft260_i2c_write_request_report *rep = 423 392 (struct ft260_i2c_write_request_report *)dev->write_buf; 424 393 394 + if (len < 1) 395 + return -EINVAL; 396 + 397 + rep->flag = FT260_FLAG_START; 398 + 425 399 do { 426 - if (data_len <= FT260_WR_DATA_MAX) 427 - len = data_len; 428 - else 429 - len = FT260_WR_DATA_MAX; 400 + if (len <= FT260_WR_DATA_MAX) { 401 + wr_len = len; 402 + if (flag == FT260_FLAG_START_STOP) 403 + rep->flag |= FT260_FLAG_STOP; 404 + } else { 405 + wr_len = FT260_WR_DATA_MAX; 406 + } 430 407 431 - rep->report = FT260_I2C_DATA_REPORT_ID(len); 408 + rep->report = FT260_I2C_DATA_REPORT_ID(wr_len); 432 409 rep->address = addr; 433 - rep->length = len; 434 - rep->flag = flag; 410 + rep->length = wr_len; 435 411 436 - memcpy(rep->data, &data[idx], len); 412 + memcpy(rep->data, &data[idx], wr_len); 437 413 438 - ft260_dbg("rep %#02x addr %#02x off %d len %d d[0] %#02x\n", 439 - rep->report, addr, idx, len, data[0]); 414 + ft260_dbg("rep %#02x addr %#02x off %d len %d wlen %d flag %#x d[0] %#02x\n", 415 + rep->report, addr, idx, len, wr_len, 416 + rep->flag, data[0]); 440 417 441 418 ret = ft260_hid_output_report_check_status(dev, (u8 *)rep, 442 - len + 4); 419 + wr_len + 4); 443 420 if (ret < 0) { 444 - hid_err(hdev, "%s: failed to start transfer, ret %d\n", 445 - __func__, ret); 421 + hid_err(hdev, "%s: failed with %d\n", __func__, ret); 446 422 return ret; 447 423 } 448 424 449 - data_len -= len; 450 - idx += len; 425 + len -= wr_len; 426 + idx += wr_len; 427 + rep->flag = 0; 451 428 452 - } while (data_len > 0); 429 + } while (len > 0); 453 430 454 431 return 0; 455 432 } ··· 496 457 static int ft260_i2c_read(struct ft260_device *dev, u8 addr, u8 *data, 497 458 u16 len, u8 flag) 498 459 { 460 + u16 rd_len; 461 + u16 rd_data_max = 60; 462 + int timeout, ret = 0; 499 463 struct ft260_i2c_read_request_report rep; 500 464 struct hid_device *hdev = dev->hdev; 501 - int timeout; 502 - int ret; 465 + u8 bus_busy = 0; 503 466 504 - if (len > FT260_RD_DATA_MAX) { 505 - hid_err(hdev, "%s: unsupported rd len: %d\n", __func__, len); 506 - return -EINVAL; 507 - } 467 + if ((flag & FT260_FLAG_START_REPEATED) == FT260_FLAG_START_REPEATED) 468 + flag = FT260_FLAG_START_REPEATED; 469 + else 470 + flag = FT260_FLAG_START; 471 + do { 472 + if (len <= rd_data_max) { 473 + rd_len = len; 474 + flag |= FT260_FLAG_STOP; 475 + } else { 476 + rd_len = rd_data_max; 477 + } 478 + rd_data_max = FT260_RD_DATA_MAX; 508 479 509 - dev->read_idx = 0; 510 - dev->read_buf = data; 511 - dev->read_len = len; 480 + rep.report = FT260_I2C_READ_REQ; 481 + rep.length = cpu_to_le16(rd_len); 482 + rep.address = addr; 483 + rep.flag = flag; 512 484 513 - rep.report = FT260_I2C_READ_REQ; 514 - rep.length = cpu_to_le16(len); 515 - rep.address = addr; 516 - rep.flag = flag; 485 + ft260_dbg("rep %#02x addr %#02x len %d rlen %d flag %#x\n", 486 + rep.report, rep.address, len, rd_len, flag); 517 487 518 - ft260_dbg("rep %#02x addr %#02x len %d\n", rep.report, rep.address, 519 - rep.length); 488 + reinit_completion(&dev->wait); 520 489 521 - reinit_completion(&dev->wait); 490 + dev->read_idx = 0; 491 + dev->read_buf = data; 492 + dev->read_len = rd_len; 522 493 523 - ret = ft260_hid_output_report(hdev, (u8 *)&rep, sizeof(rep)); 524 - if (ret < 0) { 525 - hid_err(hdev, "%s: failed to start transaction, ret %d\n", 526 - __func__, ret); 527 - return ret; 528 - } 494 + ret = ft260_hid_output_report(hdev, (u8 *)&rep, sizeof(rep)); 495 + if (ret < 0) { 496 + hid_err(hdev, "%s: failed with %d\n", __func__, ret); 497 + goto ft260_i2c_read_exit; 498 + } 529 499 530 - timeout = msecs_to_jiffies(5000); 531 - if (!wait_for_completion_timeout(&dev->wait, timeout)) { 532 - ft260_i2c_reset(hdev); 533 - return -ETIMEDOUT; 534 - } 500 + timeout = msecs_to_jiffies(5000); 501 + if (!wait_for_completion_timeout(&dev->wait, timeout)) { 502 + ret = -ETIMEDOUT; 503 + ft260_i2c_reset(hdev); 504 + goto ft260_i2c_read_exit; 505 + } 535 506 536 - ret = ft260_xfer_status(dev); 537 - if (ret == 0) 538 - return 0; 507 + dev->read_buf = NULL; 539 508 540 - ft260_i2c_reset(hdev); 541 - return -EIO; 509 + if (flag & FT260_FLAG_STOP) 510 + bus_busy = FT260_I2C_STATUS_BUS_BUSY; 511 + 512 + ret = ft260_xfer_status(dev, bus_busy); 513 + if (ret < 0) { 514 + ret = -EIO; 515 + ft260_i2c_reset(hdev); 516 + goto ft260_i2c_read_exit; 517 + } 518 + 519 + len -= rd_len; 520 + data += rd_len; 521 + flag = 0; 522 + 523 + } while (len > 0); 524 + 525 + ft260_i2c_read_exit: 526 + dev->read_buf = NULL; 527 + return ret; 542 528 } 543 529 544 530 /* ··· 574 510 */ 575 511 static int ft260_i2c_write_read(struct ft260_device *dev, struct i2c_msg *msgs) 576 512 { 577 - int len, ret; 578 - u16 left_len = msgs[1].len; 579 - u8 *read_buf = msgs[1].buf; 513 + int ret; 514 + int wr_len = msgs[0].len; 515 + int rd_len = msgs[1].len; 516 + struct hid_device *hdev = dev->hdev; 580 517 u8 addr = msgs[0].addr; 581 518 u16 read_off = 0; 582 - struct hid_device *hdev = dev->hdev; 583 519 584 - if (msgs[0].len > 2) { 585 - hid_err(hdev, "%s: unsupported wr len: %d\n", __func__, 586 - msgs[0].len); 520 + if (wr_len > 2) { 521 + hid_err(hdev, "%s: invalid wr_len: %d\n", __func__, wr_len); 587 522 return -EOPNOTSUPP; 588 523 } 589 524 590 - memcpy(&read_off, msgs[0].buf, msgs[0].len); 591 - 592 - do { 593 - if (left_len <= FT260_RD_DATA_MAX) 594 - len = left_len; 525 + if (ft260_debug) { 526 + if (wr_len == 2) 527 + read_off = be16_to_cpu(*(__be16 *)msgs[0].buf); 595 528 else 596 - len = FT260_RD_DATA_MAX; 529 + read_off = *msgs[0].buf; 597 530 598 - ft260_dbg("read_off %#x left_len %d len %d\n", read_off, 599 - left_len, len); 531 + pr_info("%s: off %#x rlen %d wlen %d\n", __func__, 532 + read_off, rd_len, wr_len); 533 + } 600 534 601 - ret = ft260_i2c_write(dev, addr, (u8 *)&read_off, msgs[0].len, 602 - FT260_FLAG_START); 603 - if (ret < 0) 604 - return ret; 535 + ret = ft260_i2c_write(dev, addr, msgs[0].buf, wr_len, 536 + FT260_FLAG_START); 537 + if (ret < 0) 538 + return ret; 605 539 606 - ret = ft260_i2c_read(dev, addr, read_buf, len, 607 - FT260_FLAG_START_STOP); 608 - if (ret < 0) 609 - return ret; 610 - 611 - left_len -= len; 612 - read_buf += len; 613 - read_off += len; 614 - 615 - } while (left_len > 0); 540 + ret = ft260_i2c_read(dev, addr, msgs[1].buf, rd_len, 541 + FT260_FLAG_START_STOP_REPEATED); 542 + if (ret < 0) 543 + return ret; 616 544 617 545 return 0; 618 546 } ··· 669 613 } 670 614 671 615 switch (size) { 672 - case I2C_SMBUS_QUICK: 673 - if (read_write == I2C_SMBUS_READ) 674 - ret = ft260_i2c_read(dev, addr, &data->byte, 0, 675 - FT260_FLAG_START_STOP); 676 - else 677 - ret = ft260_smbus_write(dev, addr, cmd, NULL, 0, 678 - FT260_FLAG_START_STOP); 679 - break; 680 616 case I2C_SMBUS_BYTE: 681 617 if (read_write == I2C_SMBUS_READ) 682 618 ret = ft260_i2c_read(dev, addr, &data->byte, 1, ··· 751 703 752 704 static u32 ft260_functionality(struct i2c_adapter *adap) 753 705 { 754 - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_QUICK | 706 + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE | 755 707 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | 756 708 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_I2C_BLOCK; 757 709 } ··· 830 782 } 831 783 832 784 static int ft260_word_show(struct hid_device *hdev, int id, u8 *cfg, int len, 833 - u16 *field, u8 *buf) 785 + __le16 *field, u8 *buf) 834 786 { 835 787 int ret; 836 788 ··· 859 811 860 812 #define FT260_I2CST_ATTR_SHOW(name) \ 861 813 FT260_ATTR_SHOW(name, ft260_get_i2c_status_report, \ 862 - FT260_I2C_STATUS, u16, ft260_word_show) 814 + FT260_I2C_STATUS, __le16, ft260_word_show) 863 815 864 - #define FT260_ATTR_STORE(name, reptype, id, req, type, func) \ 816 + #define FT260_ATTR_STORE(name, reptype, id, req, type, ctype, func) \ 865 817 static ssize_t name##_store(struct device *kdev, \ 866 818 struct device_attribute *attr, \ 867 819 const char *buf, size_t count) \ ··· 871 823 type name; \ 872 824 int ret; \ 873 825 \ 874 - if (!func(buf, 10, &name)) { \ 826 + if (!func(buf, 10, (ctype *)&name)) { \ 875 827 rep.name = name; \ 876 828 rep.report = id; \ 877 829 rep.request = req; \ ··· 887 839 888 840 #define FT260_BYTE_ATTR_STORE(name, reptype, req) \ 889 841 FT260_ATTR_STORE(name, reptype, FT260_SYSTEM_SETTINGS, req, \ 890 - u8, kstrtou8) 842 + u8, u8, kstrtou8) 891 843 892 844 #define FT260_WORD_ATTR_STORE(name, reptype, req) \ 893 845 FT260_ATTR_STORE(name, reptype, FT260_SYSTEM_SETTINGS, req, \ 894 - u16, kstrtou16) 846 + __le16, u16, kstrtou16) 895 847 896 848 FT260_SSTAT_ATTR_SHOW(chip_mode); 897 849 static DEVICE_ATTR_RO(chip_mode); ··· 976 928 return ret; 977 929 } 978 930 979 - ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW); 931 + ret = hid_hw_start(hdev, 0); 980 932 if (ret) { 981 933 hid_err(hdev, "failed to start HID HW\n"); 982 934 return ret; ··· 1003 955 if (ret <= 0) 1004 956 goto err_hid_close; 1005 957 958 + hid_info(hdev, "USB HID v%x.%02x Device [%s] on %s\n", 959 + hdev->version >> 8, hdev->version & 0xff, hdev->name, 960 + hdev->phys); 961 + 1006 962 hid_set_drvdata(hdev, dev); 1007 963 dev->hdev = hdev; 1008 964 dev->adap.owner = THIS_MODULE; ··· 1015 963 dev->adap.quirks = &ft260_i2c_quirks; 1016 964 dev->adap.dev.parent = &hdev->dev; 1017 965 snprintf(dev->adap.name, sizeof(dev->adap.name), 1018 - "FT260 usb-i2c bridge on hidraw%d", 1019 - ((struct hidraw *)hdev->hidraw)->minor); 966 + "FT260 usb-i2c bridge"); 1020 967 1021 968 mutex_init(&dev->lock); 1022 969 init_completion(&dev->wait); 1023 970 1024 - ret = ft260_xfer_status(dev); 971 + ret = ft260_xfer_status(dev, FT260_I2C_STATUS_BUS_BUSY); 1025 972 if (ret) 1026 973 ft260_i2c_reset(hdev); 1027 974 ··· 1073 1022 ft260_dbg("i2c resp: rep %#02x len %d\n", xfer->report, 1074 1023 xfer->length); 1075 1024 1025 + if ((dev->read_buf == NULL) || 1026 + (xfer->length > dev->read_len - dev->read_idx)) { 1027 + hid_err(hdev, "unexpected report %#02x, length %d\n", 1028 + xfer->report, xfer->length); 1029 + return -1; 1030 + } 1031 + 1076 1032 memcpy(&dev->read_buf[dev->read_idx], &xfer->data, 1077 1033 xfer->length); 1078 1034 dev->read_idx += xfer->length; ··· 1088 1030 complete(&dev->wait); 1089 1031 1090 1032 } else { 1091 - hid_err(hdev, "unknown report: %#02x\n", xfer->report); 1092 - return 0; 1033 + hid_err(hdev, "unhandled report %#02x\n", xfer->report); 1093 1034 } 1094 - return 1; 1035 + return 0; 1095 1036 } 1096 1037 1097 1038 static struct hid_driver ft260_driver = {
+10 -21
drivers/hid/hid-hyperv.c
··· 22 22 unsigned short reserved[11]; 23 23 }; 24 24 25 - /* The maximum size of a synthetic input message. */ 26 - #define SYNTHHID_MAX_INPUT_REPORT_SIZE 16 27 - 28 25 /* 29 26 * Current version 30 27 * ··· 54 57 struct synthhid_msg_hdr { 55 58 enum synthhid_msg_type type; 56 59 u32 size; 57 - }; 58 - 59 - struct synthhid_msg { 60 - struct synthhid_msg_hdr header; 61 - char data[1]; /* Enclosed message */ 62 60 }; 63 61 64 62 union synthhid_version { ··· 91 99 92 100 struct synthhid_input_report { 93 101 struct synthhid_msg_hdr header; 94 - char buffer[1]; 102 + char buffer[]; 95 103 }; 96 104 97 105 #pragma pack(pop) ··· 110 118 struct pipe_prt_msg { 111 119 enum pipe_prot_msg_type type; 112 120 u32 size; 113 - char data[1]; 121 + char data[]; 114 122 }; 115 123 116 124 struct mousevsc_prt_msg { ··· 224 232 225 233 ret = vmbus_sendpacket(input_device->device->channel, 226 234 &ack, 227 - sizeof(struct pipe_prt_msg) - sizeof(unsigned char) + 235 + sizeof(struct pipe_prt_msg) + 228 236 sizeof(struct synthhid_device_info_ack), 229 237 (unsigned long)&ack, 230 238 VM_PKT_DATA_INBAND, ··· 243 251 struct vmpacket_descriptor *packet) 244 252 { 245 253 struct pipe_prt_msg *pipe_msg; 246 - struct synthhid_msg *hid_msg; 254 + struct synthhid_msg_hdr *hid_msg_hdr; 247 255 struct mousevsc_dev *input_dev = hv_get_drvdata(device); 248 256 struct synthhid_input_report *input_report; 249 257 size_t len; ··· 254 262 if (pipe_msg->type != PIPE_MESSAGE_DATA) 255 263 return; 256 264 257 - hid_msg = (struct synthhid_msg *)pipe_msg->data; 265 + hid_msg_hdr = (struct synthhid_msg_hdr *)pipe_msg->data; 258 266 259 - switch (hid_msg->header.type) { 267 + switch (hid_msg_hdr->type) { 260 268 case SYNTH_HID_PROTOCOL_RESPONSE: 261 269 /* 262 270 * While it will be impossible for us to protect against 263 271 * malicious/buggy hypervisor/host, add a check here to 264 272 * ensure we don't corrupt memory. 265 273 */ 266 - if ((pipe_msg->size + sizeof(struct pipe_prt_msg) 267 - - sizeof(unsigned char)) 274 + if (struct_size(pipe_msg, data, pipe_msg->size) 268 275 > sizeof(struct mousevsc_prt_msg)) { 269 276 WARN_ON(1); 270 277 break; 271 278 } 272 279 273 280 memcpy(&input_dev->protocol_resp, pipe_msg, 274 - pipe_msg->size + sizeof(struct pipe_prt_msg) - 275 - sizeof(unsigned char)); 281 + struct_size(pipe_msg, data, pipe_msg->size)); 276 282 complete(&input_dev->wait_event); 277 283 break; 278 284 ··· 301 311 break; 302 312 default: 303 313 pr_err("unsupported hid msg type - type %d len %d\n", 304 - hid_msg->header.type, hid_msg->header.size); 314 + hid_msg_hdr->type, hid_msg_hdr->size); 305 315 break; 306 316 } 307 317 ··· 349 359 request->request.version_requested.version = SYNTHHID_INPUT_VERSION; 350 360 351 361 ret = vmbus_sendpacket(device->channel, request, 352 - sizeof(struct pipe_prt_msg) - 353 - sizeof(unsigned char) + 362 + sizeof(struct pipe_prt_msg) + 354 363 sizeof(struct synthhid_protocol_request), 355 364 (unsigned long)request, 356 365 VM_PKT_DATA_INBAND,
+6
drivers/hid/hid-input.c
··· 340 340 #define HID_BATTERY_QUIRK_PERCENT (1 << 0) /* always reports percent */ 341 341 #define HID_BATTERY_QUIRK_FEATURE (1 << 1) /* ask for feature report */ 342 342 #define HID_BATTERY_QUIRK_IGNORE (1 << 2) /* completely ignore the battery */ 343 + #define HID_BATTERY_QUIRK_AVOID_QUERY (1 << 3) /* do not query the battery */ 343 344 344 345 static const struct hid_device_id hid_battery_quirks[] = { 345 346 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, ··· 374 373 HID_BATTERY_QUIRK_IGNORE }, 375 374 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN), 376 375 HID_BATTERY_QUIRK_IGNORE }, 376 + { HID_USB_DEVICE(USB_VENDOR_ID_UGEE, USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_L), 377 + HID_BATTERY_QUIRK_AVOID_QUERY }, 377 378 { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_15), 378 379 HID_BATTERY_QUIRK_IGNORE }, 379 380 { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100), ··· 556 553 */ 557 554 dev->battery_avoid_query = report_type == HID_INPUT_REPORT && 558 555 field->physical == HID_DG_STYLUS; 556 + 557 + if (quirks & HID_BATTERY_QUIRK_AVOID_QUERY) 558 + dev->battery_avoid_query = true; 559 559 560 560 dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg); 561 561 if (IS_ERR(dev->battery)) {
+1 -1
drivers/hid/hid-logitech-hidpp.c
··· 895 895 ret = hidpp_send_rap_command_sync(hidpp, 896 896 REPORT_ID_HIDPP_SHORT, 897 897 HIDPP_PAGE_ROOT_IDX, 898 - CMD_ROOT_GET_PROTOCOL_VERSION, 898 + CMD_ROOT_GET_PROTOCOL_VERSION | LINUX_KERNEL_SW_ID, 899 899 ping_data, sizeof(ping_data), &response); 900 900 901 901 if (ret == HIDPP_ERROR_INVALID_SUBID) {
+288 -25
drivers/hid/hid-mcp2221.c
··· 10 10 #include <linux/module.h> 11 11 #include <linux/err.h> 12 12 #include <linux/mutex.h> 13 + #include <linux/bitfield.h> 13 14 #include <linux/completion.h> 14 15 #include <linux/delay.h> 15 16 #include <linux/hid.h> 16 17 #include <linux/hidraw.h> 17 18 #include <linux/i2c.h> 18 19 #include <linux/gpio/driver.h> 20 + #include <linux/iio/iio.h> 19 21 #include "hid-ids.h" 20 22 21 23 /* Commands codes in a raw output report */ ··· 32 30 MCP2221_I2C_CANCEL = 0x10, 33 31 MCP2221_GPIO_SET = 0x50, 34 32 MCP2221_GPIO_GET = 0x51, 33 + MCP2221_SET_SRAM_SETTINGS = 0x60, 34 + MCP2221_GET_SRAM_SETTINGS = 0x61, 35 + MCP2221_READ_FLASH_DATA = 0xb0, 35 36 }; 36 37 37 38 /* Response codes in a raw input report */ ··· 94 89 struct i2c_adapter adapter; 95 90 struct mutex lock; 96 91 struct completion wait_in_report; 92 + struct delayed_work init_work; 97 93 u8 *rxbuf; 98 94 u8 txbuf[64]; 99 95 int rxbuf_idx; ··· 103 97 struct gpio_chip *gc; 104 98 u8 gp_idx; 105 99 u8 gpio_dir; 100 + u8 mode[4]; 101 + #if IS_REACHABLE(CONFIG_IIO) 102 + struct iio_chan_spec iio_channels[3]; 103 + u16 adc_values[3]; 104 + u8 adc_scale; 105 + u8 dac_value; 106 + u16 dac_scale; 107 + #endif 108 + }; 109 + 110 + struct mcp2221_iio { 111 + struct mcp2221 *mcp; 106 112 }; 107 113 108 114 /* ··· 585 567 .functionality = mcp_i2c_func, 586 568 }; 587 569 570 + #if IS_REACHABLE(CONFIG_GPIOLIB) 588 571 static int mcp_gpio_get(struct gpio_chip *gc, 589 572 unsigned int offset) 590 573 { ··· 689 670 690 671 return GPIO_LINE_DIRECTION_OUT; 691 672 } 673 + #endif 692 674 693 675 /* Gives current state of i2c engine inside mcp2221 */ 694 676 static int mcp_get_i2c_eng_state(struct mcp2221 *mcp, ··· 765 745 break; 766 746 } 767 747 mcp->status = mcp_get_i2c_eng_state(mcp, data, 8); 748 + #if IS_REACHABLE(CONFIG_IIO) 749 + memcpy(&mcp->adc_values, &data[50], sizeof(mcp->adc_values)); 750 + #endif 768 751 break; 769 752 default: 770 753 mcp->status = -EIO; ··· 839 816 complete(&mcp->wait_in_report); 840 817 break; 841 818 819 + case MCP2221_SET_SRAM_SETTINGS: 820 + switch (data[1]) { 821 + case MCP2221_SUCCESS: 822 + mcp->status = 0; 823 + break; 824 + default: 825 + mcp->status = -EAGAIN; 826 + } 827 + complete(&mcp->wait_in_report); 828 + break; 829 + 830 + case MCP2221_GET_SRAM_SETTINGS: 831 + switch (data[1]) { 832 + case MCP2221_SUCCESS: 833 + memcpy(&mcp->mode, &data[22], 4); 834 + #if IS_REACHABLE(CONFIG_IIO) 835 + mcp->dac_value = data[6] & GENMASK(4, 0); 836 + #endif 837 + mcp->status = 0; 838 + break; 839 + default: 840 + mcp->status = -EAGAIN; 841 + } 842 + complete(&mcp->wait_in_report); 843 + break; 844 + 845 + case MCP2221_READ_FLASH_DATA: 846 + switch (data[1]) { 847 + case MCP2221_SUCCESS: 848 + mcp->status = 0; 849 + 850 + /* Only handles CHIP SETTINGS subpage currently */ 851 + if (mcp->txbuf[1] != 0) { 852 + mcp->status = -EIO; 853 + break; 854 + } 855 + 856 + #if IS_REACHABLE(CONFIG_IIO) 857 + { 858 + u8 tmp; 859 + /* DAC scale value */ 860 + tmp = FIELD_GET(GENMASK(7, 6), data[6]); 861 + if ((data[6] & BIT(5)) && tmp) 862 + mcp->dac_scale = tmp + 4; 863 + else 864 + mcp->dac_scale = 5; 865 + 866 + /* ADC scale value */ 867 + tmp = FIELD_GET(GENMASK(4, 3), data[7]); 868 + if ((data[7] & BIT(2)) && tmp) 869 + mcp->adc_scale = tmp - 1; 870 + else 871 + mcp->adc_scale = 0; 872 + } 873 + #endif 874 + 875 + break; 876 + default: 877 + mcp->status = -EAGAIN; 878 + } 879 + complete(&mcp->wait_in_report); 880 + break; 881 + 842 882 default: 843 883 mcp->status = -EIO; 844 884 complete(&mcp->wait_in_report); ··· 909 823 910 824 return 1; 911 825 } 826 + 827 + /* Device resource managed function for HID unregistration */ 828 + static void mcp2221_hid_unregister(void *ptr) 829 + { 830 + struct hid_device *hdev = ptr; 831 + 832 + hid_hw_close(hdev); 833 + hid_hw_stop(hdev); 834 + } 835 + 836 + /* This is needed to be sure hid_hw_stop() isn't called twice by the subsystem */ 837 + static void mcp2221_remove(struct hid_device *hdev) 838 + { 839 + } 840 + 841 + #if IS_REACHABLE(CONFIG_IIO) 842 + static int mcp2221_read_raw(struct iio_dev *indio_dev, 843 + struct iio_chan_spec const *channel, int *val, 844 + int *val2, long mask) 845 + { 846 + struct mcp2221_iio *priv = iio_priv(indio_dev); 847 + struct mcp2221 *mcp = priv->mcp; 848 + int ret; 849 + 850 + if (mask == IIO_CHAN_INFO_SCALE) { 851 + if (channel->output) 852 + *val = 1 << mcp->dac_scale; 853 + else 854 + *val = 1 << mcp->adc_scale; 855 + 856 + return IIO_VAL_INT; 857 + } 858 + 859 + mutex_lock(&mcp->lock); 860 + 861 + if (channel->output) { 862 + *val = mcp->dac_value; 863 + ret = IIO_VAL_INT; 864 + } else { 865 + /* Read ADC values */ 866 + ret = mcp_chk_last_cmd_status(mcp); 867 + 868 + if (!ret) { 869 + *val = le16_to_cpu((__force __le16) mcp->adc_values[channel->address]); 870 + if (*val >= BIT(10)) 871 + ret = -EINVAL; 872 + else 873 + ret = IIO_VAL_INT; 874 + } 875 + } 876 + 877 + mutex_unlock(&mcp->lock); 878 + 879 + return ret; 880 + } 881 + 882 + static int mcp2221_write_raw(struct iio_dev *indio_dev, 883 + struct iio_chan_spec const *chan, 884 + int val, int val2, long mask) 885 + { 886 + struct mcp2221_iio *priv = iio_priv(indio_dev); 887 + struct mcp2221 *mcp = priv->mcp; 888 + int ret; 889 + 890 + if (val < 0 || val >= BIT(5)) 891 + return -EINVAL; 892 + 893 + mutex_lock(&mcp->lock); 894 + 895 + memset(mcp->txbuf, 0, 12); 896 + mcp->txbuf[0] = MCP2221_SET_SRAM_SETTINGS; 897 + mcp->txbuf[4] = BIT(7) | val; 898 + 899 + ret = mcp_send_data_req_status(mcp, mcp->txbuf, 12); 900 + if (!ret) 901 + mcp->dac_value = val; 902 + 903 + mutex_unlock(&mcp->lock); 904 + 905 + return ret; 906 + } 907 + 908 + static const struct iio_info mcp2221_info = { 909 + .read_raw = &mcp2221_read_raw, 910 + .write_raw = &mcp2221_write_raw, 911 + }; 912 + 913 + static int mcp_iio_channels(struct mcp2221 *mcp) 914 + { 915 + int idx, cnt = 0; 916 + bool dac_created = false; 917 + 918 + /* GP0 doesn't have ADC/DAC alternative function */ 919 + for (idx = 1; idx < MCP_NGPIO; idx++) { 920 + struct iio_chan_spec *chan = &mcp->iio_channels[cnt]; 921 + 922 + switch (mcp->mode[idx]) { 923 + case 2: 924 + chan->address = idx - 1; 925 + chan->channel = cnt++; 926 + break; 927 + case 3: 928 + /* GP1 doesn't have DAC alternative function */ 929 + if (idx == 1 || dac_created) 930 + continue; 931 + /* DAC1 and DAC2 outputs are connected to the same DAC */ 932 + dac_created = true; 933 + chan->output = 1; 934 + cnt++; 935 + break; 936 + default: 937 + continue; 938 + }; 939 + 940 + chan->type = IIO_VOLTAGE; 941 + chan->indexed = 1; 942 + chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW); 943 + chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE); 944 + chan->scan_index = -1; 945 + } 946 + 947 + return cnt; 948 + } 949 + 950 + static void mcp_init_work(struct work_struct *work) 951 + { 952 + struct iio_dev *indio_dev; 953 + struct mcp2221 *mcp = container_of(work, struct mcp2221, init_work.work); 954 + struct mcp2221_iio *data; 955 + static int retries = 5; 956 + int ret, num_channels; 957 + 958 + hid_hw_power(mcp->hdev, PM_HINT_FULLON); 959 + mutex_lock(&mcp->lock); 960 + 961 + mcp->txbuf[0] = MCP2221_GET_SRAM_SETTINGS; 962 + ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); 963 + 964 + if (ret == -EAGAIN) 965 + goto reschedule_task; 966 + 967 + num_channels = mcp_iio_channels(mcp); 968 + if (!num_channels) 969 + goto unlock; 970 + 971 + mcp->txbuf[0] = MCP2221_READ_FLASH_DATA; 972 + mcp->txbuf[1] = 0; 973 + ret = mcp_send_data_req_status(mcp, mcp->txbuf, 2); 974 + 975 + if (ret == -EAGAIN) 976 + goto reschedule_task; 977 + 978 + indio_dev = devm_iio_device_alloc(&mcp->hdev->dev, sizeof(*data)); 979 + if (!indio_dev) 980 + goto unlock; 981 + 982 + data = iio_priv(indio_dev); 983 + data->mcp = mcp; 984 + 985 + indio_dev->name = "mcp2221"; 986 + indio_dev->modes = INDIO_DIRECT_MODE; 987 + indio_dev->info = &mcp2221_info; 988 + indio_dev->channels = mcp->iio_channels; 989 + indio_dev->num_channels = num_channels; 990 + 991 + devm_iio_device_register(&mcp->hdev->dev, indio_dev); 992 + 993 + unlock: 994 + mutex_unlock(&mcp->lock); 995 + hid_hw_power(mcp->hdev, PM_HINT_NORMAL); 996 + 997 + return; 998 + 999 + reschedule_task: 1000 + mutex_unlock(&mcp->lock); 1001 + hid_hw_power(mcp->hdev, PM_HINT_NORMAL); 1002 + 1003 + if (!retries--) 1004 + return; 1005 + 1006 + /* Device is not ready to read SRAM or FLASH data, try again */ 1007 + schedule_delayed_work(&mcp->init_work, msecs_to_jiffies(100)); 1008 + } 1009 + #endif 912 1010 913 1011 static int mcp2221_probe(struct hid_device *hdev, 914 1012 const struct hid_device_id *id) ··· 1119 849 ret = hid_hw_open(hdev); 1120 850 if (ret) { 1121 851 hid_err(hdev, "can't open device\n"); 1122 - goto err_hstop; 852 + hid_hw_stop(hdev); 853 + return ret; 1123 854 } 1124 855 1125 856 mutex_init(&mcp->lock); 1126 857 init_completion(&mcp->wait_in_report); 1127 858 hid_set_drvdata(hdev, mcp); 1128 859 mcp->hdev = hdev; 860 + 861 + ret = devm_add_action_or_reset(&hdev->dev, mcp2221_hid_unregister, hdev); 862 + if (ret) 863 + return ret; 1129 864 1130 865 /* Set I2C bus clock diviser */ 1131 866 if (i2c_clk_freq > 400) ··· 1148 873 "MCP2221 usb-i2c bridge on hidraw%d", 1149 874 ((struct hidraw *)hdev->hidraw)->minor); 1150 875 1151 - ret = i2c_add_adapter(&mcp->adapter); 876 + ret = devm_i2c_add_adapter(&hdev->dev, &mcp->adapter); 1152 877 if (ret) { 1153 878 hid_err(hdev, "can't add usb-i2c adapter: %d\n", ret); 1154 - goto err_i2c; 879 + return ret; 1155 880 } 1156 881 i2c_set_adapdata(&mcp->adapter, mcp); 1157 882 883 + #if IS_REACHABLE(CONFIG_GPIOLIB) 1158 884 /* Setup GPIO chip */ 1159 885 mcp->gc = devm_kzalloc(&hdev->dev, sizeof(*mcp->gc), GFP_KERNEL); 1160 - if (!mcp->gc) { 1161 - ret = -ENOMEM; 1162 - goto err_gc; 1163 - } 886 + if (!mcp->gc) 887 + return -ENOMEM; 1164 888 1165 889 mcp->gc->label = "mcp2221_gpio"; 1166 890 mcp->gc->direction_input = mcp_gpio_direction_input; ··· 1174 900 1175 901 ret = devm_gpiochip_add_data(&hdev->dev, mcp->gc, mcp); 1176 902 if (ret) 1177 - goto err_gc; 903 + return ret; 904 + #endif 905 + 906 + #if IS_REACHABLE(CONFIG_IIO) 907 + INIT_DELAYED_WORK(&mcp->init_work, mcp_init_work); 908 + schedule_delayed_work(&mcp->init_work, msecs_to_jiffies(100)); 909 + #endif 1178 910 1179 911 return 0; 1180 - 1181 - err_gc: 1182 - i2c_del_adapter(&mcp->adapter); 1183 - err_i2c: 1184 - hid_hw_close(mcp->hdev); 1185 - err_hstop: 1186 - hid_hw_stop(mcp->hdev); 1187 - return ret; 1188 - } 1189 - 1190 - static void mcp2221_remove(struct hid_device *hdev) 1191 - { 1192 - struct mcp2221 *mcp = hid_get_drvdata(hdev); 1193 - 1194 - i2c_del_adapter(&mcp->adapter); 1195 - hid_hw_close(mcp->hdev); 1196 - hid_hw_stop(mcp->hdev); 1197 912 } 1198 913 1199 914 static const struct hid_device_id mcp2221_devices[] = {
+1121 -15
drivers/hid/hid-playstation.c
··· 2 2 /* 3 3 * HID driver for Sony DualSense(TM) controller. 4 4 * 5 - * Copyright (c) 2020 Sony Interactive Entertainment 5 + * Copyright (c) 2020-2022 Sony Interactive Entertainment 6 6 */ 7 7 8 8 #include <linux/bits.h> ··· 60 60 struct ps_led_info { 61 61 const char *name; 62 62 const char *color; 63 + int max_brightness; 63 64 enum led_brightness (*brightness_get)(struct led_classdev *cdev); 64 65 int (*brightness_set)(struct led_classdev *cdev, enum led_brightness); 66 + int (*blink_set)(struct led_classdev *led, unsigned long *on, unsigned long *off); 65 67 }; 66 68 67 69 /* Seed values for DualShock4 / DualSense CRC32 for different report types. */ ··· 285 283 struct dualsense_output_report_common *common; 286 284 }; 287 285 286 + #define DS4_INPUT_REPORT_USB 0x01 287 + #define DS4_INPUT_REPORT_USB_SIZE 64 288 + #define DS4_INPUT_REPORT_BT 0x11 289 + #define DS4_INPUT_REPORT_BT_SIZE 78 290 + #define DS4_OUTPUT_REPORT_USB 0x05 291 + #define DS4_OUTPUT_REPORT_USB_SIZE 32 292 + #define DS4_OUTPUT_REPORT_BT 0x11 293 + #define DS4_OUTPUT_REPORT_BT_SIZE 78 294 + 295 + #define DS4_FEATURE_REPORT_CALIBRATION 0x02 296 + #define DS4_FEATURE_REPORT_CALIBRATION_SIZE 37 297 + #define DS4_FEATURE_REPORT_CALIBRATION_BT 0x05 298 + #define DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE 41 299 + #define DS4_FEATURE_REPORT_FIRMWARE_INFO 0xa3 300 + #define DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE 49 301 + #define DS4_FEATURE_REPORT_PAIRING_INFO 0x12 302 + #define DS4_FEATURE_REPORT_PAIRING_INFO_SIZE 16 303 + 304 + /* 305 + * Status of a DualShock4 touch point contact. 306 + * Contact IDs, with highest bit set are 'inactive' 307 + * and any associated data is then invalid. 308 + */ 309 + #define DS4_TOUCH_POINT_INACTIVE BIT(7) 310 + 311 + /* Status field of DualShock4 input report. */ 312 + #define DS4_STATUS0_BATTERY_CAPACITY GENMASK(3, 0) 313 + #define DS4_STATUS0_CABLE_STATE BIT(4) 314 + /* Battery status within batery_status field. */ 315 + #define DS4_BATTERY_STATUS_FULL 11 316 + /* Status1 bit2 contains dongle connection state: 317 + * 0 = connectd 318 + * 1 = disconnected 319 + */ 320 + #define DS4_STATUS1_DONGLE_STATE BIT(2) 321 + 322 + /* The lower 6 bits of hw_control of the Bluetooth main output report 323 + * control the interval at which Dualshock 4 reports data: 324 + * 0x00 - 1ms 325 + * 0x01 - 1ms 326 + * 0x02 - 2ms 327 + * 0x3E - 62ms 328 + * 0x3F - disabled 329 + */ 330 + #define DS4_OUTPUT_HWCTL_BT_POLL_MASK 0x3F 331 + /* Default to 4ms poll interval, which is same as USB (not adjustable). */ 332 + #define DS4_BT_DEFAULT_POLL_INTERVAL_MS 4 333 + #define DS4_OUTPUT_HWCTL_CRC32 0x40 334 + #define DS4_OUTPUT_HWCTL_HID 0x80 335 + 336 + /* Flags for DualShock4 output report. */ 337 + #define DS4_OUTPUT_VALID_FLAG0_MOTOR 0x01 338 + #define DS4_OUTPUT_VALID_FLAG0_LED 0x02 339 + #define DS4_OUTPUT_VALID_FLAG0_LED_BLINK 0x04 340 + 341 + /* DualShock4 hardware limits */ 342 + #define DS4_ACC_RES_PER_G 8192 343 + #define DS4_ACC_RANGE (4*DS_ACC_RES_PER_G) 344 + #define DS4_GYRO_RES_PER_DEG_S 1024 345 + #define DS4_GYRO_RANGE (2048*DS_GYRO_RES_PER_DEG_S) 346 + #define DS4_LIGHTBAR_MAX_BLINK 255 /* 255 centiseconds */ 347 + #define DS4_TOUCHPAD_WIDTH 1920 348 + #define DS4_TOUCHPAD_HEIGHT 942 349 + 350 + enum dualshock4_dongle_state { 351 + DONGLE_DISCONNECTED, 352 + DONGLE_CALIBRATING, 353 + DONGLE_CONNECTED, 354 + DONGLE_DISABLED 355 + }; 356 + 357 + struct dualshock4 { 358 + struct ps_device base; 359 + struct input_dev *gamepad; 360 + struct input_dev *sensors; 361 + struct input_dev *touchpad; 362 + 363 + /* Calibration data for accelerometer and gyroscope. */ 364 + struct ps_calibration_data accel_calib_data[3]; 365 + struct ps_calibration_data gyro_calib_data[3]; 366 + 367 + /* Only used on dongle to track state transitions. */ 368 + enum dualshock4_dongle_state dongle_state; 369 + /* Used during calibration. */ 370 + struct work_struct dongle_hotplug_worker; 371 + 372 + /* Timestamp for sensor data */ 373 + bool sensor_timestamp_initialized; 374 + uint32_t prev_sensor_timestamp; 375 + uint32_t sensor_timestamp_us; 376 + 377 + /* Bluetooth poll interval */ 378 + bool update_bt_poll_interval; 379 + uint8_t bt_poll_interval; 380 + 381 + bool update_rumble; 382 + uint8_t motor_left; 383 + uint8_t motor_right; 384 + 385 + /* Lightbar leds */ 386 + bool update_lightbar; 387 + bool update_lightbar_blink; 388 + bool lightbar_enabled; /* For use by global LED control. */ 389 + uint8_t lightbar_red; 390 + uint8_t lightbar_green; 391 + uint8_t lightbar_blue; 392 + uint8_t lightbar_blink_on; /* In increments of 10ms. */ 393 + uint8_t lightbar_blink_off; /* In increments of 10ms. */ 394 + struct led_classdev lightbar_leds[4]; 395 + 396 + struct work_struct output_worker; 397 + bool output_worker_initialized; 398 + void *output_report_dmabuf; 399 + }; 400 + 401 + struct dualshock4_touch_point { 402 + uint8_t contact; 403 + uint8_t x_lo; 404 + uint8_t x_hi:4, y_lo:4; 405 + uint8_t y_hi; 406 + } __packed; 407 + static_assert(sizeof(struct dualshock4_touch_point) == 4); 408 + 409 + struct dualshock4_touch_report { 410 + uint8_t timestamp; 411 + struct dualshock4_touch_point points[2]; 412 + } __packed; 413 + static_assert(sizeof(struct dualshock4_touch_report) == 9); 414 + 415 + /* Main DualShock4 input report excluding any BT/USB specific headers. */ 416 + struct dualshock4_input_report_common { 417 + uint8_t x, y; 418 + uint8_t rx, ry; 419 + uint8_t buttons[3]; 420 + uint8_t z, rz; 421 + 422 + /* Motion sensors */ 423 + __le16 sensor_timestamp; 424 + uint8_t sensor_temperature; 425 + __le16 gyro[3]; /* x, y, z */ 426 + __le16 accel[3]; /* x, y, z */ 427 + uint8_t reserved2[5]; 428 + 429 + uint8_t status[2]; 430 + uint8_t reserved3; 431 + } __packed; 432 + static_assert(sizeof(struct dualshock4_input_report_common) == 32); 433 + 434 + struct dualshock4_input_report_usb { 435 + uint8_t report_id; /* 0x01 */ 436 + struct dualshock4_input_report_common common; 437 + uint8_t num_touch_reports; 438 + struct dualshock4_touch_report touch_reports[3]; 439 + uint8_t reserved[3]; 440 + } __packed; 441 + static_assert(sizeof(struct dualshock4_input_report_usb) == DS4_INPUT_REPORT_USB_SIZE); 442 + 443 + struct dualshock4_input_report_bt { 444 + uint8_t report_id; /* 0x11 */ 445 + uint8_t reserved[2]; 446 + struct dualshock4_input_report_common common; 447 + uint8_t num_touch_reports; 448 + struct dualshock4_touch_report touch_reports[4]; /* BT has 4 compared to 3 for USB */ 449 + uint8_t reserved2[2]; 450 + __le32 crc32; 451 + } __packed; 452 + static_assert(sizeof(struct dualshock4_input_report_bt) == DS4_INPUT_REPORT_BT_SIZE); 453 + 454 + /* Common data between Bluetooth and USB DualShock4 output reports. */ 455 + struct dualshock4_output_report_common { 456 + uint8_t valid_flag0; 457 + uint8_t valid_flag1; 458 + 459 + uint8_t reserved; 460 + 461 + uint8_t motor_right; 462 + uint8_t motor_left; 463 + 464 + uint8_t lightbar_red; 465 + uint8_t lightbar_green; 466 + uint8_t lightbar_blue; 467 + uint8_t lightbar_blink_on; 468 + uint8_t lightbar_blink_off; 469 + } __packed; 470 + 471 + struct dualshock4_output_report_usb { 472 + uint8_t report_id; /* 0x5 */ 473 + struct dualshock4_output_report_common common; 474 + uint8_t reserved[21]; 475 + } __packed; 476 + static_assert(sizeof(struct dualshock4_output_report_usb) == DS4_OUTPUT_REPORT_USB_SIZE); 477 + 478 + struct dualshock4_output_report_bt { 479 + uint8_t report_id; /* 0x11 */ 480 + uint8_t hw_control; 481 + uint8_t audio_control; 482 + struct dualshock4_output_report_common common; 483 + uint8_t reserved[61]; 484 + __le32 crc32; 485 + } __packed; 486 + static_assert(sizeof(struct dualshock4_output_report_bt) == DS4_OUTPUT_REPORT_BT_SIZE); 487 + 488 + /* 489 + * The DualShock4 has a main output report used to control most features. It is 490 + * largely the same between Bluetooth and USB except for different headers and CRC. 491 + * This structure hide the differences between the two to simplify sending output reports. 492 + */ 493 + struct dualshock4_output_report { 494 + uint8_t *data; /* Start of data */ 495 + uint8_t len; /* Size of output report */ 496 + 497 + /* Points to Bluetooth data payload in case for a Bluetooth report else NULL. */ 498 + struct dualshock4_output_report_bt *bt; 499 + /* Points to USB data payload in case for a USB report else NULL. */ 500 + struct dualshock4_output_report_usb *usb; 501 + /* Points to common section of report, so past any headers. */ 502 + struct dualshock4_output_report_common *common; 503 + }; 504 + 288 505 /* 289 506 * Common gamepad buttons across DualShock 3 / 4 and DualSense. 290 507 * Note: for device with a touchpad, touchpad button is not included ··· 530 309 {0, 0}, 531 310 }; 532 311 312 + static int dualshock4_get_calibration_data(struct dualshock4 *ds4); 533 313 static inline void dualsense_schedule_work(struct dualsense *ds); 314 + static inline void dualshock4_schedule_work(struct dualshock4 *ds4); 534 315 static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t green, uint8_t blue); 316 + static void dualshock4_set_default_lightbar_colors(struct dualshock4 *ds4); 535 317 536 318 /* 537 319 * Add a new ps_device to ps_devices if it doesn't exist. ··· 738 514 return gamepad; 739 515 } 740 516 741 - static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *buf, size_t size) 517 + static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *buf, size_t size, 518 + bool check_crc) 742 519 { 743 520 int ret; 744 521 ··· 760 535 return -EINVAL; 761 536 } 762 537 763 - if (hdev->bus == BUS_BLUETOOTH) { 538 + if (hdev->bus == BUS_BLUETOOTH && check_crc) { 764 539 /* Last 4 bytes contains crc32. */ 765 540 uint8_t crc_offset = size - 4; 766 541 uint32_t report_crc = get_unaligned_le32(&buf[crc_offset]); ··· 779 554 { 780 555 int ret; 781 556 782 - led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL, 783 - "%s:%s:%s", ps_dev->input_dev_name, led_info->color, led_info->name); 557 + if (led_info->name) { 558 + led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL, 559 + "%s:%s:%s", ps_dev->input_dev_name, led_info->color, led_info->name); 560 + } else { 561 + /* Backwards compatible mode for hid-sony, but not compliant with LED class spec. */ 562 + led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL, 563 + "%s:%s", ps_dev->input_dev_name, led_info->color); 564 + } 784 565 785 566 if (!led->name) 786 567 return -ENOMEM; 787 568 788 569 led->brightness = 0; 789 - led->max_brightness = 1; 570 + led->max_brightness = led_info->max_brightness; 790 571 led->flags = LED_CORE_SUSPENDRESUME; 791 572 led->brightness_get = led_info->brightness_get; 792 573 led->brightness_set_blocking = led_info->brightness_set; 574 + led->blink_set = led_info->blink_set; 793 575 794 576 ret = devm_led_classdev_register(&ps_dev->hdev->dev, led); 795 577 if (ret) { ··· 961 729 return -ENOMEM; 962 730 963 731 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf, 964 - DS_FEATURE_REPORT_CALIBRATION_SIZE); 732 + DS_FEATURE_REPORT_CALIBRATION_SIZE, true); 965 733 if (ret) { 966 734 hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret); 967 735 goto err_free; ··· 1043 811 return -ENOMEM; 1044 812 1045 813 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf, 1046 - DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE); 814 + DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE, true); 1047 815 if (ret) { 1048 816 hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret); 1049 817 goto err_free; ··· 1076 844 return -ENOMEM; 1077 845 1078 846 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf, 1079 - DS_FEATURE_REPORT_PAIRING_INFO_SIZE); 847 + DS_FEATURE_REPORT_PAIRING_INFO_SIZE, true); 1080 848 if (ret) { 1081 849 hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret); 1082 850 goto err_free; ··· 1549 1317 int i, ret; 1550 1318 1551 1319 static const struct ps_led_info player_leds_info[] = { 1552 - { LED_FUNCTION_PLAYER1, "white", dualsense_player_led_get_brightness, 1320 + { LED_FUNCTION_PLAYER1, "white", 1, dualsense_player_led_get_brightness, 1553 1321 dualsense_player_led_set_brightness }, 1554 - { LED_FUNCTION_PLAYER2, "white", dualsense_player_led_get_brightness, 1322 + { LED_FUNCTION_PLAYER2, "white", 1, dualsense_player_led_get_brightness, 1555 1323 dualsense_player_led_set_brightness }, 1556 - { LED_FUNCTION_PLAYER3, "white", dualsense_player_led_get_brightness, 1324 + { LED_FUNCTION_PLAYER3, "white", 1, dualsense_player_led_get_brightness, 1557 1325 dualsense_player_led_set_brightness }, 1558 - { LED_FUNCTION_PLAYER4, "white", dualsense_player_led_get_brightness, 1326 + { LED_FUNCTION_PLAYER4, "white", 1, dualsense_player_led_get_brightness, 1559 1327 dualsense_player_led_set_brightness }, 1560 - { LED_FUNCTION_PLAYER5, "white", dualsense_player_led_get_brightness, 1328 + { LED_FUNCTION_PLAYER5, "white", 1, dualsense_player_led_get_brightness, 1561 1329 dualsense_player_led_set_brightness } 1562 1330 }; 1563 1331 ··· 1697 1465 return ERR_PTR(ret); 1698 1466 } 1699 1467 1468 + static void dualshock4_dongle_calibration_work(struct work_struct *work) 1469 + { 1470 + struct dualshock4 *ds4 = container_of(work, struct dualshock4, dongle_hotplug_worker); 1471 + unsigned long flags; 1472 + enum dualshock4_dongle_state dongle_state; 1473 + int ret; 1474 + 1475 + ret = dualshock4_get_calibration_data(ds4); 1476 + if (ret < 0) { 1477 + /* This call is very unlikely to fail for the dongle. When it 1478 + * fails we are probably in a very bad state, so mark the 1479 + * dongle as disabled. We will re-enable the dongle if a new 1480 + * DS4 hotplug is detect from sony_raw_event as any issues 1481 + * are likely resolved then (the dongle is quite stupid). 1482 + */ 1483 + hid_err(ds4->base.hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n"); 1484 + dongle_state = DONGLE_DISABLED; 1485 + } else { 1486 + hid_info(ds4->base.hdev, "DualShock 4 USB dongle: calibration completed\n"); 1487 + dongle_state = DONGLE_CONNECTED; 1488 + } 1489 + 1490 + spin_lock_irqsave(&ds4->base.lock, flags); 1491 + ds4->dongle_state = dongle_state; 1492 + spin_unlock_irqrestore(&ds4->base.lock, flags); 1493 + } 1494 + 1495 + static int dualshock4_get_calibration_data(struct dualshock4 *ds4) 1496 + { 1497 + struct hid_device *hdev = ds4->base.hdev; 1498 + short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus; 1499 + short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus; 1500 + short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus; 1501 + short gyro_speed_plus, gyro_speed_minus; 1502 + short acc_x_plus, acc_x_minus; 1503 + short acc_y_plus, acc_y_minus; 1504 + short acc_z_plus, acc_z_minus; 1505 + int speed_2x; 1506 + int range_2g; 1507 + int ret = 0; 1508 + uint8_t *buf; 1509 + 1510 + if (ds4->base.hdev->bus == BUS_USB) { 1511 + int retries; 1512 + 1513 + buf = kzalloc(DS4_FEATURE_REPORT_CALIBRATION_SIZE, GFP_KERNEL); 1514 + if (!buf) 1515 + return -ENOMEM; 1516 + 1517 + /* We should normally receive the feature report data we asked 1518 + * for, but hidraw applications such as Steam can issue feature 1519 + * reports as well. In particular for Dongle reconnects, Steam 1520 + * and this function are competing resulting in often receiving 1521 + * data for a different HID report, so retry a few times. 1522 + */ 1523 + for (retries = 0; retries < 3; retries++) { 1524 + ret = ps_get_report(hdev, DS4_FEATURE_REPORT_CALIBRATION, buf, 1525 + DS4_FEATURE_REPORT_CALIBRATION_SIZE, true); 1526 + if (ret) { 1527 + if (retries < 2) { 1528 + hid_warn(hdev, "Retrying DualShock 4 get calibration report (0x02) request\n"); 1529 + continue; 1530 + } else { 1531 + ret = -EILSEQ; 1532 + goto err_free; 1533 + } 1534 + hid_err(hdev, "Failed to retrieve DualShock4 calibration info: %d\n", ret); 1535 + goto err_free; 1536 + } else { 1537 + break; 1538 + } 1539 + } 1540 + } else { /* Bluetooth */ 1541 + buf = kzalloc(DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE, GFP_KERNEL); 1542 + if (!buf) 1543 + return -ENOMEM; 1544 + 1545 + ret = ps_get_report(hdev, DS4_FEATURE_REPORT_CALIBRATION_BT, buf, 1546 + DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE, true); 1547 + if (ret) { 1548 + hid_err(hdev, "Failed to retrieve DualShock4 calibration info: %d\n", ret); 1549 + goto err_free; 1550 + } 1551 + } 1552 + 1553 + gyro_pitch_bias = get_unaligned_le16(&buf[1]); 1554 + gyro_yaw_bias = get_unaligned_le16(&buf[3]); 1555 + gyro_roll_bias = get_unaligned_le16(&buf[5]); 1556 + if (ds4->base.hdev->bus == BUS_USB) { 1557 + gyro_pitch_plus = get_unaligned_le16(&buf[7]); 1558 + gyro_pitch_minus = get_unaligned_le16(&buf[9]); 1559 + gyro_yaw_plus = get_unaligned_le16(&buf[11]); 1560 + gyro_yaw_minus = get_unaligned_le16(&buf[13]); 1561 + gyro_roll_plus = get_unaligned_le16(&buf[15]); 1562 + gyro_roll_minus = get_unaligned_le16(&buf[17]); 1563 + } else { 1564 + /* BT + Dongle */ 1565 + gyro_pitch_plus = get_unaligned_le16(&buf[7]); 1566 + gyro_yaw_plus = get_unaligned_le16(&buf[9]); 1567 + gyro_roll_plus = get_unaligned_le16(&buf[11]); 1568 + gyro_pitch_minus = get_unaligned_le16(&buf[13]); 1569 + gyro_yaw_minus = get_unaligned_le16(&buf[15]); 1570 + gyro_roll_minus = get_unaligned_le16(&buf[17]); 1571 + } 1572 + gyro_speed_plus = get_unaligned_le16(&buf[19]); 1573 + gyro_speed_minus = get_unaligned_le16(&buf[21]); 1574 + acc_x_plus = get_unaligned_le16(&buf[23]); 1575 + acc_x_minus = get_unaligned_le16(&buf[25]); 1576 + acc_y_plus = get_unaligned_le16(&buf[27]); 1577 + acc_y_minus = get_unaligned_le16(&buf[29]); 1578 + acc_z_plus = get_unaligned_le16(&buf[31]); 1579 + acc_z_minus = get_unaligned_le16(&buf[33]); 1580 + 1581 + /* 1582 + * Set gyroscope calibration and normalization parameters. 1583 + * Data values will be normalized to 1/DS4_GYRO_RES_PER_DEG_S degree/s. 1584 + */ 1585 + speed_2x = (gyro_speed_plus + gyro_speed_minus); 1586 + ds4->gyro_calib_data[0].abs_code = ABS_RX; 1587 + ds4->gyro_calib_data[0].bias = gyro_pitch_bias; 1588 + ds4->gyro_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; 1589 + ds4->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; 1590 + 1591 + ds4->gyro_calib_data[1].abs_code = ABS_RY; 1592 + ds4->gyro_calib_data[1].bias = gyro_yaw_bias; 1593 + ds4->gyro_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; 1594 + ds4->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; 1595 + 1596 + ds4->gyro_calib_data[2].abs_code = ABS_RZ; 1597 + ds4->gyro_calib_data[2].bias = gyro_roll_bias; 1598 + ds4->gyro_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; 1599 + ds4->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; 1600 + 1601 + /* 1602 + * Set accelerometer calibration and normalization parameters. 1603 + * Data values will be normalized to 1/DS4_ACC_RES_PER_G g. 1604 + */ 1605 + range_2g = acc_x_plus - acc_x_minus; 1606 + ds4->accel_calib_data[0].abs_code = ABS_X; 1607 + ds4->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; 1608 + ds4->accel_calib_data[0].sens_numer = 2*DS4_ACC_RES_PER_G; 1609 + ds4->accel_calib_data[0].sens_denom = range_2g; 1610 + 1611 + range_2g = acc_y_plus - acc_y_minus; 1612 + ds4->accel_calib_data[1].abs_code = ABS_Y; 1613 + ds4->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; 1614 + ds4->accel_calib_data[1].sens_numer = 2*DS4_ACC_RES_PER_G; 1615 + ds4->accel_calib_data[1].sens_denom = range_2g; 1616 + 1617 + range_2g = acc_z_plus - acc_z_minus; 1618 + ds4->accel_calib_data[2].abs_code = ABS_Z; 1619 + ds4->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; 1620 + ds4->accel_calib_data[2].sens_numer = 2*DS4_ACC_RES_PER_G; 1621 + ds4->accel_calib_data[2].sens_denom = range_2g; 1622 + 1623 + err_free: 1624 + kfree(buf); 1625 + return ret; 1626 + } 1627 + 1628 + static int dualshock4_get_firmware_info(struct dualshock4 *ds4) 1629 + { 1630 + uint8_t *buf; 1631 + int ret; 1632 + 1633 + buf = kzalloc(DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE, GFP_KERNEL); 1634 + if (!buf) 1635 + return -ENOMEM; 1636 + 1637 + /* Note USB and BT support the same feature report, but this report 1638 + * lacks CRC support, so must be disabled in ps_get_report. 1639 + */ 1640 + ret = ps_get_report(ds4->base.hdev, DS4_FEATURE_REPORT_FIRMWARE_INFO, buf, 1641 + DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE, false); 1642 + if (ret) { 1643 + hid_err(ds4->base.hdev, "Failed to retrieve DualShock4 firmware info: %d\n", ret); 1644 + goto err_free; 1645 + } 1646 + 1647 + ds4->base.hw_version = get_unaligned_le16(&buf[35]); 1648 + ds4->base.fw_version = get_unaligned_le16(&buf[41]); 1649 + 1650 + err_free: 1651 + kfree(buf); 1652 + return ret; 1653 + } 1654 + 1655 + static int dualshock4_get_mac_address(struct dualshock4 *ds4) 1656 + { 1657 + struct hid_device *hdev = ds4->base.hdev; 1658 + uint8_t *buf; 1659 + int ret = 0; 1660 + 1661 + if (hdev->bus == BUS_USB) { 1662 + buf = kzalloc(DS4_FEATURE_REPORT_PAIRING_INFO_SIZE, GFP_KERNEL); 1663 + if (!buf) 1664 + return -ENOMEM; 1665 + 1666 + ret = ps_get_report(hdev, DS4_FEATURE_REPORT_PAIRING_INFO, buf, 1667 + DS4_FEATURE_REPORT_PAIRING_INFO_SIZE, false); 1668 + if (ret) { 1669 + hid_err(hdev, "Failed to retrieve DualShock4 pairing info: %d\n", ret); 1670 + goto err_free; 1671 + } 1672 + 1673 + memcpy(ds4->base.mac_address, &buf[1], sizeof(ds4->base.mac_address)); 1674 + } else { 1675 + /* Rely on HIDP for Bluetooth */ 1676 + if (strlen(hdev->uniq) != 17) 1677 + return -EINVAL; 1678 + 1679 + ret = sscanf(hdev->uniq, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", 1680 + &ds4->base.mac_address[5], &ds4->base.mac_address[4], 1681 + &ds4->base.mac_address[3], &ds4->base.mac_address[2], 1682 + &ds4->base.mac_address[1], &ds4->base.mac_address[0]); 1683 + 1684 + if (ret != sizeof(ds4->base.mac_address)) 1685 + return -EINVAL; 1686 + 1687 + ret = 0; 1688 + } 1689 + 1690 + err_free: 1691 + kfree(buf); 1692 + return ret; 1693 + } 1694 + 1695 + static enum led_brightness dualshock4_led_get_brightness(struct led_classdev *led) 1696 + { 1697 + struct hid_device *hdev = to_hid_device(led->dev->parent); 1698 + struct dualshock4 *ds4 = hid_get_drvdata(hdev); 1699 + unsigned int led_index; 1700 + 1701 + led_index = led - ds4->lightbar_leds; 1702 + switch (led_index) { 1703 + case 0: 1704 + return ds4->lightbar_red; 1705 + case 1: 1706 + return ds4->lightbar_green; 1707 + case 2: 1708 + return ds4->lightbar_blue; 1709 + case 3: 1710 + return ds4->lightbar_enabled; 1711 + } 1712 + 1713 + return -1; 1714 + } 1715 + 1716 + static int dualshock4_led_set_blink(struct led_classdev *led, unsigned long *delay_on, 1717 + unsigned long *delay_off) 1718 + { 1719 + struct hid_device *hdev = to_hid_device(led->dev->parent); 1720 + struct dualshock4 *ds4 = hid_get_drvdata(hdev); 1721 + unsigned long flags; 1722 + 1723 + spin_lock_irqsave(&ds4->base.lock, flags); 1724 + 1725 + if (!*delay_on && !*delay_off) { 1726 + /* Default to 1 Hz (50 centiseconds on, 50 centiseconds off). */ 1727 + ds4->lightbar_blink_on = 50; 1728 + ds4->lightbar_blink_off = 50; 1729 + } else { 1730 + /* Blink delays in centiseconds. */ 1731 + ds4->lightbar_blink_on = min_t(unsigned long, *delay_on/10, DS4_LIGHTBAR_MAX_BLINK); 1732 + ds4->lightbar_blink_off = min_t(unsigned long, *delay_off/10, DS4_LIGHTBAR_MAX_BLINK); 1733 + } 1734 + 1735 + ds4->update_lightbar_blink = true; 1736 + 1737 + spin_unlock_irqrestore(&ds4->base.lock, flags); 1738 + 1739 + dualshock4_schedule_work(ds4); 1740 + 1741 + *delay_on = ds4->lightbar_blink_on; 1742 + *delay_off = ds4->lightbar_blink_off; 1743 + 1744 + return 0; 1745 + } 1746 + 1747 + static int dualshock4_led_set_brightness(struct led_classdev *led, enum led_brightness value) 1748 + { 1749 + struct hid_device *hdev = to_hid_device(led->dev->parent); 1750 + struct dualshock4 *ds4 = hid_get_drvdata(hdev); 1751 + unsigned long flags; 1752 + unsigned int led_index; 1753 + 1754 + spin_lock_irqsave(&ds4->base.lock, flags); 1755 + 1756 + led_index = led - ds4->lightbar_leds; 1757 + switch (led_index) { 1758 + case 0: 1759 + ds4->lightbar_red = value; 1760 + break; 1761 + case 1: 1762 + ds4->lightbar_green = value; 1763 + break; 1764 + case 2: 1765 + ds4->lightbar_blue = value; 1766 + break; 1767 + case 3: 1768 + ds4->lightbar_enabled = !!value; 1769 + } 1770 + 1771 + ds4->update_lightbar = true; 1772 + 1773 + spin_unlock_irqrestore(&ds4->base.lock, flags); 1774 + 1775 + dualshock4_schedule_work(ds4); 1776 + 1777 + return 0; 1778 + } 1779 + 1780 + static void dualshock4_init_output_report(struct dualshock4 *ds4, 1781 + struct dualshock4_output_report *rp, void *buf) 1782 + { 1783 + struct hid_device *hdev = ds4->base.hdev; 1784 + 1785 + if (hdev->bus == BUS_BLUETOOTH) { 1786 + struct dualshock4_output_report_bt *bt = buf; 1787 + 1788 + memset(bt, 0, sizeof(*bt)); 1789 + bt->report_id = DS4_OUTPUT_REPORT_BT; 1790 + 1791 + rp->data = buf; 1792 + rp->len = sizeof(*bt); 1793 + rp->bt = bt; 1794 + rp->usb = NULL; 1795 + rp->common = &bt->common; 1796 + } else { /* USB */ 1797 + struct dualshock4_output_report_usb *usb = buf; 1798 + 1799 + memset(usb, 0, sizeof(*usb)); 1800 + usb->report_id = DS4_OUTPUT_REPORT_USB; 1801 + 1802 + rp->data = buf; 1803 + rp->len = sizeof(*usb); 1804 + rp->bt = NULL; 1805 + rp->usb = usb; 1806 + rp->common = &usb->common; 1807 + } 1808 + } 1809 + 1810 + static void dualshock4_output_worker(struct work_struct *work) 1811 + { 1812 + struct dualshock4 *ds4 = container_of(work, struct dualshock4, output_worker); 1813 + struct dualshock4_output_report report; 1814 + struct dualshock4_output_report_common *common; 1815 + unsigned long flags; 1816 + 1817 + dualshock4_init_output_report(ds4, &report, ds4->output_report_dmabuf); 1818 + common = report.common; 1819 + 1820 + spin_lock_irqsave(&ds4->base.lock, flags); 1821 + 1822 + if (ds4->update_rumble) { 1823 + /* Select classic rumble style haptics and enable it. */ 1824 + common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_MOTOR; 1825 + common->motor_left = ds4->motor_left; 1826 + common->motor_right = ds4->motor_right; 1827 + ds4->update_rumble = false; 1828 + } 1829 + 1830 + if (ds4->update_lightbar) { 1831 + common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED; 1832 + /* Comptabile behavior with hid-sony, which used a dummy global LED to 1833 + * allow enabling/disabling the lightbar. The global LED maps to 1834 + * lightbar_enabled. 1835 + */ 1836 + common->lightbar_red = ds4->lightbar_enabled ? ds4->lightbar_red : 0; 1837 + common->lightbar_green = ds4->lightbar_enabled ? ds4->lightbar_green : 0; 1838 + common->lightbar_blue = ds4->lightbar_enabled ? ds4->lightbar_blue : 0; 1839 + ds4->update_lightbar = false; 1840 + } 1841 + 1842 + if (ds4->update_lightbar_blink) { 1843 + common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED_BLINK; 1844 + common->lightbar_blink_on = ds4->lightbar_blink_on; 1845 + common->lightbar_blink_off = ds4->lightbar_blink_off; 1846 + ds4->update_lightbar_blink = false; 1847 + } 1848 + 1849 + spin_unlock_irqrestore(&ds4->base.lock, flags); 1850 + 1851 + /* Bluetooth packets need additional flags as well as a CRC in the last 4 bytes. */ 1852 + if (report.bt) { 1853 + uint32_t crc; 1854 + uint8_t seed = PS_OUTPUT_CRC32_SEED; 1855 + 1856 + /* Hardware control flags need to set to let the device know 1857 + * there is HID data as well as CRC. 1858 + */ 1859 + report.bt->hw_control = DS4_OUTPUT_HWCTL_HID | DS4_OUTPUT_HWCTL_CRC32; 1860 + 1861 + if (ds4->update_bt_poll_interval) { 1862 + report.bt->hw_control |= ds4->bt_poll_interval; 1863 + ds4->update_bt_poll_interval = false; 1864 + } 1865 + 1866 + crc = crc32_le(0xFFFFFFFF, &seed, 1); 1867 + crc = ~crc32_le(crc, report.data, report.len - 4); 1868 + 1869 + report.bt->crc32 = cpu_to_le32(crc); 1870 + } 1871 + 1872 + hid_hw_output_report(ds4->base.hdev, report.data, report.len); 1873 + } 1874 + 1875 + static int dualshock4_parse_report(struct ps_device *ps_dev, struct hid_report *report, 1876 + u8 *data, int size) 1877 + { 1878 + struct hid_device *hdev = ps_dev->hdev; 1879 + struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base); 1880 + struct dualshock4_input_report_common *ds4_report; 1881 + struct dualshock4_touch_report *touch_reports; 1882 + uint8_t battery_capacity, num_touch_reports, value; 1883 + int battery_status, i, j; 1884 + uint16_t sensor_timestamp; 1885 + unsigned long flags; 1886 + 1887 + /* 1888 + * DualShock4 in USB uses the full HID report for reportID 1, but 1889 + * Bluetooth uses a minimal HID report for reportID 1 and reports 1890 + * the full report using reportID 17. 1891 + */ 1892 + if (hdev->bus == BUS_USB && report->id == DS4_INPUT_REPORT_USB && 1893 + size == DS4_INPUT_REPORT_USB_SIZE) { 1894 + struct dualshock4_input_report_usb *usb = (struct dualshock4_input_report_usb *)data; 1895 + 1896 + ds4_report = &usb->common; 1897 + num_touch_reports = usb->num_touch_reports; 1898 + touch_reports = usb->touch_reports; 1899 + } else if (hdev->bus == BUS_BLUETOOTH && report->id == DS4_INPUT_REPORT_BT && 1900 + size == DS4_INPUT_REPORT_BT_SIZE) { 1901 + struct dualshock4_input_report_bt *bt = (struct dualshock4_input_report_bt *)data; 1902 + uint32_t report_crc = get_unaligned_le32(&bt->crc32); 1903 + 1904 + /* Last 4 bytes of input report contains CRC. */ 1905 + if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) { 1906 + hid_err(hdev, "DualShock4 input CRC's check failed\n"); 1907 + return -EILSEQ; 1908 + } 1909 + 1910 + ds4_report = &bt->common; 1911 + num_touch_reports = bt->num_touch_reports; 1912 + touch_reports = bt->touch_reports; 1913 + } else { 1914 + hid_err(hdev, "Unhandled reportID=%d\n", report->id); 1915 + return -1; 1916 + } 1917 + 1918 + input_report_abs(ds4->gamepad, ABS_X, ds4_report->x); 1919 + input_report_abs(ds4->gamepad, ABS_Y, ds4_report->y); 1920 + input_report_abs(ds4->gamepad, ABS_RX, ds4_report->rx); 1921 + input_report_abs(ds4->gamepad, ABS_RY, ds4_report->ry); 1922 + input_report_abs(ds4->gamepad, ABS_Z, ds4_report->z); 1923 + input_report_abs(ds4->gamepad, ABS_RZ, ds4_report->rz); 1924 + 1925 + value = ds4_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; 1926 + if (value >= ARRAY_SIZE(ps_gamepad_hat_mapping)) 1927 + value = 8; /* center */ 1928 + input_report_abs(ds4->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); 1929 + input_report_abs(ds4->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); 1930 + 1931 + input_report_key(ds4->gamepad, BTN_WEST, ds4_report->buttons[0] & DS_BUTTONS0_SQUARE); 1932 + input_report_key(ds4->gamepad, BTN_SOUTH, ds4_report->buttons[0] & DS_BUTTONS0_CROSS); 1933 + input_report_key(ds4->gamepad, BTN_EAST, ds4_report->buttons[0] & DS_BUTTONS0_CIRCLE); 1934 + input_report_key(ds4->gamepad, BTN_NORTH, ds4_report->buttons[0] & DS_BUTTONS0_TRIANGLE); 1935 + input_report_key(ds4->gamepad, BTN_TL, ds4_report->buttons[1] & DS_BUTTONS1_L1); 1936 + input_report_key(ds4->gamepad, BTN_TR, ds4_report->buttons[1] & DS_BUTTONS1_R1); 1937 + input_report_key(ds4->gamepad, BTN_TL2, ds4_report->buttons[1] & DS_BUTTONS1_L2); 1938 + input_report_key(ds4->gamepad, BTN_TR2, ds4_report->buttons[1] & DS_BUTTONS1_R2); 1939 + input_report_key(ds4->gamepad, BTN_SELECT, ds4_report->buttons[1] & DS_BUTTONS1_CREATE); 1940 + input_report_key(ds4->gamepad, BTN_START, ds4_report->buttons[1] & DS_BUTTONS1_OPTIONS); 1941 + input_report_key(ds4->gamepad, BTN_THUMBL, ds4_report->buttons[1] & DS_BUTTONS1_L3); 1942 + input_report_key(ds4->gamepad, BTN_THUMBR, ds4_report->buttons[1] & DS_BUTTONS1_R3); 1943 + input_report_key(ds4->gamepad, BTN_MODE, ds4_report->buttons[2] & DS_BUTTONS2_PS_HOME); 1944 + input_sync(ds4->gamepad); 1945 + 1946 + /* Parse and calibrate gyroscope data. */ 1947 + for (i = 0; i < ARRAY_SIZE(ds4_report->gyro); i++) { 1948 + int raw_data = (short)le16_to_cpu(ds4_report->gyro[i]); 1949 + int calib_data = mult_frac(ds4->gyro_calib_data[i].sens_numer, 1950 + raw_data - ds4->gyro_calib_data[i].bias, 1951 + ds4->gyro_calib_data[i].sens_denom); 1952 + 1953 + input_report_abs(ds4->sensors, ds4->gyro_calib_data[i].abs_code, calib_data); 1954 + } 1955 + 1956 + /* Parse and calibrate accelerometer data. */ 1957 + for (i = 0; i < ARRAY_SIZE(ds4_report->accel); i++) { 1958 + int raw_data = (short)le16_to_cpu(ds4_report->accel[i]); 1959 + int calib_data = mult_frac(ds4->accel_calib_data[i].sens_numer, 1960 + raw_data - ds4->accel_calib_data[i].bias, 1961 + ds4->accel_calib_data[i].sens_denom); 1962 + 1963 + input_report_abs(ds4->sensors, ds4->accel_calib_data[i].abs_code, calib_data); 1964 + } 1965 + 1966 + /* Convert timestamp (in 5.33us unit) to timestamp_us */ 1967 + sensor_timestamp = le16_to_cpu(ds4_report->sensor_timestamp); 1968 + if (!ds4->sensor_timestamp_initialized) { 1969 + ds4->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp*16, 3); 1970 + ds4->sensor_timestamp_initialized = true; 1971 + } else { 1972 + uint16_t delta; 1973 + 1974 + if (ds4->prev_sensor_timestamp > sensor_timestamp) 1975 + delta = (U16_MAX - ds4->prev_sensor_timestamp + sensor_timestamp + 1); 1976 + else 1977 + delta = sensor_timestamp - ds4->prev_sensor_timestamp; 1978 + ds4->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta*16, 3); 1979 + } 1980 + ds4->prev_sensor_timestamp = sensor_timestamp; 1981 + input_event(ds4->sensors, EV_MSC, MSC_TIMESTAMP, ds4->sensor_timestamp_us); 1982 + input_sync(ds4->sensors); 1983 + 1984 + for (i = 0; i < num_touch_reports; i++) { 1985 + struct dualshock4_touch_report *touch_report = &touch_reports[i]; 1986 + 1987 + for (j = 0; j < ARRAY_SIZE(touch_report->points); j++) { 1988 + struct dualshock4_touch_point *point = &touch_report->points[j]; 1989 + bool active = (point->contact & DS4_TOUCH_POINT_INACTIVE) ? false : true; 1990 + 1991 + input_mt_slot(ds4->touchpad, j); 1992 + input_mt_report_slot_state(ds4->touchpad, MT_TOOL_FINGER, active); 1993 + 1994 + if (active) { 1995 + int x = (point->x_hi << 8) | point->x_lo; 1996 + int y = (point->y_hi << 4) | point->y_lo; 1997 + 1998 + input_report_abs(ds4->touchpad, ABS_MT_POSITION_X, x); 1999 + input_report_abs(ds4->touchpad, ABS_MT_POSITION_Y, y); 2000 + } 2001 + } 2002 + input_mt_sync_frame(ds4->touchpad); 2003 + input_sync(ds4->touchpad); 2004 + } 2005 + input_report_key(ds4->touchpad, BTN_LEFT, ds4_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); 2006 + 2007 + /* 2008 + * Interpretation of the battery_capacity data depends on the cable state. 2009 + * When no cable is connected (bit4 is 0): 2010 + * - 0:10: percentage in units of 10%. 2011 + * When a cable is plugged in: 2012 + * - 0-10: percentage in units of 10%. 2013 + * - 11: battery is full 2014 + * - 14: not charging due to Voltage or temperature error 2015 + * - 15: charge error 2016 + */ 2017 + if (ds4_report->status[0] & DS4_STATUS0_CABLE_STATE) { 2018 + uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY; 2019 + 2020 + if (battery_data < 10) { 2021 + /* Take the mid-point for each battery capacity value, 2022 + * because on the hardware side 0 = 0-9%, 1=10-19%, etc. 2023 + * This matches official platform behavior, which does 2024 + * the same. 2025 + */ 2026 + battery_capacity = battery_data * 10 + 5; 2027 + battery_status = POWER_SUPPLY_STATUS_CHARGING; 2028 + } else if (battery_data == 10) { 2029 + battery_capacity = 100; 2030 + battery_status = POWER_SUPPLY_STATUS_CHARGING; 2031 + } else if (battery_data == DS4_BATTERY_STATUS_FULL) { 2032 + battery_capacity = 100; 2033 + battery_status = POWER_SUPPLY_STATUS_FULL; 2034 + } else { /* 14, 15 and undefined values */ 2035 + battery_capacity = 0; 2036 + battery_status = POWER_SUPPLY_STATUS_UNKNOWN; 2037 + } 2038 + } else { 2039 + uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY; 2040 + 2041 + if (battery_data < 10) 2042 + battery_capacity = battery_data * 10 + 5; 2043 + else /* 10 */ 2044 + battery_capacity = 100; 2045 + 2046 + battery_status = POWER_SUPPLY_STATUS_DISCHARGING; 2047 + } 2048 + 2049 + spin_lock_irqsave(&ps_dev->lock, flags); 2050 + ps_dev->battery_capacity = battery_capacity; 2051 + ps_dev->battery_status = battery_status; 2052 + spin_unlock_irqrestore(&ps_dev->lock, flags); 2053 + 2054 + return 0; 2055 + } 2056 + 2057 + static int dualshock4_dongle_parse_report(struct ps_device *ps_dev, struct hid_report *report, 2058 + u8 *data, int size) 2059 + { 2060 + struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base); 2061 + bool connected = false; 2062 + 2063 + /* The dongle reports data using the main USB report (0x1) no matter whether a controller 2064 + * is connected with mostly zeros. The report does contain dongle status, which we use to 2065 + * determine if a controller is connected and if so we forward to the regular DualShock4 2066 + * parsing code. 2067 + */ 2068 + if (data[0] == DS4_INPUT_REPORT_USB && size == DS4_INPUT_REPORT_USB_SIZE) { 2069 + struct dualshock4_input_report_common *ds4_report = (struct dualshock4_input_report_common *)&data[1]; 2070 + unsigned long flags; 2071 + 2072 + connected = ds4_report->status[1] & DS4_STATUS1_DONGLE_STATE ? false : true; 2073 + 2074 + if (ds4->dongle_state == DONGLE_DISCONNECTED && connected) { 2075 + hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller connected\n"); 2076 + 2077 + dualshock4_set_default_lightbar_colors(ds4); 2078 + 2079 + spin_lock_irqsave(&ps_dev->lock, flags); 2080 + ds4->dongle_state = DONGLE_CALIBRATING; 2081 + spin_unlock_irqrestore(&ps_dev->lock, flags); 2082 + 2083 + schedule_work(&ds4->dongle_hotplug_worker); 2084 + 2085 + /* Don't process the report since we don't have 2086 + * calibration data, but let hidraw have it anyway. 2087 + */ 2088 + return 0; 2089 + } else if ((ds4->dongle_state == DONGLE_CONNECTED || 2090 + ds4->dongle_state == DONGLE_DISABLED) && !connected) { 2091 + hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller disconnected\n"); 2092 + 2093 + spin_lock_irqsave(&ps_dev->lock, flags); 2094 + ds4->dongle_state = DONGLE_DISCONNECTED; 2095 + spin_unlock_irqrestore(&ps_dev->lock, flags); 2096 + 2097 + /* Return 0, so hidraw can get the report. */ 2098 + return 0; 2099 + } else if (ds4->dongle_state == DONGLE_CALIBRATING || 2100 + ds4->dongle_state == DONGLE_DISABLED || 2101 + ds4->dongle_state == DONGLE_DISCONNECTED) { 2102 + /* Return 0, so hidraw can get the report. */ 2103 + return 0; 2104 + } 2105 + } 2106 + 2107 + if (connected) 2108 + return dualshock4_parse_report(ps_dev, report, data, size); 2109 + 2110 + return 0; 2111 + } 2112 + 2113 + static int dualshock4_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) 2114 + { 2115 + struct hid_device *hdev = input_get_drvdata(dev); 2116 + struct dualshock4 *ds4 = hid_get_drvdata(hdev); 2117 + unsigned long flags; 2118 + 2119 + if (effect->type != FF_RUMBLE) 2120 + return 0; 2121 + 2122 + spin_lock_irqsave(&ds4->base.lock, flags); 2123 + ds4->update_rumble = true; 2124 + ds4->motor_left = effect->u.rumble.strong_magnitude / 256; 2125 + ds4->motor_right = effect->u.rumble.weak_magnitude / 256; 2126 + spin_unlock_irqrestore(&ds4->base.lock, flags); 2127 + 2128 + dualshock4_schedule_work(ds4); 2129 + return 0; 2130 + } 2131 + 2132 + static void dualshock4_remove(struct ps_device *ps_dev) 2133 + { 2134 + struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base); 2135 + unsigned long flags; 2136 + 2137 + spin_lock_irqsave(&ds4->base.lock, flags); 2138 + ds4->output_worker_initialized = false; 2139 + spin_unlock_irqrestore(&ds4->base.lock, flags); 2140 + 2141 + cancel_work_sync(&ds4->output_worker); 2142 + 2143 + if (ps_dev->hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) 2144 + cancel_work_sync(&ds4->dongle_hotplug_worker); 2145 + } 2146 + 2147 + static inline void dualshock4_schedule_work(struct dualshock4 *ds4) 2148 + { 2149 + unsigned long flags; 2150 + 2151 + spin_lock_irqsave(&ds4->base.lock, flags); 2152 + if (ds4->output_worker_initialized) 2153 + schedule_work(&ds4->output_worker); 2154 + spin_unlock_irqrestore(&ds4->base.lock, flags); 2155 + } 2156 + 2157 + static void dualshock4_set_bt_poll_interval(struct dualshock4 *ds4, uint8_t interval) 2158 + { 2159 + ds4->bt_poll_interval = interval; 2160 + ds4->update_bt_poll_interval = true; 2161 + dualshock4_schedule_work(ds4); 2162 + } 2163 + 2164 + /* Set default lightbar color based on player. */ 2165 + static void dualshock4_set_default_lightbar_colors(struct dualshock4 *ds4) 2166 + { 2167 + /* Use same player colors as PlayStation 4. 2168 + * Array of colors is in RGB. 2169 + */ 2170 + static const int player_colors[4][3] = { 2171 + { 0x00, 0x00, 0x40 }, /* Blue */ 2172 + { 0x40, 0x00, 0x00 }, /* Red */ 2173 + { 0x00, 0x40, 0x00 }, /* Green */ 2174 + { 0x20, 0x00, 0x20 } /* Pink */ 2175 + }; 2176 + 2177 + uint8_t player_id = ds4->base.player_id % ARRAY_SIZE(player_colors); 2178 + 2179 + ds4->lightbar_enabled = true; 2180 + ds4->lightbar_red = player_colors[player_id][0]; 2181 + ds4->lightbar_green = player_colors[player_id][1]; 2182 + ds4->lightbar_blue = player_colors[player_id][2]; 2183 + 2184 + ds4->update_lightbar = true; 2185 + dualshock4_schedule_work(ds4); 2186 + } 2187 + 2188 + static struct ps_device *dualshock4_create(struct hid_device *hdev) 2189 + { 2190 + struct dualshock4 *ds4; 2191 + struct ps_device *ps_dev; 2192 + uint8_t max_output_report_size; 2193 + int i, ret; 2194 + 2195 + /* The DualShock4 has an RGB lightbar, which the original hid-sony driver 2196 + * exposed as a set of 4 LEDs for the 3 color channels and a global control. 2197 + * Ideally this should have used the multi-color LED class, which didn't exist 2198 + * yet. In addition the driver used a naming scheme not compliant with the LED 2199 + * naming spec by using "<mac_address>:<color>", which contained many colons. 2200 + * We use a more compliant by using "<device_name>:<color>" name now. Ideally 2201 + * would have been "<device_name>:<color>:indicator", but that would break 2202 + * existing applications (e.g. Android). Nothing matches against MAC address. 2203 + */ 2204 + static const struct ps_led_info lightbar_leds_info[] = { 2205 + { NULL, "red", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness }, 2206 + { NULL, "green", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness }, 2207 + { NULL, "blue", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness }, 2208 + { NULL, "global", 1, dualshock4_led_get_brightness, dualshock4_led_set_brightness, 2209 + dualshock4_led_set_blink }, 2210 + }; 2211 + 2212 + ds4 = devm_kzalloc(&hdev->dev, sizeof(*ds4), GFP_KERNEL); 2213 + if (!ds4) 2214 + return ERR_PTR(-ENOMEM); 2215 + 2216 + /* 2217 + * Patch version to allow userspace to distinguish between 2218 + * hid-generic vs hid-playstation axis and button mapping. 2219 + */ 2220 + hdev->version |= HID_PLAYSTATION_VERSION_PATCH; 2221 + 2222 + ps_dev = &ds4->base; 2223 + ps_dev->hdev = hdev; 2224 + spin_lock_init(&ps_dev->lock); 2225 + ps_dev->battery_capacity = 100; /* initial value until parse_report. */ 2226 + ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; 2227 + ps_dev->parse_report = dualshock4_parse_report; 2228 + ps_dev->remove = dualshock4_remove; 2229 + INIT_WORK(&ds4->output_worker, dualshock4_output_worker); 2230 + ds4->output_worker_initialized = true; 2231 + hid_set_drvdata(hdev, ds4); 2232 + 2233 + max_output_report_size = sizeof(struct dualshock4_output_report_bt); 2234 + ds4->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); 2235 + if (!ds4->output_report_dmabuf) 2236 + return ERR_PTR(-ENOMEM); 2237 + 2238 + if (hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) { 2239 + ds4->dongle_state = DONGLE_DISCONNECTED; 2240 + INIT_WORK(&ds4->dongle_hotplug_worker, dualshock4_dongle_calibration_work); 2241 + 2242 + /* Override parse report for dongle specific hotplug handling. */ 2243 + ps_dev->parse_report = dualshock4_dongle_parse_report; 2244 + } 2245 + 2246 + ret = dualshock4_get_mac_address(ds4); 2247 + if (ret) { 2248 + hid_err(hdev, "Failed to get MAC address from DualShock4\n"); 2249 + return ERR_PTR(ret); 2250 + } 2251 + snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds4->base.mac_address); 2252 + 2253 + ret = dualshock4_get_firmware_info(ds4); 2254 + if (ret) { 2255 + hid_err(hdev, "Failed to get firmware info from DualShock4\n"); 2256 + return ERR_PTR(ret); 2257 + } 2258 + 2259 + ret = ps_devices_list_add(ps_dev); 2260 + if (ret) 2261 + return ERR_PTR(ret); 2262 + 2263 + ret = dualshock4_get_calibration_data(ds4); 2264 + if (ret) { 2265 + hid_err(hdev, "Failed to get calibration data from DualShock4\n"); 2266 + goto err; 2267 + } 2268 + 2269 + ds4->gamepad = ps_gamepad_create(hdev, dualshock4_play_effect); 2270 + if (IS_ERR(ds4->gamepad)) { 2271 + ret = PTR_ERR(ds4->gamepad); 2272 + goto err; 2273 + } 2274 + 2275 + /* Use gamepad input device name as primary device name for e.g. LEDs */ 2276 + ps_dev->input_dev_name = dev_name(&ds4->gamepad->dev); 2277 + 2278 + ds4->sensors = ps_sensors_create(hdev, DS4_ACC_RANGE, DS4_ACC_RES_PER_G, 2279 + DS4_GYRO_RANGE, DS4_GYRO_RES_PER_DEG_S); 2280 + if (IS_ERR(ds4->sensors)) { 2281 + ret = PTR_ERR(ds4->sensors); 2282 + goto err; 2283 + } 2284 + 2285 + ds4->touchpad = ps_touchpad_create(hdev, DS4_TOUCHPAD_WIDTH, DS4_TOUCHPAD_HEIGHT, 2); 2286 + if (IS_ERR(ds4->touchpad)) { 2287 + ret = PTR_ERR(ds4->touchpad); 2288 + goto err; 2289 + } 2290 + 2291 + ret = ps_device_register_battery(ps_dev); 2292 + if (ret) 2293 + goto err; 2294 + 2295 + for (i = 0; i < ARRAY_SIZE(lightbar_leds_info); i++) { 2296 + const struct ps_led_info *led_info = &lightbar_leds_info[i]; 2297 + 2298 + ret = ps_led_register(ps_dev, &ds4->lightbar_leds[i], led_info); 2299 + if (ret < 0) 2300 + goto err; 2301 + } 2302 + 2303 + dualshock4_set_bt_poll_interval(ds4, DS4_BT_DEFAULT_POLL_INTERVAL_MS); 2304 + 2305 + ret = ps_device_set_player_id(ps_dev); 2306 + if (ret) { 2307 + hid_err(hdev, "Failed to assign player id for DualShock4: %d\n", ret); 2308 + goto err; 2309 + } 2310 + 2311 + dualshock4_set_default_lightbar_colors(ds4); 2312 + 2313 + /* 2314 + * Reporting hardware and firmware is important as there are frequent updates, which 2315 + * can change behavior. 2316 + */ 2317 + hid_info(hdev, "Registered DualShock4 controller hw_version=0x%08x fw_version=0x%08x\n", 2318 + ds4->base.hw_version, ds4->base.fw_version); 2319 + return &ds4->base; 2320 + 2321 + err: 2322 + ps_devices_list_remove(ps_dev); 2323 + return ERR_PTR(ret); 2324 + } 2325 + 1700 2326 static int ps_raw_event(struct hid_device *hdev, struct hid_report *report, 1701 2327 u8 *data, int size) 1702 2328 { ··· 2589 1499 goto err_stop; 2590 1500 } 2591 1501 2592 - if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER || 1502 + if (hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER || 1503 + hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_2 || 1504 + hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) { 1505 + dev = dualshock4_create(hdev); 1506 + if (IS_ERR(dev)) { 1507 + hid_err(hdev, "Failed to create dualshock4.\n"); 1508 + ret = PTR_ERR(dev); 1509 + goto err_close; 1510 + } 1511 + } else if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER || 2593 1512 hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER_2) { 2594 1513 dev = dualsense_create(hdev); 2595 1514 if (IS_ERR(dev)) { ··· 2632 1533 } 2633 1534 2634 1535 static const struct hid_device_id ps_devices[] = { 1536 + /* Sony DualShock 4 controllers for PS4 */ 1537 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, 1538 + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, 1539 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2) }, 1540 + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2) }, 1541 + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) }, 1542 + /* Sony DualSense controllers for PS5 */ 2635 1543 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) }, 2636 1544 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) }, 2637 1545 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER_2) },
+2
drivers/hid/hid-rmi.c
··· 326 326 if (!(test_bit(RMI_STARTED, &hdata->flags))) 327 327 return 0; 328 328 329 + pm_wakeup_event(hdev->dev.parent, 0); 330 + 329 331 local_irq_save(flags); 330 332 331 333 rmi_set_attn_data(rmi_dev, data[1], &data[2], size - 2);
+2 -2
drivers/hid/hid-sensor-custom.c
··· 62 62 u32 raw_len; 63 63 } __packed; 64 64 65 - static struct attribute hid_custom_attrs[] = { 65 + static struct attribute hid_custom_attrs[HID_CUSTOM_TOTAL_ATTRS] = { 66 66 {.name = "name", .mode = S_IRUGO}, 67 67 {.name = "units", .mode = S_IRUGO}, 68 68 {.name = "unit-expo", .mode = S_IRUGO}, ··· 862 862 return ERR_PTR(-ENOMEM); 863 863 864 864 custom_pdev = platform_device_register_data(pdev->dev.parent, dev_name, 865 - PLATFORM_DEVID_NONE, hsdev, 865 + PLATFORM_DEVID_AUTO, hsdev, 866 866 sizeof(*hsdev)); 867 867 kfree(dev_name); 868 868 return custom_pdev;
+2 -2
drivers/hid/hid-uclogic-params-test.c
··· 136 136 KUNIT_ARRAY_PARAM(uclogic_parse_ugee_v2_desc, uclogic_parse_ugee_v2_desc_cases, 137 137 uclogic_parse_ugee_v2_desc_case_desc); 138 138 139 - static void uclogic_parse_ugee_v2_desc_test(struct kunit *test) 139 + static void hid_test_uclogic_parse_ugee_v2_desc(struct kunit *test) 140 140 { 141 141 int res; 142 142 s32 desc_params[UCLOGIC_RDESC_PH_ID_NUM]; ··· 175 175 } 176 176 177 177 static struct kunit_case hid_uclogic_params_test_cases[] = { 178 - KUNIT_CASE_PARAM(uclogic_parse_ugee_v2_desc_test, 178 + KUNIT_CASE_PARAM(hid_test_uclogic_parse_ugee_v2_desc, 179 179 uclogic_parse_ugee_v2_desc_gen_params), 180 180 {} 181 181 };
+73
drivers/hid/hid-uclogic-params.c
··· 18 18 #include "usbhid/usbhid.h" 19 19 #include "hid-ids.h" 20 20 #include <linux/ctype.h> 21 + #include <linux/string.h> 21 22 #include <asm/unaligned.h> 22 23 23 24 /** ··· 1213 1212 } 1214 1213 1215 1214 /** 1215 + * uclogic_params_ugee_v2_has_battery() - check whether a UGEE v2 device has 1216 + * battery or not. 1217 + * @hdev: The HID device of the tablet interface. 1218 + * 1219 + * Returns: 1220 + * True if the device has battery, false otherwise. 1221 + */ 1222 + static bool uclogic_params_ugee_v2_has_battery(struct hid_device *hdev) 1223 + { 1224 + /* The XP-PEN Deco LW vendor, product and version are identical to the 1225 + * Deco L. The only difference reported by their firmware is the product 1226 + * name. Add a quirk to support battery reporting on the wireless 1227 + * version. 1228 + */ 1229 + if (hdev->vendor == USB_VENDOR_ID_UGEE && 1230 + hdev->product == USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_L) { 1231 + struct usb_device *udev = hid_to_usb_dev(hdev); 1232 + 1233 + if (strstarts(udev->product, "Deco LW")) 1234 + return true; 1235 + } 1236 + 1237 + return false; 1238 + } 1239 + 1240 + /** 1241 + * uclogic_params_ugee_v2_init_battery() - initialize UGEE v2 battery reporting. 1242 + * @hdev: The HID device of the tablet interface, cannot be NULL. 1243 + * @p: Parameters to fill in, cannot be NULL. 1244 + * 1245 + * Returns: 1246 + * Zero, if successful. A negative errno code on error. 1247 + */ 1248 + static int uclogic_params_ugee_v2_init_battery(struct hid_device *hdev, 1249 + struct uclogic_params *p) 1250 + { 1251 + int rc = 0; 1252 + 1253 + if (!hdev || !p) 1254 + return -EINVAL; 1255 + 1256 + /* Some tablets contain invalid characters in hdev->uniq, throwing a 1257 + * "hwmon: '<name>' is not a valid name attribute, please fix" error. 1258 + * Use the device vendor and product IDs instead. 1259 + */ 1260 + snprintf(hdev->uniq, sizeof(hdev->uniq), "%x-%x", hdev->vendor, 1261 + hdev->product); 1262 + 1263 + rc = uclogic_params_frame_init_with_desc(&p->frame_list[1], 1264 + uclogic_rdesc_ugee_v2_battery_template_arr, 1265 + uclogic_rdesc_ugee_v2_battery_template_size, 1266 + UCLOGIC_RDESC_UGEE_V2_BATTERY_ID); 1267 + if (rc) 1268 + return rc; 1269 + 1270 + p->frame_list[1].suffix = "Battery"; 1271 + p->pen.subreport_list[1].value = 0xf2; 1272 + p->pen.subreport_list[1].id = UCLOGIC_RDESC_UGEE_V2_BATTERY_ID; 1273 + 1274 + return rc; 1275 + } 1276 + 1277 + /** 1216 1278 * uclogic_params_ugee_v2_init() - initialize a UGEE graphics tablets by 1217 1279 * discovering their parameters. 1218 1280 * ··· 1397 1333 1398 1334 if (rc) 1399 1335 goto cleanup; 1336 + 1337 + /* Initialize the battery interface*/ 1338 + if (uclogic_params_ugee_v2_has_battery(hdev)) { 1339 + rc = uclogic_params_ugee_v2_init_battery(hdev, &p); 1340 + if (rc) { 1341 + hid_err(hdev, "error initializing battery: %d\n", rc); 1342 + goto cleanup; 1343 + } 1344 + } 1400 1345 1401 1346 output: 1402 1347 /* Output parameters */
+2 -2
drivers/hid/hid-uclogic-rdesc-test.c
··· 187 187 KUNIT_ARRAY_PARAM(uclogic_template, uclogic_template_cases, 188 188 uclogic_template_case_desc); 189 189 190 - static void uclogic_template_test(struct kunit *test) 190 + static void hid_test_uclogic_template(struct kunit *test) 191 191 { 192 192 __u8 *res; 193 193 const struct uclogic_template_case *params = test->param_value; ··· 203 203 } 204 204 205 205 static struct kunit_case hid_uclogic_rdesc_test_cases[] = { 206 - KUNIT_CASE_PARAM(uclogic_template_test, uclogic_template_gen_params), 206 + KUNIT_CASE_PARAM(hid_test_uclogic_template, uclogic_template_gen_params), 207 207 {} 208 208 }; 209 209
+34
drivers/hid/hid-uclogic-rdesc.c
··· 1035 1035 const size_t uclogic_rdesc_ugee_v2_frame_mouse_template_size = 1036 1036 sizeof(uclogic_rdesc_ugee_v2_frame_mouse_template_arr); 1037 1037 1038 + /* Fixed report descriptor template for UGEE v2 battery reports */ 1039 + const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[] = { 1040 + 0x05, 0x01, /* Usage Page (Desktop), */ 1041 + 0x09, 0x07, /* Usage (Keypad), */ 1042 + 0xA1, 0x01, /* Collection (Application), */ 1043 + 0x85, UCLOGIC_RDESC_UGEE_V2_BATTERY_ID, 1044 + /* Report ID, */ 1045 + 0x75, 0x08, /* Report Size (8), */ 1046 + 0x95, 0x02, /* Report Count (2), */ 1047 + 0x81, 0x01, /* Input (Constant), */ 1048 + 0x05, 0x84, /* Usage Page (Power Device), */ 1049 + 0x05, 0x85, /* Usage Page (Battery System), */ 1050 + 0x09, 0x65, /* Usage Page (AbsoluteStateOfCharge), */ 1051 + 0x75, 0x08, /* Report Size (8), */ 1052 + 0x95, 0x01, /* Report Count (1), */ 1053 + 0x15, 0x00, /* Logical Minimum (0), */ 1054 + 0x26, 0xff, 0x00, /* Logical Maximum (255), */ 1055 + 0x81, 0x02, /* Input (Variable), */ 1056 + 0x75, 0x01, /* Report Size (1), */ 1057 + 0x95, 0x01, /* Report Count (1), */ 1058 + 0x15, 0x00, /* Logical Minimum (0), */ 1059 + 0x25, 0x01, /* Logical Maximum (1), */ 1060 + 0x09, 0x44, /* Usage Page (Charging), */ 1061 + 0x81, 0x02, /* Input (Variable), */ 1062 + 0x95, 0x07, /* Report Count (7), */ 1063 + 0x81, 0x01, /* Input (Constant), */ 1064 + 0x75, 0x08, /* Report Size (8), */ 1065 + 0x95, 0x07, /* Report Count (7), */ 1066 + 0x81, 0x01, /* Input (Constant), */ 1067 + 0xC0 /* End Collection */ 1068 + }; 1069 + const size_t uclogic_rdesc_ugee_v2_battery_template_size = 1070 + sizeof(uclogic_rdesc_ugee_v2_battery_template_arr); 1071 + 1038 1072 /* Fixed report descriptor for Ugee EX07 frame */ 1039 1073 const __u8 uclogic_rdesc_ugee_ex07_frame_arr[] = { 1040 1074 0x05, 0x01, /* Usage Page (Desktop), */
+7
drivers/hid/hid-uclogic-rdesc.h
··· 161 161 /* Device ID byte offset in v2 frame dial reports */ 162 162 #define UCLOGIC_RDESC_V2_FRAME_DIAL_DEV_ID_BYTE 0x4 163 163 164 + /* Report ID for tweaked UGEE v2 battery reports */ 165 + #define UCLOGIC_RDESC_UGEE_V2_BATTERY_ID 0xba 166 + 164 167 /* Fixed report descriptor template for UGEE v2 pen reports */ 165 168 extern const __u8 uclogic_rdesc_ugee_v2_pen_template_arr[]; 166 169 extern const size_t uclogic_rdesc_ugee_v2_pen_template_size; ··· 179 176 /* Fixed report descriptor template for UGEE v2 frame reports (mouse) */ 180 177 extern const __u8 uclogic_rdesc_ugee_v2_frame_mouse_template_arr[]; 181 178 extern const size_t uclogic_rdesc_ugee_v2_frame_mouse_template_size; 179 + 180 + /* Fixed report descriptor template for UGEE v2 battery reports */ 181 + extern const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[]; 182 + extern const size_t uclogic_rdesc_ugee_v2_battery_template_size; 182 183 183 184 /* Fixed report descriptor for Ugee EX07 frame */ 184 185 extern const __u8 uclogic_rdesc_ugee_ex07_frame_arr[];
+7
drivers/hid/hid-wiimote-core.c
··· 458 458 if (rmem[0] == 0x00 && rmem[1] == 0x00 && 459 459 rmem[4] == 0x01 && rmem[5] == 0x03) 460 460 return WIIMOTE_EXT_GUITAR; 461 + if (rmem[0] == 0x03 && rmem[1] == 0x00 && 462 + rmem[4] == 0x01 && rmem[5] == 0x03) 463 + return WIIMOTE_EXT_TURNTABLE; 461 464 462 465 return WIIMOTE_EXT_UNKNOWN; 463 466 } ··· 498 495 case WIIMOTE_EXT_GUITAR: 499 496 wmem = 0x07; 500 497 break; 498 + case WIIMOTE_EXT_TURNTABLE: 501 499 case WIIMOTE_EXT_NUNCHUK: 502 500 wmem = 0x05; 503 501 break; ··· 1086 1082 [WIIMOTE_EXT_PRO_CONTROLLER] = "Nintendo Wii U Pro Controller", 1087 1083 [WIIMOTE_EXT_DRUMS] = "Nintendo Wii Drums", 1088 1084 [WIIMOTE_EXT_GUITAR] = "Nintendo Wii Guitar", 1085 + [WIIMOTE_EXT_TURNTABLE] = "Nintendo Wii Turntable" 1089 1086 }; 1090 1087 1091 1088 /* ··· 1674 1669 return sprintf(buf, "drums\n"); 1675 1670 case WIIMOTE_EXT_GUITAR: 1676 1671 return sprintf(buf, "guitar\n"); 1672 + case WIIMOTE_EXT_TURNTABLE: 1673 + return sprintf(buf, "turntable\n"); 1677 1674 case WIIMOTE_EXT_UNKNOWN: 1678 1675 default: 1679 1676 return sprintf(buf, "unknown\n");
+225
drivers/hid/hid-wiimote-modules.c
··· 2403 2403 .in_ext = wiimod_guitar_in_ext, 2404 2404 }; 2405 2405 2406 + /* 2407 + * Turntable 2408 + * DJ Hero came with a Turntable Controller that was plugged in 2409 + * as an extension. 2410 + * We create a separate device for turntables and report all information via this 2411 + * input device. 2412 + */ 2413 + 2414 + enum wiimod_turntable_keys { 2415 + WIIMOD_TURNTABLE_KEY_G_RIGHT, 2416 + WIIMOD_TURNTABLE_KEY_R_RIGHT, 2417 + WIIMOD_TURNTABLE_KEY_B_RIGHT, 2418 + WIIMOD_TURNTABLE_KEY_G_LEFT, 2419 + WIIMOD_TURNTABLE_KEY_R_LEFT, 2420 + WIIMOD_TURNTABLE_KEY_B_LEFT, 2421 + WIIMOD_TURNTABLE_KEY_EUPHORIA, 2422 + WIIMOD_TURNTABLE_KEY_PLUS, 2423 + WIIMOD_TURNTABLE_KEY_MINUS, 2424 + WIIMOD_TURNTABLE_KEY_NUM 2425 + }; 2426 + 2427 + static const __u16 wiimod_turntable_map[] = { 2428 + BTN_1, /* WIIMOD_TURNTABLE_KEY_G_RIGHT */ 2429 + BTN_2, /* WIIMOD_TURNTABLE_KEY_R_RIGHT */ 2430 + BTN_3, /* WIIMOD_TURNTABLE_KEY_B_RIGHT */ 2431 + BTN_4, /* WIIMOD_TURNTABLE_KEY_G_LEFT */ 2432 + BTN_5, /* WIIMOD_TURNTABLE_KEY_R_LEFT */ 2433 + BTN_6, /* WIIMOD_TURNTABLE_KEY_B_LEFT */ 2434 + BTN_7, /* WIIMOD_TURNTABLE_KEY_EUPHORIA */ 2435 + BTN_START, /* WIIMOD_TURNTABLE_KEY_PLUS */ 2436 + BTN_SELECT, /* WIIMOD_TURNTABLE_KEY_MINUS */ 2437 + }; 2438 + 2439 + static void wiimod_turntable_in_ext(struct wiimote_data *wdata, const __u8 *ext) 2440 + { 2441 + __u8 be, cs, sx, sy, ed, rtt, rbg, rbr, rbb, ltt, lbg, lbr, lbb, bp, bm; 2442 + /* 2443 + * Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 2444 + *------+------+-----+-----+-----+-----+------+------+--------+ 2445 + * 0 | RTT<4:3> | SX <5:0> | 2446 + * 1 | RTT<2:1> | SY <5:0> | 2447 + *------+------+-----+-----+-----+-----+------+------+--------+ 2448 + * 2 |RTT<0>| ED<4:3> | CS<3:0> | RTT<5> | 2449 + *------+------+-----+-----+-----+-----+------+------+--------+ 2450 + * 3 | ED<2:0> | LTT<4:0> | 2451 + *------+------+-----+-----+-----+-----+------+------+--------+ 2452 + * 4 | 0 | 0 | LBR | B- | 0 | B+ | RBR | LTT<5> | 2453 + *------+------+-----+-----+-----+-----+------+------+--------+ 2454 + * 5 | LBB | 0 | RBG | BE | LBG | RBB | 0 | 0 | 2455 + *------+------+-----+-----+-----+-----+------+------+--------+ 2456 + * All pressed buttons are 0 2457 + * 2458 + * With Motion+ enabled, it will look like this: 2459 + * Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 2460 + *------+------+-----+-----+-----+-----+------+------+--------+ 2461 + * 1 | RTT<4:3> | SX <5:1> | 0 | 2462 + * 2 | RTT<2:1> | SY <5:1> | 0 | 2463 + *------+------+-----+-----+-----+-----+------+------+--------+ 2464 + * 3 |RTT<0>| ED<4:3> | CS<3:0> | RTT<5> | 2465 + *------+------+-----+-----+-----+-----+------+------+--------+ 2466 + * 4 | ED<2:0> | LTT<4:0> | 2467 + *------+------+-----+-----+-----+-----+------+------+--------+ 2468 + * 5 | 0 | 0 | LBR | B- | 0 | B+ | RBR | XXXX | 2469 + *------+------+-----+-----+-----+-----+------+------+--------+ 2470 + * 6 | LBB | 0 | RBG | BE | LBG | RBB | XXXX | XXXX | 2471 + *------+------+-----+-----+-----+-----+------+------+--------+ 2472 + */ 2473 + 2474 + be = !(ext[5] & 0x10); 2475 + cs = ((ext[2] & 0x1e)); 2476 + sx = ext[0] & 0x3f; 2477 + sy = ext[1] & 0x3f; 2478 + ed = (ext[3] & 0xe0) >> 5; 2479 + rtt = ((ext[2] & 0x01) << 5 | (ext[0] & 0xc0) >> 3 | (ext[1] & 0xc0) >> 5 | ( ext[2] & 0x80 ) >> 7); 2480 + ltt = ((ext[4] & 0x01) << 5 | (ext[3] & 0x1f)); 2481 + rbg = !(ext[5] & 0x20); 2482 + rbr = !(ext[4] & 0x02); 2483 + rbb = !(ext[5] & 0x04); 2484 + lbg = !(ext[5] & 0x08); 2485 + lbb = !(ext[5] & 0x80); 2486 + lbr = !(ext[4] & 0x20); 2487 + bm = !(ext[4] & 0x10); 2488 + bp = !(ext[4] & 0x04); 2489 + 2490 + if (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE) { 2491 + ltt = (ext[4] & 0x01) << 5; 2492 + sx &= 0x3e; 2493 + sy &= 0x3e; 2494 + } 2495 + 2496 + input_report_abs(wdata->extension.input, ABS_X, sx); 2497 + input_report_abs(wdata->extension.input, ABS_Y, sy); 2498 + input_report_abs(wdata->extension.input, ABS_HAT0X, rtt); 2499 + input_report_abs(wdata->extension.input, ABS_HAT1X, ltt); 2500 + input_report_abs(wdata->extension.input, ABS_HAT2X, cs); 2501 + input_report_abs(wdata->extension.input, ABS_HAT3X, ed); 2502 + input_report_key(wdata->extension.input, 2503 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_G_RIGHT], 2504 + rbg); 2505 + input_report_key(wdata->extension.input, 2506 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_R_RIGHT], 2507 + rbr); 2508 + input_report_key(wdata->extension.input, 2509 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_B_RIGHT], 2510 + rbb); 2511 + input_report_key(wdata->extension.input, 2512 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_G_LEFT], 2513 + lbg); 2514 + input_report_key(wdata->extension.input, 2515 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_R_LEFT], 2516 + lbr); 2517 + input_report_key(wdata->extension.input, 2518 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_B_LEFT], 2519 + lbb); 2520 + input_report_key(wdata->extension.input, 2521 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_EUPHORIA], 2522 + be); 2523 + input_report_key(wdata->extension.input, 2524 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_PLUS], 2525 + bp); 2526 + input_report_key(wdata->extension.input, 2527 + wiimod_turntable_map[WIIMOD_TURNTABLE_KEY_MINUS], 2528 + bm); 2529 + 2530 + input_sync(wdata->extension.input); 2531 + } 2532 + 2533 + static int wiimod_turntable_open(struct input_dev *dev) 2534 + { 2535 + struct wiimote_data *wdata = input_get_drvdata(dev); 2536 + unsigned long flags; 2537 + 2538 + spin_lock_irqsave(&wdata->state.lock, flags); 2539 + wdata->state.flags |= WIIPROTO_FLAG_EXT_USED; 2540 + wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); 2541 + spin_unlock_irqrestore(&wdata->state.lock, flags); 2542 + 2543 + return 0; 2544 + } 2545 + 2546 + static void wiimod_turntable_close(struct input_dev *dev) 2547 + { 2548 + struct wiimote_data *wdata = input_get_drvdata(dev); 2549 + unsigned long flags; 2550 + 2551 + spin_lock_irqsave(&wdata->state.lock, flags); 2552 + wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED; 2553 + wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); 2554 + spin_unlock_irqrestore(&wdata->state.lock, flags); 2555 + } 2556 + 2557 + static int wiimod_turntable_probe(const struct wiimod_ops *ops, 2558 + struct wiimote_data *wdata) 2559 + { 2560 + int ret, i; 2561 + 2562 + wdata->extension.input = input_allocate_device(); 2563 + if (!wdata->extension.input) 2564 + return -ENOMEM; 2565 + 2566 + input_set_drvdata(wdata->extension.input, wdata); 2567 + wdata->extension.input->open = wiimod_turntable_open; 2568 + wdata->extension.input->close = wiimod_turntable_close; 2569 + wdata->extension.input->dev.parent = &wdata->hdev->dev; 2570 + wdata->extension.input->id.bustype = wdata->hdev->bus; 2571 + wdata->extension.input->id.vendor = wdata->hdev->vendor; 2572 + wdata->extension.input->id.product = wdata->hdev->product; 2573 + wdata->extension.input->id.version = wdata->hdev->version; 2574 + wdata->extension.input->name = WIIMOTE_NAME " Turntable"; 2575 + 2576 + set_bit(EV_KEY, wdata->extension.input->evbit); 2577 + for (i = 0; i < WIIMOD_TURNTABLE_KEY_NUM; ++i) 2578 + set_bit(wiimod_turntable_map[i], 2579 + wdata->extension.input->keybit); 2580 + 2581 + set_bit(EV_ABS, wdata->extension.input->evbit); 2582 + set_bit(ABS_X, wdata->extension.input->absbit); 2583 + set_bit(ABS_Y, wdata->extension.input->absbit); 2584 + set_bit(ABS_HAT0X, wdata->extension.input->absbit); 2585 + set_bit(ABS_HAT1X, wdata->extension.input->absbit); 2586 + set_bit(ABS_HAT2X, wdata->extension.input->absbit); 2587 + set_bit(ABS_HAT3X, wdata->extension.input->absbit); 2588 + input_set_abs_params(wdata->extension.input, 2589 + ABS_X, 0, 63, 1, 0); 2590 + input_set_abs_params(wdata->extension.input, 2591 + ABS_Y, 63, 0, 1, 0); 2592 + input_set_abs_params(wdata->extension.input, 2593 + ABS_HAT0X, -8, 8, 0, 0); 2594 + input_set_abs_params(wdata->extension.input, 2595 + ABS_HAT1X, -8, 8, 0, 0); 2596 + input_set_abs_params(wdata->extension.input, 2597 + ABS_HAT2X, 0, 31, 1, 1); 2598 + input_set_abs_params(wdata->extension.input, 2599 + ABS_HAT3X, 0, 7, 0, 0); 2600 + ret = input_register_device(wdata->extension.input); 2601 + if (ret) 2602 + goto err_free; 2603 + 2604 + return 0; 2605 + 2606 + err_free: 2607 + input_free_device(wdata->extension.input); 2608 + wdata->extension.input = NULL; 2609 + return ret; 2610 + } 2611 + 2612 + static void wiimod_turntable_remove(const struct wiimod_ops *ops, 2613 + struct wiimote_data *wdata) 2614 + { 2615 + if (!wdata->extension.input) 2616 + return; 2617 + 2618 + input_unregister_device(wdata->extension.input); 2619 + wdata->extension.input = NULL; 2620 + } 2621 + 2622 + static const struct wiimod_ops wiimod_turntable = { 2623 + .flags = 0, 2624 + .arg = 0, 2625 + .probe = wiimod_turntable_probe, 2626 + .remove = wiimod_turntable_remove, 2627 + .in_ext = wiimod_turntable_in_ext, 2628 + }; 2629 + 2406 2630 /* 2407 2631 * Builtin Motion Plus 2408 2632 * This module simply sets the WIIPROTO_FLAG_BUILTIN_MP protocol flag which ··· 2881 2657 [WIIMOTE_EXT_PRO_CONTROLLER] = &wiimod_pro, 2882 2658 [WIIMOTE_EXT_DRUMS] = &wiimod_drums, 2883 2659 [WIIMOTE_EXT_GUITAR] = &wiimod_guitar, 2660 + [WIIMOTE_EXT_TURNTABLE] = &wiimod_turntable, 2884 2661 };
+1
drivers/hid/hid-wiimote.h
··· 88 88 WIIMOTE_EXT_PRO_CONTROLLER, 89 89 WIIMOTE_EXT_DRUMS, 90 90 WIIMOTE_EXT_GUITAR, 91 + WIIMOTE_EXT_TURNTABLE, 91 92 WIIMOTE_EXT_NUM, 92 93 }; 93 94
+2 -1
drivers/hid/i2c-hid/i2c-hid-core.c
··· 554 554 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); 555 555 556 556 if (test_bit(I2C_HID_STARTED, &ihid->flags)) { 557 - pm_wakeup_event(&ihid->client->dev, 0); 557 + if (ihid->hid->group != HID_GROUP_RMI) 558 + pm_wakeup_event(&ihid->client->dev, 0); 558 559 559 560 hid_input_report(ihid->hid, HID_INPUT_REPORT, 560 561 ihid->inbuf + sizeof(__le16),
+2 -3
drivers/hid/i2c-hid/i2c-hid-of-elan.c
··· 68 68 regulator_disable(ihid_elan->vcc33); 69 69 } 70 70 71 - static int i2c_hid_of_elan_probe(struct i2c_client *client, 72 - const struct i2c_device_id *id) 71 + static int i2c_hid_of_elan_probe(struct i2c_client *client) 73 72 { 74 73 struct i2c_hid_of_elan *ihid_elan; 75 74 ··· 118 119 .probe_type = PROBE_PREFER_ASYNCHRONOUS, 119 120 .of_match_table = of_match_ptr(elan_i2c_hid_of_match), 120 121 }, 121 - .probe = i2c_hid_of_elan_probe, 122 + .probe_new = i2c_hid_of_elan_probe, 122 123 .remove = i2c_hid_core_remove, 123 124 .shutdown = i2c_hid_core_shutdown, 124 125 };
+2 -3
drivers/hid/i2c-hid/i2c-hid-of-goodix.c
··· 87 87 return ret; 88 88 } 89 89 90 - static int i2c_hid_of_goodix_probe(struct i2c_client *client, 91 - const struct i2c_device_id *id) 90 + static int i2c_hid_of_goodix_probe(struct i2c_client *client) 92 91 { 93 92 struct i2c_hid_of_goodix *ihid_goodix; 94 93 int ret; ··· 166 167 .probe_type = PROBE_PREFER_ASYNCHRONOUS, 167 168 .of_match_table = of_match_ptr(goodix_i2c_hid_of_match), 168 169 }, 169 - .probe = i2c_hid_of_goodix_probe, 170 + .probe_new = i2c_hid_of_goodix_probe, 170 171 .remove = i2c_hid_core_remove, 171 172 .shutdown = i2c_hid_core_shutdown, 172 173 };
+2 -3
drivers/hid/i2c-hid/i2c-hid-of.c
··· 66 66 ihid_of->supplies); 67 67 } 68 68 69 - static int i2c_hid_of_probe(struct i2c_client *client, 70 - const struct i2c_device_id *dev_id) 69 + static int i2c_hid_of_probe(struct i2c_client *client) 71 70 { 72 71 struct device *dev = &client->dev; 73 72 struct i2c_hid_of *ihid_of; ··· 137 138 .of_match_table = of_match_ptr(i2c_hid_of_match), 138 139 }, 139 140 140 - .probe = i2c_hid_of_probe, 141 + .probe_new = i2c_hid_of_probe, 141 142 .remove = i2c_hid_core_remove, 142 143 .shutdown = i2c_hid_core_shutdown, 143 144 .id_table = i2c_hid_of_id_table,
-3
drivers/hid/intel-ish-hid/ishtp/client.c
··· 841 841 unsigned char *buffer = NULL; 842 842 struct ishtp_cl_rb *complete_rb = NULL; 843 843 unsigned long flags; 844 - int rb_count; 845 844 846 845 if (ishtp_hdr->reserved) { 847 846 dev_err(dev->devc, "corrupted message header.\n"); ··· 854 855 } 855 856 856 857 spin_lock_irqsave(&dev->read_list_spinlock, flags); 857 - rb_count = -1; 858 858 list_for_each_entry(rb, &dev->read_list.list, list) { 859 - ++rb_count; 860 859 cl = rb->cl; 861 860 if (!cl || !(cl->host_client_id == ishtp_hdr->host_addr && 862 861 cl->fw_client_id == ishtp_hdr->fw_addr) ||