diff options
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/Kconfig | 2 | ||||
-rw-r--r-- | drivers/hid/hid-apple.c | 74 | ||||
-rw-r--r-- | drivers/hid/hid-core.c | 55 | ||||
-rw-r--r-- | drivers/hid/hid-dell.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-gyration.c | 4 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 14 | ||||
-rw-r--r-- | drivers/hid/hid-lg.c | 5 | ||||
-rw-r--r-- | drivers/hid/hid-sony.c | 44 | ||||
-rw-r--r-- | drivers/hid/hidraw.c | 33 | ||||
-rw-r--r-- | drivers/hid/usbhid/hid-core.c | 86 | ||||
-rw-r--r-- | drivers/hid/usbhid/hiddev.c | 5 | ||||
-rw-r--r-- | drivers/hid/usbhid/usbhid.h | 2 |
12 files changed, 225 insertions, 100 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index f5999a91614e..b4fd8ca701a4 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
@@ -247,7 +247,6 @@ config HID_SUNPLUS | |||
247 | 247 | ||
248 | config THRUSTMASTER_FF | 248 | config THRUSTMASTER_FF |
249 | tristate "ThrustMaster devices support" | 249 | tristate "ThrustMaster devices support" |
250 | default m | ||
251 | depends on USB_HID | 250 | depends on USB_HID |
252 | select INPUT_FF_MEMLESS | 251 | select INPUT_FF_MEMLESS |
253 | help | 252 | help |
@@ -256,7 +255,6 @@ config THRUSTMASTER_FF | |||
256 | 255 | ||
257 | config ZEROPLUS_FF | 256 | config ZEROPLUS_FF |
258 | tristate "Zeroplus based game controller support" | 257 | tristate "Zeroplus based game controller support" |
259 | default m | ||
260 | depends on USB_HID | 258 | depends on USB_HID |
261 | select INPUT_FF_MEMLESS | 259 | select INPUT_FF_MEMLESS |
262 | help | 260 | help |
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index fd7f896b34f7..9b97795e45ad 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -55,10 +55,11 @@ struct apple_key_translation { | |||
55 | 55 | ||
56 | static struct apple_key_translation apple_fn_keys[] = { | 56 | static struct apple_key_translation apple_fn_keys[] = { |
57 | { KEY_BACKSPACE, KEY_DELETE }, | 57 | { KEY_BACKSPACE, KEY_DELETE }, |
58 | { KEY_ENTER, KEY_INSERT }, | ||
58 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | 59 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, |
59 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | 60 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, |
60 | { KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */ | 61 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, |
61 | { KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */ | 62 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, |
62 | { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, | 63 | { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, |
63 | { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, | 64 | { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, |
64 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | 65 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, |
@@ -312,13 +313,6 @@ static int apple_probe(struct hid_device *hdev, | |||
312 | unsigned int connect_mask = HID_CONNECT_DEFAULT; | 313 | unsigned int connect_mask = HID_CONNECT_DEFAULT; |
313 | int ret; | 314 | int ret; |
314 | 315 | ||
315 | /* return something else or move to hid layer? device will reside | ||
316 | allocated */ | ||
317 | if (id->bus == BUS_USB && (quirks & APPLE_IGNORE_MOUSE) && | ||
318 | to_usb_interface(hdev->dev.parent)->cur_altsetting-> | ||
319 | desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE) | ||
320 | return -ENODEV; | ||
321 | |||
322 | asc = kzalloc(sizeof(*asc), GFP_KERNEL); | 316 | asc = kzalloc(sizeof(*asc), GFP_KERNEL); |
323 | if (asc == NULL) { | 317 | if (asc == NULL) { |
324 | dev_err(&hdev->dev, "can't alloc apple descriptor\n"); | 318 | dev_err(&hdev->dev, "can't alloc apple descriptor\n"); |
@@ -367,38 +361,32 @@ static const struct hid_device_id apple_devices[] = { | |||
367 | .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, | 361 | .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, |
368 | 362 | ||
369 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI), | 363 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI), |
370 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 364 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
371 | APPLE_IGNORE_MOUSE }, | ||
372 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO), | 365 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO), |
373 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 366 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
374 | APPLE_IGNORE_MOUSE }, | ||
375 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI), | 367 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI), |
376 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 368 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
377 | APPLE_IGNORE_MOUSE }, | ||
378 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO), | 369 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO), |
379 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 370 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
380 | APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD }, | 371 | APPLE_ISO_KEYBOARD }, |
381 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS), | 372 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS), |
382 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 373 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
383 | APPLE_IGNORE_MOUSE }, | ||
384 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI), | 374 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI), |
385 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 375 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
386 | APPLE_IGNORE_MOUSE }, | ||
387 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO), | 376 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO), |
388 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 377 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
389 | APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD }, | 378 | APPLE_ISO_KEYBOARD }, |
390 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS), | 379 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS), |
391 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 380 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
392 | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS }, | 381 | APPLE_RDESC_JIS }, |
393 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI), | 382 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI), |
394 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 383 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
395 | APPLE_IGNORE_MOUSE }, | ||
396 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO), | 384 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO), |
397 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 385 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
398 | APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD }, | 386 | APPLE_ISO_KEYBOARD }, |
399 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS), | 387 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS), |
400 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 388 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
401 | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS}, | 389 | APPLE_RDESC_JIS }, |
402 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI), | 390 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI), |
403 | .driver_data = APPLE_HAS_FN }, | 391 | .driver_data = APPLE_HAS_FN }, |
404 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO), | 392 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO), |
@@ -406,14 +394,12 @@ static const struct hid_device_id apple_devices[] = { | |||
406 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS), | 394 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS), |
407 | .driver_data = APPLE_HAS_FN }, | 395 | .driver_data = APPLE_HAS_FN }, |
408 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI), | 396 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI), |
409 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 397 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
410 | APPLE_IGNORE_MOUSE }, | ||
411 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO), | 398 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO), |
412 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 399 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
413 | APPLE_IGNORE_MOUSE }, | ||
414 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), | 400 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), |
415 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 401 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
416 | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS }, | 402 | APPLE_RDESC_JIS }, |
417 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), | 403 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
418 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 404 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
419 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), | 405 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), |
@@ -422,25 +408,27 @@ static const struct hid_device_id apple_devices[] = { | |||
422 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), | 408 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), |
423 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 409 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
424 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | 410 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), |
425 | .driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE }, | 411 | .driver_data = APPLE_HAS_FN }, |
426 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO), | 412 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO), |
427 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD | | 413 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, |
428 | APPLE_IGNORE_MOUSE }, | ||
429 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS), | 414 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS), |
430 | .driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS }, | 415 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, |
431 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), | 416 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), |
432 | .driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE }, | 417 | .driver_data = APPLE_HAS_FN }, |
433 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), | 418 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), |
434 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD | | 419 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, |
435 | APPLE_IGNORE_MOUSE }, | ||
436 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), | 420 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), |
437 | .driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS }, | 421 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, |
422 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), | ||
423 | .driver_data = APPLE_HAS_FN }, | ||
424 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), | ||
425 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
426 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), | ||
427 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
438 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), | 428 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), |
439 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 429 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
440 | APPLE_IGNORE_MOUSE }, | ||
441 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), | 430 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), |
442 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 431 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
443 | APPLE_IGNORE_MOUSE }, | ||
444 | 432 | ||
445 | /* Apple wireless Mighty Mouse */ | 433 | /* Apple wireless Mighty Mouse */ |
446 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c), | 434 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c), |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 721a36d97582..147ec591a806 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1250,9 +1250,11 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1250 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | 1250 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, |
1251 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | 1251 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, |
1252 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | 1252 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, |
1253 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | ||
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | ||
1255 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | ||
1253 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 1256 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1257 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
1255 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, | ||
1256 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1258 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
1257 | { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) }, | 1259 | { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) }, |
1258 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1260 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
@@ -1263,7 +1265,9 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1263 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, | 1265 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, |
1264 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | ||
1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
1270 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | ||
1267 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1271 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
1268 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | 1272 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
1269 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, | 1273 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, |
@@ -1275,8 +1279,6 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1275 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD) }, | 1279 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD) }, |
1276 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) }, | 1280 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) }, |
1277 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) }, | 1281 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) }, |
1278 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_LX3) }, | ||
1279 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150) }, | ||
1280 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, | 1282 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, |
1281 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, | 1283 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, |
1282 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, | 1284 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, |
@@ -1295,6 +1297,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1295 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, | 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, |
1296 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, | 1298 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, |
1297 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 1299 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
1300 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, | ||
1298 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, | 1301 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, |
1299 | 1302 | ||
1300 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) }, | 1303 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) }, |
@@ -1406,6 +1409,8 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1406 | { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) }, | 1409 | { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) }, |
1407 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, | 1410 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, |
1408 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)}, | 1411 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)}, |
1412 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM2)}, | ||
1413 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, | ||
1409 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, | 1414 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, |
1410 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, | 1415 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, |
1411 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, | 1416 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, |
@@ -1483,6 +1488,7 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1483 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, | 1488 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, |
1484 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, | 1489 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, |
1485 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, | 1490 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, |
1491 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, | ||
1486 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, | 1492 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, |
1487 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, | 1493 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, |
1488 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, | 1494 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, |
@@ -1541,6 +1547,43 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1541 | { } | 1547 | { } |
1542 | }; | 1548 | }; |
1543 | 1549 | ||
1550 | /** | ||
1551 | * hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer | ||
1552 | * | ||
1553 | * There are composite devices for which we want to ignore only a certain | ||
1554 | * interface. This is a list of devices for which only the mouse interface will | ||
1555 | * be ignored. This allows a dedicated driver to take care of the interface. | ||
1556 | */ | ||
1557 | static const struct hid_device_id hid_mouse_ignore_list[] = { | ||
1558 | /* appletouch driver */ | ||
1559 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) }, | ||
1560 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) }, | ||
1561 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) }, | ||
1562 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) }, | ||
1563 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) }, | ||
1564 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) }, | ||
1565 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) }, | ||
1566 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) }, | ||
1567 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) }, | ||
1568 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) }, | ||
1569 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) }, | ||
1570 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, | ||
1571 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, | ||
1572 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, | ||
1573 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, | ||
1574 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, | ||
1575 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, | ||
1576 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | ||
1577 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | ||
1578 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | ||
1579 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | ||
1580 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | ||
1581 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | ||
1582 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | ||
1583 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | ||
1584 | { } | ||
1585 | }; | ||
1586 | |||
1544 | static bool hid_ignore(struct hid_device *hdev) | 1587 | static bool hid_ignore(struct hid_device *hdev) |
1545 | { | 1588 | { |
1546 | switch (hdev->vendor) { | 1589 | switch (hdev->vendor) { |
@@ -1557,6 +1600,10 @@ static bool hid_ignore(struct hid_device *hdev) | |||
1557 | break; | 1600 | break; |
1558 | } | 1601 | } |
1559 | 1602 | ||
1603 | if (hdev->type == HID_TYPE_USBMOUSE && | ||
1604 | hid_match_id(hdev, hid_mouse_ignore_list)) | ||
1605 | return true; | ||
1606 | |||
1560 | return !!hid_match_id(hdev, hid_ignore_list); | 1607 | return !!hid_match_id(hdev, hid_ignore_list); |
1561 | } | 1608 | } |
1562 | 1609 | ||
@@ -1689,7 +1736,7 @@ static int __init hid_init(void) | |||
1689 | goto err_bus; | 1736 | goto err_bus; |
1690 | 1737 | ||
1691 | #ifdef CONFIG_HID_COMPAT | 1738 | #ifdef CONFIG_HID_COMPAT |
1692 | hid_compat_wq = create_workqueue("hid_compat"); | 1739 | hid_compat_wq = create_singlethread_workqueue("hid_compat"); |
1693 | if (!hid_compat_wq) { | 1740 | if (!hid_compat_wq) { |
1694 | hidraw_exit(); | 1741 | hidraw_exit(); |
1695 | goto err; | 1742 | goto err; |
diff --git a/drivers/hid/hid-dell.c b/drivers/hid/hid-dell.c index 1a0d0dfc62fc..f5474300b83a 100644 --- a/drivers/hid/hid-dell.c +++ b/drivers/hid/hid-dell.c | |||
@@ -48,6 +48,7 @@ err_free: | |||
48 | static const struct hid_device_id dell_devices[] = { | 48 | static const struct hid_device_id dell_devices[] = { |
49 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, | 49 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, |
50 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 50 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
51 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | ||
51 | { } | 52 | { } |
52 | }; | 53 | }; |
53 | MODULE_DEVICE_TABLE(hid, dell_devices); | 54 | MODULE_DEVICE_TABLE(hid, dell_devices); |
diff --git a/drivers/hid/hid-gyration.c b/drivers/hid/hid-gyration.c index ac5120f542cc..04a0afec52ac 100644 --- a/drivers/hid/hid-gyration.c +++ b/drivers/hid/hid-gyration.c | |||
@@ -4,9 +4,9 @@ | |||
4 | * Copyright (c) 1999 Andreas Gal | 4 | * Copyright (c) 1999 Andreas Gal |
5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | 5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> |
6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | 6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc |
7 | * Copyright (c) 2006-2007 Jiri Kosina | ||
8 | * Copyright (c) 2007 Paul Walmsley | 7 | * Copyright (c) 2007 Paul Walmsley |
9 | * Copyright (c) 2008 Jiri Slaby | 8 | * Copyright (c) 2008 Jiri Slaby |
9 | * Copyright (c) 2006-2008 Jiri Kosina | ||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* | 12 | /* |
@@ -40,6 +40,7 @@ static int gyration_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
40 | case 0x025: gy_map_key_clear(KEY_PVR); break; | 40 | case 0x025: gy_map_key_clear(KEY_PVR); break; |
41 | case 0x046: gy_map_key_clear(KEY_MEDIA); break; | 41 | case 0x046: gy_map_key_clear(KEY_MEDIA); break; |
42 | case 0x047: gy_map_key_clear(KEY_MP3); break; | 42 | case 0x047: gy_map_key_clear(KEY_MP3); break; |
43 | case 0x048: gy_map_key_clear(KEY_MEDIA); break; | ||
43 | case 0x049: gy_map_key_clear(KEY_CAMERA); break; | 44 | case 0x049: gy_map_key_clear(KEY_CAMERA); break; |
44 | case 0x04a: gy_map_key_clear(KEY_VIDEO); break; | 45 | case 0x04a: gy_map_key_clear(KEY_VIDEO); break; |
45 | 46 | ||
@@ -68,6 +69,7 @@ static int gyration_event(struct hid_device *hdev, struct hid_field *field, | |||
68 | 69 | ||
69 | static const struct hid_device_id gyration_devices[] = { | 70 | static const struct hid_device_id gyration_devices[] = { |
70 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 71 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
72 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | ||
71 | { } | 73 | { } |
72 | }; | 74 | }; |
73 | MODULE_DEVICE_TABLE(hid, gyration_devices); | 75 | MODULE_DEVICE_TABLE(hid, gyration_devices); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index d9a1ba920c23..d70075dd3d81 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -82,6 +82,9 @@ | |||
82 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 | 82 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 |
83 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 | 83 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 |
84 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 | 84 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 |
85 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 | ||
86 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 | ||
87 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 | ||
85 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | 88 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
86 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | 89 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
87 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 | 90 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 |
@@ -89,6 +92,7 @@ | |||
89 | 92 | ||
90 | #define USB_VENDOR_ID_ASUS 0x0b05 | 93 | #define USB_VENDOR_ID_ASUS 0x0b05 |
91 | #define USB_DEVICE_ID_ASUS_LCM 0x1726 | 94 | #define USB_DEVICE_ID_ASUS_LCM 0x1726 |
95 | #define USB_DEVICE_ID_ASUS_LCM2 0x175b | ||
92 | 96 | ||
93 | #define USB_VENDOR_ID_ATEN 0x0557 | 97 | #define USB_VENDOR_ID_ATEN 0x0557 |
94 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 | 98 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 |
@@ -162,6 +166,9 @@ | |||
162 | 166 | ||
163 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc | 167 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc |
164 | 168 | ||
169 | #define USB_VENDOR_ID_GENERIC_13BA 0x13ba | ||
170 | #define USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE 0x0017 | ||
171 | |||
165 | #define USB_VENDOR_ID_GLAB 0x06c2 | 172 | #define USB_VENDOR_ID_GLAB 0x06c2 |
166 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 | 173 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 |
167 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 | 174 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 |
@@ -236,6 +243,7 @@ | |||
236 | 243 | ||
237 | #define USB_VENDOR_ID_GYRATION 0x0c16 | 244 | #define USB_VENDOR_ID_GYRATION 0x0c16 |
238 | #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002 | 245 | #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002 |
246 | #define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003 | ||
239 | 247 | ||
240 | #define USB_VENDOR_ID_HAPP 0x078b | 248 | #define USB_VENDOR_ID_HAPP 0x078b |
241 | #define USB_DEVICE_ID_UGCI_DRIVING 0x0010 | 249 | #define USB_DEVICE_ID_UGCI_DRIVING 0x0010 |
@@ -248,6 +256,9 @@ | |||
248 | #define USB_VENDOR_ID_KBGEAR 0x084e | 256 | #define USB_VENDOR_ID_KBGEAR 0x084e |
249 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 | 257 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 |
250 | 258 | ||
259 | #define USB_VENDOR_ID_KWORLD 0x1b80 | ||
260 | #define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700 | ||
261 | |||
251 | #define USB_VENDOR_ID_LABTEC 0x1020 | 262 | #define USB_VENDOR_ID_LABTEC 0x1020 |
252 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 | 263 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 |
253 | 264 | ||
@@ -268,8 +279,6 @@ | |||
268 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 | 279 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 |
269 | 280 | ||
270 | #define USB_VENDOR_ID_LOGITECH 0x046d | 281 | #define USB_VENDOR_ID_LOGITECH 0x046d |
271 | #define USB_DEVICE_ID_LOGITECH_LX3 0xc044 | ||
272 | #define USB_DEVICE_ID_LOGITECH_V150 0xc047 | ||
273 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 | 282 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 |
274 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 | 283 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 |
275 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f | 284 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f |
@@ -350,6 +359,7 @@ | |||
350 | #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 | 359 | #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 |
351 | 360 | ||
352 | #define USB_VENDOR_ID_SONY 0x054c | 361 | #define USB_VENDOR_ID_SONY 0x054c |
362 | #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b | ||
353 | #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 | 363 | #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 |
354 | 364 | ||
355 | #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2 | 365 | #define USB_VENDOR_ID_SOUNDGRAPH 0x15c2 |
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c index 406d8c82abf1..2bae340eafe2 100644 --- a/drivers/hid/hid-lg.c +++ b/drivers/hid/hid-lg.c | |||
@@ -287,11 +287,6 @@ static const struct hid_device_id lg_devices[] = { | |||
287 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500), | 287 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500), |
288 | .driver_data = LG_IGNORE_DOUBLED_WHEEL | LG_EXPANDED_KEYMAP }, | 288 | .driver_data = LG_IGNORE_DOUBLED_WHEEL | LG_EXPANDED_KEYMAP }, |
289 | 289 | ||
290 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_LX3), | ||
291 | .driver_data = LG_INVERT_HWHEEL }, | ||
292 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150), | ||
293 | .driver_data = LG_INVERT_HWHEEL }, | ||
294 | |||
295 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D), | 290 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D), |
296 | .driver_data = LG_NOGET }, | 291 | .driver_data = LG_NOGET }, |
297 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL), | 292 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL), |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 3af8095a7de1..86e563b8d644 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
@@ -4,9 +4,9 @@ | |||
4 | * Copyright (c) 1999 Andreas Gal | 4 | * Copyright (c) 1999 Andreas Gal |
5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | 5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> |
6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | 6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc |
7 | * Copyright (c) 2006-2007 Jiri Kosina | ||
8 | * Copyright (c) 2007 Paul Walmsley | 7 | * Copyright (c) 2007 Paul Walmsley |
9 | * Copyright (c) 2008 Jiri Slaby | 8 | * Copyright (c) 2008 Jiri Slaby |
9 | * Copyright (c) 2006-2008 Jiri Kosina | ||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* | 12 | /* |
@@ -23,6 +23,26 @@ | |||
23 | 23 | ||
24 | #include "hid-ids.h" | 24 | #include "hid-ids.h" |
25 | 25 | ||
26 | #define VAIO_RDESC_CONSTANT 0x0001 | ||
27 | |||
28 | struct sony_sc { | ||
29 | unsigned long quirks; | ||
30 | }; | ||
31 | |||
32 | /* Sony Vaio VGX has wrongly mouse pointer declared as constant */ | ||
33 | static void sony_report_fixup(struct hid_device *hdev, __u8 *rdesc, | ||
34 | unsigned int rsize) | ||
35 | { | ||
36 | struct sony_sc *sc = hid_get_drvdata(hdev); | ||
37 | |||
38 | if ((sc->quirks & VAIO_RDESC_CONSTANT) && | ||
39 | rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) { | ||
40 | dev_info(&hdev->dev, "Fixing up Sony Vaio VGX report " | ||
41 | "descriptor\n"); | ||
42 | rdesc[55] = 0x06; | ||
43 | } | ||
44 | } | ||
45 | |||
26 | /* | 46 | /* |
27 | * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller | 47 | * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller |
28 | * to "operational". Without this, the ps3 controller will not report any | 48 | * to "operational". Without this, the ps3 controller will not report any |
@@ -56,6 +76,17 @@ static int sony_set_operational(struct hid_device *hdev) | |||
56 | static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | 76 | static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) |
57 | { | 77 | { |
58 | int ret; | 78 | int ret; |
79 | unsigned long quirks = id->driver_data; | ||
80 | struct sony_sc *sc; | ||
81 | |||
82 | sc = kzalloc(sizeof(*sc), GFP_KERNEL); | ||
83 | if (sc == NULL) { | ||
84 | dev_err(&hdev->dev, "can't alloc apple descriptor\n"); | ||
85 | return -ENOMEM; | ||
86 | } | ||
87 | |||
88 | sc->quirks = quirks; | ||
89 | hid_set_drvdata(hdev, sc); | ||
59 | 90 | ||
60 | ret = hid_parse(hdev); | 91 | ret = hid_parse(hdev); |
61 | if (ret) { | 92 | if (ret) { |
@@ -78,11 +109,20 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
78 | err_stop: | 109 | err_stop: |
79 | hid_hw_stop(hdev); | 110 | hid_hw_stop(hdev); |
80 | err_free: | 111 | err_free: |
112 | kfree(sc); | ||
81 | return ret; | 113 | return ret; |
82 | } | 114 | } |
83 | 115 | ||
116 | static void sony_remove(struct hid_device *hdev) | ||
117 | { | ||
118 | hid_hw_stop(hdev); | ||
119 | kfree(hid_get_drvdata(hdev)); | ||
120 | } | ||
121 | |||
84 | static const struct hid_device_id sony_devices[] = { | 122 | static const struct hid_device_id sony_devices[] = { |
85 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 123 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
124 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE), | ||
125 | .driver_data = VAIO_RDESC_CONSTANT }, | ||
86 | { } | 126 | { } |
87 | }; | 127 | }; |
88 | MODULE_DEVICE_TABLE(hid, sony_devices); | 128 | MODULE_DEVICE_TABLE(hid, sony_devices); |
@@ -91,6 +131,8 @@ static struct hid_driver sony_driver = { | |||
91 | .name = "sony", | 131 | .name = "sony", |
92 | .id_table = sony_devices, | 132 | .id_table = sony_devices, |
93 | .probe = sony_probe, | 133 | .probe = sony_probe, |
134 | .remove = sony_remove, | ||
135 | .report_fixup = sony_report_fixup, | ||
94 | }; | 136 | }; |
95 | 137 | ||
96 | static int sony_init(void) | 138 | static int sony_init(void) |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index af3edb98df43..7685ae6808c4 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -38,7 +38,7 @@ static int hidraw_major; | |||
38 | static struct cdev hidraw_cdev; | 38 | static struct cdev hidraw_cdev; |
39 | static struct class *hidraw_class; | 39 | static struct class *hidraw_class; |
40 | static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; | 40 | static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; |
41 | static DEFINE_SPINLOCK(minors_lock); | 41 | static DEFINE_MUTEX(minors_lock); |
42 | 42 | ||
43 | static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) | 43 | static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
44 | { | 44 | { |
@@ -159,13 +159,13 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
159 | struct hidraw_list *list; | 159 | struct hidraw_list *list; |
160 | int err = 0; | 160 | int err = 0; |
161 | 161 | ||
162 | lock_kernel(); | ||
163 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { | 162 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { |
164 | err = -ENOMEM; | 163 | err = -ENOMEM; |
165 | goto out; | 164 | goto out; |
166 | } | 165 | } |
167 | 166 | ||
168 | spin_lock(&minors_lock); | 167 | lock_kernel(); |
168 | mutex_lock(&minors_lock); | ||
169 | if (!hidraw_table[minor]) { | 169 | if (!hidraw_table[minor]) { |
170 | printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n", | 170 | printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n", |
171 | minor); | 171 | minor); |
@@ -180,13 +180,16 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
180 | file->private_data = list; | 180 | file->private_data = list; |
181 | 181 | ||
182 | dev = hidraw_table[minor]; | 182 | dev = hidraw_table[minor]; |
183 | if (!dev->open++) | 183 | if (!dev->open++) { |
184 | dev->hid->ll_driver->open(dev->hid); | 184 | err = dev->hid->ll_driver->open(dev->hid); |
185 | if (err < 0) | ||
186 | dev->open--; | ||
187 | } | ||
185 | 188 | ||
186 | out_unlock: | 189 | out_unlock: |
187 | spin_unlock(&minors_lock); | 190 | mutex_unlock(&minors_lock); |
188 | out: | ||
189 | unlock_kernel(); | 191 | unlock_kernel(); |
192 | out: | ||
190 | return err; | 193 | return err; |
191 | 194 | ||
192 | } | 195 | } |
@@ -264,6 +267,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
264 | default: | 267 | default: |
265 | ret = -ENOTTY; | 268 | ret = -ENOTTY; |
266 | } | 269 | } |
270 | unlock_kernel(); | ||
267 | return ret; | 271 | return ret; |
268 | } | 272 | } |
269 | 273 | ||
@@ -309,7 +313,7 @@ int hidraw_connect(struct hid_device *hid) | |||
309 | 313 | ||
310 | result = -EINVAL; | 314 | result = -EINVAL; |
311 | 315 | ||
312 | spin_lock(&minors_lock); | 316 | mutex_lock(&minors_lock); |
313 | 317 | ||
314 | for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) { | 318 | for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) { |
315 | if (hidraw_table[minor]) | 319 | if (hidraw_table[minor]) |
@@ -319,9 +323,8 @@ int hidraw_connect(struct hid_device *hid) | |||
319 | break; | 323 | break; |
320 | } | 324 | } |
321 | 325 | ||
322 | spin_unlock(&minors_lock); | ||
323 | |||
324 | if (result) { | 326 | if (result) { |
327 | mutex_unlock(&minors_lock); | ||
325 | kfree(dev); | 328 | kfree(dev); |
326 | goto out; | 329 | goto out; |
327 | } | 330 | } |
@@ -330,14 +333,14 @@ int hidraw_connect(struct hid_device *hid) | |||
330 | NULL, "%s%d", "hidraw", minor); | 333 | NULL, "%s%d", "hidraw", minor); |
331 | 334 | ||
332 | if (IS_ERR(dev->dev)) { | 335 | if (IS_ERR(dev->dev)) { |
333 | spin_lock(&minors_lock); | ||
334 | hidraw_table[minor] = NULL; | 336 | hidraw_table[minor] = NULL; |
335 | spin_unlock(&minors_lock); | 337 | mutex_unlock(&minors_lock); |
336 | result = PTR_ERR(dev->dev); | 338 | result = PTR_ERR(dev->dev); |
337 | kfree(dev); | 339 | kfree(dev); |
338 | goto out; | 340 | goto out; |
339 | } | 341 | } |
340 | 342 | ||
343 | mutex_unlock(&minors_lock); | ||
341 | init_waitqueue_head(&dev->wait); | 344 | init_waitqueue_head(&dev->wait); |
342 | INIT_LIST_HEAD(&dev->list); | 345 | INIT_LIST_HEAD(&dev->list); |
343 | 346 | ||
@@ -359,9 +362,9 @@ void hidraw_disconnect(struct hid_device *hid) | |||
359 | 362 | ||
360 | hidraw->exist = 0; | 363 | hidraw->exist = 0; |
361 | 364 | ||
362 | spin_lock(&minors_lock); | 365 | mutex_lock(&minors_lock); |
363 | hidraw_table[hidraw->minor] = NULL; | 366 | hidraw_table[hidraw->minor] = NULL; |
364 | spin_unlock(&minors_lock); | 367 | mutex_unlock(&minors_lock); |
365 | 368 | ||
366 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | 369 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); |
367 | 370 | ||
@@ -403,7 +406,7 @@ out: | |||
403 | return result; | 406 | return result; |
404 | } | 407 | } |
405 | 408 | ||
406 | void __exit hidraw_exit(void) | 409 | void hidraw_exit(void) |
407 | { | 410 | { |
408 | dev_t dev_id = MKDEV(hidraw_major, 0); | 411 | dev_t dev_id = MKDEV(hidraw_major, 0); |
409 | 412 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 705a43cdeea4..d746bf8284dd 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
23 | #include <linux/mutex.h> | ||
23 | #include <linux/smp_lock.h> | 24 | #include <linux/smp_lock.h> |
24 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
25 | #include <asm/unaligned.h> | 26 | #include <asm/unaligned.h> |
@@ -776,20 +777,11 @@ static int usbhid_start(struct hid_device *hid) | |||
776 | struct usb_interface *intf = to_usb_interface(hid->dev.parent); | 777 | struct usb_interface *intf = to_usb_interface(hid->dev.parent); |
777 | struct usb_host_interface *interface = intf->cur_altsetting; | 778 | struct usb_host_interface *interface = intf->cur_altsetting; |
778 | struct usb_device *dev = interface_to_usbdev(intf); | 779 | struct usb_device *dev = interface_to_usbdev(intf); |
779 | struct usbhid_device *usbhid; | 780 | struct usbhid_device *usbhid = hid->driver_data; |
780 | unsigned int n, insize = 0; | 781 | unsigned int n, insize = 0; |
781 | int ret; | 782 | int ret; |
782 | 783 | ||
783 | WARN_ON(hid->driver_data); | 784 | clear_bit(HID_DISCONNECTED, &usbhid->iofl); |
784 | |||
785 | usbhid = kzalloc(sizeof(struct usbhid_device), GFP_KERNEL); | ||
786 | if (usbhid == NULL) { | ||
787 | ret = -ENOMEM; | ||
788 | goto err; | ||
789 | } | ||
790 | |||
791 | hid->driver_data = usbhid; | ||
792 | usbhid->hid = hid; | ||
793 | 785 | ||
794 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; | 786 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; |
795 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); | 787 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); |
@@ -804,6 +796,7 @@ static int usbhid_start(struct hid_device *hid) | |||
804 | if (insize > HID_MAX_BUFFER_SIZE) | 796 | if (insize > HID_MAX_BUFFER_SIZE) |
805 | insize = HID_MAX_BUFFER_SIZE; | 797 | insize = HID_MAX_BUFFER_SIZE; |
806 | 798 | ||
799 | mutex_lock(&usbhid->setup); | ||
807 | if (hid_alloc_buffers(dev, hid)) { | 800 | if (hid_alloc_buffers(dev, hid)) { |
808 | ret = -ENOMEM; | 801 | ret = -ENOMEM; |
809 | goto fail; | 802 | goto fail; |
@@ -856,12 +849,6 @@ static int usbhid_start(struct hid_device *hid) | |||
856 | } | 849 | } |
857 | } | 850 | } |
858 | 851 | ||
859 | if (!usbhid->urbin) { | ||
860 | err_hid("couldn't find an input interrupt endpoint"); | ||
861 | ret = -ENODEV; | ||
862 | goto fail; | ||
863 | } | ||
864 | |||
865 | init_waitqueue_head(&usbhid->wait); | 852 | init_waitqueue_head(&usbhid->wait); |
866 | INIT_WORK(&usbhid->reset_work, hid_reset); | 853 | INIT_WORK(&usbhid->reset_work, hid_reset); |
867 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | 854 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); |
@@ -888,15 +875,20 @@ static int usbhid_start(struct hid_device *hid) | |||
888 | usbhid_init_reports(hid); | 875 | usbhid_init_reports(hid); |
889 | hid_dump_device(hid); | 876 | hid_dump_device(hid); |
890 | 877 | ||
878 | set_bit(HID_STARTED, &usbhid->iofl); | ||
879 | mutex_unlock(&usbhid->setup); | ||
880 | |||
891 | return 0; | 881 | return 0; |
892 | 882 | ||
893 | fail: | 883 | fail: |
894 | usb_free_urb(usbhid->urbin); | 884 | usb_free_urb(usbhid->urbin); |
895 | usb_free_urb(usbhid->urbout); | 885 | usb_free_urb(usbhid->urbout); |
896 | usb_free_urb(usbhid->urbctrl); | 886 | usb_free_urb(usbhid->urbctrl); |
887 | usbhid->urbin = NULL; | ||
888 | usbhid->urbout = NULL; | ||
889 | usbhid->urbctrl = NULL; | ||
897 | hid_free_buffers(dev, hid); | 890 | hid_free_buffers(dev, hid); |
898 | kfree(usbhid); | 891 | mutex_unlock(&usbhid->setup); |
899 | err: | ||
900 | return ret; | 892 | return ret; |
901 | } | 893 | } |
902 | 894 | ||
@@ -907,6 +899,8 @@ static void usbhid_stop(struct hid_device *hid) | |||
907 | if (WARN_ON(!usbhid)) | 899 | if (WARN_ON(!usbhid)) |
908 | return; | 900 | return; |
909 | 901 | ||
902 | mutex_lock(&usbhid->setup); | ||
903 | clear_bit(HID_STARTED, &usbhid->iofl); | ||
910 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 904 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
911 | set_bit(HID_DISCONNECTED, &usbhid->iofl); | 905 | set_bit(HID_DISCONNECTED, &usbhid->iofl); |
912 | spin_unlock_irq(&usbhid->inlock); | 906 | spin_unlock_irq(&usbhid->inlock); |
@@ -929,10 +923,12 @@ static void usbhid_stop(struct hid_device *hid) | |||
929 | usb_free_urb(usbhid->urbin); | 923 | usb_free_urb(usbhid->urbin); |
930 | usb_free_urb(usbhid->urbctrl); | 924 | usb_free_urb(usbhid->urbctrl); |
931 | usb_free_urb(usbhid->urbout); | 925 | usb_free_urb(usbhid->urbout); |
926 | usbhid->urbin = NULL; /* don't mess up next start */ | ||
927 | usbhid->urbctrl = NULL; | ||
928 | usbhid->urbout = NULL; | ||
932 | 929 | ||
933 | hid_free_buffers(hid_to_usb_dev(hid), hid); | 930 | hid_free_buffers(hid_to_usb_dev(hid), hid); |
934 | kfree(usbhid); | 931 | mutex_unlock(&usbhid->setup); |
935 | hid->driver_data = NULL; | ||
936 | } | 932 | } |
937 | 933 | ||
938 | static struct hid_ll_driver usb_hid_driver = { | 934 | static struct hid_ll_driver usb_hid_driver = { |
@@ -946,14 +942,26 @@ static struct hid_ll_driver usb_hid_driver = { | |||
946 | 942 | ||
947 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | 943 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) |
948 | { | 944 | { |
945 | struct usb_host_interface *interface = intf->cur_altsetting; | ||
949 | struct usb_device *dev = interface_to_usbdev(intf); | 946 | struct usb_device *dev = interface_to_usbdev(intf); |
947 | struct usbhid_device *usbhid; | ||
950 | struct hid_device *hid; | 948 | struct hid_device *hid; |
949 | unsigned int n, has_in = 0; | ||
951 | size_t len; | 950 | size_t len; |
952 | int ret; | 951 | int ret; |
953 | 952 | ||
954 | dbg_hid("HID probe called for ifnum %d\n", | 953 | dbg_hid("HID probe called for ifnum %d\n", |
955 | intf->altsetting->desc.bInterfaceNumber); | 954 | intf->altsetting->desc.bInterfaceNumber); |
956 | 955 | ||
956 | for (n = 0; n < interface->desc.bNumEndpoints; n++) | ||
957 | if (usb_endpoint_is_int_in(&interface->endpoint[n].desc)) | ||
958 | has_in++; | ||
959 | if (!has_in) { | ||
960 | dev_err(&intf->dev, "couldn't find an input interrupt " | ||
961 | "endpoint\n"); | ||
962 | return -ENODEV; | ||
963 | } | ||
964 | |||
957 | hid = hid_allocate_device(); | 965 | hid = hid_allocate_device(); |
958 | if (IS_ERR(hid)) | 966 | if (IS_ERR(hid)) |
959 | return PTR_ERR(hid); | 967 | return PTR_ERR(hid); |
@@ -972,6 +980,9 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
972 | hid->vendor = le16_to_cpu(dev->descriptor.idVendor); | 980 | hid->vendor = le16_to_cpu(dev->descriptor.idVendor); |
973 | hid->product = le16_to_cpu(dev->descriptor.idProduct); | 981 | hid->product = le16_to_cpu(dev->descriptor.idProduct); |
974 | hid->name[0] = 0; | 982 | hid->name[0] = 0; |
983 | if (intf->cur_altsetting->desc.bInterfaceProtocol == | ||
984 | USB_INTERFACE_PROTOCOL_MOUSE) | ||
985 | hid->type = HID_TYPE_USBMOUSE; | ||
975 | 986 | ||
976 | if (dev->manufacturer) | 987 | if (dev->manufacturer) |
977 | strlcpy(hid->name, dev->manufacturer, sizeof(hid->name)); | 988 | strlcpy(hid->name, dev->manufacturer, sizeof(hid->name)); |
@@ -997,14 +1008,26 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
997 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) | 1008 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) |
998 | hid->uniq[0] = 0; | 1009 | hid->uniq[0] = 0; |
999 | 1010 | ||
1011 | usbhid = kzalloc(sizeof(*usbhid), GFP_KERNEL); | ||
1012 | if (usbhid == NULL) { | ||
1013 | ret = -ENOMEM; | ||
1014 | goto err; | ||
1015 | } | ||
1016 | |||
1017 | hid->driver_data = usbhid; | ||
1018 | usbhid->hid = hid; | ||
1019 | mutex_init(&usbhid->setup); /* needed on suspend/resume */ | ||
1020 | |||
1000 | ret = hid_add_device(hid); | 1021 | ret = hid_add_device(hid); |
1001 | if (ret) { | 1022 | if (ret) { |
1002 | if (ret != -ENODEV) | 1023 | if (ret != -ENODEV) |
1003 | dev_err(&intf->dev, "can't add hid device: %d\n", ret); | 1024 | dev_err(&intf->dev, "can't add hid device: %d\n", ret); |
1004 | goto err; | 1025 | goto err_free; |
1005 | } | 1026 | } |
1006 | 1027 | ||
1007 | return 0; | 1028 | return 0; |
1029 | err_free: | ||
1030 | kfree(usbhid); | ||
1008 | err: | 1031 | err: |
1009 | hid_destroy_device(hid); | 1032 | hid_destroy_device(hid); |
1010 | return ret; | 1033 | return ret; |
@@ -1013,11 +1036,14 @@ err: | |||
1013 | static void hid_disconnect(struct usb_interface *intf) | 1036 | static void hid_disconnect(struct usb_interface *intf) |
1014 | { | 1037 | { |
1015 | struct hid_device *hid = usb_get_intfdata(intf); | 1038 | struct hid_device *hid = usb_get_intfdata(intf); |
1039 | struct usbhid_device *usbhid; | ||
1016 | 1040 | ||
1017 | if (WARN_ON(!hid)) | 1041 | if (WARN_ON(!hid)) |
1018 | return; | 1042 | return; |
1019 | 1043 | ||
1044 | usbhid = hid->driver_data; | ||
1020 | hid_destroy_device(hid); | 1045 | hid_destroy_device(hid); |
1046 | kfree(usbhid); | ||
1021 | } | 1047 | } |
1022 | 1048 | ||
1023 | static int hid_suspend(struct usb_interface *intf, pm_message_t message) | 1049 | static int hid_suspend(struct usb_interface *intf, pm_message_t message) |
@@ -1025,11 +1051,18 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | |||
1025 | struct hid_device *hid = usb_get_intfdata (intf); | 1051 | struct hid_device *hid = usb_get_intfdata (intf); |
1026 | struct usbhid_device *usbhid = hid->driver_data; | 1052 | struct usbhid_device *usbhid = hid->driver_data; |
1027 | 1053 | ||
1054 | mutex_lock(&usbhid->setup); | ||
1055 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1056 | mutex_unlock(&usbhid->setup); | ||
1057 | return 0; | ||
1058 | } | ||
1059 | |||
1028 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 1060 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
1029 | set_bit(HID_SUSPENDED, &usbhid->iofl); | 1061 | set_bit(HID_SUSPENDED, &usbhid->iofl); |
1030 | spin_unlock_irq(&usbhid->inlock); | 1062 | spin_unlock_irq(&usbhid->inlock); |
1031 | del_timer(&usbhid->io_retry); | 1063 | del_timer_sync(&usbhid->io_retry); |
1032 | usb_kill_urb(usbhid->urbin); | 1064 | usb_kill_urb(usbhid->urbin); |
1065 | mutex_unlock(&usbhid->setup); | ||
1033 | dev_dbg(&intf->dev, "suspend\n"); | 1066 | dev_dbg(&intf->dev, "suspend\n"); |
1034 | return 0; | 1067 | return 0; |
1035 | } | 1068 | } |
@@ -1040,9 +1073,16 @@ static int hid_resume(struct usb_interface *intf) | |||
1040 | struct usbhid_device *usbhid = hid->driver_data; | 1073 | struct usbhid_device *usbhid = hid->driver_data; |
1041 | int status; | 1074 | int status; |
1042 | 1075 | ||
1076 | mutex_lock(&usbhid->setup); | ||
1077 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1078 | mutex_unlock(&usbhid->setup); | ||
1079 | return 0; | ||
1080 | } | ||
1081 | |||
1043 | clear_bit(HID_SUSPENDED, &usbhid->iofl); | 1082 | clear_bit(HID_SUSPENDED, &usbhid->iofl); |
1044 | usbhid->retry_delay = 0; | 1083 | usbhid->retry_delay = 0; |
1045 | status = hid_start_in(hid); | 1084 | status = hid_start_in(hid); |
1085 | mutex_unlock(&usbhid->setup); | ||
1046 | dev_dbg(&intf->dev, "resume status %d\n", status); | 1086 | dev_dbg(&intf->dev, "resume status %d\n", status); |
1047 | return status; | 1087 | return status; |
1048 | } | 1088 | } |
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index babd65dd46ad..83e851a5ed30 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
@@ -242,8 +242,6 @@ static int hiddev_release(struct inode * inode, struct file * file) | |||
242 | struct hiddev_list *list = file->private_data; | 242 | struct hiddev_list *list = file->private_data; |
243 | unsigned long flags; | 243 | unsigned long flags; |
244 | 244 | ||
245 | hiddev_fasync(-1, file, 0); | ||
246 | |||
247 | spin_lock_irqsave(&list->hiddev->list_lock, flags); | 245 | spin_lock_irqsave(&list->hiddev->list_lock, flags); |
248 | list_del(&list->node); | 246 | list_del(&list->node); |
249 | spin_unlock_irqrestore(&list->hiddev->list_lock, flags); | 247 | spin_unlock_irqrestore(&list->hiddev->list_lock, flags); |
@@ -436,8 +434,7 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, | |||
436 | if (copy_to_user(user_arg, uref, sizeof(*uref))) | 434 | if (copy_to_user(user_arg, uref, sizeof(*uref))) |
437 | goto fault; | 435 | goto fault; |
438 | 436 | ||
439 | kfree(uref_multi); | 437 | goto goodreturn; |
440 | return 0; | ||
441 | 438 | ||
442 | default: | 439 | default: |
443 | if (cmd != HIDIOCGUSAGE && | 440 | if (cmd != HIDIOCGUSAGE && |
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index abedb13c623e..55973ff54008 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/list.h> | 29 | #include <linux/list.h> |
30 | #include <linux/mutex.h> | ||
30 | #include <linux/timer.h> | 31 | #include <linux/timer.h> |
31 | #include <linux/wait.h> | 32 | #include <linux/wait.h> |
32 | #include <linux/workqueue.h> | 33 | #include <linux/workqueue.h> |
@@ -73,6 +74,7 @@ struct usbhid_device { | |||
73 | dma_addr_t outbuf_dma; /* Output buffer dma */ | 74 | dma_addr_t outbuf_dma; /* Output buffer dma */ |
74 | spinlock_t outlock; /* Output fifo spinlock */ | 75 | spinlock_t outlock; /* Output fifo spinlock */ |
75 | 76 | ||
77 | struct mutex setup; | ||
76 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ | 78 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ |
77 | struct timer_list io_retry; /* Retry timer */ | 79 | struct timer_list io_retry; /* Retry timer */ |
78 | unsigned long stop_retry; /* Time to give up, in jiffies */ | 80 | unsigned long stop_retry; /* Time to give up, in jiffies */ |