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

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

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
HID: add multi-input quirk for NextWindow Touchscreen.
HID: add support for Acan FG-8100 barcode reader
HID: make Media key on Logitech DiNovo Mini work
HID: support Logitech/3DConnexion SpaceTraveler and SpaceNavigator
HID: remove BKL from hiddev_ioctl_usage()
HID: fixup quirk for NCR devices
HID: pidff - fix unnecessary loop iterations on reset
HID: add NOGET quirk for another device from CH Products
HID: remove useless DRIVER_VERSION macro
HID: fix MODULE_AUTHOR usage in HID modules
HID: blacklist Acer Ferrari 4005 optical mouse

+61 -17
+7 -2
drivers/hid/hid-core.c
··· 39 39 * Version Information 40 40 */ 41 41 42 - #define DRIVER_VERSION "v2.6" 43 - #define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina" 44 42 #define DRIVER_DESC "HID core driver" 45 43 #define DRIVER_LICENSE "GPL" 46 44 ··· 1292 1294 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, 1293 1295 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, 1294 1296 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, 1297 + { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) }, 1295 1298 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) }, 1296 1299 { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) }, 1297 1300 { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, ··· 1325 1326 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) }, 1326 1327 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) }, 1327 1328 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) }, 1329 + { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, 1330 + { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, 1328 1331 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, 1329 1332 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, 1330 1333 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) }, ··· 1621 1620 { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, 1622 1621 { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, 1623 1622 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, 1623 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) }, 1624 1624 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, 1625 1625 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, 1626 1626 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, ··· 1920 1918 module_init(hid_init); 1921 1919 module_exit(hid_exit); 1922 1920 1921 + MODULE_AUTHOR("Andreas Gal"); 1922 + MODULE_AUTHOR("Vojtech Pavlik"); 1923 + MODULE_AUTHOR("Jiri Kosina"); 1923 1924 MODULE_LICENSE(DRIVER_LICENSE); 1924 1925
+2
drivers/hid/hid-cypress.c
··· 126 126 .driver_data = CP_RDESC_SWAPPED_MIN_MAX }, 127 127 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2), 128 128 .driver_data = CP_RDESC_SWAPPED_MIN_MAX }, 129 + { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3), 130 + .driver_data = CP_RDESC_SWAPPED_MIN_MAX }, 129 131 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE), 130 132 .driver_data = CP_2WHEEL_MOUSE_HACK }, 131 133 { }
+7
drivers/hid/hid-ids.h
··· 117 117 #define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2 118 118 #define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4 119 119 #define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff 120 + #define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3 120 121 121 122 #define USB_VENDOR_ID_CHERRY 0x046a 122 123 #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 ··· 146 145 #define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417 147 146 #define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61 148 147 #define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64 148 + #define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1 149 149 150 150 #define USB_VENDOR_ID_DEALEXTREAME 0x10c5 151 151 #define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a ··· 306 304 #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 307 305 #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 308 306 #define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 307 + #define USB_DEVICE_ID_SPACETRAVELLER 0xc623 308 + #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626 309 309 #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 310 310 #define USB_DEVICE_ID_DINOVO_EDGE 0xc714 311 311 #define USB_DEVICE_ID_DINOVO_MINI 0xc71f ··· 349 345 350 346 #define USB_VENDOR_ID_NEC 0x073e 351 347 #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 348 + 349 + #define USB_VENDOR_ID_NEXTWINDOW 0x1926 350 + #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 352 351 353 352 #define USB_VENDOR_ID_NTRIG 0x1b96 354 353 #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001
+33
drivers/hid/hid-lg.c
··· 33 33 #define LG_NOGET 0x100 34 34 #define LG_FF 0x200 35 35 #define LG_FF2 0x400 36 + #define LG_RDESC_REL_ABS 0x800 36 37 37 38 /* 38 39 * Certain Logitech keyboards send in report #3 keys which are far ··· 51 50 "descriptor\n"); 52 51 rdesc[84] = rdesc[89] = 0x4d; 53 52 rdesc[85] = rdesc[90] = 0x10; 53 + } 54 + if ((quirks & LG_RDESC_REL_ABS) && rsize >= 50 && 55 + rdesc[32] == 0x81 && rdesc[33] == 0x06 && 56 + rdesc[49] == 0x81 && rdesc[50] == 0x06) { 57 + dev_info(&hdev->dev, "fixing up rel/abs in Logitech " 58 + "report descriptor\n"); 59 + rdesc[33] = rdesc[50] = 0x02; 54 60 } 55 61 } 56 62 ··· 93 85 94 86 default: 95 87 return 0; 88 + } 89 + return 1; 90 + } 91 + 92 + static int lg_dinovo_mapping(struct hid_input *hi, struct hid_usage *usage, 93 + unsigned long **bit, int *max) 94 + { 95 + if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) 96 + return 0; 97 + 98 + switch (usage->hid & HID_USAGE) { 99 + 100 + case 0x00d: lg_map_key_clear(KEY_MEDIA); break; 101 + default: 102 + return 0; 103 + 96 104 } 97 105 return 1; 98 106 } ··· 186 162 187 163 if (hdev->product == USB_DEVICE_ID_LOGITECH_RECEIVER && 188 164 lg_ultrax_remote_mapping(hi, usage, bit, max)) 165 + return 1; 166 + 167 + if (hdev->product == USB_DEVICE_ID_DINOVO_MINI && 168 + lg_dinovo_mapping(hi, usage, bit, max)) 189 169 return 1; 190 170 191 171 if ((quirks & LG_WIRELESS) && lg_wireless_mapping(hi, usage, bit, max)) ··· 331 303 .driver_data = LG_FF }, 332 304 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), 333 305 .driver_data = LG_FF2 }, 306 + { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR), 307 + .driver_data = LG_RDESC_REL_ABS }, 308 + { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER), 309 + .driver_data = LG_RDESC_REL_ABS }, 334 310 { } 335 311 }; 312 + 336 313 MODULE_DEVICE_TABLE(hid, lg_devices); 337 314 338 315 static struct hid_driver lg_driver = {
+6 -6
drivers/hid/usbhid/hid-core.c
··· 41 41 * Version Information 42 42 */ 43 43 44 - #define DRIVER_VERSION "v2.6" 45 - #define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina" 46 44 #define DRIVER_DESC "USB HID core driver" 47 45 #define DRIVER_LICENSE "GPL" 48 46 ··· 996 998 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma; 997 999 usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); 998 1000 999 - usbhid_init_reports(hid); 1001 + if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS)) 1002 + usbhid_init_reports(hid); 1000 1003 1001 1004 set_bit(HID_STARTED, &usbhid->iofl); 1002 1005 ··· 1394 1395 retval = usb_register(&hid_driver); 1395 1396 if (retval) 1396 1397 goto usb_register_fail; 1397 - printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 1398 - DRIVER_DESC "\n"); 1398 + printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); 1399 1399 1400 1400 return 0; 1401 1401 usb_register_fail: ··· 1421 1423 module_init(hid_init); 1422 1424 module_exit(hid_exit); 1423 1425 1424 - MODULE_AUTHOR(DRIVER_AUTHOR); 1426 + MODULE_AUTHOR("Andreas Gal"); 1427 + MODULE_AUTHOR("Vojtech Pavlik"); 1428 + MODULE_AUTHOR("Jiri Kosina"); 1425 1429 MODULE_DESCRIPTION(DRIVER_DESC); 1426 1430 MODULE_LICENSE(DRIVER_LICENSE);
+2 -3
drivers/hid/usbhid/hid-pidff.c
··· 1181 1181 usbhid_wait_io(hid); 1182 1182 1183 1183 if (pidff->pool[PID_SIMULTANEOUS_MAX].value) { 1184 - int sim_effects = pidff->pool[PID_SIMULTANEOUS_MAX].value[0]; 1185 - while (sim_effects < 2) { 1184 + while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { 1186 1185 if (i++ > 20) { 1187 1186 printk(KERN_WARNING "hid-pidff: device reports " 1188 1187 "%d simultaneous effects\n", 1189 - sim_effects); 1188 + pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); 1190 1189 break; 1191 1190 } 1192 1191 debug("pid_pool requested again");
+3 -1
drivers/hid/usbhid/hid-quirks.c
··· 37 37 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 38 38 { USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD, HID_QUIRK_BADPAD }, 39 39 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD }, 40 + { USB_VENDOR_ID_NEXTWINDOW, USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN, HID_QUIRK_MULTI_INPUT}, 40 41 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 41 42 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 42 43 ··· 54 53 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET }, 55 54 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET }, 56 55 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET }, 56 + { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET }, 57 57 { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, 58 58 { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, 59 59 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, ··· 282 280 if (idVendor == USB_VENDOR_ID_NCR && 283 281 idProduct >= USB_DEVICE_ID_NCR_FIRST && 284 282 idProduct <= USB_DEVICE_ID_NCR_LAST) 285 - return HID_QUIRK_NOGET; 283 + return HID_QUIRK_NO_INIT_REPORTS; 286 284 287 285 down_read(&dquirks_rwsem); 288 286 bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
-5
drivers/hid/usbhid/hiddev.c
··· 450 450 uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL); 451 451 if (!uref_multi) 452 452 return -ENOMEM; 453 - lock_kernel(); 454 453 uref = &uref_multi->uref; 455 454 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) { 456 455 if (copy_from_user(uref_multi, user_arg, ··· 527 528 528 529 case HIDIOCGCOLLECTIONINDEX: 529 530 i = field->usage[uref->usage_index].collection_index; 530 - unlock_kernel(); 531 531 kfree(uref_multi); 532 532 return i; 533 533 case HIDIOCGUSAGES: ··· 545 547 } 546 548 547 549 goodreturn: 548 - unlock_kernel(); 549 550 kfree(uref_multi); 550 551 return 0; 551 552 fault: 552 - unlock_kernel(); 553 553 kfree(uref_multi); 554 554 return -EFAULT; 555 555 inval: 556 - unlock_kernel(); 557 556 kfree(uref_multi); 558 557 return -EINVAL; 559 558 }
+1
include/linux/hid.h
··· 312 312 #define HID_QUIRK_MULTI_INPUT 0x00000040 313 313 #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 314 314 #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 315 + #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 315 316 316 317 /* 317 318 * This is the global environment of the parser. This information is