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