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

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull HID updates from Jiri Kosina:

- support for the following Bluetooth devices from Samsung: Samsung
wireless {Keyboard, GamePad, Action Mouse, Book Cover, Universal
Keyboard, HOGP Keyboard} (Sandeep C S)

- second version of code for applying proper quirk depending on
firmware version for lenovo/cptkbd (Mikhail Khvainitski)

- lenovo/cptkbd firmware-dependent quirk (Mikhail Khvainitski)

- assorted fixes and optimizations for amd-sfh (Basavaraj Natikar)

- dead code and dead data structures removal (Jiri Slaby, Jiapeng
Chong)

* tag 'hid-for-linus-2024031301' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: (25 commits)
HID: amd_sfh: Set the AMD SFH driver to depend on x86
HID: input: avoid polling stylus battery on Chromebook Pompom
HID: amd_sfh: Extend MP2 register access to SFH
HID: amd_sfh: Improve boot time when SFH is available
HID: amd_sfh: Avoid disabling the interrupt
HID: amd_sfh: Update HPD sensor structure elements
HID: amd_sfh: Increase sensor command timeout
HID: intel-ish-hid: ipc: Add Arrow Lake PCI device ID
HID: nintendo: Remove some unused functions
HID: hid-prodikeys: remove struct pk_device
HID: hid-prodikeys: remove unused struct pcmidi_snd members
HID: hid-multitouch: remove unused mt_application::dev_time
HID: hid-lg3ff: remove unused struct lg3ff_device
HID: protect hid_device::bpf by CONFIG_HID_BPF
HID: wacom: remove unused hid_data::pressure
HID: apple: remove unused members from struct apple_sc_backlight
HID: wacom: Clean up use of struct->wacom_wac
HID: samsung: Add Samsung wireless bookcover and universal keyboard support
HID: samsung: Add Samsung wireless action mouse support
HID: samsung: Add Samsung wireless gamepad support
...

