diff options
Diffstat (limited to 'drivers/hid')
28 files changed, 113 insertions, 74 deletions
diff --git a/drivers/hid/hid-3m-pct.c b/drivers/hid/hid-3m-pct.c index 883fd1af3c4c..2a0d56b7a02b 100644 --- a/drivers/hid/hid-3m-pct.c +++ b/drivers/hid/hid-3m-pct.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/hid.h> | 16 | #include <linux/hid.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/slab.h> | ||
18 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
19 | 20 | ||
20 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); | 21 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); |
diff --git a/drivers/hid/hid-a4tech.c b/drivers/hid/hid-a4tech.c index df474c699fb8..3a2b223c1da4 100644 --- a/drivers/hid/hid-a4tech.c +++ b/drivers/hid/hid-a4tech.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/input.h> | 20 | #include <linux/input.h> |
21 | #include <linux/hid.h> | 21 | #include <linux/hid.h> |
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/slab.h> | ||
23 | 24 | ||
24 | #include "hid-ids.h" | 25 | #include "hid-ids.h" |
25 | 26 | ||
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 78286b184ace..bba05d0a8980 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
20 | #include <linux/hid.h> | 20 | #include <linux/hid.h> |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/slab.h> | ||
22 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
23 | 24 | ||
24 | #include "hid-ids.h" | 25 | #include "hid-ids.h" |
diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c index 7e597d7f770f..24663a8717b1 100644 --- a/drivers/hid/hid-cherry.c +++ b/drivers/hid/hid-cherry.c | |||
@@ -59,6 +59,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
59 | 59 | ||
60 | static const struct hid_device_id ch_devices[] = { | 60 | static const struct hid_device_id ch_devices[] = { |
61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
62 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
62 | { } | 63 | { } |
63 | }; | 64 | }; |
64 | MODULE_DEVICE_TABLE(hid, ch_devices); | 65 | MODULE_DEVICE_TABLE(hid, ch_devices); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index c625c3419a8c..69fdf1e2347b 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1038,13 +1038,8 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | |||
1038 | 1038 | ||
1039 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) | 1039 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) |
1040 | hid->hiddev_report_event(hid, report); | 1040 | hid->hiddev_report_event(hid, report); |
1041 | if (hid->claimed & HID_CLAIMED_HIDRAW) { | 1041 | if (hid->claimed & HID_CLAIMED_HIDRAW) |
1042 | /* numbered reports need to be passed with the report num */ | 1042 | hidraw_report_event(hid, data, size); |
1043 | if (report_enum->numbered) | ||
1044 | hidraw_report_event(hid, data - 1, size + 1); | ||
1045 | else | ||
1046 | hidraw_report_event(hid, data, size); | ||
1047 | } | ||
1048 | 1043 | ||
1049 | for (a = 0; a < report->maxfield; a++) | 1044 | for (a = 0; a < report->maxfield; a++) |
1050 | hid_input_field(hid, report->field[a], cdata, interrupt); | 1045 | hid_input_field(hid, report->field[a], cdata, interrupt); |
@@ -1295,6 +1290,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1295 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1290 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
1296 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, | 1291 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, |
1297 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1292 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
1298 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
1299 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, | 1295 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
1300 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, | 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, |
@@ -1357,6 +1353,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1357 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, | 1353 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, |
1358 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) }, | 1354 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) }, |
1359 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, | 1355 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, |
1356 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) }, | ||
1360 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, | 1357 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, |
1361 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, | 1358 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, |
1362 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, | 1359 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, |
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c index cd4ece6fdfb9..56f314fbd4f9 100644 --- a/drivers/hid/hid-debug.c +++ b/drivers/hid/hid-debug.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/debugfs.h> | 29 | #include <linux/debugfs.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
32 | #include <linux/slab.h> | ||
32 | #include <linux/uaccess.h> | 33 | #include <linux/uaccess.h> |
33 | #include <linux/poll.h> | 34 | #include <linux/poll.h> |
34 | 35 | ||
@@ -564,10 +565,10 @@ void hid_debug_event(struct hid_device *hdev, char *buf) | |||
564 | struct hid_debug_list *list; | 565 | struct hid_debug_list *list; |
565 | 566 | ||
566 | list_for_each_entry(list, &hdev->debug_list, node) { | 567 | list_for_each_entry(list, &hdev->debug_list, node) { |
567 | for (i = 0; i <= strlen(buf); i++) | 568 | for (i = 0; i < strlen(buf); i++) |
568 | list->hid_debug_buf[(list->tail + i) % (HID_DEBUG_BUFSIZE - 1)] = | 569 | list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] = |
569 | buf[i]; | 570 | buf[i]; |
570 | list->tail = (list->tail + i) % (HID_DEBUG_BUFSIZE - 1); | 571 | list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE; |
571 | } | 572 | } |
572 | } | 573 | } |
573 | EXPORT_SYMBOL_GPL(hid_debug_event); | 574 | EXPORT_SYMBOL_GPL(hid_debug_event); |
diff --git a/drivers/hid/hid-drff.c b/drivers/hid/hid-drff.c index a239d20ad7a5..968b04f9b796 100644 --- a/drivers/hid/hid-drff.c +++ b/drivers/hid/hid-drff.c | |||
@@ -28,6 +28,7 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/input.h> | 30 | #include <linux/input.h> |
31 | #include <linux/slab.h> | ||
31 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
32 | #include <linux/hid.h> | 33 | #include <linux/hid.h> |
33 | 34 | ||
diff --git a/drivers/hid/hid-gaff.c b/drivers/hid/hid-gaff.c index 8a11ccddaf2e..88dfcf49a5d7 100644 --- a/drivers/hid/hid-gaff.c +++ b/drivers/hid/hid-gaff.c | |||
@@ -28,6 +28,7 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/input.h> | 30 | #include <linux/input.h> |
31 | #include <linux/slab.h> | ||
31 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
32 | #include <linux/hid.h> | 33 | #include <linux/hid.h> |
33 | #include "hid-ids.h" | 34 | #include "hid-ids.h" |
diff --git a/drivers/hid/hid-gyration.c b/drivers/hid/hid-gyration.c index cab13e8c7d29..62416e6baeca 100644 --- a/drivers/hid/hid-gyration.c +++ b/drivers/hid/hid-gyration.c | |||
@@ -53,10 +53,13 @@ static int gyration_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
53 | static int gyration_event(struct hid_device *hdev, struct hid_field *field, | 53 | static int gyration_event(struct hid_device *hdev, struct hid_field *field, |
54 | struct hid_usage *usage, __s32 value) | 54 | struct hid_usage *usage, __s32 value) |
55 | { | 55 | { |
56 | struct input_dev *input = field->hidinput->input; | 56 | |
57 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput) | ||
58 | return 0; | ||
57 | 59 | ||
58 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK && | 60 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK && |
59 | (usage->hid & 0xff) == 0x82) { | 61 | (usage->hid & 0xff) == 0x82) { |
62 | struct input_dev *input = field->hidinput->input; | ||
60 | input_event(input, usage->type, usage->code, 1); | 63 | input_event(input, usage->type, usage->code, 1); |
61 | input_sync(input); | 64 | input_sync(input); |
62 | input_event(input, usage->type, usage->code, 0); | 65 | input_event(input, usage->type, usage->code, 0); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index ba071b1aba3e..d55b81d2d16e 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -135,6 +135,7 @@ | |||
135 | 135 | ||
136 | #define USB_VENDOR_ID_CHERRY 0x046a | 136 | #define USB_VENDOR_ID_CHERRY 0x046a |
137 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 137 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
138 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 | ||
138 | 139 | ||
139 | #define USB_VENDOR_ID_CHIC 0x05fe | 140 | #define USB_VENDOR_ID_CHIC 0x05fe |
140 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 | 141 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 |
@@ -453,6 +454,7 @@ | |||
453 | 454 | ||
454 | #define USB_VENDOR_ID_UCLOGIC 0x5543 | 455 | #define USB_VENDOR_ID_UCLOGIC 0x5543 |
455 | #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 | 456 | #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 |
457 | #define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003 | ||
456 | 458 | ||
457 | #define USB_VENDOR_ID_VERNIER 0x08f7 | 459 | #define USB_VENDOR_ID_VERNIER 0x08f7 |
458 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 | 460 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 79d9edd0bdfa..7a0d2e4661a1 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -68,22 +68,25 @@ static const struct { | |||
68 | #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \ | 68 | #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \ |
69 | &max, EV_KEY, (c)) | 69 | &max, EV_KEY, (c)) |
70 | 70 | ||
71 | static inline int match_scancode(int code, int scancode) | 71 | static inline int match_scancode(unsigned int code, unsigned int scancode) |
72 | { | 72 | { |
73 | if (scancode == 0) | 73 | if (scancode == 0) |
74 | return 1; | 74 | return 1; |
75 | return ((code & (HID_USAGE_PAGE | HID_USAGE)) == scancode); | 75 | |
76 | return (code & (HID_USAGE_PAGE | HID_USAGE)) == scancode; | ||
76 | } | 77 | } |
77 | 78 | ||
78 | static inline int match_keycode(int code, int keycode) | 79 | static inline int match_keycode(unsigned int code, unsigned int keycode) |
79 | { | 80 | { |
80 | if (keycode == 0) | 81 | if (keycode == 0) |
81 | return 1; | 82 | return 1; |
82 | return (code == keycode); | 83 | |
84 | return code == keycode; | ||
83 | } | 85 | } |
84 | 86 | ||
85 | static struct hid_usage *hidinput_find_key(struct hid_device *hid, | 87 | static struct hid_usage *hidinput_find_key(struct hid_device *hid, |
86 | int scancode, int keycode) | 88 | unsigned int scancode, |
89 | unsigned int keycode) | ||
87 | { | 90 | { |
88 | int i, j, k; | 91 | int i, j, k; |
89 | struct hid_report *report; | 92 | struct hid_report *report; |
@@ -105,8 +108,8 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid, | |||
105 | return NULL; | 108 | return NULL; |
106 | } | 109 | } |
107 | 110 | ||
108 | static int hidinput_getkeycode(struct input_dev *dev, int scancode, | 111 | static int hidinput_getkeycode(struct input_dev *dev, |
109 | int *keycode) | 112 | unsigned int scancode, unsigned int *keycode) |
110 | { | 113 | { |
111 | struct hid_device *hid = input_get_drvdata(dev); | 114 | struct hid_device *hid = input_get_drvdata(dev); |
112 | struct hid_usage *usage; | 115 | struct hid_usage *usage; |
@@ -119,16 +122,13 @@ static int hidinput_getkeycode(struct input_dev *dev, int scancode, | |||
119 | return -EINVAL; | 122 | return -EINVAL; |
120 | } | 123 | } |
121 | 124 | ||
122 | static int hidinput_setkeycode(struct input_dev *dev, int scancode, | 125 | static int hidinput_setkeycode(struct input_dev *dev, |
123 | int keycode) | 126 | unsigned int scancode, unsigned int keycode) |
124 | { | 127 | { |
125 | struct hid_device *hid = input_get_drvdata(dev); | 128 | struct hid_device *hid = input_get_drvdata(dev); |
126 | struct hid_usage *usage; | 129 | struct hid_usage *usage; |
127 | int old_keycode; | 130 | int old_keycode; |
128 | 131 | ||
129 | if (keycode < 0 || keycode > KEY_MAX) | ||
130 | return -EINVAL; | ||
131 | |||
132 | usage = hidinput_find_key(hid, scancode, 0); | 132 | usage = hidinput_find_key(hid, scancode, 0); |
133 | if (usage) { | 133 | if (usage) { |
134 | old_keycode = usage->code; | 134 | old_keycode = usage->code; |
diff --git a/drivers/hid/hid-lg2ff.c b/drivers/hid/hid-lg2ff.c index 4e6dc6e26523..d888f1e6794f 100644 --- a/drivers/hid/hid-lg2ff.c +++ b/drivers/hid/hid-lg2ff.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | 23 | ||
24 | #include <linux/input.h> | 24 | #include <linux/input.h> |
25 | #include <linux/slab.h> | ||
25 | #include <linux/usb.h> | 26 | #include <linux/usb.h> |
26 | #include <linux/hid.h> | 27 | #include <linux/hid.h> |
27 | 28 | ||
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c index 4a3a94f2b10c..0d471fc2ab82 100644 --- a/drivers/hid/hid-magicmouse.c +++ b/drivers/hid/hid-magicmouse.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <linux/hid.h> | 15 | #include <linux/hid.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/slab.h> | ||
17 | #include <linux/usb.h> | 18 | #include <linux/usb.h> |
18 | 19 | ||
19 | #include "hid-ids.h" | 20 | #include "hid-ids.h" |
@@ -353,7 +354,7 @@ static int magicmouse_probe(struct hid_device *hdev, | |||
353 | goto err_free; | 354 | goto err_free; |
354 | } | 355 | } |
355 | 356 | ||
356 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 357 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_HIDINPUT); |
357 | if (ret) { | 358 | if (ret) { |
358 | dev_err(&hdev->dev, "magicmouse hw start failed\n"); | 359 | dev_err(&hdev->dev, "magicmouse hw start failed\n"); |
359 | goto err_free; | 360 | goto err_free; |
@@ -409,8 +410,11 @@ err_free: | |||
409 | 410 | ||
410 | static void magicmouse_remove(struct hid_device *hdev) | 411 | static void magicmouse_remove(struct hid_device *hdev) |
411 | { | 412 | { |
413 | struct magicmouse_sc *msc = hid_get_drvdata(hdev); | ||
414 | |||
412 | hid_hw_stop(hdev); | 415 | hid_hw_stop(hdev); |
413 | kfree(hid_get_drvdata(hdev)); | 416 | input_unregister_device(msc->input); |
417 | kfree(msc); | ||
414 | } | 418 | } |
415 | 419 | ||
416 | static const struct hid_device_id magic_mice[] = { | 420 | static const struct hid_device_id magic_mice[] = { |
diff --git a/drivers/hid/hid-mosart.c b/drivers/hid/hid-mosart.c index c8718168fe42..e91437c18906 100644 --- a/drivers/hid/hid-mosart.c +++ b/drivers/hid/hid-mosart.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/hid.h> | 17 | #include <linux/hid.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/slab.h> | ||
19 | #include <linux/usb.h> | 20 | #include <linux/usb.h> |
20 | #include "usbhid/usbhid.h" | 21 | #include "usbhid/usbhid.h" |
21 | 22 | ||
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index 3234c729a895..4777bbfa1cc2 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * HID driver for N-Trig touchscreens | 2 | * HID driver for N-Trig touchscreens |
3 | * | 3 | * |
4 | * Copyright (c) 2008 Rafi Rubin | 4 | * Copyright (c) 2008-2010 Rafi Rubin |
5 | * Copyright (c) 2009 Stephane Chatty | 5 | * Copyright (c) 2009-2010 Stephane Chatty |
6 | * | 6 | * |
7 | */ | 7 | */ |
8 | 8 | ||
@@ -15,23 +15,25 @@ | |||
15 | 15 | ||
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/hid.h> | 17 | #include <linux/hid.h> |
18 | #include <linux/usb.h> | ||
19 | #include "usbhid/usbhid.h" | ||
18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/slab.h> | ||
19 | 22 | ||
20 | #include "hid-ids.h" | 23 | #include "hid-ids.h" |
21 | 24 | ||
22 | #define NTRIG_DUPLICATE_USAGES 0x001 | 25 | #define NTRIG_DUPLICATE_USAGES 0x001 |
23 | 26 | ||
24 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | ||
25 | EV_KEY, (c)) | ||
26 | |||
27 | struct ntrig_data { | 27 | struct ntrig_data { |
28 | /* Incoming raw values for a single contact */ | 28 | /* Incoming raw values for a single contact */ |
29 | __u16 x, y, w, h; | 29 | __u16 x, y, w, h; |
30 | __u16 id; | 30 | __u16 id; |
31 | __u8 confidence; | 31 | |
32 | bool tipswitch; | ||
33 | bool confidence; | ||
34 | bool first_contact_touch; | ||
32 | 35 | ||
33 | bool reading_mt; | 36 | bool reading_mt; |
34 | __u8 first_contact_confidence; | ||
35 | 37 | ||
36 | __u8 mt_footer[4]; | 38 | __u8 mt_footer[4]; |
37 | __u8 mt_foot_count; | 39 | __u8 mt_foot_count; |
@@ -138,8 +140,12 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
138 | case 0xff000001: | 140 | case 0xff000001: |
139 | /* Tag indicating the start of a multitouch group */ | 141 | /* Tag indicating the start of a multitouch group */ |
140 | nd->reading_mt = 1; | 142 | nd->reading_mt = 1; |
141 | nd->first_contact_confidence = 0; | 143 | nd->first_contact_touch = 0; |
142 | break; | 144 | break; |
145 | case HID_DG_TIPSWITCH: | ||
146 | nd->tipswitch = value; | ||
147 | /* Prevent emission of touch until validated */ | ||
148 | return 1; | ||
143 | case HID_DG_CONFIDENCE: | 149 | case HID_DG_CONFIDENCE: |
144 | nd->confidence = value; | 150 | nd->confidence = value; |
145 | break; | 151 | break; |
@@ -165,8 +171,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
165 | * to emit a normal (X, Y) position | 171 | * to emit a normal (X, Y) position |
166 | */ | 172 | */ |
167 | if (!nd->reading_mt) { | 173 | if (!nd->reading_mt) { |
174 | /* | ||
175 | * TipSwitch indicates the presence of a | ||
176 | * finger in single touch mode. | ||
177 | */ | ||
178 | input_report_key(input, BTN_TOUCH, | ||
179 | nd->tipswitch); | ||
168 | input_report_key(input, BTN_TOOL_DOUBLETAP, | 180 | input_report_key(input, BTN_TOOL_DOUBLETAP, |
169 | (nd->confidence != 0)); | 181 | nd->tipswitch); |
170 | input_event(input, EV_ABS, ABS_X, nd->x); | 182 | input_event(input, EV_ABS, ABS_X, nd->x); |
171 | input_event(input, EV_ABS, ABS_Y, nd->y); | 183 | input_event(input, EV_ABS, ABS_Y, nd->y); |
172 | } | 184 | } |
@@ -205,7 +217,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
205 | 217 | ||
206 | /* emit a normal (X, Y) for the first point only */ | 218 | /* emit a normal (X, Y) for the first point only */ |
207 | if (nd->id == 0) { | 219 | if (nd->id == 0) { |
208 | nd->first_contact_confidence = nd->confidence; | 220 | /* |
221 | * TipSwitch is superfluous in multitouch | ||
222 | * mode. The footer events tell us | ||
223 | * if there is a finger on the screen or | ||
224 | * not. | ||
225 | */ | ||
226 | nd->first_contact_touch = nd->confidence; | ||
209 | input_event(input, EV_ABS, ABS_X, nd->x); | 227 | input_event(input, EV_ABS, ABS_X, nd->x); |
210 | input_event(input, EV_ABS, ABS_Y, nd->y); | 228 | input_event(input, EV_ABS, ABS_Y, nd->y); |
211 | } | 229 | } |
@@ -235,30 +253,12 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
235 | 253 | ||
236 | nd->reading_mt = 0; | 254 | nd->reading_mt = 0; |
237 | 255 | ||
238 | if (nd->first_contact_confidence) { | 256 | if (nd->first_contact_touch) { |
239 | switch (value) { | 257 | input_report_key(input, BTN_TOOL_DOUBLETAP, 1); |
240 | case 0: /* for single touch devices */ | ||
241 | case 1: | ||
242 | input_report_key(input, | ||
243 | BTN_TOOL_DOUBLETAP, 1); | ||
244 | break; | ||
245 | case 2: | ||
246 | input_report_key(input, | ||
247 | BTN_TOOL_TRIPLETAP, 1); | ||
248 | break; | ||
249 | case 3: | ||
250 | default: | ||
251 | input_report_key(input, | ||
252 | BTN_TOOL_QUADTAP, 1); | ||
253 | } | ||
254 | input_report_key(input, BTN_TOUCH, 1); | 258 | input_report_key(input, BTN_TOUCH, 1); |
255 | } else { | 259 | } else { |
256 | input_report_key(input, | 260 | input_report_key(input, BTN_TOOL_DOUBLETAP, 0); |
257 | BTN_TOOL_DOUBLETAP, 0); | 261 | input_report_key(input, BTN_TOUCH, 0); |
258 | input_report_key(input, | ||
259 | BTN_TOOL_TRIPLETAP, 0); | ||
260 | input_report_key(input, | ||
261 | BTN_TOOL_QUADTAP, 0); | ||
262 | } | 262 | } |
263 | break; | 263 | break; |
264 | 264 | ||
@@ -281,6 +281,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
281 | struct ntrig_data *nd; | 281 | struct ntrig_data *nd; |
282 | struct hid_input *hidinput; | 282 | struct hid_input *hidinput; |
283 | struct input_dev *input; | 283 | struct input_dev *input; |
284 | struct hid_report *report; | ||
284 | 285 | ||
285 | if (id->driver_data) | 286 | if (id->driver_data) |
286 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; | 287 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
@@ -308,20 +309,21 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
308 | 309 | ||
309 | 310 | ||
310 | list_for_each_entry(hidinput, &hdev->inputs, list) { | 311 | list_for_each_entry(hidinput, &hdev->inputs, list) { |
312 | if (hidinput->report->maxfield < 1) | ||
313 | continue; | ||
314 | |||
311 | input = hidinput->input; | 315 | input = hidinput->input; |
312 | switch (hidinput->report->field[0]->application) { | 316 | switch (hidinput->report->field[0]->application) { |
313 | case HID_DG_PEN: | 317 | case HID_DG_PEN: |
314 | input->name = "N-Trig Pen"; | 318 | input->name = "N-Trig Pen"; |
315 | break; | 319 | break; |
316 | case HID_DG_TOUCHSCREEN: | 320 | case HID_DG_TOUCHSCREEN: |
321 | /* These keys are redundant for fingers, clear them | ||
322 | * to prevent incorrect identification */ | ||
317 | __clear_bit(BTN_TOOL_PEN, input->keybit); | 323 | __clear_bit(BTN_TOOL_PEN, input->keybit); |
318 | /* | 324 | __clear_bit(BTN_TOOL_FINGER, input->keybit); |
319 | * A little something special to enable | 325 | __clear_bit(BTN_0, input->keybit); |
320 | * two and three finger taps. | ||
321 | */ | ||
322 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); | 326 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); |
323 | __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); | ||
324 | __set_bit(BTN_TOOL_QUADTAP, input->keybit); | ||
325 | /* | 327 | /* |
326 | * The physical touchscreen (single touch) | 328 | * The physical touchscreen (single touch) |
327 | * input has a value for physical, whereas | 329 | * input has a value for physical, whereas |
@@ -337,6 +339,12 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
337 | } | 339 | } |
338 | } | 340 | } |
339 | 341 | ||
342 | /* This is needed for devices with more recent firmware versions */ | ||
343 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; | ||
344 | if (report) | ||
345 | usbhid_submit_report(hdev, report, USB_DIR_OUT); | ||
346 | |||
347 | |||
340 | return 0; | 348 | return 0; |
341 | err_free: | 349 | err_free: |
342 | kfree(nd); | 350 | kfree(nd); |
diff --git a/drivers/hid/hid-pl.c b/drivers/hid/hid-pl.c index c6d7dbc935b1..9f41e2bd8483 100644 --- a/drivers/hid/hid-pl.c +++ b/drivers/hid/hid-pl.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #define debug(format, arg...) pr_debug("hid-plff: " format "\n" , ## arg) | 39 | #define debug(format, arg...) pr_debug("hid-plff: " format "\n" , ## arg) |
40 | 40 | ||
41 | #include <linux/input.h> | 41 | #include <linux/input.h> |
42 | #include <linux/slab.h> | ||
42 | #include <linux/usb.h> | 43 | #include <linux/usb.h> |
43 | #include <linux/hid.h> | 44 | #include <linux/hid.h> |
44 | 45 | ||
diff --git a/drivers/hid/hid-quanta.c b/drivers/hid/hid-quanta.c index 01dd51c4986c..54d3db50605b 100644 --- a/drivers/hid/hid-quanta.c +++ b/drivers/hid/hid-quanta.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/hid.h> | 16 | #include <linux/hid.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/slab.h> | ||
18 | 19 | ||
19 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); | 20 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); |
20 | MODULE_DESCRIPTION("Quanta dual-touch panel"); | 21 | MODULE_DESCRIPTION("Quanta dual-touch panel"); |
diff --git a/drivers/hid/hid-sjoy.c b/drivers/hid/hid-sjoy.c index 203c438b016f..e10a7687ebf2 100644 --- a/drivers/hid/hid-sjoy.c +++ b/drivers/hid/hid-sjoy.c | |||
@@ -27,6 +27,7 @@ | |||
27 | /* #define DEBUG */ | 27 | /* #define DEBUG */ |
28 | 28 | ||
29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
30 | #include <linux/slab.h> | ||
30 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
31 | #include <linux/hid.h> | 32 | #include <linux/hid.h> |
32 | #include "hid-ids.h" | 33 | #include "hid-ids.h" |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 9bf00d77d92b..402d5574b574 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
20 | #include <linux/hid.h> | 20 | #include <linux/hid.h> |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/slab.h> | ||
22 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
23 | 24 | ||
24 | #include "hid-ids.h" | 25 | #include "hid-ids.h" |
@@ -75,7 +76,7 @@ static int sony_set_operational_usb(struct hid_device *hdev) | |||
75 | 76 | ||
76 | static int sony_set_operational_bt(struct hid_device *hdev) | 77 | static int sony_set_operational_bt(struct hid_device *hdev) |
77 | { | 78 | { |
78 | unsigned char buf[] = { 0x53, 0xf4, 0x42, 0x03, 0x00, 0x00 }; | 79 | unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; |
79 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); | 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); |
80 | } | 81 | } |
81 | 82 | ||
diff --git a/drivers/hid/hid-stantum.c b/drivers/hid/hid-stantum.c index 2e592a06654e..90df886c5e04 100644 --- a/drivers/hid/hid-stantum.c +++ b/drivers/hid/hid-stantum.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/hid.h> | 16 | #include <linux/hid.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/slab.h> | ||
18 | 19 | ||
19 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); | 20 | MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); |
20 | MODULE_DESCRIPTION("Stantum HID multitouch panels"); | 21 | MODULE_DESCRIPTION("Stantum HID multitouch panels"); |
diff --git a/drivers/hid/hid-tmff.c b/drivers/hid/hid-tmff.c index 167ea746fb9c..15434c814793 100644 --- a/drivers/hid/hid-tmff.c +++ b/drivers/hid/hid-tmff.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <linux/hid.h> | 30 | #include <linux/hid.h> |
31 | #include <linux/input.h> | 31 | #include <linux/input.h> |
32 | #include <linux/slab.h> | ||
32 | #include <linux/usb.h> | 33 | #include <linux/usb.h> |
33 | 34 | ||
34 | #include "hid-ids.h" | 35 | #include "hid-ids.h" |
@@ -251,6 +252,8 @@ static const struct hid_device_id tm_devices[] = { | |||
251 | .driver_data = (unsigned long)ff_rumble }, | 252 | .driver_data = (unsigned long)ff_rumble }, |
252 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651), /* FGT Rumble Force Wheel */ | 253 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651), /* FGT Rumble Force Wheel */ |
253 | .driver_data = (unsigned long)ff_rumble }, | 254 | .driver_data = (unsigned long)ff_rumble }, |
255 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653), /* RGT Force Feedback CLUTCH Raging Wheel */ | ||
256 | .driver_data = (unsigned long)ff_joystick }, | ||
254 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654), /* FGT Force Feedback Wheel */ | 257 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654), /* FGT Force Feedback Wheel */ |
255 | .driver_data = (unsigned long)ff_joystick }, | 258 | .driver_data = (unsigned long)ff_joystick }, |
256 | { } | 259 | { } |
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index 51d7d77eb43b..1e051f1171e4 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/device.h> | 21 | #include <linux/device.h> |
22 | #include <linux/hid.h> | 22 | #include <linux/hid.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/slab.h> | ||
24 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY | 25 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY |
25 | #include <linux/power_supply.h> | 26 | #include <linux/power_supply.h> |
26 | #endif | 27 | #endif |
@@ -455,7 +456,6 @@ static int __init wacom_init(void) | |||
455 | ret = hid_register_driver(&wacom_driver); | 456 | ret = hid_register_driver(&wacom_driver); |
456 | if (ret) | 457 | if (ret) |
457 | printk(KERN_ERR "can't register wacom driver\n"); | 458 | printk(KERN_ERR "can't register wacom driver\n"); |
458 | printk(KERN_ERR "wacom driver registered\n"); | ||
459 | return ret; | 459 | return ret; |
460 | } | 460 | } |
461 | 461 | ||
diff --git a/drivers/hid/hid-zpff.c b/drivers/hid/hid-zpff.c index a79f0d78c6be..b7acceabba80 100644 --- a/drivers/hid/hid-zpff.c +++ b/drivers/hid/hid-zpff.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <linux/hid.h> | 24 | #include <linux/hid.h> |
25 | #include <linux/input.h> | 25 | #include <linux/input.h> |
26 | #include <linux/slab.h> | ||
26 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
27 | 28 | ||
28 | #include "hid-ids.h" | 29 | #include "hid-ids.h" |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index a758ead3df61..a9becf9cd0f6 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/poll.h> | 28 | #include <linux/poll.h> |
29 | #include <linux/device.h> | 29 | #include <linux/device.h> |
30 | #include <linux/major.h> | 30 | #include <linux/major.h> |
31 | #include <linux/slab.h> | ||
31 | #include <linux/hid.h> | 32 | #include <linux/hid.h> |
32 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
33 | #include <linux/sched.h> | 34 | #include <linux/sched.h> |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index f9640a362caa..a2ebe1996740 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -1019,13 +1019,6 @@ static int usbhid_start(struct hid_device *hid) | |||
1019 | } | 1019 | } |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | init_waitqueue_head(&usbhid->wait); | ||
1023 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
1024 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
1025 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
1026 | |||
1027 | spin_lock_init(&usbhid->lock); | ||
1028 | |||
1029 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); | 1022 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); |
1030 | if (!usbhid->urbctrl) { | 1023 | if (!usbhid->urbctrl) { |
1031 | ret = -ENOMEM; | 1024 | ret = -ENOMEM; |
@@ -1203,6 +1196,12 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * | |||
1203 | usbhid->intf = intf; | 1196 | usbhid->intf = intf; |
1204 | usbhid->ifnum = interface->desc.bInterfaceNumber; | 1197 | usbhid->ifnum = interface->desc.bInterfaceNumber; |
1205 | 1198 | ||
1199 | init_waitqueue_head(&usbhid->wait); | ||
1200 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
1201 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
1202 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
1203 | spin_lock_init(&usbhid->lock); | ||
1204 | |||
1206 | ret = hid_add_device(hid); | 1205 | ret = hid_add_device(hid); |
1207 | if (ret) { | 1206 | if (ret) { |
1208 | if (ret != -ENODEV) | 1207 | if (ret != -ENODEV) |
diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index e565dbe91d97..ef381d79cfa8 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #define debug(format, arg...) pr_debug("hid-pidff: " format "\n" , ## arg) | 25 | #define debug(format, arg...) pr_debug("hid-pidff: " format "\n" , ## arg) |
26 | 26 | ||
27 | #include <linux/input.h> | 27 | #include <linux/input.h> |
28 | #include <linux/slab.h> | ||
28 | #include <linux/usb.h> | 29 | #include <linux/usb.h> |
29 | 30 | ||
30 | #include <linux/hid.h> | 31 | #include <linux/hid.h> |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 8ea185246a78..7a6bda23283e 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -16,6 +16,7 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/hid.h> | 18 | #include <linux/hid.h> |
19 | #include <linux/slab.h> | ||
19 | 20 | ||
20 | #include "../hid-ids.h" | 21 | #include "../hid-ids.h" |
21 | 22 | ||
@@ -61,9 +62,11 @@ static const struct hid_blacklist { | |||
61 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, | 62 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
62 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | 63 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
63 | { USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS, HID_QUIRK_NOGET }, | 64 | { USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS, HID_QUIRK_NOGET }, |
65 | { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NOGET }, | ||
64 | { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, | 66 | { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, |
65 | { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, | 67 | { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, |
66 | { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209, HID_QUIRK_MULTI_INPUT }, | 68 | { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209, HID_QUIRK_MULTI_INPUT }, |
69 | { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U, HID_QUIRK_MULTI_INPUT }, | ||
67 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, | 70 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, |
68 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | 71 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, |
69 | 72 | ||
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 867e08433e4b..433602aed468 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
@@ -265,9 +265,10 @@ static int hiddev_release(struct inode * inode, struct file * file) | |||
265 | static int hiddev_open(struct inode *inode, struct file *file) | 265 | static int hiddev_open(struct inode *inode, struct file *file) |
266 | { | 266 | { |
267 | struct hiddev_list *list; | 267 | struct hiddev_list *list; |
268 | int res; | 268 | int res, i; |
269 | 269 | ||
270 | int i = iminor(inode) - HIDDEV_MINOR_BASE; | 270 | lock_kernel(); |
271 | i = iminor(inode) - HIDDEV_MINOR_BASE; | ||
271 | 272 | ||
272 | if (i >= HIDDEV_MINORS || i < 0 || !hiddev_table[i]) | 273 | if (i >= HIDDEV_MINORS || i < 0 || !hiddev_table[i]) |
273 | return -ENODEV; | 274 | return -ENODEV; |
@@ -313,10 +314,12 @@ static int hiddev_open(struct inode *inode, struct file *file) | |||
313 | usbhid_open(hid); | 314 | usbhid_open(hid); |
314 | } | 315 | } |
315 | 316 | ||
317 | unlock_kernel(); | ||
316 | return 0; | 318 | return 0; |
317 | bail: | 319 | bail: |
318 | file->private_data = NULL; | 320 | file->private_data = NULL; |
319 | kfree(list); | 321 | kfree(list); |
322 | unlock_kernel(); | ||
320 | return res; | 323 | return res; |
321 | } | 324 | } |
322 | 325 | ||