+624 -197
+1
drivers/hid/amd-sfh-hid/Kconfig
··· 6 6 config AMD_SFH_HID 7 7 tristate "AMD Sensor Fusion Hub" 8 8 depends on HID 9 + depends on X86 9 10 help 10 11 If you say yes to this option, support will be included for the 11 12 AMD Sensor Fusion Hub.
+16
drivers/hid/amd-sfh-hid/amd_sfh_common.h
··· 19 19 #define AMD_C2P_MSG(regno) (0x10500 + ((regno) * 4)) 20 20 #define AMD_P2C_MSG(regno) (0x10680 + ((regno) * 4)) 21 21 22 + #define AMD_C2P_MSG_V1(regno) (0x10900 + ((regno) * 4)) 23 + #define AMD_P2C_MSG_V1(regno) (0x10500 + ((regno) * 4)) 24 + 22 25 #define SENSOR_ENABLED 4 23 26 #define SENSOR_DISABLED 5 24 27 ··· 56 53 /* mp2 active control status */ 57 54 u32 mp2_acs; 58 55 struct sfh_dev_status dev_en; 56 + struct work_struct work; 57 + u8 init_done; 58 + u8 rver; 59 59 }; 60 60 61 61 struct amd_mp2_ops { ··· 85 79 int amd_sfh_irq_init_v2(struct amd_mp2_dev *privdata); 86 80 void amd_sfh_clear_intr(struct amd_mp2_dev *privdata); 87 81 int amd_sfh_irq_init(struct amd_mp2_dev *privdata); 82 + 83 + static inline u64 amd_get_c2p_val(struct amd_mp2_dev *mp2, u32 idx) 84 + { 85 + return mp2->rver == 1 ? AMD_C2P_MSG_V1(idx) : AMD_C2P_MSG(idx); 86 + } 87 + 88 + static inline u64 amd_get_p2c_val(struct amd_mp2_dev *mp2, u32 idx) 89 + { 90 + return mp2->rver == 1 ? AMD_P2C_MSG_V1(idx) : AMD_P2C_MSG(idx); 91 + } 88 92 #endif
+97 -21
drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
··· 10 10 11 11 #include <linux/bitops.h> 12 12 #include <linux/delay.h> 13 + #include <linux/devm-helpers.h> 13 14 #include <linux/dma-mapping.h> 14 15 #include <linux/dmi.h> 15 16 #include <linux/interrupt.h> ··· 36 35 module_param_named(sensor_mask, sensor_mask_override, int, 0444); 37 36 MODULE_PARM_DESC(sensor_mask, "override the detected sensors mask"); 38 37 38 + static bool intr_disable = true; 39 + 39 40 static int amd_sfh_wait_response_v2(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts) 40 41 { 41 42 union cmd_response cmd_resp; 42 43 43 - /* Get response with status within a max of 1600 ms timeout */ 44 + /* Get response with status within a max of 10 seconds timeout */ 44 45 if (!readl_poll_timeout(mp2->mmio + AMD_P2C_MSG(0), cmd_resp.resp, 45 46 (cmd_resp.response_v2.response == sensor_sts && 46 47 cmd_resp.response_v2.status == 0 && (sid == 0xff || 47 - cmd_resp.response_v2.sensor_id == sid)), 500, 1600000)) 48 + cmd_resp.response_v2.sensor_id == sid)), 500, 10000000)) 48 49 return cmd_resp.response_v2.response; 49 50 50 51 return SENSOR_DISABLED; ··· 58 55 59 56 cmd_base.ul = 0; 60 57 cmd_base.cmd_v2.cmd_id = ENABLE_SENSOR; 61 - cmd_base.cmd_v2.intr_disable = 1; 58 + cmd_base.cmd_v2.intr_disable = intr_disable; 62 59 cmd_base.cmd_v2.period = info.period; 63 60 cmd_base.cmd_v2.sensor_id = info.sensor_idx; 64 61 cmd_base.cmd_v2.length = 16; ··· 76 73 77 74 cmd_base.ul = 0; 78 75 cmd_base.cmd_v2.cmd_id = DISABLE_SENSOR; 79 - cmd_base.cmd_v2.intr_disable = 1; 76 + cmd_base.cmd_v2.intr_disable = intr_disable; 80 77 cmd_base.cmd_v2.period = 0; 81 78 cmd_base.cmd_v2.sensor_id = sensor_idx; 82 79 cmd_base.cmd_v2.length = 16; ··· 90 87 union sfh_cmd_base cmd_base; 91 88 92 89 cmd_base.cmd_v2.cmd_id = STOP_ALL_SENSORS; 93 - cmd_base.cmd_v2.intr_disable = 1; 90 + cmd_base.cmd_v2.intr_disable = intr_disable; 94 91 cmd_base.cmd_v2.period = 0; 95 92 cmd_base.cmd_v2.sensor_id = 0; 96 93 ··· 99 96 100 97 void amd_sfh_clear_intr_v2(struct amd_mp2_dev *privdata) 101 98 { 102 - if (readl(privdata->mmio + AMD_P2C_MSG(4))) { 103 - writel(0, privdata->mmio + AMD_P2C_MSG(4)); 104 - writel(0xf, privdata->mmio + AMD_P2C_MSG(5)); 99 + if (readl(privdata->mmio + amd_get_p2c_val(privdata, 4))) { 100 + writel(0, privdata->mmio + amd_get_p2c_val(privdata, 4)); 101 + writel(0xf, privdata->mmio + amd_get_p2c_val(privdata, 5)); 105 102 } 106 103 } 107 104 ··· 295 292 return 0; 296 293 } 297 294 295 + static int mp2_disable_intr(const struct dmi_system_id *id) 296 + { 297 + intr_disable = false; 298 + return 0; 299 + } 300 + 301 + static const struct dmi_system_id dmi_sfh_table[] = { 302 + { 303 + /* 304 + * https://bugzilla.kernel.org/show_bug.cgi?id=218104 305 + */ 306 + .callback = mp2_disable_intr, 307 + .matches = { 308 + DMI_MATCH(DMI_SYS_VENDOR, "HP"), 309 + DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook x360 435 G7"), 310 + }, 311 + }, 312 + {} 313 + }; 314 + 298 315 static const struct dmi_system_id dmi_nodevs[] = { 299 316 { 300 317 /* ··· 330 307 { } 331 308 }; 332 309 310 + static void sfh1_1_init_work(struct work_struct *work) 311 + { 312 + struct amd_mp2_dev *mp2 = container_of(work, struct amd_mp2_dev, work); 313 + struct pci_dev *pdev = mp2->pdev; 314 + int rc; 315 + 316 + rc = mp2->sfh1_1_ops->init(mp2); 317 + if (rc) { 318 + dev_err(&pdev->dev, "sfh1_1_init failed err %d\n", rc); 319 + return; 320 + } 321 + 322 + amd_sfh_clear_intr(mp2); 323 + mp2->init_done = 1; 324 + } 325 + 326 + static void sfh_init_work(struct work_struct *work) 327 + { 328 + struct amd_mp2_dev *mp2 = container_of(work, struct amd_mp2_dev, work); 329 + struct pci_dev *pdev = mp2->pdev; 330 + int rc; 331 + 332 + rc = amd_sfh_hid_client_init(mp2); 333 + if (rc) { 334 + amd_sfh_clear_intr(mp2); 335 + dev_err(&pdev->dev, "amd_sfh_hid_client_init failed err %d\n", rc); 336 + return; 337 + } 338 + 339 + amd_sfh_clear_intr(mp2); 340 + mp2->init_done = 1; 341 + } 342 + 343 + static void amd_sfh_remove(struct pci_dev *pdev) 344 + { 345 + struct amd_mp2_dev *mp2 = pci_get_drvdata(pdev); 346 + 347 + flush_work(&mp2->work); 348 + if (mp2->init_done) 349 + mp2->mp2_ops->remove(mp2); 350 + } 351 + 333 352 static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 334 353 { 335 354 struct amd_mp2_dev *privdata; ··· 379 314 380 315 if (dmi_first_match(dmi_nodevs)) 381 316 return -ENODEV; 317 + 318 + dmi_check_system(dmi_sfh_table); 382 319 383 320 privdata = devm_kzalloc(&pdev->dev, sizeof(*privdata), GFP_KERNEL); 384 321 if (!privdata) ··· 410 343 411 344 privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data; 412 345 if (privdata->sfh1_1_ops) { 413 - rc = privdata->sfh1_1_ops->init(privdata); 346 + if (boot_cpu_data.x86 >= 0x1A) 347 + privdata->rver = 1; 348 + 349 + rc = devm_work_autocancel(&pdev->dev, &privdata->work, sfh1_1_init_work); 414 350 if (rc) 415 351 return rc; 416 - goto init_done; 352 + 353 + schedule_work(&privdata->work); 354 + return 0; 417 355 } 418 356 419 357 mp2_select_ops(privdata); ··· 429 357 return rc; 430 358 } 431 359 432 - rc = amd_sfh_hid_client_init(privdata); 360 + rc = devm_work_autocancel(&pdev->dev, &privdata->work, sfh_init_work); 433 361 if (rc) { 434 362 amd_sfh_clear_intr(privdata); 435 - if (rc != -EOPNOTSUPP) 436 - dev_err(&pdev->dev, "amd_sfh_hid_client_init failed\n"); 437 363 return rc; 438 364 } 439 365 440 - init_done: 441 - amd_sfh_clear_intr(privdata); 442 - 443 - return devm_add_action_or_reset(&pdev->dev, privdata->mp2_ops->remove, privdata); 366 + schedule_work(&privdata->work); 367 + return 0; 444 368 } 445 369 446 370 static void amd_sfh_shutdown(struct pci_dev *pdev) 447 371 { 448 372 struct amd_mp2_dev *mp2 = pci_get_drvdata(pdev); 449 373 450 - if (mp2 && mp2->mp2_ops) 451 - mp2->mp2_ops->stop_all(mp2); 374 + if (mp2) { 375 + flush_work(&mp2->work); 376 + if (mp2->init_done) 377 + mp2->mp2_ops->stop_all(mp2); 378 + } 452 379 } 453 380 454 381 static int __maybe_unused amd_mp2_pci_resume(struct device *dev) 455 382 { 456 383 struct amd_mp2_dev *mp2 = dev_get_drvdata(dev); 457 384 458 - mp2->mp2_ops->resume(mp2); 385 + flush_work(&mp2->work); 386 + if (mp2->init_done) 387 + mp2->mp2_ops->resume(mp2); 459 388 460 389 return 0; 461 390 } ··· 465 392 { 466 393 struct amd_mp2_dev *mp2 = dev_get_drvdata(dev); 467 394 468 - mp2->mp2_ops->suspend(mp2); 395 + flush_work(&mp2->work); 396 + if (mp2->init_done) 397 + mp2->mp2_ops->suspend(mp2); 469 398 470 399 return 0; 471 400 } ··· 489 414 .probe = amd_mp2_pci_probe, 490 415 .driver.pm = &amd_mp2_pm_ops, 491 416 .shutdown = amd_sfh_shutdown, 417 + .remove = amd_sfh_remove, 492 418 }; 493 419 module_pci_driver(amd_mp2_pci_driver); 494 420
+3 -3
drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
··· 90 90 struct hpd_status { 91 91 union { 92 92 struct { 93 - u32 human_presence_report : 4; 94 - u32 human_presence_actual : 4; 95 - u32 probablity : 8; 96 93 u32 object_distance : 16; 94 + u32 probablity : 8; 95 + u32 human_presence_actual : 4; 96 + u32 human_presence_report : 4; 97 97 } shpd; 98 98 u32 val; 99 99 };
+1 -1
drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_desc.c
··· 251 251 break; 252 252 case HPD_IDX: 253 253 get_common_inputs(&hpd_input.common_property, report_id); 254 - hpdstatus.val = readl(mp2->mmio + AMD_C2P_MSG(4)); 254 + hpdstatus.val = readl(mp2->mmio + amd_get_c2p_val(mp2, 4)); 255 255 hpd_input.human_presence = hpdstatus.shpd.presence; 256 256 report_size = sizeof(hpd_input); 257 257 memcpy(input_report, &hpd_input, sizeof(hpd_input));
+2 -2
drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c
··· 172 172 if (rc) 173 173 goto cleanup; 174 174 175 - writel(0, privdata->mmio + AMD_P2C_MSG(0)); 175 + writel(0, privdata->mmio + amd_get_p2c_val(privdata, 0)); 176 176 mp2_ops->start(privdata, info); 177 177 status = amd_sfh_wait_for_response 178 178 (privdata, cl_data->sensor_idx[i], ENABLE_SENSOR); ··· 298 298 299 299 int amd_sfh1_1_init(struct amd_mp2_dev *mp2) 300 300 { 301 - u32 phy_base = readl(mp2->mmio + AMD_C2P_MSG(22)); 301 + u32 phy_base = readl(mp2->mmio + amd_get_c2p_val(mp2, 22)); 302 302 struct device *dev = &mp2->pdev->dev; 303 303 struct sfh_base_info binfo; 304 304 int rc;
+5 -5
drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c
··· 20 20 struct sfh_cmd_response cmd_resp; 21 21 22 22 /* Get response with status within a max of 10000 ms timeout */ 23 - if (!readl_poll_timeout(mp2->mmio + AMD_P2C_MSG(0), cmd_resp.resp, 23 + if (!readl_poll_timeout(mp2->mmio + amd_get_p2c_val(mp2, 0), cmd_resp.resp, 24 24 (cmd_resp.response.response == 0 && 25 25 cmd_resp.response.cmd_id == cmd_id && (sid == 0xff || 26 26 cmd_resp.response.sensor_id == sid)), 500, 10000000)) ··· 39 39 cmd_base.cmd.sub_cmd_value = 1; 40 40 cmd_base.cmd.sensor_id = info.sensor_idx; 41 41 42 - writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG(0)); 42 + writel(cmd_base.ul, privdata->mmio + amd_get_c2p_val(privdata, 0)); 43 43 } 44 44 45 45 static void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx) ··· 52 52 cmd_base.cmd.sub_cmd_value = 1; 53 53 cmd_base.cmd.sensor_id = sensor_idx; 54 54 55 - writeq(0x0, privdata->mmio + AMD_C2P_MSG(1)); 56 - writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG(0)); 55 + writeq(0x0, privdata->mmio + amd_get_c2p_val(privdata, 1)); 56 + writel(cmd_base.ul, privdata->mmio + amd_get_c2p_val(privdata, 0)); 57 57 } 58 58 59 59 static void amd_stop_all_sensor(struct amd_mp2_dev *privdata) ··· 66 66 /* 0xf indicates all sensors */ 67 67 cmd_base.cmd.sensor_id = 0xf; 68 68 69 - writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG(0)); 69 + writel(cmd_base.ul, privdata->mmio + amd_get_c2p_val(privdata, 0)); 70 70 } 71 71 72 72 static struct amd_mp2_ops amd_sfh_ops = {
-1
drivers/hid/hid-apple.c
··· 79 79 struct apple_sc_backlight { 80 80 struct led_classdev cdev; 81 81 struct hid_device *hdev; 82 - unsigned short backlight_off, backlight_on_min, backlight_on_max; 83 82 }; 84 83 85 84 struct apple_sc {
+8
drivers/hid/hid-ids.h
··· 430 430 #define I2C_DEVICE_ID_HP_SPECTRE_X360_14T_EA100_V1 0x2BED 431 431 #define I2C_DEVICE_ID_HP_SPECTRE_X360_14T_EA100_V2 0x2BEE 432 432 #define I2C_DEVICE_ID_HP_ENVY_X360_15_EU0556NG 0x2D02 433 + #define I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM 0x2F81 433 434 434 435 #define USB_VENDOR_ID_ELECOM 0x056e 435 436 #define USB_DEVICE_ID_ELECOM_BM084 0x0061 ··· 1147 1146 #define USB_DEVICE_ID_SAITEK_X65 0x0b6a 1148 1147 1149 1148 #define USB_VENDOR_ID_SAMSUNG 0x0419 1149 + #define USB_VENDOR_ID_SAMSUNG_ELECTRONICS 0x04e8 1150 1150 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 1151 1151 #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 1152 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD 0x7021 1153 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD 0xa000 1154 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE 0xa004 1155 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_BOOKCOVER 0xa005 1156 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD 0xa006 1157 + #define USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD 0xa064 1152 1158 1153 1159 #define USB_VENDOR_ID_SEMICO 0x1a2c 1154 1160 #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD 0x0023
+2
drivers/hid/hid-input.c
··· 411 411 HID_BATTERY_QUIRK_IGNORE }, 412 412 { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_15_EU0556NG), 413 413 HID_BATTERY_QUIRK_IGNORE }, 414 + { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM), 415 + HID_BATTERY_QUIRK_AVOID_QUERY }, 414 416 {} 415 417 }; 416 418
+39 -18
drivers/hid/hid-lenovo.c
··· 54 54 /* 0: Up 55 55 * 1: Down (undecided) 56 56 * 2: Scrolling 57 - * 3: Patched firmware, disable workaround 58 57 */ 59 58 u8 middlebutton_state; 60 59 bool fn_lock; 60 + bool middleclick_workaround_cptkbd; 61 61 }; 62 62 63 63 #define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) ··· 621 621 return count; 622 622 } 623 623 624 + static ssize_t attr_middleclick_workaround_show_cptkbd(struct device *dev, 625 + struct device_attribute *attr, 626 + char *buf) 627 + { 628 + struct hid_device *hdev = to_hid_device(dev); 629 + struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); 630 + 631 + return snprintf(buf, PAGE_SIZE, "%u\n", 632 + cptkbd_data->middleclick_workaround_cptkbd); 633 + } 634 + 635 + static ssize_t attr_middleclick_workaround_store_cptkbd(struct device *dev, 636 + struct device_attribute *attr, 637 + const char *buf, 638 + size_t count) 639 + { 640 + struct hid_device *hdev = to_hid_device(dev); 641 + struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); 642 + int value; 643 + 644 + if (kstrtoint(buf, 10, &value)) 645 + return -EINVAL; 646 + if (value < 0 || value > 1) 647 + return -EINVAL; 648 + 649 + cptkbd_data->middleclick_workaround_cptkbd = !!value; 650 + 651 + return count; 652 + } 653 + 624 654 625 655 static struct device_attribute dev_attr_fn_lock = 626 656 __ATTR(fn_lock, S_IWUSR | S_IRUGO, ··· 662 632 attr_sensitivity_show_cptkbd, 663 633 attr_sensitivity_store_cptkbd); 664 634 635 + static struct device_attribute dev_attr_middleclick_workaround_cptkbd = 636 + __ATTR(middleclick_workaround, S_IWUSR | S_IRUGO, 637 + attr_middleclick_workaround_show_cptkbd, 638 + attr_middleclick_workaround_store_cptkbd); 639 + 665 640 666 641 static struct attribute *lenovo_attributes_cptkbd[] = { 667 642 &dev_attr_fn_lock.attr, 668 643 &dev_attr_sensitivity_cptkbd.attr, 644 + &dev_attr_middleclick_workaround_cptkbd.attr, 669 645 NULL 670 646 }; 671 647 ··· 722 686 { 723 687 struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); 724 688 725 - if (cptkbd_data->middlebutton_state != 3) { 726 - /* REL_X and REL_Y events during middle button pressed 727 - * are only possible on patched, bug-free firmware 728 - * so set middlebutton_state to 3 729 - * to never apply workaround anymore 730 - */ 731 - if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD && 732 - cptkbd_data->middlebutton_state == 1 && 733 - usage->type == EV_REL && 734 - (usage->code == REL_X || usage->code == REL_Y)) { 735 - cptkbd_data->middlebutton_state = 3; 736 - /* send middle button press which was hold before */ 737 - input_event(field->hidinput->input, 738 - EV_KEY, BTN_MIDDLE, 1); 739 - input_sync(field->hidinput->input); 740 - } 741 - 689 + if (cptkbd_data->middleclick_workaround_cptkbd) { 742 690 /* "wheel" scroll events */ 743 691 if (usage->type == EV_REL && (usage->code == REL_WHEEL || 744 692 usage->code == REL_HWHEEL)) { ··· 1186 1166 cptkbd_data->middlebutton_state = 0; 1187 1167 cptkbd_data->fn_lock = true; 1188 1168 cptkbd_data->sensitivity = 0x05; 1169 + cptkbd_data->middleclick_workaround_cptkbd = true; 1189 1170 lenovo_features_set_cptkbd(hdev); 1190 1171 1191 1172 ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd);
-4
drivers/hid/hid-lg3ff.c
··· 41 41 * I'm sure these are effects that I don't know enough about them 42 42 */ 43 43 44 - struct lg3ff_device { 45 - struct hid_report *report; 46 - }; 47 - 48 44 static int hid_lg3ff_play(struct input_dev *dev, void *data, 49 45 struct ff_effect *effect) 50 46 {
-1
drivers/hid/hid-multitouch.c
··· 130 130 * > 1 means hybrid (multitouch) protocol 131 131 */ 132 132 133 - __s32 dev_time; /* the scan time provided by the device */ 134 133 unsigned long jiffies; /* the frame's jiffies */ 135 134 int timestamp; /* the timestamp to be sent */ 136 135 int prev_scantime; /* scantime reported previously */
-22
drivers/hid/hid-nintendo.c
··· 667 667 * These helpers are most useful early during the HID probe or in conjunction 668 668 * with the capability helpers below. 669 669 */ 670 - static inline bool joycon_device_is_left_joycon(struct joycon_ctlr *ctlr) 671 - { 672 - return ctlr->hdev->product == USB_DEVICE_ID_NINTENDO_JOYCONL; 673 - } 674 - 675 - static inline bool joycon_device_is_right_joycon(struct joycon_ctlr *ctlr) 676 - { 677 - return ctlr->hdev->product == USB_DEVICE_ID_NINTENDO_JOYCONR; 678 - } 679 - 680 670 static inline bool joycon_device_is_procon(struct joycon_ctlr *ctlr) 681 671 { 682 672 return ctlr->hdev->product == USB_DEVICE_ID_NINTENDO_PROCON; ··· 752 762 static inline bool joycon_type_is_right_nescon(struct joycon_ctlr *ctlr) 753 763 { 754 764 return ctlr->ctlr_type == JOYCON_CTLR_TYPE_NESR; 755 - } 756 - 757 - static inline bool joycon_type_has_left_controls(struct joycon_ctlr *ctlr) 758 - { 759 - return joycon_type_is_left_joycon(ctlr) || 760 - joycon_type_is_procon(ctlr); 761 - } 762 - 763 - static inline bool joycon_type_has_right_controls(struct joycon_ctlr *ctlr) 764 - { 765 - return joycon_type_is_right_joycon(ctlr) || 766 - joycon_type_is_procon(ctlr); 767 765 } 768 766 769 767 static inline bool joycon_type_is_any_joycon(struct joycon_ctlr *ctlr)
+41 -76
drivers/hid/hid-prodikeys.c
··· 32 32 33 33 struct pcmidi_snd; 34 34 35 - struct pk_device { 36 - unsigned long quirks; 37 - 38 - struct hid_device *hdev; 39 - struct pcmidi_snd *pm; /* pcmidi device context */ 40 - }; 41 - 42 35 struct pcmidi_sustain { 43 36 unsigned long in_use; 44 37 struct pcmidi_snd *pm; ··· 43 50 44 51 #define PCMIDI_SUSTAINED_MAX 32 45 52 struct pcmidi_snd { 46 - struct pk_device *pk; 53 + struct hid_device *hdev; 47 54 unsigned short ifnum; 48 55 struct hid_report *pcmidi_report6; 49 56 struct input_dev *input_ep82; ··· 59 66 struct snd_card *card; 60 67 struct snd_rawmidi *rwmidi; 61 68 struct snd_rawmidi_substream *in_substream; 62 - struct snd_rawmidi_substream *out_substream; 63 69 unsigned long in_triggered; 64 - unsigned long out_active; 65 70 }; 66 71 67 72 #define PK_QUIRK_NOGET 0x00010000 ··· 91 100 struct device_attribute *attr, char *buf) 92 101 { 93 102 struct hid_device *hdev = to_hid_device(dev); 94 - struct pk_device *pk = hid_get_drvdata(hdev); 103 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 95 104 96 - dbg_hid("pcmidi sysfs read channel=%u\n", pk->pm->midi_channel); 105 + dbg_hid("pcmidi sysfs read channel=%u\n", pm->midi_channel); 97 106 98 - return sprintf(buf, "%u (min:%u, max:%u)\n", pk->pm->midi_channel, 107 + return sprintf(buf, "%u (min:%u, max:%u)\n", pm->midi_channel, 99 108 PCMIDI_CHANNEL_MIN, PCMIDI_CHANNEL_MAX); 100 109 } 101 110 ··· 104 113 struct device_attribute *attr, const char *buf, size_t count) 105 114 { 106 115 struct hid_device *hdev = to_hid_device(dev); 107 - struct pk_device *pk = hid_get_drvdata(hdev); 116 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 108 117 109 118 unsigned channel = 0; 110 119 111 120 if (sscanf(buf, "%u", &channel) > 0 && channel <= PCMIDI_CHANNEL_MAX) { 112 121 dbg_hid("pcmidi sysfs write channel=%u\n", channel); 113 - pk->pm->midi_channel = channel; 122 + pm->midi_channel = channel; 114 123 return strlen(buf); 115 124 } 116 125 return -EINVAL; ··· 128 137 struct device_attribute *attr, char *buf) 129 138 { 130 139 struct hid_device *hdev = to_hid_device(dev); 131 - struct pk_device *pk = hid_get_drvdata(hdev); 140 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 132 141 133 - dbg_hid("pcmidi sysfs read sustain=%u\n", pk->pm->midi_sustain); 142 + dbg_hid("pcmidi sysfs read sustain=%u\n", pm->midi_sustain); 134 143 135 - return sprintf(buf, "%u (off:%u, max:%u (ms))\n", pk->pm->midi_sustain, 144 + return sprintf(buf, "%u (off:%u, max:%u (ms))\n", pm->midi_sustain, 136 145 PCMIDI_SUSTAIN_MIN, PCMIDI_SUSTAIN_MAX); 137 146 } 138 147 ··· 141 150 struct device_attribute *attr, const char *buf, size_t count) 142 151 { 143 152 struct hid_device *hdev = to_hid_device(dev); 144 - struct pk_device *pk = hid_get_drvdata(hdev); 153 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 145 154 146 155 unsigned sustain = 0; 147 156 148 157 if (sscanf(buf, "%u", &sustain) > 0 && sustain <= PCMIDI_SUSTAIN_MAX) { 149 158 dbg_hid("pcmidi sysfs write sustain=%u\n", sustain); 150 - pk->pm->midi_sustain = sustain; 151 - pk->pm->midi_sustain_mode = 152 - (0 == sustain || !pk->pm->midi_mode) ? 0 : 1; 159 + pm->midi_sustain = sustain; 160 + pm->midi_sustain_mode = (0 == sustain || !pm->midi_mode) ? 0 : 1; 153 161 return strlen(buf); 154 162 } 155 163 return -EINVAL; ··· 166 176 struct device_attribute *attr, char *buf) 167 177 { 168 178 struct hid_device *hdev = to_hid_device(dev); 169 - struct pk_device *pk = hid_get_drvdata(hdev); 179 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 170 180 171 - dbg_hid("pcmidi sysfs read octave=%d\n", pk->pm->midi_octave); 181 + dbg_hid("pcmidi sysfs read octave=%d\n", pm->midi_octave); 172 182 173 - return sprintf(buf, "%d (min:%d, max:%d)\n", pk->pm->midi_octave, 183 + return sprintf(buf, "%d (min:%d, max:%d)\n", pm->midi_octave, 174 184 PCMIDI_OCTAVE_MIN, PCMIDI_OCTAVE_MAX); 175 185 } 176 186 ··· 179 189 struct device_attribute *attr, const char *buf, size_t count) 180 190 { 181 191 struct hid_device *hdev = to_hid_device(dev); 182 - struct pk_device *pk = hid_get_drvdata(hdev); 192 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 183 193 184 194 int octave = 0; 185 195 186 196 if (sscanf(buf, "%d", &octave) > 0 && 187 197 octave >= PCMIDI_OCTAVE_MIN && octave <= PCMIDI_OCTAVE_MAX) { 188 198 dbg_hid("pcmidi sysfs write octave=%d\n", octave); 189 - pk->pm->midi_octave = octave; 199 + pm->midi_octave = octave; 190 200 return strlen(buf); 191 201 } 192 202 return -EINVAL; ··· 260 270 261 271 static int pcmidi_get_output_report(struct pcmidi_snd *pm) 262 272 { 263 - struct hid_device *hdev = pm->pk->hdev; 273 + struct hid_device *hdev = pm->hdev; 264 274 struct hid_report *report; 265 275 266 276 list_for_each_entry(report, ··· 285 295 286 296 static void pcmidi_submit_output_report(struct pcmidi_snd *pm, int state) 287 297 { 288 - struct hid_device *hdev = pm->pk->hdev; 298 + struct hid_device *hdev = pm->hdev; 289 299 struct hid_report *report = pm->pcmidi_report6; 290 300 report->field[0]->value[0] = 0x01; 291 301 report->field[0]->value[1] = state; ··· 612 622 613 623 /* Setup sound card */ 614 624 615 - err = snd_card_new(&pm->pk->hdev->dev, index[dev], id[dev], 625 + err = snd_card_new(&pm->hdev->dev, index[dev], id[dev], 616 626 THIS_MODULE, 0, &card); 617 627 if (err < 0) { 618 628 pk_error("failed to create pc-midi sound card\n"); ··· 650 660 &pcmidi_in_ops); 651 661 652 662 /* create sysfs variables */ 653 - err = device_create_file(&pm->pk->hdev->dev, 663 + err = device_create_file(&pm->hdev->dev, 654 664 sysfs_device_attr_channel); 655 665 if (err < 0) { 656 666 pk_error("failed to create sysfs attribute channel: error %d\n", ··· 658 668 goto fail; 659 669 } 660 670 661 - err = device_create_file(&pm->pk->hdev->dev, 671 + err = device_create_file(&pm->hdev->dev, 662 672 sysfs_device_attr_sustain); 663 673 if (err < 0) { 664 674 pk_error("failed to create sysfs attribute sustain: error %d\n", ··· 666 676 goto fail_attr_sustain; 667 677 } 668 678 669 - err = device_create_file(&pm->pk->hdev->dev, 679 + err = device_create_file(&pm->hdev->dev, 670 680 sysfs_device_attr_octave); 671 681 if (err < 0) { 672 682 pk_error("failed to create sysfs attribute octave: error %d\n", ··· 696 706 697 707 fail_register: 698 708 stop_sustain_timers(pm); 699 - device_remove_file(&pm->pk->hdev->dev, sysfs_device_attr_octave); 709 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_octave); 700 710 fail_attr_octave: 701 - device_remove_file(&pm->pk->hdev->dev, sysfs_device_attr_sustain); 711 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_sustain); 702 712 fail_attr_sustain: 703 - device_remove_file(&pm->pk->hdev->dev, sysfs_device_attr_channel); 713 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_channel); 704 714 fail: 705 715 if (pm->card) { 706 716 snd_card_free(pm->card); ··· 714 724 if (pm->card) { 715 725 stop_sustain_timers(pm); 716 726 717 - device_remove_file(&pm->pk->hdev->dev, 718 - sysfs_device_attr_channel); 719 - device_remove_file(&pm->pk->hdev->dev, 720 - sysfs_device_attr_sustain); 721 - device_remove_file(&pm->pk->hdev->dev, 722 - sysfs_device_attr_octave); 727 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_channel); 728 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_sustain); 729 + device_remove_file(&pm->hdev->dev, sysfs_device_attr_octave); 723 730 724 731 snd_card_disconnect(pm->card); 725 732 snd_card_free_when_closed(pm->card); ··· 746 759 struct hid_field *field, struct hid_usage *usage, 747 760 unsigned long **bit, int *max) 748 761 { 749 - struct pk_device *pk = hid_get_drvdata(hdev); 750 - struct pcmidi_snd *pm; 751 - 752 - pm = pk->pm; 762 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 753 763 754 764 if (HID_UP_MSVENDOR == (usage->hid & HID_USAGE_PAGE) && 755 765 1 == pm->ifnum) { ··· 761 777 static int pk_raw_event(struct hid_device *hdev, struct hid_report *report, 762 778 u8 *data, int size) 763 779 { 764 - struct pk_device *pk = hid_get_drvdata(hdev); 780 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 765 781 int ret = 0; 766 782 767 - if (1 == pk->pm->ifnum) { 783 + if (1 == pm->ifnum) { 768 784 if (report->id == data[0]) 769 785 switch (report->id) { 770 786 case 0x01: /* midi keys (qwerty)*/ 771 787 case 0x03: /* midi keyboard (musical)*/ 772 788 case 0x04: /* extra/midi keys (qwerty)*/ 773 - ret = pcmidi_handle_report(pk->pm, 789 + ret = pcmidi_handle_report(pm, 774 790 report->id, data, size); 775 791 break; 776 792 } ··· 785 801 struct usb_interface *intf; 786 802 unsigned short ifnum; 787 803 unsigned long quirks = id->driver_data; 788 - struct pk_device *pk; 789 - struct pcmidi_snd *pm = NULL; 804 + struct pcmidi_snd *pm; 790 805 791 806 if (!hid_is_usb(hdev)) 792 807 return -EINVAL; ··· 793 810 intf = to_usb_interface(hdev->dev.parent); 794 811 ifnum = intf->cur_altsetting->desc.bInterfaceNumber; 795 812 796 - pk = kzalloc(sizeof(*pk), GFP_KERNEL); 797 - if (pk == NULL) { 813 + pm = kzalloc(sizeof(*pm), GFP_KERNEL); 814 + if (pm == NULL) { 798 815 hid_err(hdev, "can't alloc descriptor\n"); 799 816 return -ENOMEM; 800 817 } 801 818 802 - pk->hdev = hdev; 803 - 804 - pm = kzalloc(sizeof(*pm), GFP_KERNEL); 805 - if (pm == NULL) { 806 - hid_err(hdev, "can't alloc descriptor\n"); 807 - ret = -ENOMEM; 808 - goto err_free_pk; 809 - } 810 - 811 - pm->pk = pk; 812 - pk->pm = pm; 819 + pm->hdev = hdev; 813 820 pm->ifnum = ifnum; 814 821 815 - hid_set_drvdata(hdev, pk); 822 + hid_set_drvdata(hdev, pm); 816 823 817 824 ret = hid_parse(hdev); 818 825 if (ret) { ··· 829 856 hid_hw_stop(hdev); 830 857 err_free: 831 858 kfree(pm); 832 - err_free_pk: 833 - kfree(pk); 834 859 835 860 return ret; 836 861 } 837 862 838 863 static void pk_remove(struct hid_device *hdev) 839 864 { 840 - struct pk_device *pk = hid_get_drvdata(hdev); 841 - struct pcmidi_snd *pm; 865 + struct pcmidi_snd *pm = hid_get_drvdata(hdev); 842 866 843 - pm = pk->pm; 844 - if (pm) { 845 - pcmidi_snd_terminate(pm); 846 - kfree(pm); 847 - } 848 - 867 + pcmidi_snd_terminate(pm); 849 868 hid_hw_stop(hdev); 850 869 851 - kfree(pk); 870 + kfree(pm); 852 871 } 853 872 854 873 static const struct hid_device_id pk_devices[] = {
+401 -36
drivers/hid/hid-samsung.c
··· 58 58 static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, 59 59 unsigned int *rsize) 60 60 { 61 - if (*rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 && 62 - rdesc[177] == 0x75 && rdesc[178] == 0x30 && 63 - rdesc[179] == 0x95 && rdesc[180] == 0x01 && 61 + if (*rsize == 184 && !memcmp(&rdesc[175], "\x25\x40\x75\x30\x95\x01", 6) && 64 62 rdesc[182] == 0x40) { 65 63 samsung_irda_dev_trace(hdev, 184); 66 64 rdesc[176] = 0xff; 67 65 rdesc[178] = 0x08; 68 66 rdesc[180] = 0x06; 69 67 rdesc[182] = 0x42; 70 - } else 71 - if (*rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 && 72 - rdesc[194] == 0x25 && rdesc[195] == 0x12) { 68 + } else if (*rsize == 203 && !memcmp(&rdesc[192], "\x15\x00\x25\x12", 4)) { 73 69 samsung_irda_dev_trace(hdev, 203); 74 - rdesc[193] = 0x1; 75 - rdesc[195] = 0xf; 76 - } else 77 - if (*rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 && 78 - rdesc[126] == 0x25 && rdesc[127] == 0x11) { 70 + rdesc[193] = 0x01; 71 + rdesc[195] = 0x0f; 72 + } else if (*rsize == 135 && !memcmp(&rdesc[124], "\x15\x00\x25\x11", 4)) { 79 73 samsung_irda_dev_trace(hdev, 135); 80 - rdesc[125] = 0x1; 81 - rdesc[127] = 0xe; 82 - } else 83 - if (*rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 && 84 - rdesc[162] == 0x25 && rdesc[163] == 0x01) { 74 + rdesc[125] = 0x01; 75 + rdesc[127] = 0x0e; 76 + } else if (*rsize == 171 && !memcmp(&rdesc[160], "\x15\x00\x25\x01", 4)) { 85 77 samsung_irda_dev_trace(hdev, 171); 86 - rdesc[161] = 0x1; 87 - rdesc[163] = 0x3; 78 + rdesc[161] = 0x01; 79 + rdesc[163] = 0x03; 88 80 } 89 81 return rdesc; 90 82 } ··· 91 99 struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 92 100 unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; 93 101 94 - if (1 != ifnum || HID_UP_CONSUMER != (usage->hid & HID_USAGE_PAGE)) 102 + if (ifnum != 1 || HID_UP_CONSUMER != (usage->hid & HID_USAGE_PAGE)) 95 103 return 0; 96 104 97 105 dbg_hid("samsung wireless keyboard/mouse input mapping event [0x%x]\n", ··· 99 107 100 108 switch (usage->hid & HID_USAGE) { 101 109 /* report 2 */ 102 - case 0x183: samsung_kbd_mouse_map_key_clear(KEY_MEDIA); break; 103 - case 0x195: samsung_kbd_mouse_map_key_clear(KEY_EMAIL); break; 104 - case 0x196: samsung_kbd_mouse_map_key_clear(KEY_CALC); break; 105 - case 0x197: samsung_kbd_mouse_map_key_clear(KEY_COMPUTER); break; 106 - case 0x22b: samsung_kbd_mouse_map_key_clear(KEY_SEARCH); break; 107 - case 0x22c: samsung_kbd_mouse_map_key_clear(KEY_WWW); break; 108 - case 0x22d: samsung_kbd_mouse_map_key_clear(KEY_BACK); break; 109 - case 0x22e: samsung_kbd_mouse_map_key_clear(KEY_FORWARD); break; 110 - case 0x22f: samsung_kbd_mouse_map_key_clear(KEY_FAVORITES); break; 111 - case 0x230: samsung_kbd_mouse_map_key_clear(KEY_REFRESH); break; 112 - case 0x231: samsung_kbd_mouse_map_key_clear(KEY_STOP); break; 110 + case 0x183: 111 + samsung_kbd_mouse_map_key_clear(KEY_MEDIA); 112 + break; 113 + case 0x195: 114 + samsung_kbd_mouse_map_key_clear(KEY_EMAIL); 115 + break; 116 + case 0x196: 117 + samsung_kbd_mouse_map_key_clear(KEY_CALC); 118 + break; 119 + case 0x197: 120 + samsung_kbd_mouse_map_key_clear(KEY_COMPUTER); 121 + break; 122 + case 0x22b: 123 + samsung_kbd_mouse_map_key_clear(KEY_SEARCH); 124 + break; 125 + case 0x22c: 126 + samsung_kbd_mouse_map_key_clear(KEY_WWW); 127 + break; 128 + case 0x22d: 129 + samsung_kbd_mouse_map_key_clear(KEY_BACK); 130 + break; 131 + case 0x22e: 132 + samsung_kbd_mouse_map_key_clear(KEY_FORWARD); 133 + break; 134 + case 0x22f: 135 + samsung_kbd_mouse_map_key_clear(KEY_FAVORITES); 136 + break; 137 + case 0x230: 138 + samsung_kbd_mouse_map_key_clear(KEY_REFRESH); 139 + break; 140 + case 0x231: 141 + samsung_kbd_mouse_map_key_clear(KEY_STOP); 142 + break; 113 143 default: 114 144 return 0; 145 + } 146 + 147 + return 1; 148 + } 149 + 150 + static int samsung_kbd_input_mapping(struct hid_device *hdev, 151 + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, 152 + unsigned long **bit, int *max) 153 + { 154 + if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) || 155 + HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE))) 156 + return 0; 157 + 158 + dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", 159 + usage->hid & HID_USAGE); 160 + 161 + if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) { 162 + set_bit(EV_REP, hi->input->evbit); 163 + switch (usage->hid & HID_USAGE) { 164 + case 0x32: 165 + samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH); 166 + break; 167 + case 0x64: 168 + samsung_kbd_mouse_map_key_clear(KEY_102ND); 169 + break; 170 + /* Only for BR keyboard */ 171 + case 0x87: 172 + samsung_kbd_mouse_map_key_clear(KEY_RO); 173 + break; 174 + default: 175 + return 0; 176 + } 177 + } 178 + 179 + if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { 180 + switch (usage->hid & HID_USAGE) { 181 + /* report 2 */ 182 + /* MENU */ 183 + case 0x040: 184 + samsung_kbd_mouse_map_key_clear(KEY_MENU); 185 + break; 186 + case 0x18a: 187 + samsung_kbd_mouse_map_key_clear(KEY_MAIL); 188 + break; 189 + case 0x196: 190 + samsung_kbd_mouse_map_key_clear(KEY_WWW); 191 + break; 192 + case 0x19e: 193 + samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK); 194 + break; 195 + case 0x221: 196 + samsung_kbd_mouse_map_key_clear(KEY_SEARCH); 197 + break; 198 + case 0x223: 199 + samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); 200 + break; 201 + /* Smtart Voice Key */ 202 + case 0x300: 203 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY13); 204 + break; 205 + /* RECENTAPPS */ 206 + case 0x301: 207 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1); 208 + break; 209 + /* APPLICATION */ 210 + case 0x302: 211 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2); 212 + break; 213 + /* Voice search */ 214 + case 0x305: 215 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4); 216 + break; 217 + /* QPANEL on/off */ 218 + case 0x306: 219 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5); 220 + break; 221 + /* SIP on/off */ 222 + case 0x307: 223 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3); 224 + break; 225 + /* LANG */ 226 + case 0x308: 227 + samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE); 228 + break; 229 + case 0x30a: 230 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); 231 + break; 232 + case 0x30b: 233 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); 234 + break; 235 + default: 236 + return 0; 237 + } 238 + } 239 + 240 + return 1; 241 + } 242 + 243 + static int samsung_gamepad_input_mapping(struct hid_device *hdev, 244 + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, 245 + unsigned long **bit, int *max) 246 + { 247 + if (!(HID_UP_BUTTON == (usage->hid & HID_USAGE_PAGE) || 248 + HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE))) 249 + return 0; 250 + 251 + dbg_hid("samsung wireless gamepad input mapping event [0x%x], %ld, %ld, [0x%x]\n", 252 + usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0], usage->hid & HID_USAGE_PAGE); 253 + 254 + if (HID_UP_BUTTON == (usage->hid & HID_USAGE_PAGE)) { 255 + switch (usage->hid & HID_USAGE) { 256 + case 0x01: 257 + samsung_kbd_mouse_map_key_clear(BTN_A); 258 + break; 259 + case 0x02: 260 + samsung_kbd_mouse_map_key_clear(BTN_B); 261 + break; 262 + case 0x03: 263 + samsung_kbd_mouse_map_key_clear(BTN_C); 264 + break; 265 + case 0x04: 266 + samsung_kbd_mouse_map_key_clear(BTN_X); 267 + break; 268 + case 0x05: 269 + samsung_kbd_mouse_map_key_clear(BTN_Y); 270 + break; 271 + case 0x06: 272 + samsung_kbd_mouse_map_key_clear(BTN_Z); 273 + break; 274 + case 0x07: 275 + samsung_kbd_mouse_map_key_clear(BTN_TL); 276 + break; 277 + case 0x08: 278 + samsung_kbd_mouse_map_key_clear(BTN_TR); 279 + break; 280 + case 0x09: 281 + samsung_kbd_mouse_map_key_clear(BTN_TL2); 282 + break; 283 + case 0x0a: 284 + samsung_kbd_mouse_map_key_clear(BTN_TR2); 285 + break; 286 + case 0x0b: 287 + samsung_kbd_mouse_map_key_clear(BTN_SELECT); 288 + break; 289 + case 0x0c: 290 + samsung_kbd_mouse_map_key_clear(BTN_START); 291 + break; 292 + case 0x0d: 293 + samsung_kbd_mouse_map_key_clear(BTN_MODE); 294 + break; 295 + case 0x0e: 296 + samsung_kbd_mouse_map_key_clear(BTN_THUMBL); 297 + break; 298 + case 0x0f: 299 + samsung_kbd_mouse_map_key_clear(BTN_THUMBR); 300 + break; 301 + case 0x10: 302 + samsung_kbd_mouse_map_key_clear(0x13f); 303 + break; 304 + default: 305 + return 0; 306 + } 307 + } 308 + 309 + if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { 310 + switch (usage->hid & HID_USAGE) { 311 + case 0x040: 312 + samsung_kbd_mouse_map_key_clear(KEY_MENU); 313 + break; 314 + case 0x223: 315 + samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); 316 + break; 317 + case 0x224: 318 + samsung_kbd_mouse_map_key_clear(KEY_BACK); 319 + break; 320 + 321 + /* Screen Capture */ 322 + case 0x303: 323 + samsung_kbd_mouse_map_key_clear(KEY_SYSRQ); 324 + break; 325 + 326 + default: 327 + return 0; 328 + } 329 + } 330 + 331 + return 1; 332 + } 333 + 334 + static int samsung_actionmouse_input_mapping(struct hid_device *hdev, 335 + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, 336 + unsigned long **bit, int *max) 337 + { 338 + 339 + dbg_hid("samsung wireless actionmouse input mapping event [0x%x], [0x%x], %ld, %ld, [0x%x]\n", 340 + usage->hid, usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0], 341 + usage->hid & HID_USAGE_PAGE); 342 + 343 + if (((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER) && ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)) 344 + return 0; 345 + 346 + switch (usage->hid & HID_USAGE) { 347 + case 0x301: 348 + samsung_kbd_mouse_map_key_clear(254); 349 + break; 350 + default: 351 + return 0; 352 + } 353 + 354 + return 1; 355 + } 356 + 357 + static int samsung_universal_kbd_input_mapping(struct hid_device *hdev, 358 + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, 359 + unsigned long **bit, int *max) 360 + { 361 + if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) || 362 + HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE))) 363 + return 0; 364 + 365 + dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", 366 + usage->hid & HID_USAGE); 367 + 368 + if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) { 369 + set_bit(EV_REP, hi->input->evbit); 370 + switch (usage->hid & HID_USAGE) { 371 + case 0x32: 372 + samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH); 373 + break; 374 + case 0x64: 375 + samsung_kbd_mouse_map_key_clear(KEY_102ND); 376 + break; 377 + /* Only for BR keyboard */ 378 + case 0x87: 379 + samsung_kbd_mouse_map_key_clear(KEY_RO); 380 + break; 381 + default: 382 + return 0; 383 + } 384 + } 385 + 386 + if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { 387 + switch (usage->hid & HID_USAGE) { 388 + /* report 2 */ 389 + /* MENU */ 390 + case 0x040: 391 + samsung_kbd_mouse_map_key_clear(KEY_MENU); 392 + break; 393 + case 0x18a: 394 + samsung_kbd_mouse_map_key_clear(KEY_MAIL); 395 + break; 396 + case 0x196: 397 + samsung_kbd_mouse_map_key_clear(KEY_WWW); 398 + break; 399 + case 0x19e: 400 + samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK); 401 + break; 402 + case 0x221: 403 + samsung_kbd_mouse_map_key_clear(KEY_SEARCH); 404 + break; 405 + case 0x223: 406 + samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); 407 + break; 408 + /* RECENTAPPS */ 409 + case 0x301: 410 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1); 411 + break; 412 + /* APPLICATION */ 413 + case 0x302: 414 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2); 415 + break; 416 + /* Voice search */ 417 + case 0x305: 418 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4); 419 + break; 420 + /* QPANEL on/off */ 421 + case 0x306: 422 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5); 423 + break; 424 + /* SIP on/off */ 425 + case 0x307: 426 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3); 427 + break; 428 + /* LANG */ 429 + case 0x308: 430 + samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE); 431 + break; 432 + case 0x30a: 433 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); 434 + break; 435 + case 0x070: 436 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); 437 + break; 438 + case 0x30b: 439 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); 440 + break; 441 + case 0x06f: 442 + samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); 443 + break; 444 + /* S-Finder */ 445 + case 0x304: 446 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY7); 447 + break; 448 + /* Screen Capture */ 449 + case 0x303: 450 + samsung_kbd_mouse_map_key_clear(KEY_SYSRQ); 451 + break; 452 + /* Multi Window */ 453 + case 0x309: 454 + samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY9); 455 + break; 456 + /* HotKey App 1 */ 457 + case 0x071: 458 + samsung_kbd_mouse_map_key_clear(0x2f5); 459 + break; 460 + /* HotKey App 2 */ 461 + case 0x072: 462 + samsung_kbd_mouse_map_key_clear(0x2f6); 463 + break; 464 + /* HotKey App 3 */ 465 + case 0x073: 466 + samsung_kbd_mouse_map_key_clear(0x2f7); 467 + break; 468 + /* Dex */ 469 + case 0x06e: 470 + samsung_kbd_mouse_map_key_clear(0x2bd); 471 + break; 472 + default: 473 + return 0; 474 + } 115 475 } 116 476 117 477 return 1; ··· 472 128 static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc, 473 129 unsigned int *rsize) 474 130 { 475 - if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) 131 + if (hdev->product == USB_DEVICE_ID_SAMSUNG_IR_REMOTE && hid_is_usb(hdev)) 476 132 rdesc = samsung_irda_report_fixup(hdev, rdesc, rsize); 477 133 return rdesc; 478 134 } ··· 483 139 { 484 140 int ret = 0; 485 141 486 - if (USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE == hdev->product) 142 + if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE && hid_is_usb(hdev)) 487 143 ret = samsung_kbd_mouse_input_mapping(hdev, 144 + hi, field, usage, bit, max); 145 + else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) 146 + ret = samsung_kbd_input_mapping(hdev, 147 + hi, field, usage, bit, max); 148 + else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) 149 + ret = samsung_gamepad_input_mapping(hdev, 150 + hi, field, usage, bit, max); 151 + else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) 152 + ret = samsung_actionmouse_input_mapping(hdev, 153 + hi, field, usage, bit, max); 154 + else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) 155 + ret = samsung_universal_kbd_input_mapping(hdev, 156 + hi, field, usage, bit, max); 157 + else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD) 158 + ret = samsung_universal_kbd_input_mapping(hdev, 488 159 hi, field, usage, bit, max); 489 160 490 161 return ret; ··· 511 152 int ret; 512 153 unsigned int cmask = HID_CONNECT_DEFAULT; 513 154 514 - if (!hid_is_usb(hdev)) 515 - return -EINVAL; 516 - 517 155 ret = hid_parse(hdev); 518 156 if (ret) { 519 157 hid_err(hdev, "parse failed\n"); 520 158 goto err_free; 521 159 } 522 160 523 - if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) { 161 + if (hdev->product == USB_DEVICE_ID_SAMSUNG_IR_REMOTE) { 162 + if (!hid_is_usb(hdev)) { 163 + ret = -EINVAL; 164 + goto err_free; 165 + } 524 166 if (hdev->rsize == 184) { 525 167 /* disable hidinput, force hiddev */ 526 168 cmask = (cmask & ~HID_CONNECT_HIDINPUT) | ··· 543 183 static const struct hid_device_id samsung_devices[] = { 544 184 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, 545 185 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, 186 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) }, 187 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) }, 188 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) }, 189 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) }, 190 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD) }, 546 191 { } 547 192 }; 548 193 MODULE_DEVICE_TABLE(hid, samsung_devices);
+1
drivers/hid/intel-ish-hid/ipc/hw-ish.h
··· 34 34 #define RPL_S_DEVICE_ID 0x7A78 35 35 #define MTL_P_DEVICE_ID 0x7E45 36 36 #define ARL_H_DEVICE_ID 0x7745 37 + #define ARL_S_DEVICE_ID 0x7F78 37 38 38 39 #define REVISION_ID_CHT_A0 0x6 39 40 #define REVISION_ID_CHT_Ax_SI 0x0
+1
drivers/hid/intel-ish-hid/ipc/pci-ish.c
··· 45 45 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, RPL_S_DEVICE_ID)}, 46 46 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MTL_P_DEVICE_ID)}, 47 47 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ARL_H_DEVICE_ID)}, 48 + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ARL_S_DEVICE_ID)}, 48 49 {0, } 49 50 }; 50 51 MODULE_DEVICE_TABLE(pci, ish_pci_tbl);
+4 -4
drivers/hid/wacom_wac.c
··· 2990 2990 2991 2991 wacom_wac_battery_pre_report(hdev, report); 2992 2992 2993 - if (pad_in_hid_field && wacom->wacom_wac.pad_input) 2993 + if (pad_in_hid_field && wacom_wac->pad_input) 2994 2994 wacom_wac_pad_pre_report(hdev, report); 2995 - if (pen_in_hid_field && wacom->wacom_wac.pen_input) 2995 + if (pen_in_hid_field && wacom_wac->pen_input) 2996 2996 wacom_wac_pen_pre_report(hdev, report); 2997 - if (finger_in_hid_field && wacom->wacom_wac.touch_input) 2997 + if (finger_in_hid_field && wacom_wac->touch_input) 2998 2998 wacom_wac_finger_pre_report(hdev, report); 2999 2999 3000 3000 for (r = 0; r < report->maxfield; r++) { ··· 3010 3010 3011 3011 wacom_wac_battery_report(hdev, report); 3012 3012 3013 - if (true_pad && wacom->wacom_wac.pad_input) 3013 + if (true_pad && wacom_wac->pad_input) 3014 3014 wacom_wac_pad_report(hdev, report, field); 3015 3015 } 3016 3016
-1
drivers/hid/wacom_wac.h
··· 309 309 bool confidence; 310 310 int x; 311 311 int y; 312 - int pressure; 313 312 int width; 314 313 int height; 315 314 int id;
+2 -2
include/linux/hid.h
··· 683 683 684 684 unsigned int id; /* system unique id */ 685 685 686 - #ifdef CONFIG_BPF 686 + #ifdef CONFIG_HID_BPF 687 687 struct hid_bpf bpf; /* hid-bpf data */ 688 - #endif /* CONFIG_BPF */ 688 + #endif /* CONFIG_HID_BPF */ 689 689 }; 690 690 691 691 void hiddev_free(struct kref *ref);