diff options
54 files changed, 1351 insertions, 492 deletions
diff --git a/Documentation/devicetree/bindings/hid/hid-over-i2c.txt b/Documentation/devicetree/bindings/hid/hid-over-i2c.txt new file mode 100644 index 000000000000..488edcb264c4 --- /dev/null +++ b/Documentation/devicetree/bindings/hid/hid-over-i2c.txt | |||
@@ -0,0 +1,28 @@ | |||
1 | * HID over I2C Device-Tree bindings | ||
2 | |||
3 | HID over I2C provides support for various Human Interface Devices over the | ||
4 | I2C bus. These devices can be for example touchpads, keyboards, touch screens | ||
5 | or sensors. | ||
6 | |||
7 | The specification has been written by Microsoft and is currently available here: | ||
8 | http://msdn.microsoft.com/en-us/library/windows/hardware/hh852380.aspx | ||
9 | |||
10 | If this binding is used, the kernel module i2c-hid will handle the communication | ||
11 | with the device and the generic hid core layer will handle the protocol. | ||
12 | |||
13 | Required properties: | ||
14 | - compatible: must be "hid-over-i2c" | ||
15 | - reg: i2c slave address | ||
16 | - hid-descr-addr: HID descriptor address | ||
17 | - interrupt-parent: the phandle for the interrupt controller | ||
18 | - interrupts: interrupt line | ||
19 | |||
20 | Example: | ||
21 | |||
22 | i2c-hid-dev@2c { | ||
23 | compatible = "hid-over-i2c"; | ||
24 | reg = <0x2c>; | ||
25 | hid-descr-addr = <0x0020>; | ||
26 | interrupt-parent = <&gpx3>; | ||
27 | interrupts = <3 2>; | ||
28 | }; | ||
diff --git a/Documentation/hid/uhid.txt b/Documentation/hid/uhid.txt index 3c741214dfbb..dc35a2b75eee 100644 --- a/Documentation/hid/uhid.txt +++ b/Documentation/hid/uhid.txt | |||
@@ -149,11 +149,13 @@ needs. Only UHID_OUTPUT and UHID_OUTPUT_EV have payloads. | |||
149 | is of type "struct uhid_data_req". | 149 | is of type "struct uhid_data_req". |
150 | This may be received even though you haven't received UHID_OPEN, yet. | 150 | This may be received even though you haven't received UHID_OPEN, yet. |
151 | 151 | ||
152 | UHID_OUTPUT_EV: | 152 | UHID_OUTPUT_EV (obsolete): |
153 | Same as UHID_OUTPUT but this contains a "struct input_event" as payload. This | 153 | Same as UHID_OUTPUT but this contains a "struct input_event" as payload. This |
154 | is called for force-feedback, LED or similar events which are received through | 154 | is called for force-feedback, LED or similar events which are received through |
155 | an input device by the HID subsystem. You should convert this into raw reports | 155 | an input device by the HID subsystem. You should convert this into raw reports |
156 | and send them to your device similar to events of type UHID_OUTPUT. | 156 | and send them to your device similar to events of type UHID_OUTPUT. |
157 | This is no longer sent by newer kernels. Instead, HID core converts it into a | ||
158 | raw output report and sends it via UHID_OUTPUT. | ||
157 | 159 | ||
158 | UHID_FEATURE: | 160 | UHID_FEATURE: |
159 | This event is sent if the kernel driver wants to perform a feature request as | 161 | This event is sent if the kernel driver wants to perform a feature request as |
diff --git a/Documentation/input/gamepad.txt b/Documentation/input/gamepad.txt new file mode 100644 index 000000000000..8002c894c6b0 --- /dev/null +++ b/Documentation/input/gamepad.txt | |||
@@ -0,0 +1,156 @@ | |||
1 | Linux Gamepad API | ||
2 | ---------------------------------------------------------------------------- | ||
3 | |||
4 | 1. Intro | ||
5 | ~~~~~~~~ | ||
6 | Linux provides many different input drivers for gamepad hardware. To avoid | ||
7 | having user-space deal with different button-mappings for each gamepad, this | ||
8 | document defines how gamepads are supposed to report their data. | ||
9 | |||
10 | 2. Geometry | ||
11 | ~~~~~~~~~~~ | ||
12 | As "gamepad" we define devices which roughly look like this: | ||
13 | |||
14 | ____________________________ __ | ||
15 | / [__ZL__] [__ZR__] \ | | ||
16 | / [__ TL __] [__ TR __] \ | Front Triggers | ||
17 | __/________________________________\__ __| | ||
18 | / _ \ | | ||
19 | / /\ __ (N) \ | | ||
20 | / || __ |MO| __ _ _ \ | Main Pad | ||
21 | | <===DP===> |SE| |ST| (W) -|- (E) | | | ||
22 | \ || ___ ___ _ / | | ||
23 | /\ \/ / \ / \ (S) /\ __| | ||
24 | / \________ | LS | ____ | RS | ________/ \ | | ||
25 | | / \ \___/ / \ \___/ / \ | | Control Sticks | ||
26 | | / \_____/ \_____/ \ | __| | ||
27 | | / \ | | ||
28 | \_____/ \_____/ | ||
29 | |||
30 | |________|______| |______|___________| | ||
31 | D-Pad Left Right Action Pad | ||
32 | Stick Stick | ||
33 | |||
34 | |_____________| | ||
35 | Menu Pad | ||
36 | |||
37 | Most gamepads have the following features: | ||
38 | - Action-Pad | ||
39 | 4 buttons in diamonds-shape (on the right side). The buttons are | ||
40 | differently labeled on most devices so we define them as NORTH, | ||
41 | SOUTH, WEST and EAST. | ||
42 | - D-Pad (Direction-pad) | ||
43 | 4 buttons (on the left side) that point up, down, left and right. | ||
44 | - Menu-Pad | ||
45 | Different constellations, but most-times 2 buttons: SELECT - START | ||
46 | Furthermore, many gamepads have a fancy branded button that is used as | ||
47 | special system-button. It often looks different to the other buttons and | ||
48 | is used to pop up system-menus or system-settings. | ||
49 | - Analog-Sticks | ||
50 | Analog-sticks provide freely moveable sticks to control directions. Not | ||
51 | all devices have both or any, but they are present at most times. | ||
52 | Analog-sticks may also provide a digital button if you press them. | ||
53 | - Triggers | ||
54 | Triggers are located on the upper-side of the pad in vertical direction. | ||
55 | Not all devices provide them, but the upper buttons are normally named | ||
56 | Left- and Right-Triggers, the lower buttons Z-Left and Z-Right. | ||
57 | - Rumble | ||
58 | Many devices provide force-feedback features. But are mostly just | ||
59 | simple rumble motors. | ||
60 | |||
61 | 3. Detection | ||
62 | ~~~~~~~~~~~~ | ||
63 | All gamepads that follow the protocol described here map BTN_GAMEPAD. This is | ||
64 | an alias for BTN_SOUTH/BTN_A. It can be used to identify a gamepad as such. | ||
65 | However, not all gamepads provide all features, so you need to test for all | ||
66 | features that you need, first. How each feature is mapped is described below. | ||
67 | |||
68 | Legacy drivers often don't comply to these rules. As we cannot change them | ||
69 | for backwards-compatibility reasons, you need to provide fixup mappings in | ||
70 | user-space yourself. Some of them might also provide module-options that | ||
71 | change the mappings so you can adivce users to set these. | ||
72 | |||
73 | All new gamepads are supposed to comply with this mapping. Please report any | ||
74 | bugs, if they don't. | ||
75 | |||
76 | There are a lot of less-featured/less-powerful devices out there, which re-use | ||
77 | the buttons from this protocol. However, they try to do this in a compatible | ||
78 | fashion. For example, the "Nintendo Wii Nunchuk" provides two trigger buttons | ||
79 | and one analog stick. It reports them as if it were a gamepad with only one | ||
80 | analog stick and two trigger buttons on the right side. | ||
81 | But that means, that if you only support "real" gamepads, you must test | ||
82 | devices for _all_ reported events that you need. Otherwise, you will also get | ||
83 | devices that report a small subset of the events. | ||
84 | |||
85 | No other devices, that do not look/feel like a gamepad, shall report these | ||
86 | events. | ||
87 | |||
88 | 4. Events | ||
89 | ~~~~~~~~~ | ||
90 | Gamepads report the following events: | ||
91 | |||
92 | Action-Pad: | ||
93 | Every gamepad device has at least 2 action buttons. This means, that every | ||
94 | device reports BTN_SOUTH (which BTN_GAMEPAD is an alias for). Regardless | ||
95 | of the labels on the buttons, the codes are sent according to the | ||
96 | physical position of the buttons. | ||
97 | Please note that 2- and 3-button pads are fairly rare and old. You might | ||
98 | want to filter gamepads that do not report all four. | ||
99 | 2-Button Pad: | ||
100 | If only 2 action-buttons are present, they are reported as BTN_SOUTH and | ||
101 | BTN_EAST. For vertical layouts, the upper button is BTN_EAST. For | ||
102 | horizontal layouts, the button more on the right is BTN_EAST. | ||
103 | 3-Button Pad: | ||
104 | If only 3 action-buttons are present, they are reported as (from left | ||
105 | to right): BTN_WEST, BTN_SOUTH, BTN_EAST | ||
106 | If the buttons are aligned perfectly vertically, they are reported as | ||
107 | (from top down): BTN_WEST, BTN_SOUTH, BTN_EAST | ||
108 | 4-Button Pad: | ||
109 | If all 4 action-buttons are present, they can be aligned in two | ||
110 | different formations. If diamond-shaped, they are reported as BTN_NORTH, | ||
111 | BTN_WEST, BTN_SOUTH, BTN_EAST according to their physical location. | ||
112 | If rectangular-shaped, the upper-left button is BTN_NORTH, lower-left | ||
113 | is BTN_WEST, lower-right is BTN_SOUTH and upper-right is BTN_EAST. | ||
114 | |||
115 | D-Pad: | ||
116 | Every gamepad provides a D-Pad with four directions: Up, Down, Left, Right | ||
117 | Some of these are available as digital buttons, some as analog buttons. Some | ||
118 | may even report both. The kernel does not convert between these so | ||
119 | applications should support both and choose what is more appropriate if | ||
120 | both are reported. | ||
121 | Digital buttons are reported as: | ||
122 | BTN_DPAD_* | ||
123 | Analog buttons are reported as: | ||
124 | ABS_HAT0X and ABS_HAT0Y | ||
125 | |||
126 | Analog-Sticks: | ||
127 | The left analog-stick is reported as ABS_X, ABS_Y. The right analog stick is | ||
128 | reported as ABS_RX, ABS_RY. Zero, one or two sticks may be present. | ||
129 | If analog-sticks provide digital buttons, they are mapped accordingly as | ||
130 | BTN_THUMBL (first/left) and BTN_THUMBR (second/right). | ||
131 | |||
132 | Triggers: | ||
133 | Trigger buttons can be available as digital or analog buttons or both. User- | ||
134 | space must correctly deal with any situation and choose the most appropriate | ||
135 | mode. | ||
136 | Upper trigger buttons are reported as BTN_TR or ABS_HAT1X (right) and BTN_TL | ||
137 | or ABS_HAT1Y (left). Lower trigger buttons are reported as BTN_TR2 or | ||
138 | ABS_HAT2X (right/ZR) and BTN_TL2 or ABS_HAT2Y (left/ZL). | ||
139 | If only one trigger-button combination is present (upper+lower), they are | ||
140 | reported as "right" triggers (BTN_TR/ABS_HAT1X). | ||
141 | |||
142 | Menu-Pad: | ||
143 | Menu buttons are always digital and are mapped according to their location | ||
144 | instead of their labels. That is: | ||
145 | 1-button Pad: Mapped as BTN_START | ||
146 | 2-button Pad: Left button mapped as BTN_SELECT, right button mapped as | ||
147 | BTN_START | ||
148 | Many pads also have a third button which is branded or has a special symbol | ||
149 | and meaning. Such buttons are mapped as BTN_MODE. Examples are the Nintendo | ||
150 | "HOME" button, the XBox "X"-button or Sony "P" button. | ||
151 | |||
152 | Rumble: | ||
153 | Rumble is adverticed as FF_RUMBLE. | ||
154 | |||
155 | ---------------------------------------------------------------------------- | ||
156 | Written 2013 by David Herrmann <dh.herrmann@gmail.com> | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 9d8ab7c681f9..caa7c3a1fef9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -6961,6 +6961,14 @@ M: Maxim Levitsky <maximlevitsky@gmail.com> | |||
6961 | S: Maintained | 6961 | S: Maintained |
6962 | F: drivers/memstick/host/r592.* | 6962 | F: drivers/memstick/host/r592.* |
6963 | 6963 | ||
6964 | ROCCAT DRIVERS | ||
6965 | M: Stefan Achatz <erazor_de@users.sourceforge.net> | ||
6966 | W: http://sourceforge.net/projects/roccat/ | ||
6967 | S: Maintained | ||
6968 | F: drivers/hid/hid-roccat* | ||
6969 | F: include/linux/hid-roccat* | ||
6970 | F: Documentation/ABI/*/sysfs-driver-hid-roccat* | ||
6971 | |||
6964 | ROCKETPORT DRIVER | 6972 | ROCKETPORT DRIVER |
6965 | P: Comtrol Corp. | 6973 | P: Comtrol Corp. |
6966 | W: http://www.comtrol.com | 6974 | W: http://www.comtrol.com |
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 14ef6ab69790..3d7c9f67b6d7 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
@@ -743,6 +743,14 @@ config HID_WIIMOTE | |||
743 | To compile this driver as a module, choose M here: the | 743 | To compile this driver as a module, choose M here: the |
744 | module will be called hid-wiimote. | 744 | module will be called hid-wiimote. |
745 | 745 | ||
746 | config HID_XINMO | ||
747 | tristate "Xin-Mo non-fully compliant devices" | ||
748 | depends on HID | ||
749 | ---help--- | ||
750 | Support for Xin-Mo devices that are not fully compliant with the HID | ||
751 | standard. Currently only supports the Xin-Mo Dual Arcade. Say YÂ here | ||
752 | if you have a Xin-Mo Dual Arcade controller. | ||
753 | |||
746 | config HID_ZEROPLUS | 754 | config HID_ZEROPLUS |
747 | tristate "Zeroplus based game controller support" | 755 | tristate "Zeroplus based game controller support" |
748 | depends on HID | 756 | depends on HID |
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 6f687287e212..a959f4aecaf5 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile | |||
@@ -110,6 +110,7 @@ obj-$(CONFIG_HID_TIVO) += hid-tivo.o | |||
110 | obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o | 110 | obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o |
111 | obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o | 111 | obj-$(CONFIG_HID_TWINHAN) += hid-twinhan.o |
112 | obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o | 112 | obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o |
113 | obj-$(CONFIG_HID_XINMO) += hid-xinmo.o | ||
113 | obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o | 114 | obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o |
114 | obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o | 115 | obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o |
115 | obj-$(CONFIG_HID_WACOM) += hid-wacom.o | 116 | obj-$(CONFIG_HID_WACOM) += hid-wacom.o |
diff --git a/drivers/hid/hid-a4tech.c b/drivers/hid/hid-a4tech.c index 7c5507e94820..9428ea7cdf8a 100644 --- a/drivers/hid/hid-a4tech.c +++ b/drivers/hid/hid-a4tech.c | |||
@@ -90,11 +90,10 @@ static int a4_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
90 | struct a4tech_sc *a4; | 90 | struct a4tech_sc *a4; |
91 | int ret; | 91 | int ret; |
92 | 92 | ||
93 | a4 = kzalloc(sizeof(*a4), GFP_KERNEL); | 93 | a4 = devm_kzalloc(&hdev->dev, sizeof(*a4), GFP_KERNEL); |
94 | if (a4 == NULL) { | 94 | if (a4 == NULL) { |
95 | hid_err(hdev, "can't alloc device descriptor\n"); | 95 | hid_err(hdev, "can't alloc device descriptor\n"); |
96 | ret = -ENOMEM; | 96 | return -ENOMEM; |
97 | goto err_free; | ||
98 | } | 97 | } |
99 | 98 | ||
100 | a4->quirks = id->driver_data; | 99 | a4->quirks = id->driver_data; |
@@ -104,27 +103,16 @@ static int a4_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
104 | ret = hid_parse(hdev); | 103 | ret = hid_parse(hdev); |
105 | if (ret) { | 104 | if (ret) { |
106 | hid_err(hdev, "parse failed\n"); | 105 | hid_err(hdev, "parse failed\n"); |
107 | goto err_free; | 106 | return ret; |
108 | } | 107 | } |
109 | 108 | ||
110 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 109 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
111 | if (ret) { | 110 | if (ret) { |
112 | hid_err(hdev, "hw start failed\n"); | 111 | hid_err(hdev, "hw start failed\n"); |
113 | goto err_free; | 112 | return ret; |
114 | } | 113 | } |
115 | 114 | ||
116 | return 0; | 115 | return 0; |
117 | err_free: | ||
118 | kfree(a4); | ||
119 | return ret; | ||
120 | } | ||
121 | |||
122 | static void a4_remove(struct hid_device *hdev) | ||
123 | { | ||
124 | struct a4tech_sc *a4 = hid_get_drvdata(hdev); | ||
125 | |||
126 | hid_hw_stop(hdev); | ||
127 | kfree(a4); | ||
128 | } | 116 | } |
129 | 117 | ||
130 | static const struct hid_device_id a4_devices[] = { | 118 | static const struct hid_device_id a4_devices[] = { |
@@ -144,7 +132,6 @@ static struct hid_driver a4_driver = { | |||
144 | .input_mapped = a4_input_mapped, | 132 | .input_mapped = a4_input_mapped, |
145 | .event = a4_event, | 133 | .event = a4_event, |
146 | .probe = a4_probe, | 134 | .probe = a4_probe, |
147 | .remove = a4_remove, | ||
148 | }; | 135 | }; |
149 | module_hid_driver(a4_driver); | 136 | module_hid_driver(a4_driver); |
150 | 137 | ||
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index c7710b5c69af..881cf7b4f9a4 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -349,7 +349,7 @@ static int apple_probe(struct hid_device *hdev, | |||
349 | unsigned int connect_mask = HID_CONNECT_DEFAULT; | 349 | unsigned int connect_mask = HID_CONNECT_DEFAULT; |
350 | int ret; | 350 | int ret; |
351 | 351 | ||
352 | asc = kzalloc(sizeof(*asc), GFP_KERNEL); | 352 | asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL); |
353 | if (asc == NULL) { | 353 | if (asc == NULL) { |
354 | hid_err(hdev, "can't alloc apple descriptor\n"); | 354 | hid_err(hdev, "can't alloc apple descriptor\n"); |
355 | return -ENOMEM; | 355 | return -ENOMEM; |
@@ -362,7 +362,7 @@ static int apple_probe(struct hid_device *hdev, | |||
362 | ret = hid_parse(hdev); | 362 | ret = hid_parse(hdev); |
363 | if (ret) { | 363 | if (ret) { |
364 | hid_err(hdev, "parse failed\n"); | 364 | hid_err(hdev, "parse failed\n"); |
365 | goto err_free; | 365 | return ret; |
366 | } | 366 | } |
367 | 367 | ||
368 | if (quirks & APPLE_HIDDEV) | 368 | if (quirks & APPLE_HIDDEV) |
@@ -373,19 +373,10 @@ static int apple_probe(struct hid_device *hdev, | |||
373 | ret = hid_hw_start(hdev, connect_mask); | 373 | ret = hid_hw_start(hdev, connect_mask); |
374 | if (ret) { | 374 | if (ret) { |
375 | hid_err(hdev, "hw start failed\n"); | 375 | hid_err(hdev, "hw start failed\n"); |
376 | goto err_free; | 376 | return ret; |
377 | } | 377 | } |
378 | 378 | ||
379 | return 0; | 379 | return 0; |
380 | err_free: | ||
381 | kfree(asc); | ||
382 | return ret; | ||
383 | } | ||
384 | |||
385 | static void apple_remove(struct hid_device *hdev) | ||
386 | { | ||
387 | hid_hw_stop(hdev); | ||
388 | kfree(hid_get_drvdata(hdev)); | ||
389 | } | 380 | } |
390 | 381 | ||
391 | static const struct hid_device_id apple_devices[] = { | 382 | static const struct hid_device_id apple_devices[] = { |
@@ -551,7 +542,6 @@ static struct hid_driver apple_driver = { | |||
551 | .id_table = apple_devices, | 542 | .id_table = apple_devices, |
552 | .report_fixup = apple_report_fixup, | 543 | .report_fixup = apple_report_fixup, |
553 | .probe = apple_probe, | 544 | .probe = apple_probe, |
554 | .remove = apple_remove, | ||
555 | .event = apple_event, | 545 | .event = apple_event, |
556 | .input_mapping = apple_input_mapping, | 546 | .input_mapping = apple_input_mapping, |
557 | .input_mapped = apple_input_mapped, | 547 | .input_mapped = apple_input_mapped, |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index b8f1c77f2f77..ae88a97f976e 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -63,6 +63,8 @@ struct hid_report *hid_register_report(struct hid_device *device, unsigned type, | |||
63 | struct hid_report_enum *report_enum = device->report_enum + type; | 63 | struct hid_report_enum *report_enum = device->report_enum + type; |
64 | struct hid_report *report; | 64 | struct hid_report *report; |
65 | 65 | ||
66 | if (id >= HID_MAX_IDS) | ||
67 | return NULL; | ||
66 | if (report_enum->report_id_hash[id]) | 68 | if (report_enum->report_id_hash[id]) |
67 | return report_enum->report_id_hash[id]; | 69 | return report_enum->report_id_hash[id]; |
68 | 70 | ||
@@ -404,8 +406,10 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) | |||
404 | 406 | ||
405 | case HID_GLOBAL_ITEM_TAG_REPORT_ID: | 407 | case HID_GLOBAL_ITEM_TAG_REPORT_ID: |
406 | parser->global.report_id = item_udata(item); | 408 | parser->global.report_id = item_udata(item); |
407 | if (parser->global.report_id == 0) { | 409 | if (parser->global.report_id == 0 || |
408 | hid_err(parser->device, "report_id 0 is invalid\n"); | 410 | parser->global.report_id >= HID_MAX_IDS) { |
411 | hid_err(parser->device, "report_id %u is invalid\n", | ||
412 | parser->global.report_id); | ||
409 | return -1; | 413 | return -1; |
410 | } | 414 | } |
411 | return 0; | 415 | return 0; |
@@ -450,7 +454,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) | |||
450 | } | 454 | } |
451 | parser->local.delimiter_depth--; | 455 | parser->local.delimiter_depth--; |
452 | } | 456 | } |
453 | return 1; | 457 | return 0; |
454 | 458 | ||
455 | case HID_LOCAL_ITEM_TAG_USAGE: | 459 | case HID_LOCAL_ITEM_TAG_USAGE: |
456 | 460 | ||
@@ -575,7 +579,7 @@ static void hid_close_report(struct hid_device *device) | |||
575 | for (i = 0; i < HID_REPORT_TYPES; i++) { | 579 | for (i = 0; i < HID_REPORT_TYPES; i++) { |
576 | struct hid_report_enum *report_enum = device->report_enum + i; | 580 | struct hid_report_enum *report_enum = device->report_enum + i; |
577 | 581 | ||
578 | for (j = 0; j < 256; j++) { | 582 | for (j = 0; j < HID_MAX_IDS; j++) { |
579 | struct hid_report *report = report_enum->report_id_hash[j]; | 583 | struct hid_report *report = report_enum->report_id_hash[j]; |
580 | if (report) | 584 | if (report) |
581 | hid_free_report(report); | 585 | hid_free_report(report); |
@@ -677,12 +681,61 @@ static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item) | |||
677 | return NULL; | 681 | return NULL; |
678 | } | 682 | } |
679 | 683 | ||
680 | static void hid_scan_usage(struct hid_device *hid, u32 usage) | 684 | static void hid_scan_input_usage(struct hid_parser *parser, u32 usage) |
681 | { | 685 | { |
686 | struct hid_device *hid = parser->device; | ||
687 | |||
682 | if (usage == HID_DG_CONTACTID) | 688 | if (usage == HID_DG_CONTACTID) |
683 | hid->group = HID_GROUP_MULTITOUCH; | 689 | hid->group = HID_GROUP_MULTITOUCH; |
684 | } | 690 | } |
685 | 691 | ||
692 | static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage) | ||
693 | { | ||
694 | if (usage == 0xff0000c5 && parser->global.report_count == 256 && | ||
695 | parser->global.report_size == 8) | ||
696 | parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8; | ||
697 | } | ||
698 | |||
699 | static void hid_scan_collection(struct hid_parser *parser, unsigned type) | ||
700 | { | ||
701 | struct hid_device *hid = parser->device; | ||
702 | |||
703 | if (((parser->global.usage_page << 16) == HID_UP_SENSOR) && | ||
704 | type == HID_COLLECTION_PHYSICAL) | ||
705 | hid->group = HID_GROUP_SENSOR_HUB; | ||
706 | } | ||
707 | |||
708 | static int hid_scan_main(struct hid_parser *parser, struct hid_item *item) | ||
709 | { | ||
710 | __u32 data; | ||
711 | int i; | ||
712 | |||
713 | data = item_udata(item); | ||
714 | |||
715 | switch (item->tag) { | ||
716 | case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION: | ||
717 | hid_scan_collection(parser, data & 0xff); | ||
718 | break; | ||
719 | case HID_MAIN_ITEM_TAG_END_COLLECTION: | ||
720 | break; | ||
721 | case HID_MAIN_ITEM_TAG_INPUT: | ||
722 | for (i = 0; i < parser->local.usage_index; i++) | ||
723 | hid_scan_input_usage(parser, parser->local.usage[i]); | ||
724 | break; | ||
725 | case HID_MAIN_ITEM_TAG_OUTPUT: | ||
726 | break; | ||
727 | case HID_MAIN_ITEM_TAG_FEATURE: | ||
728 | for (i = 0; i < parser->local.usage_index; i++) | ||
729 | hid_scan_feature_usage(parser, parser->local.usage[i]); | ||
730 | break; | ||
731 | } | ||
732 | |||
733 | /* Reset the local parser environment */ | ||
734 | memset(&parser->local, 0, sizeof(parser->local)); | ||
735 | |||
736 | return 0; | ||
737 | } | ||
738 | |||
686 | /* | 739 | /* |
687 | * Scan a report descriptor before the device is added to the bus. | 740 | * Scan a report descriptor before the device is added to the bus. |
688 | * Sets device groups and other properties that determine what driver | 741 | * Sets device groups and other properties that determine what driver |
@@ -690,48 +743,41 @@ static void hid_scan_usage(struct hid_device *hid, u32 usage) | |||
690 | */ | 743 | */ |
691 | static int hid_scan_report(struct hid_device *hid) | 744 | static int hid_scan_report(struct hid_device *hid) |
692 | { | 745 | { |
693 | unsigned int page = 0, delim = 0; | 746 | struct hid_parser *parser; |
747 | struct hid_item item; | ||
694 | __u8 *start = hid->dev_rdesc; | 748 | __u8 *start = hid->dev_rdesc; |
695 | __u8 *end = start + hid->dev_rsize; | 749 | __u8 *end = start + hid->dev_rsize; |
696 | unsigned int u, u_min = 0, u_max = 0; | 750 | static int (*dispatch_type[])(struct hid_parser *parser, |
697 | struct hid_item item; | 751 | struct hid_item *item) = { |
752 | hid_scan_main, | ||
753 | hid_parser_global, | ||
754 | hid_parser_local, | ||
755 | hid_parser_reserved | ||
756 | }; | ||
757 | |||
758 | parser = vzalloc(sizeof(struct hid_parser)); | ||
759 | if (!parser) | ||
760 | return -ENOMEM; | ||
698 | 761 | ||
762 | parser->device = hid; | ||
699 | hid->group = HID_GROUP_GENERIC; | 763 | hid->group = HID_GROUP_GENERIC; |
700 | while ((start = fetch_item(start, end, &item)) != NULL) { | ||
701 | if (item.format != HID_ITEM_FORMAT_SHORT) | ||
702 | return -EINVAL; | ||
703 | if (item.type == HID_ITEM_TYPE_GLOBAL) { | ||
704 | if (item.tag == HID_GLOBAL_ITEM_TAG_USAGE_PAGE) | ||
705 | page = item_udata(&item) << 16; | ||
706 | } else if (item.type == HID_ITEM_TYPE_LOCAL) { | ||
707 | if (delim > 1) | ||
708 | break; | ||
709 | u = item_udata(&item); | ||
710 | if (item.size <= 2) | ||
711 | u += page; | ||
712 | switch (item.tag) { | ||
713 | case HID_LOCAL_ITEM_TAG_DELIMITER: | ||
714 | delim += !!u; | ||
715 | break; | ||
716 | case HID_LOCAL_ITEM_TAG_USAGE: | ||
717 | hid_scan_usage(hid, u); | ||
718 | break; | ||
719 | case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM: | ||
720 | u_min = u; | ||
721 | break; | ||
722 | case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM: | ||
723 | u_max = u; | ||
724 | for (u = u_min; u <= u_max; u++) | ||
725 | hid_scan_usage(hid, u); | ||
726 | break; | ||
727 | } | ||
728 | } else if (page == HID_UP_SENSOR && | ||
729 | item.type == HID_ITEM_TYPE_MAIN && | ||
730 | item.tag == HID_MAIN_ITEM_TAG_BEGIN_COLLECTION && | ||
731 | (item_udata(&item) & 0xff) == HID_COLLECTION_PHYSICAL) | ||
732 | hid->group = HID_GROUP_SENSOR_HUB; | ||
733 | } | ||
734 | 764 | ||
765 | /* | ||
766 | * The parsing is simpler than the one in hid_open_report() as we should | ||
767 | * be robust against hid errors. Those errors will be raised by | ||
768 | * hid_open_report() anyway. | ||
769 | */ | ||
770 | while ((start = fetch_item(start, end, &item)) != NULL) | ||
771 | dispatch_type[item.type](parser, &item); | ||
772 | |||
773 | /* | ||
774 | * Handle special flags set during scanning. | ||
775 | */ | ||
776 | if ((parser->scan_flags & HID_SCAN_FLAG_MT_WIN_8) && | ||
777 | (hid->group == HID_GROUP_MULTITOUCH)) | ||
778 | hid->group = HID_GROUP_MULTITOUCH_WIN_8; | ||
779 | |||
780 | vfree(parser); | ||
735 | return 0; | 781 | return 0; |
736 | } | 782 | } |
737 | 783 | ||
@@ -1128,7 +1174,8 @@ static void hid_output_field(const struct hid_device *hid, | |||
1128 | } | 1174 | } |
1129 | 1175 | ||
1130 | /* | 1176 | /* |
1131 | * Create a report. | 1177 | * Create a report. 'data' has to be allocated using |
1178 | * hid_alloc_report_buf() so that it has proper size. | ||
1132 | */ | 1179 | */ |
1133 | 1180 | ||
1134 | void hid_output_report(struct hid_report *report, __u8 *data) | 1181 | void hid_output_report(struct hid_report *report, __u8 *data) |
@@ -1145,6 +1192,22 @@ void hid_output_report(struct hid_report *report, __u8 *data) | |||
1145 | EXPORT_SYMBOL_GPL(hid_output_report); | 1192 | EXPORT_SYMBOL_GPL(hid_output_report); |
1146 | 1193 | ||
1147 | /* | 1194 | /* |
1195 | * Allocator for buffer that is going to be passed to hid_output_report() | ||
1196 | */ | ||
1197 | u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags) | ||
1198 | { | ||
1199 | /* | ||
1200 | * 7 extra bytes are necessary to achieve proper functionality | ||
1201 | * of implement() working on 8 byte chunks | ||
1202 | */ | ||
1203 | |||
1204 | int len = ((report->size - 1) >> 3) + 1 + (report->id > 0) + 7; | ||
1205 | |||
1206 | return kmalloc(len, flags); | ||
1207 | } | ||
1208 | EXPORT_SYMBOL_GPL(hid_alloc_report_buf); | ||
1209 | |||
1210 | /* | ||
1148 | * Set a field value. The report this field belongs to has to be | 1211 | * Set a field value. The report this field belongs to has to be |
1149 | * created and transferred to the device, to set this value in the | 1212 | * created and transferred to the device, to set this value in the |
1150 | * device. | 1213 | * device. |
@@ -1152,7 +1215,12 @@ EXPORT_SYMBOL_GPL(hid_output_report); | |||
1152 | 1215 | ||
1153 | int hid_set_field(struct hid_field *field, unsigned offset, __s32 value) | 1216 | int hid_set_field(struct hid_field *field, unsigned offset, __s32 value) |
1154 | { | 1217 | { |
1155 | unsigned size = field->report_size; | 1218 | unsigned size; |
1219 | |||
1220 | if (!field) | ||
1221 | return -1; | ||
1222 | |||
1223 | size = field->report_size; | ||
1156 | 1224 | ||
1157 | hid_dump_input(field->report->device, field->usage + offset, value); | 1225 | hid_dump_input(field->report->device, field->usage + offset, value); |
1158 | 1226 | ||
@@ -1597,6 +1665,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1597 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, | 1665 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, |
1598 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, | 1666 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, |
1599 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, | 1667 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
1668 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, | ||
1600 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, | 1669 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, |
1601 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, | 1670 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, |
1602 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, | 1671 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
@@ -1679,6 +1748,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1679 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, | 1748 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, |
1680 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) }, | 1749 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) }, |
1681 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) }, | 1750 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) }, |
1751 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL) }, | ||
1682 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) }, | 1752 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) }, |
1683 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_LUA) }, | 1753 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_LUA) }, |
1684 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) }, | 1754 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) }, |
@@ -1736,6 +1806,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1736 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) }, | 1806 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) }, |
1737 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) }, | 1807 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) }, |
1738 | { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) }, | 1808 | { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) }, |
1809 | { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) }, | ||
1739 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, | 1810 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, |
1740 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, | 1811 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, |
1741 | { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, | 1812 | { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, |
diff --git a/drivers/hid/hid-holtekff.c b/drivers/hid/hid-holtekff.c index 9a8f05124525..9325545fc3ae 100644 --- a/drivers/hid/hid-holtekff.c +++ b/drivers/hid/hid-holtekff.c | |||
@@ -98,7 +98,7 @@ static void holtekff_send(struct holtekff_device *holtekff, | |||
98 | holtekff->field->value[i] = data[i]; | 98 | holtekff->field->value[i] = data[i]; |
99 | } | 99 | } |
100 | 100 | ||
101 | dbg_hid("sending %*ph\n", 7, data); | 101 | dbg_hid("sending %7ph\n", data); |
102 | 102 | ||
103 | hid_hw_request(hid, holtekff->field->report, HID_REQ_SET_REPORT); | 103 | hid_hw_request(hid, holtekff->field->report, HID_REQ_SET_REPORT); |
104 | } | 104 | } |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index ffe4c7ae3340..e60e8d530697 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -135,9 +135,9 @@ | |||
135 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b | 135 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b |
136 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 | 136 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 |
137 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 | 137 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 |
138 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0291 | 138 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 |
139 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0292 | 139 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 |
140 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0293 | 140 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 |
141 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | 141 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
142 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | 142 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
143 | #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 | 143 | #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 |
@@ -482,6 +482,7 @@ | |||
482 | #define USB_VENDOR_ID_KYE 0x0458 | 482 | #define USB_VENDOR_ID_KYE 0x0458 |
483 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 | 483 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 |
484 | #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 | 484 | #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 |
485 | #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 | ||
485 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 | 486 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 |
486 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 | 487 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 |
487 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 | 488 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 |
@@ -658,6 +659,7 @@ | |||
658 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 | 659 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 |
659 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 | 660 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 |
660 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 | 661 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 |
662 | #define USB_DEVICE_ID_NTRIG_DUOSENSE 0x1500 | ||
661 | 663 | ||
662 | #define USB_VENDOR_ID_ONTRAK 0x0a07 | 664 | #define USB_VENDOR_ID_ONTRAK 0x0a07 |
663 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 | 665 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 |
@@ -716,6 +718,7 @@ | |||
716 | #define USB_DEVICE_ID_ROCCAT_KONE 0x2ced | 718 | #define USB_DEVICE_ID_ROCCAT_KONE 0x2ced |
717 | #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51 | 719 | #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51 |
718 | #define USB_DEVICE_ID_ROCCAT_KONEPURE 0x2dbe | 720 | #define USB_DEVICE_ID_ROCCAT_KONEPURE 0x2dbe |
721 | #define USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL 0x2db4 | ||
719 | #define USB_DEVICE_ID_ROCCAT_KONEXTD 0x2e22 | 722 | #define USB_DEVICE_ID_ROCCAT_KONEXTD 0x2e22 |
720 | #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50 | 723 | #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50 |
721 | #define USB_DEVICE_ID_ROCCAT_LUA 0x2c2e | 724 | #define USB_DEVICE_ID_ROCCAT_LUA 0x2c2e |
@@ -887,6 +890,9 @@ | |||
887 | #define USB_VENDOR_ID_XAT 0x2505 | 890 | #define USB_VENDOR_ID_XAT 0x2505 |
888 | #define USB_DEVICE_ID_XAT_CSR 0x0220 | 891 | #define USB_DEVICE_ID_XAT_CSR 0x0220 |
889 | 892 | ||
893 | #define USB_VENDOR_ID_XIN_MO 0x16c0 | ||
894 | #define USB_DEVICE_ID_XIN_MO_DUAL_ARCADE 0x05e1 | ||
895 | |||
890 | #define USB_VENDOR_ID_XIROKU 0x1477 | 896 | #define USB_VENDOR_ID_XIROKU 0x1477 |
891 | #define USB_DEVICE_ID_XIROKU_SPX 0x1006 | 897 | #define USB_DEVICE_ID_XIROKU_SPX 0x1006 |
892 | #define USB_DEVICE_ID_XIROKU_MPX 0x1007 | 898 | #define USB_DEVICE_ID_XIROKU_MPX 0x1007 |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 7480799e535c..b420f4a0fd28 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -340,7 +340,7 @@ static int hidinput_get_battery_property(struct power_supply *psy, | |||
340 | { | 340 | { |
341 | struct hid_device *dev = container_of(psy, struct hid_device, battery); | 341 | struct hid_device *dev = container_of(psy, struct hid_device, battery); |
342 | int ret = 0; | 342 | int ret = 0; |
343 | __u8 buf[2] = {}; | 343 | __u8 *buf; |
344 | 344 | ||
345 | switch (prop) { | 345 | switch (prop) { |
346 | case POWER_SUPPLY_PROP_PRESENT: | 346 | case POWER_SUPPLY_PROP_PRESENT: |
@@ -349,12 +349,19 @@ static int hidinput_get_battery_property(struct power_supply *psy, | |||
349 | break; | 349 | break; |
350 | 350 | ||
351 | case POWER_SUPPLY_PROP_CAPACITY: | 351 | case POWER_SUPPLY_PROP_CAPACITY: |
352 | |||
353 | buf = kmalloc(2 * sizeof(__u8), GFP_KERNEL); | ||
354 | if (!buf) { | ||
355 | ret = -ENOMEM; | ||
356 | break; | ||
357 | } | ||
352 | ret = dev->hid_get_raw_report(dev, dev->battery_report_id, | 358 | ret = dev->hid_get_raw_report(dev, dev->battery_report_id, |
353 | buf, sizeof(buf), | 359 | buf, 2, |
354 | dev->battery_report_type); | 360 | dev->battery_report_type); |
355 | 361 | ||
356 | if (ret != 2) { | 362 | if (ret != 2) { |
357 | ret = -ENODATA; | 363 | ret = -ENODATA; |
364 | kfree(buf); | ||
358 | break; | 365 | break; |
359 | } | 366 | } |
360 | ret = 0; | 367 | ret = 0; |
@@ -364,6 +371,7 @@ static int hidinput_get_battery_property(struct power_supply *psy, | |||
364 | buf[1] <= dev->battery_max) | 371 | buf[1] <= dev->battery_max) |
365 | val->intval = (100 * (buf[1] - dev->battery_min)) / | 372 | val->intval = (100 * (buf[1] - dev->battery_min)) / |
366 | (dev->battery_max - dev->battery_min); | 373 | (dev->battery_max - dev->battery_min); |
374 | kfree(buf); | ||
367 | break; | 375 | break; |
368 | 376 | ||
369 | case POWER_SUPPLY_PROP_MODEL_NAME: | 377 | case POWER_SUPPLY_PROP_MODEL_NAME: |
@@ -1137,6 +1145,74 @@ unsigned int hidinput_count_leds(struct hid_device *hid) | |||
1137 | } | 1145 | } |
1138 | EXPORT_SYMBOL_GPL(hidinput_count_leds); | 1146 | EXPORT_SYMBOL_GPL(hidinput_count_leds); |
1139 | 1147 | ||
1148 | static void hidinput_led_worker(struct work_struct *work) | ||
1149 | { | ||
1150 | struct hid_device *hid = container_of(work, struct hid_device, | ||
1151 | led_work); | ||
1152 | struct hid_field *field; | ||
1153 | struct hid_report *report; | ||
1154 | int len; | ||
1155 | __u8 *buf; | ||
1156 | |||
1157 | field = hidinput_get_led_field(hid); | ||
1158 | if (!field) | ||
1159 | return; | ||
1160 | |||
1161 | /* | ||
1162 | * field->report is accessed unlocked regarding HID core. So there might | ||
1163 | * be another incoming SET-LED request from user-space, which changes | ||
1164 | * the LED state while we assemble our outgoing buffer. However, this | ||
1165 | * doesn't matter as hid_output_report() correctly converts it into a | ||
1166 | * boolean value no matter what information is currently set on the LED | ||
1167 | * field (even garbage). So the remote device will always get a valid | ||
1168 | * request. | ||
1169 | * And in case we send a wrong value, a next led worker is spawned | ||
1170 | * for every SET-LED request so the following worker will send the | ||
1171 | * correct value, guaranteed! | ||
1172 | */ | ||
1173 | |||
1174 | report = field->report; | ||
1175 | |||
1176 | /* use custom SET_REPORT request if possible (asynchronous) */ | ||
1177 | if (hid->ll_driver->request) | ||
1178 | return hid->ll_driver->request(hid, report, HID_REQ_SET_REPORT); | ||
1179 | |||
1180 | /* fall back to generic raw-output-report */ | ||
1181 | len = ((report->size - 1) >> 3) + 1 + (report->id > 0); | ||
1182 | buf = kmalloc(len, GFP_KERNEL); | ||
1183 | if (!buf) | ||
1184 | return; | ||
1185 | |||
1186 | hid_output_report(report, buf); | ||
1187 | /* synchronous output report */ | ||
1188 | hid->hid_output_raw_report(hid, buf, len, HID_OUTPUT_REPORT); | ||
1189 | kfree(buf); | ||
1190 | } | ||
1191 | |||
1192 | static int hidinput_input_event(struct input_dev *dev, unsigned int type, | ||
1193 | unsigned int code, int value) | ||
1194 | { | ||
1195 | struct hid_device *hid = input_get_drvdata(dev); | ||
1196 | struct hid_field *field; | ||
1197 | int offset; | ||
1198 | |||
1199 | if (type == EV_FF) | ||
1200 | return input_ff_event(dev, type, code, value); | ||
1201 | |||
1202 | if (type != EV_LED) | ||
1203 | return -1; | ||
1204 | |||
1205 | if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) { | ||
1206 | hid_warn(dev, "event field not found\n"); | ||
1207 | return -1; | ||
1208 | } | ||
1209 | |||
1210 | hid_set_field(field, offset, value); | ||
1211 | |||
1212 | schedule_work(&hid->led_work); | ||
1213 | return 0; | ||
1214 | } | ||
1215 | |||
1140 | static int hidinput_open(struct input_dev *dev) | 1216 | static int hidinput_open(struct input_dev *dev) |
1141 | { | 1217 | { |
1142 | struct hid_device *hid = input_get_drvdata(dev); | 1218 | struct hid_device *hid = input_get_drvdata(dev); |
@@ -1183,7 +1259,10 @@ static struct hid_input *hidinput_allocate(struct hid_device *hid) | |||
1183 | } | 1259 | } |
1184 | 1260 | ||
1185 | input_set_drvdata(input_dev, hid); | 1261 | input_set_drvdata(input_dev, hid); |
1186 | input_dev->event = hid->ll_driver->hidinput_input_event; | 1262 | if (hid->ll_driver->hidinput_input_event) |
1263 | input_dev->event = hid->ll_driver->hidinput_input_event; | ||
1264 | else if (hid->ll_driver->request || hid->hid_output_raw_report) | ||
1265 | input_dev->event = hidinput_input_event; | ||
1187 | input_dev->open = hidinput_open; | 1266 | input_dev->open = hidinput_open; |
1188 | input_dev->close = hidinput_close; | 1267 | input_dev->close = hidinput_close; |
1189 | input_dev->setkeycode = hidinput_setkeycode; | 1268 | input_dev->setkeycode = hidinput_setkeycode; |
@@ -1278,6 +1357,7 @@ int hidinput_connect(struct hid_device *hid, unsigned int force) | |||
1278 | int i, j, k; | 1357 | int i, j, k; |
1279 | 1358 | ||
1280 | INIT_LIST_HEAD(&hid->inputs); | 1359 | INIT_LIST_HEAD(&hid->inputs); |
1360 | INIT_WORK(&hid->led_work, hidinput_led_worker); | ||
1281 | 1361 | ||
1282 | if (!force) { | 1362 | if (!force) { |
1283 | for (i = 0; i < hid->maxcollection; i++) { | 1363 | for (i = 0; i < hid->maxcollection; i++) { |
@@ -1379,6 +1459,12 @@ void hidinput_disconnect(struct hid_device *hid) | |||
1379 | input_unregister_device(hidinput->input); | 1459 | input_unregister_device(hidinput->input); |
1380 | kfree(hidinput); | 1460 | kfree(hidinput); |
1381 | } | 1461 | } |
1462 | |||
1463 | /* led_work is spawned by input_dev callbacks, but doesn't access the | ||
1464 | * parent input_dev at all. Once all input devices are removed, we | ||
1465 | * know that led_work will never get restarted, so we can cancel it | ||
1466 | * synchronously and are safe. */ | ||
1467 | cancel_work_sync(&hid->led_work); | ||
1382 | } | 1468 | } |
1383 | EXPORT_SYMBOL_GPL(hidinput_disconnect); | 1469 | EXPORT_SYMBOL_GPL(hidinput_disconnect); |
1384 | 1470 | ||
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index 1e2ee2aa84a0..73845120295e 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c | |||
@@ -268,6 +268,26 @@ static __u8 easypen_m610x_rdesc_fixed[] = { | |||
268 | 0xC0 /* End Collection */ | 268 | 0xC0 /* End Collection */ |
269 | }; | 269 | }; |
270 | 270 | ||
271 | static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, | ||
272 | unsigned int *rsize, int offset, const char *device_name) { | ||
273 | /* | ||
274 | * the fixup that need to be done: | ||
275 | * - change Usage Maximum in the Comsumer Control | ||
276 | * (report ID 3) to a reasonable value | ||
277 | */ | ||
278 | if (*rsize >= offset + 31 && | ||
279 | /* Usage Page (Consumer Devices) */ | ||
280 | rdesc[offset] == 0x05 && rdesc[offset + 1] == 0x0c && | ||
281 | /* Usage (Consumer Control) */ | ||
282 | rdesc[offset + 2] == 0x09 && rdesc[offset + 3] == 0x01 && | ||
283 | /* Usage Maximum > 12287 */ | ||
284 | rdesc[offset + 10] == 0x2a && rdesc[offset + 12] > 0x2f) { | ||
285 | hid_info(hdev, "fixing up %s report descriptor\n", device_name); | ||
286 | rdesc[offset + 12] = 0x2f; | ||
287 | } | ||
288 | return rdesc; | ||
289 | } | ||
290 | |||
271 | static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 291 | static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
272 | unsigned int *rsize) | 292 | unsigned int *rsize) |
273 | { | 293 | { |
@@ -315,23 +335,12 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
315 | } | 335 | } |
316 | break; | 336 | break; |
317 | case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: | 337 | case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: |
318 | /* | 338 | rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, |
319 | * the fixup that need to be done: | 339 | "Genius Gila Gaming Mouse"); |
320 | * - change Usage Maximum in the Comsumer Control | 340 | break; |
321 | * (report ID 3) to a reasonable value | 341 | case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: |
322 | */ | 342 | rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, |
323 | if (*rsize >= 135 && | 343 | "Genius Gx Imperator Keyboard"); |
324 | /* Usage Page (Consumer Devices) */ | ||
325 | rdesc[104] == 0x05 && rdesc[105] == 0x0c && | ||
326 | /* Usage (Consumer Control) */ | ||
327 | rdesc[106] == 0x09 && rdesc[107] == 0x01 && | ||
328 | /* Usage Maximum > 12287 */ | ||
329 | rdesc[114] == 0x2a && rdesc[116] > 0x2f) { | ||
330 | hid_info(hdev, | ||
331 | "fixing up Genius Gila Gaming Mouse " | ||
332 | "report descriptor\n"); | ||
333 | rdesc[116] = 0x2f; | ||
334 | } | ||
335 | break; | 344 | break; |
336 | } | 345 | } |
337 | return rdesc; | 346 | return rdesc; |
@@ -428,6 +437,8 @@ static const struct hid_device_id kye_devices[] = { | |||
428 | USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 437 | USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
429 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | 438 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
430 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, | 439 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
440 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | ||
441 | USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, | ||
431 | { } | 442 | { } |
432 | }; | 443 | }; |
433 | MODULE_DEVICE_TABLE(hid, kye_devices); | 444 | MODULE_DEVICE_TABLE(hid, kye_devices); |
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index cd33084c7860..7800b1410562 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
@@ -619,7 +619,7 @@ static int logi_dj_ll_input_event(struct input_dev *dev, unsigned int type, | |||
619 | 619 | ||
620 | struct hid_field *field; | 620 | struct hid_field *field; |
621 | struct hid_report *report; | 621 | struct hid_report *report; |
622 | unsigned char data[8]; | 622 | unsigned char *data; |
623 | int offset; | 623 | int offset; |
624 | 624 | ||
625 | dbg_hid("%s: %s, type:%d | code:%d | value:%d\n", | 625 | dbg_hid("%s: %s, type:%d | code:%d | value:%d\n", |
@@ -635,6 +635,13 @@ static int logi_dj_ll_input_event(struct input_dev *dev, unsigned int type, | |||
635 | return -1; | 635 | return -1; |
636 | } | 636 | } |
637 | hid_set_field(field, offset, value); | 637 | hid_set_field(field, offset, value); |
638 | |||
639 | data = hid_alloc_report_buf(field->report, GFP_ATOMIC); | ||
640 | if (!data) { | ||
641 | dev_warn(&dev->dev, "failed to allocate report buf memory\n"); | ||
642 | return -1; | ||
643 | } | ||
644 | |||
638 | hid_output_report(field->report, &data[0]); | 645 | hid_output_report(field->report, &data[0]); |
639 | 646 | ||
640 | output_report_enum = &dj_rcv_hiddev->report_enum[HID_OUTPUT_REPORT]; | 647 | output_report_enum = &dj_rcv_hiddev->report_enum[HID_OUTPUT_REPORT]; |
@@ -645,8 +652,9 @@ static int logi_dj_ll_input_event(struct input_dev *dev, unsigned int type, | |||
645 | 652 | ||
646 | hid_hw_request(dj_rcv_hiddev, report, HID_REQ_SET_REPORT); | 653 | hid_hw_request(dj_rcv_hiddev, report, HID_REQ_SET_REPORT); |
647 | 654 | ||
648 | return 0; | 655 | kfree(data); |
649 | 656 | ||
657 | return 0; | ||
650 | } | 658 | } |
651 | 659 | ||
652 | static int logi_dj_ll_start(struct hid_device *hid) | 660 | static int logi_dj_ll_start(struct hid_device *hid) |
@@ -801,10 +809,10 @@ static int logi_dj_probe(struct hid_device *hdev, | |||
801 | } | 809 | } |
802 | 810 | ||
803 | /* This is enabling the polling urb on the IN endpoint */ | 811 | /* This is enabling the polling urb on the IN endpoint */ |
804 | retval = hdev->ll_driver->open(hdev); | 812 | retval = hid_hw_open(hdev); |
805 | if (retval < 0) { | 813 | if (retval < 0) { |
806 | dev_err(&hdev->dev, "%s:hdev->ll_driver->open returned " | 814 | dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n", |
807 | "error:%d\n", __func__, retval); | 815 | __func__, retval); |
808 | goto llopen_failed; | 816 | goto llopen_failed; |
809 | } | 817 | } |
810 | 818 | ||
@@ -821,7 +829,7 @@ static int logi_dj_probe(struct hid_device *hdev, | |||
821 | return retval; | 829 | return retval; |
822 | 830 | ||
823 | logi_dj_recv_query_paired_devices_failed: | 831 | logi_dj_recv_query_paired_devices_failed: |
824 | hdev->ll_driver->close(hdev); | 832 | hid_hw_close(hdev); |
825 | 833 | ||
826 | llopen_failed: | 834 | llopen_failed: |
827 | switch_to_dj_mode_fail: | 835 | switch_to_dj_mode_fail: |
@@ -863,7 +871,7 @@ static void logi_dj_remove(struct hid_device *hdev) | |||
863 | 871 | ||
864 | cancel_work_sync(&djrcv_dev->work); | 872 | cancel_work_sync(&djrcv_dev->work); |
865 | 873 | ||
866 | hdev->ll_driver->close(hdev); | 874 | hid_hw_close(hdev); |
867 | hid_hw_stop(hdev); | 875 | hid_hw_stop(hdev); |
868 | 876 | ||
869 | /* I suppose that at this point the only context that can access | 877 | /* I suppose that at this point the only context that can access |
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c index 5bc37343eb22..3b43d1cfa936 100644 --- a/drivers/hid/hid-magicmouse.c +++ b/drivers/hid/hid-magicmouse.c | |||
@@ -36,7 +36,7 @@ MODULE_PARM_DESC(emulate_scroll_wheel, "Emulate a scroll wheel"); | |||
36 | static unsigned int scroll_speed = 32; | 36 | static unsigned int scroll_speed = 32; |
37 | static int param_set_scroll_speed(const char *val, struct kernel_param *kp) { | 37 | static int param_set_scroll_speed(const char *val, struct kernel_param *kp) { |
38 | unsigned long speed; | 38 | unsigned long speed; |
39 | if (!val || strict_strtoul(val, 0, &speed) || speed > 63) | 39 | if (!val || kstrtoul(val, 0, &speed) || speed > 63) |
40 | return -EINVAL; | 40 | return -EINVAL; |
41 | scroll_speed = speed; | 41 | scroll_speed = speed; |
42 | return 0; | 42 | return 0; |
@@ -484,7 +484,7 @@ static int magicmouse_probe(struct hid_device *hdev, | |||
484 | struct hid_report *report; | 484 | struct hid_report *report; |
485 | int ret; | 485 | int ret; |
486 | 486 | ||
487 | msc = kzalloc(sizeof(*msc), GFP_KERNEL); | 487 | msc = devm_kzalloc(&hdev->dev, sizeof(*msc), GFP_KERNEL); |
488 | if (msc == NULL) { | 488 | if (msc == NULL) { |
489 | hid_err(hdev, "can't alloc magicmouse descriptor\n"); | 489 | hid_err(hdev, "can't alloc magicmouse descriptor\n"); |
490 | return -ENOMEM; | 490 | return -ENOMEM; |
@@ -498,13 +498,13 @@ static int magicmouse_probe(struct hid_device *hdev, | |||
498 | ret = hid_parse(hdev); | 498 | ret = hid_parse(hdev); |
499 | if (ret) { | 499 | if (ret) { |
500 | hid_err(hdev, "magicmouse hid parse failed\n"); | 500 | hid_err(hdev, "magicmouse hid parse failed\n"); |
501 | goto err_free; | 501 | return ret; |
502 | } | 502 | } |
503 | 503 | ||
504 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 504 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
505 | if (ret) { | 505 | if (ret) { |
506 | hid_err(hdev, "magicmouse hw start failed\n"); | 506 | hid_err(hdev, "magicmouse hw start failed\n"); |
507 | goto err_free; | 507 | return ret; |
508 | } | 508 | } |
509 | 509 | ||
510 | if (!msc->input) { | 510 | if (!msc->input) { |
@@ -548,19 +548,9 @@ static int magicmouse_probe(struct hid_device *hdev, | |||
548 | return 0; | 548 | return 0; |
549 | err_stop_hw: | 549 | err_stop_hw: |
550 | hid_hw_stop(hdev); | 550 | hid_hw_stop(hdev); |
551 | err_free: | ||
552 | kfree(msc); | ||
553 | return ret; | 551 | return ret; |
554 | } | 552 | } |
555 | 553 | ||
556 | static void magicmouse_remove(struct hid_device *hdev) | ||
557 | { | ||
558 | struct magicmouse_sc *msc = hid_get_drvdata(hdev); | ||
559 | |||
560 | hid_hw_stop(hdev); | ||
561 | kfree(msc); | ||
562 | } | ||
563 | |||
564 | static const struct hid_device_id magic_mice[] = { | 554 | static const struct hid_device_id magic_mice[] = { |
565 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, | 555 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
566 | USB_DEVICE_ID_APPLE_MAGICMOUSE), .driver_data = 0 }, | 556 | USB_DEVICE_ID_APPLE_MAGICMOUSE), .driver_data = 0 }, |
@@ -574,7 +564,6 @@ static struct hid_driver magicmouse_driver = { | |||
574 | .name = "magicmouse", | 564 | .name = "magicmouse", |
575 | .id_table = magic_mice, | 565 | .id_table = magic_mice, |
576 | .probe = magicmouse_probe, | 566 | .probe = magicmouse_probe, |
577 | .remove = magicmouse_remove, | ||
578 | .raw_event = magicmouse_raw_event, | 567 | .raw_event = magicmouse_raw_event, |
579 | .input_mapping = magicmouse_input_mapping, | 568 | .input_mapping = magicmouse_input_mapping, |
580 | .input_configured = magicmouse_input_configured, | 569 | .input_configured = magicmouse_input_configured, |
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index cb0e361d7a4b..ac28f08c3866 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
@@ -133,6 +133,7 @@ static void mt_post_parse(struct mt_device *td); | |||
133 | #define MT_CLS_NSMU 0x000a | 133 | #define MT_CLS_NSMU 0x000a |
134 | #define MT_CLS_DUAL_CONTACT_NUMBER 0x0010 | 134 | #define MT_CLS_DUAL_CONTACT_NUMBER 0x0010 |
135 | #define MT_CLS_DUAL_CONTACT_ID 0x0011 | 135 | #define MT_CLS_DUAL_CONTACT_ID 0x0011 |
136 | #define MT_CLS_WIN_8 0x0012 | ||
136 | 137 | ||
137 | /* vendor specific classes */ | 138 | /* vendor specific classes */ |
138 | #define MT_CLS_3M 0x0101 | 139 | #define MT_CLS_3M 0x0101 |
@@ -205,6 +206,11 @@ static struct mt_class mt_classes[] = { | |||
205 | MT_QUIRK_CONTACT_CNT_ACCURATE | | 206 | MT_QUIRK_CONTACT_CNT_ACCURATE | |
206 | MT_QUIRK_SLOT_IS_CONTACTID, | 207 | MT_QUIRK_SLOT_IS_CONTACTID, |
207 | .maxcontacts = 2 }, | 208 | .maxcontacts = 2 }, |
209 | { .name = MT_CLS_WIN_8, | ||
210 | .quirks = MT_QUIRK_ALWAYS_VALID | | ||
211 | MT_QUIRK_IGNORE_DUPLICATES | | ||
212 | MT_QUIRK_HOVERING | | ||
213 | MT_QUIRK_CONTACT_CNT_ACCURATE }, | ||
208 | 214 | ||
209 | /* | 215 | /* |
210 | * vendor specific classes | 216 | * vendor specific classes |
@@ -261,17 +267,6 @@ static struct mt_class mt_classes[] = { | |||
261 | { } | 267 | { } |
262 | }; | 268 | }; |
263 | 269 | ||
264 | static void mt_free_input_name(struct hid_input *hi) | ||
265 | { | ||
266 | struct hid_device *hdev = hi->report->device; | ||
267 | const char *name = hi->input->name; | ||
268 | |||
269 | if (name != hdev->name) { | ||
270 | hi->input->name = hdev->name; | ||
271 | kfree(name); | ||
272 | } | ||
273 | } | ||
274 | |||
275 | static ssize_t mt_show_quirks(struct device *dev, | 270 | static ssize_t mt_show_quirks(struct device *dev, |
276 | struct device_attribute *attr, | 271 | struct device_attribute *attr, |
277 | char *buf) | 272 | char *buf) |
@@ -343,19 +338,6 @@ static void mt_feature_mapping(struct hid_device *hdev, | |||
343 | td->maxcontacts = td->mtclass.maxcontacts; | 338 | td->maxcontacts = td->mtclass.maxcontacts; |
344 | 339 | ||
345 | break; | 340 | break; |
346 | case 0xff0000c5: | ||
347 | if (field->report_count == 256 && field->report_size == 8) { | ||
348 | /* Win 8 devices need special quirks */ | ||
349 | __s32 *quirks = &td->mtclass.quirks; | ||
350 | *quirks |= MT_QUIRK_ALWAYS_VALID; | ||
351 | *quirks |= MT_QUIRK_IGNORE_DUPLICATES; | ||
352 | *quirks |= MT_QUIRK_HOVERING; | ||
353 | *quirks |= MT_QUIRK_CONTACT_CNT_ACCURATE; | ||
354 | *quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP; | ||
355 | *quirks &= ~MT_QUIRK_VALID_IS_INRANGE; | ||
356 | *quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE; | ||
357 | } | ||
358 | break; | ||
359 | } | 341 | } |
360 | } | 342 | } |
361 | 343 | ||
@@ -415,13 +397,6 @@ static void mt_pen_report(struct hid_device *hid, struct hid_report *report) | |||
415 | static void mt_pen_input_configured(struct hid_device *hdev, | 397 | static void mt_pen_input_configured(struct hid_device *hdev, |
416 | struct hid_input *hi) | 398 | struct hid_input *hi) |
417 | { | 399 | { |
418 | char *name = kzalloc(strlen(hi->input->name) + 5, GFP_KERNEL); | ||
419 | if (name) { | ||
420 | sprintf(name, "%s Pen", hi->input->name); | ||
421 | mt_free_input_name(hi); | ||
422 | hi->input->name = name; | ||
423 | } | ||
424 | |||
425 | /* force BTN_STYLUS to allow tablet matching in udev */ | 400 | /* force BTN_STYLUS to allow tablet matching in udev */ |
426 | __set_bit(BTN_STYLUS, hi->input->keybit); | 401 | __set_bit(BTN_STYLUS, hi->input->keybit); |
427 | } | 402 | } |
@@ -928,16 +903,26 @@ static void mt_post_parse(struct mt_device *td) | |||
928 | static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi) | 903 | static void mt_input_configured(struct hid_device *hdev, struct hid_input *hi) |
929 | { | 904 | { |
930 | struct mt_device *td = hid_get_drvdata(hdev); | 905 | struct mt_device *td = hid_get_drvdata(hdev); |
931 | char *name = kstrdup(hdev->name, GFP_KERNEL); | 906 | char *name; |
932 | 907 | const char *suffix = NULL; | |
933 | if (name) | ||
934 | hi->input->name = name; | ||
935 | 908 | ||
936 | if (hi->report->id == td->mt_report_id) | 909 | if (hi->report->id == td->mt_report_id) |
937 | mt_touch_input_configured(hdev, hi); | 910 | mt_touch_input_configured(hdev, hi); |
938 | 911 | ||
939 | if (hi->report->id == td->pen_report_id) | 912 | if (hi->report->field[0]->physical == HID_DG_STYLUS) { |
913 | suffix = "Pen"; | ||
940 | mt_pen_input_configured(hdev, hi); | 914 | mt_pen_input_configured(hdev, hi); |
915 | } | ||
916 | |||
917 | if (suffix) { | ||
918 | name = devm_kzalloc(&hi->input->dev, | ||
919 | strlen(hdev->name) + strlen(suffix) + 2, | ||
920 | GFP_KERNEL); | ||
921 | if (name) { | ||
922 | sprintf(name, "%s %s", hdev->name, suffix); | ||
923 | hi->input->name = name; | ||
924 | } | ||
925 | } | ||
941 | } | 926 | } |
942 | 927 | ||
943 | static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | 928 | static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) |
@@ -945,7 +930,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
945 | int ret, i; | 930 | int ret, i; |
946 | struct mt_device *td; | 931 | struct mt_device *td; |
947 | struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ | 932 | struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ |
948 | struct hid_input *hi; | ||
949 | 933 | ||
950 | for (i = 0; mt_classes[i].name ; i++) { | 934 | for (i = 0; mt_classes[i].name ; i++) { |
951 | if (id->driver_data == mt_classes[i].name) { | 935 | if (id->driver_data == mt_classes[i].name) { |
@@ -967,7 +951,19 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
967 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; | 951 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
968 | hdev->quirks |= HID_QUIRK_NO_EMPTY_INPUT; | 952 | hdev->quirks |= HID_QUIRK_NO_EMPTY_INPUT; |
969 | 953 | ||
970 | td = kzalloc(sizeof(struct mt_device), GFP_KERNEL); | 954 | /* |
955 | * Handle special quirks for Windows 8 certified devices. | ||
956 | */ | ||
957 | if (id->group == HID_GROUP_MULTITOUCH_WIN_8) | ||
958 | /* | ||
959 | * Some multitouch screens do not like to be polled for input | ||
960 | * reports. Fortunately, the Win8 spec says that all touches | ||
961 | * should be sent during each report, making the initialization | ||
962 | * of input reports unnecessary. | ||
963 | */ | ||
964 | hdev->quirks |= HID_QUIRK_NO_INIT_INPUT_REPORTS; | ||
965 | |||
966 | td = devm_kzalloc(&hdev->dev, sizeof(struct mt_device), GFP_KERNEL); | ||
971 | if (!td) { | 967 | if (!td) { |
972 | dev_err(&hdev->dev, "cannot allocate multitouch data\n"); | 968 | dev_err(&hdev->dev, "cannot allocate multitouch data\n"); |
973 | return -ENOMEM; | 969 | return -ENOMEM; |
@@ -980,11 +976,11 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
980 | td->pen_report_id = -1; | 976 | td->pen_report_id = -1; |
981 | hid_set_drvdata(hdev, td); | 977 | hid_set_drvdata(hdev, td); |
982 | 978 | ||
983 | td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL); | 979 | td->fields = devm_kzalloc(&hdev->dev, sizeof(struct mt_fields), |
980 | GFP_KERNEL); | ||
984 | if (!td->fields) { | 981 | if (!td->fields) { |
985 | dev_err(&hdev->dev, "cannot allocate multitouch fields data\n"); | 982 | dev_err(&hdev->dev, "cannot allocate multitouch fields data\n"); |
986 | ret = -ENOMEM; | 983 | return -ENOMEM; |
987 | goto fail; | ||
988 | } | 984 | } |
989 | 985 | ||
990 | if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID) | 986 | if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID) |
@@ -992,29 +988,22 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
992 | 988 | ||
993 | ret = hid_parse(hdev); | 989 | ret = hid_parse(hdev); |
994 | if (ret != 0) | 990 | if (ret != 0) |
995 | goto fail; | 991 | return ret; |
996 | 992 | ||
997 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 993 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
998 | if (ret) | 994 | if (ret) |
999 | goto hid_fail; | 995 | return ret; |
1000 | 996 | ||
1001 | ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group); | 997 | ret = sysfs_create_group(&hdev->dev.kobj, &mt_attribute_group); |
1002 | 998 | ||
1003 | mt_set_maxcontacts(hdev); | 999 | mt_set_maxcontacts(hdev); |
1004 | mt_set_input_mode(hdev); | 1000 | mt_set_input_mode(hdev); |
1005 | 1001 | ||
1006 | kfree(td->fields); | 1002 | /* release .fields memory as it is not used anymore */ |
1003 | devm_kfree(&hdev->dev, td->fields); | ||
1007 | td->fields = NULL; | 1004 | td->fields = NULL; |
1008 | 1005 | ||
1009 | return 0; | 1006 | return 0; |
1010 | |||
1011 | hid_fail: | ||
1012 | list_for_each_entry(hi, &hdev->inputs, list) | ||
1013 | mt_free_input_name(hi); | ||
1014 | fail: | ||
1015 | kfree(td->fields); | ||
1016 | kfree(td); | ||
1017 | return ret; | ||
1018 | } | 1007 | } |
1019 | 1008 | ||
1020 | #ifdef CONFIG_PM | 1009 | #ifdef CONFIG_PM |
@@ -1039,17 +1028,8 @@ static int mt_resume(struct hid_device *hdev) | |||
1039 | 1028 | ||
1040 | static void mt_remove(struct hid_device *hdev) | 1029 | static void mt_remove(struct hid_device *hdev) |
1041 | { | 1030 | { |
1042 | struct mt_device *td = hid_get_drvdata(hdev); | ||
1043 | struct hid_input *hi; | ||
1044 | |||
1045 | sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group); | 1031 | sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group); |
1046 | list_for_each_entry(hi, &hdev->inputs, list) | ||
1047 | mt_free_input_name(hi); | ||
1048 | |||
1049 | hid_hw_stop(hdev); | 1032 | hid_hw_stop(hdev); |
1050 | |||
1051 | kfree(td); | ||
1052 | hid_set_drvdata(hdev, NULL); | ||
1053 | } | 1033 | } |
1054 | 1034 | ||
1055 | static const struct hid_device_id mt_devices[] = { | 1035 | static const struct hid_device_id mt_devices[] = { |
@@ -1371,6 +1351,11 @@ static const struct hid_device_id mt_devices[] = { | |||
1371 | 1351 | ||
1372 | /* Generic MT device */ | 1352 | /* Generic MT device */ |
1373 | { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) }, | 1353 | { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) }, |
1354 | |||
1355 | /* Generic Win 8 certified MT device */ | ||
1356 | { .driver_data = MT_CLS_WIN_8, | ||
1357 | HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH_WIN_8, | ||
1358 | HID_ANY_ID, HID_ANY_ID) }, | ||
1374 | { } | 1359 | { } |
1375 | }; | 1360 | }; |
1376 | MODULE_DEVICE_TABLE(hid, mt_devices); | 1361 | MODULE_DEVICE_TABLE(hid, mt_devices); |
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index ef95102515e4..600f2075512f 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
@@ -115,7 +115,8 @@ static inline int ntrig_get_mode(struct hid_device *hdev) | |||
115 | struct hid_report *report = hdev->report_enum[HID_FEATURE_REPORT]. | 115 | struct hid_report *report = hdev->report_enum[HID_FEATURE_REPORT]. |
116 | report_id_hash[0x0d]; | 116 | report_id_hash[0x0d]; |
117 | 117 | ||
118 | if (!report) | 118 | if (!report || report->maxfield < 1 || |
119 | report->field[0]->report_count < 1) | ||
119 | return -EINVAL; | 120 | return -EINVAL; |
120 | 121 | ||
121 | hid_hw_request(hdev, report, HID_REQ_GET_REPORT); | 122 | hid_hw_request(hdev, report, HID_REQ_GET_REPORT); |
@@ -237,7 +238,7 @@ static ssize_t set_min_width(struct device *dev, | |||
237 | 238 | ||
238 | unsigned long val; | 239 | unsigned long val; |
239 | 240 | ||
240 | if (strict_strtoul(buf, 0, &val)) | 241 | if (kstrtoul(buf, 0, &val)) |
241 | return -EINVAL; | 242 | return -EINVAL; |
242 | 243 | ||
243 | if (val > nd->sensor_physical_width) | 244 | if (val > nd->sensor_physical_width) |
@@ -272,7 +273,7 @@ static ssize_t set_min_height(struct device *dev, | |||
272 | 273 | ||
273 | unsigned long val; | 274 | unsigned long val; |
274 | 275 | ||
275 | if (strict_strtoul(buf, 0, &val)) | 276 | if (kstrtoul(buf, 0, &val)) |
276 | return -EINVAL; | 277 | return -EINVAL; |
277 | 278 | ||
278 | if (val > nd->sensor_physical_height) | 279 | if (val > nd->sensor_physical_height) |
@@ -306,7 +307,7 @@ static ssize_t set_activate_slack(struct device *dev, | |||
306 | 307 | ||
307 | unsigned long val; | 308 | unsigned long val; |
308 | 309 | ||
309 | if (strict_strtoul(buf, 0, &val)) | 310 | if (kstrtoul(buf, 0, &val)) |
310 | return -EINVAL; | 311 | return -EINVAL; |
311 | 312 | ||
312 | if (val > 0x7f) | 313 | if (val > 0x7f) |
@@ -341,7 +342,7 @@ static ssize_t set_activation_width(struct device *dev, | |||
341 | 342 | ||
342 | unsigned long val; | 343 | unsigned long val; |
343 | 344 | ||
344 | if (strict_strtoul(buf, 0, &val)) | 345 | if (kstrtoul(buf, 0, &val)) |
345 | return -EINVAL; | 346 | return -EINVAL; |
346 | 347 | ||
347 | if (val > nd->sensor_physical_width) | 348 | if (val > nd->sensor_physical_width) |
@@ -377,7 +378,7 @@ static ssize_t set_activation_height(struct device *dev, | |||
377 | 378 | ||
378 | unsigned long val; | 379 | unsigned long val; |
379 | 380 | ||
380 | if (strict_strtoul(buf, 0, &val)) | 381 | if (kstrtoul(buf, 0, &val)) |
381 | return -EINVAL; | 382 | return -EINVAL; |
382 | 383 | ||
383 | if (val > nd->sensor_physical_height) | 384 | if (val > nd->sensor_physical_height) |
@@ -411,7 +412,7 @@ static ssize_t set_deactivate_slack(struct device *dev, | |||
411 | 412 | ||
412 | unsigned long val; | 413 | unsigned long val; |
413 | 414 | ||
414 | if (strict_strtoul(buf, 0, &val)) | 415 | if (kstrtoul(buf, 0, &val)) |
415 | return -EINVAL; | 416 | return -EINVAL; |
416 | 417 | ||
417 | /* | 418 | /* |
diff --git a/drivers/hid/hid-picolcd_cir.c b/drivers/hid/hid-picolcd_cir.c index e346038f0f11..59d5eb1e742c 100644 --- a/drivers/hid/hid-picolcd_cir.c +++ b/drivers/hid/hid-picolcd_cir.c | |||
@@ -145,6 +145,7 @@ void picolcd_exit_cir(struct picolcd_data *data) | |||
145 | struct rc_dev *rdev = data->rc_dev; | 145 | struct rc_dev *rdev = data->rc_dev; |
146 | 146 | ||
147 | data->rc_dev = NULL; | 147 | data->rc_dev = NULL; |
148 | rc_unregister_device(rdev); | 148 | if (rdev) |
149 | rc_unregister_device(rdev); | ||
149 | } | 150 | } |
150 | 151 | ||
diff --git a/drivers/hid/hid-picolcd_core.c b/drivers/hid/hid-picolcd_core.c index b48092d0e139..acbb021065ec 100644 --- a/drivers/hid/hid-picolcd_core.c +++ b/drivers/hid/hid-picolcd_core.c | |||
@@ -290,7 +290,7 @@ static ssize_t picolcd_operation_mode_store(struct device *dev, | |||
290 | buf += 10; | 290 | buf += 10; |
291 | cnt -= 10; | 291 | cnt -= 10; |
292 | } | 292 | } |
293 | if (!report) | 293 | if (!report || report->maxfield != 1) |
294 | return -EINVAL; | 294 | return -EINVAL; |
295 | 295 | ||
296 | while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r')) | 296 | while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r')) |
diff --git a/drivers/hid/hid-picolcd_debugfs.c b/drivers/hid/hid-picolcd_debugfs.c index 59ab8e157e6b..024cdf3c2297 100644 --- a/drivers/hid/hid-picolcd_debugfs.c +++ b/drivers/hid/hid-picolcd_debugfs.c | |||
@@ -394,7 +394,7 @@ static void dump_buff_as_hex(char *dst, size_t dst_sz, const u8 *data, | |||
394 | void picolcd_debug_out_report(struct picolcd_data *data, | 394 | void picolcd_debug_out_report(struct picolcd_data *data, |
395 | struct hid_device *hdev, struct hid_report *report) | 395 | struct hid_device *hdev, struct hid_report *report) |
396 | { | 396 | { |
397 | u8 raw_data[70]; | 397 | u8 *raw_data; |
398 | int raw_size = (report->size >> 3) + 1; | 398 | int raw_size = (report->size >> 3) + 1; |
399 | char *buff; | 399 | char *buff; |
400 | #define BUFF_SZ 256 | 400 | #define BUFF_SZ 256 |
@@ -407,20 +407,20 @@ void picolcd_debug_out_report(struct picolcd_data *data, | |||
407 | if (!buff) | 407 | if (!buff) |
408 | return; | 408 | return; |
409 | 409 | ||
410 | snprintf(buff, BUFF_SZ, "\nout report %d (size %d) = ", | 410 | raw_data = hid_alloc_report_buf(report, GFP_ATOMIC); |
411 | report->id, raw_size); | 411 | if (!raw_data) { |
412 | hid_debug_event(hdev, buff); | ||
413 | if (raw_size + 5 > sizeof(raw_data)) { | ||
414 | kfree(buff); | 412 | kfree(buff); |
415 | hid_debug_event(hdev, " TOO BIG\n"); | ||
416 | return; | 413 | return; |
417 | } else { | ||
418 | raw_data[0] = report->id; | ||
419 | hid_output_report(report, raw_data); | ||
420 | dump_buff_as_hex(buff, BUFF_SZ, raw_data, raw_size); | ||
421 | hid_debug_event(hdev, buff); | ||
422 | } | 414 | } |
423 | 415 | ||
416 | snprintf(buff, BUFF_SZ, "\nout report %d (size %d) = ", | ||
417 | report->id, raw_size); | ||
418 | hid_debug_event(hdev, buff); | ||
419 | raw_data[0] = report->id; | ||
420 | hid_output_report(report, raw_data); | ||
421 | dump_buff_as_hex(buff, BUFF_SZ, raw_data, raw_size); | ||
422 | hid_debug_event(hdev, buff); | ||
423 | |||
424 | switch (report->id) { | 424 | switch (report->id) { |
425 | case REPORT_LED_STATE: | 425 | case REPORT_LED_STATE: |
426 | /* 1 data byte with GPO state */ | 426 | /* 1 data byte with GPO state */ |
@@ -644,6 +644,7 @@ void picolcd_debug_out_report(struct picolcd_data *data, | |||
644 | break; | 644 | break; |
645 | } | 645 | } |
646 | wake_up_interruptible(&hdev->debug_wait); | 646 | wake_up_interruptible(&hdev->debug_wait); |
647 | kfree(raw_data); | ||
647 | kfree(buff); | 648 | kfree(buff); |
648 | } | 649 | } |
649 | 650 | ||
diff --git a/drivers/hid/hid-picolcd_fb.c b/drivers/hid/hid-picolcd_fb.c index 591f6b22aa94..c930ab8554ea 100644 --- a/drivers/hid/hid-picolcd_fb.c +++ b/drivers/hid/hid-picolcd_fb.c | |||
@@ -593,10 +593,14 @@ err_nomem: | |||
593 | void picolcd_exit_framebuffer(struct picolcd_data *data) | 593 | void picolcd_exit_framebuffer(struct picolcd_data *data) |
594 | { | 594 | { |
595 | struct fb_info *info = data->fb_info; | 595 | struct fb_info *info = data->fb_info; |
596 | struct picolcd_fb_data *fbdata = info->par; | 596 | struct picolcd_fb_data *fbdata; |
597 | unsigned long flags; | 597 | unsigned long flags; |
598 | 598 | ||
599 | if (!info) | ||
600 | return; | ||
601 | |||
599 | device_remove_file(&data->hdev->dev, &dev_attr_fb_update_rate); | 602 | device_remove_file(&data->hdev->dev, &dev_attr_fb_update_rate); |
603 | fbdata = info->par; | ||
600 | 604 | ||
601 | /* disconnect framebuffer from HID dev */ | 605 | /* disconnect framebuffer from HID dev */ |
602 | spin_lock_irqsave(&fbdata->lock, flags); | 606 | spin_lock_irqsave(&fbdata->lock, flags); |
diff --git a/drivers/hid/hid-pl.c b/drivers/hid/hid-pl.c index d29112fa5cd5..2dcd7d98dbd6 100644 --- a/drivers/hid/hid-pl.c +++ b/drivers/hid/hid-pl.c | |||
@@ -132,8 +132,14 @@ static int plff_init(struct hid_device *hid) | |||
132 | strong = &report->field[0]->value[2]; | 132 | strong = &report->field[0]->value[2]; |
133 | weak = &report->field[0]->value[3]; | 133 | weak = &report->field[0]->value[3]; |
134 | debug("detected single-field device"); | 134 | debug("detected single-field device"); |
135 | } else if (report->maxfield >= 4 && report->field[0]->maxusage == 1 && | 135 | } else if (report->field[0]->maxusage == 1 && |
136 | report->field[0]->usage[0].hid == (HID_UP_LED | 0x43)) { | 136 | report->field[0]->usage[0].hid == |
137 | (HID_UP_LED | 0x43) && | ||
138 | report->maxfield >= 4 && | ||
139 | report->field[0]->report_count >= 1 && | ||
140 | report->field[1]->report_count >= 1 && | ||
141 | report->field[2]->report_count >= 1 && | ||
142 | report->field[3]->report_count >= 1) { | ||
137 | report->field[0]->value[0] = 0x00; | 143 | report->field[0]->value[0] = 0x00; |
138 | report->field[1]->value[0] = 0x00; | 144 | report->field[1]->value[0] = 0x00; |
139 | strong = &report->field[2]->value[0]; | 145 | strong = &report->field[2]->value[0]; |
diff --git a/drivers/hid/hid-roccat-arvo.c b/drivers/hid/hid-roccat-arvo.c index eed7f52084c5..1948208fe038 100644 --- a/drivers/hid/hid-roccat-arvo.c +++ b/drivers/hid/hid-roccat-arvo.c | |||
@@ -59,7 +59,7 @@ static ssize_t arvo_sysfs_set_mode_key(struct device *dev, | |||
59 | unsigned long state; | 59 | unsigned long state; |
60 | int retval; | 60 | int retval; |
61 | 61 | ||
62 | retval = strict_strtoul(buf, 10, &state); | 62 | retval = kstrtoul(buf, 10, &state); |
63 | if (retval) | 63 | if (retval) |
64 | return retval; | 64 | return retval; |
65 | 65 | ||
@@ -109,7 +109,7 @@ static ssize_t arvo_sysfs_set_key_mask(struct device *dev, | |||
109 | unsigned long key_mask; | 109 | unsigned long key_mask; |
110 | int retval; | 110 | int retval; |
111 | 111 | ||
112 | retval = strict_strtoul(buf, 10, &key_mask); | 112 | retval = kstrtoul(buf, 10, &key_mask); |
113 | if (retval) | 113 | if (retval) |
114 | return retval; | 114 | return retval; |
115 | 115 | ||
@@ -163,7 +163,7 @@ static ssize_t arvo_sysfs_set_actual_profile(struct device *dev, | |||
163 | unsigned long profile; | 163 | unsigned long profile; |
164 | int retval; | 164 | int retval; |
165 | 165 | ||
166 | retval = strict_strtoul(buf, 10, &profile); | 166 | retval = kstrtoul(buf, 10, &profile); |
167 | if (retval) | 167 | if (retval) |
168 | return retval; | 168 | return retval; |
169 | 169 | ||
diff --git a/drivers/hid/hid-roccat-isku.c b/drivers/hid/hid-roccat-isku.c index b7a4e10e112e..bc62ed91e451 100644 --- a/drivers/hid/hid-roccat-isku.c +++ b/drivers/hid/hid-roccat-isku.c | |||
@@ -82,7 +82,7 @@ static ssize_t isku_sysfs_set_actual_profile(struct device *dev, | |||
82 | isku = hid_get_drvdata(dev_get_drvdata(dev)); | 82 | isku = hid_get_drvdata(dev_get_drvdata(dev)); |
83 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); | 83 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); |
84 | 84 | ||
85 | retval = strict_strtoul(buf, 10, &profile); | 85 | retval = kstrtoul(buf, 10, &profile); |
86 | if (retval) | 86 | if (retval) |
87 | return retval; | 87 | return retval; |
88 | 88 | ||
diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c index 6e614a85f175..602c188e9d86 100644 --- a/drivers/hid/hid-roccat-kone.c +++ b/drivers/hid/hid-roccat-kone.c | |||
@@ -476,7 +476,7 @@ static ssize_t kone_sysfs_set_tcu(struct device *dev, | |||
476 | kone = hid_get_drvdata(dev_get_drvdata(dev)); | 476 | kone = hid_get_drvdata(dev_get_drvdata(dev)); |
477 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); | 477 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); |
478 | 478 | ||
479 | retval = strict_strtoul(buf, 10, &state); | 479 | retval = kstrtoul(buf, 10, &state); |
480 | if (retval) | 480 | if (retval) |
481 | return retval; | 481 | return retval; |
482 | 482 | ||
@@ -566,7 +566,7 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev, | |||
566 | kone = hid_get_drvdata(dev_get_drvdata(dev)); | 566 | kone = hid_get_drvdata(dev_get_drvdata(dev)); |
567 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); | 567 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); |
568 | 568 | ||
569 | retval = strict_strtoul(buf, 10, &new_startup_profile); | 569 | retval = kstrtoul(buf, 10, &new_startup_profile); |
570 | if (retval) | 570 | if (retval) |
571 | return retval; | 571 | return retval; |
572 | 572 | ||
diff --git a/drivers/hid/hid-roccat-koneplus.c b/drivers/hid/hid-roccat-koneplus.c index db4d8b6a2542..5ddf605b6b89 100644 --- a/drivers/hid/hid-roccat-koneplus.c +++ b/drivers/hid/hid-roccat-koneplus.c | |||
@@ -267,7 +267,7 @@ static ssize_t koneplus_sysfs_set_actual_profile(struct device *dev, | |||
267 | koneplus = hid_get_drvdata(dev_get_drvdata(dev)); | 267 | koneplus = hid_get_drvdata(dev_get_drvdata(dev)); |
268 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); | 268 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); |
269 | 269 | ||
270 | retval = strict_strtoul(buf, 10, &profile); | 270 | retval = kstrtoul(buf, 10, &profile); |
271 | if (retval) | 271 | if (retval) |
272 | return retval; | 272 | return retval; |
273 | 273 | ||
diff --git a/drivers/hid/hid-roccat-konepure.c b/drivers/hid/hid-roccat-konepure.c index fa02b1f44979..99a605ebb665 100644 --- a/drivers/hid/hid-roccat-konepure.c +++ b/drivers/hid/hid-roccat-konepure.c | |||
@@ -275,6 +275,7 @@ static int konepure_raw_event(struct hid_device *hdev, | |||
275 | 275 | ||
276 | static const struct hid_device_id konepure_devices[] = { | 276 | static const struct hid_device_id konepure_devices[] = { |
277 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) }, | 277 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) }, |
278 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL) }, | ||
278 | { } | 279 | { } |
279 | }; | 280 | }; |
280 | 281 | ||
@@ -313,5 +314,5 @@ module_init(konepure_init); | |||
313 | module_exit(konepure_exit); | 314 | module_exit(konepure_exit); |
314 | 315 | ||
315 | MODULE_AUTHOR("Stefan Achatz"); | 316 | MODULE_AUTHOR("Stefan Achatz"); |
316 | MODULE_DESCRIPTION("USB Roccat KonePure driver"); | 317 | MODULE_DESCRIPTION("USB Roccat KonePure/Optical driver"); |
317 | MODULE_LICENSE("GPL v2"); | 318 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/hid/hid-roccat-kovaplus.c b/drivers/hid/hid-roccat-kovaplus.c index 8a0f2993411f..515bc03136c0 100644 --- a/drivers/hid/hid-roccat-kovaplus.c +++ b/drivers/hid/hid-roccat-kovaplus.c | |||
@@ -295,7 +295,7 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev, | |||
295 | kovaplus = hid_get_drvdata(dev_get_drvdata(dev)); | 295 | kovaplus = hid_get_drvdata(dev_get_drvdata(dev)); |
296 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); | 296 | usb_dev = interface_to_usbdev(to_usb_interface(dev)); |
297 | 297 | ||
298 | retval = strict_strtoul(buf, 10, &profile); | 298 | retval = kstrtoul(buf, 10, &profile); |
299 | if (retval) | 299 | if (retval) |
300 | return retval; | 300 | return retval; |
301 | 301 | ||
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c index ca7498107327..10e1581022cf 100644 --- a/drivers/hid/hid-sensor-hub.c +++ b/drivers/hid/hid-sensor-hub.c | |||
@@ -103,8 +103,7 @@ static int sensor_hub_get_physical_device_count( | |||
103 | 103 | ||
104 | list_for_each_entry(report, &report_enum->report_list, list) { | 104 | list_for_each_entry(report, &report_enum->report_list, list) { |
105 | field = report->field[0]; | 105 | field = report->field[0]; |
106 | if (report->maxfield && field && | 106 | if (report->maxfield && field && field->physical) |
107 | field->physical) | ||
108 | cnt++; | 107 | cnt++; |
109 | } | 108 | } |
110 | 109 | ||
@@ -192,12 +191,12 @@ int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, | |||
192 | u32 field_index, s32 value) | 191 | u32 field_index, s32 value) |
193 | { | 192 | { |
194 | struct hid_report *report; | 193 | struct hid_report *report; |
195 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); | 194 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); |
196 | int ret = 0; | 195 | int ret = 0; |
197 | 196 | ||
198 | mutex_lock(&data->mutex); | 197 | mutex_lock(&data->mutex); |
199 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); | 198 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); |
200 | if (!report || (field_index >= report->maxfield)) { | 199 | if (!report || (field_index >= report->maxfield)) { |
201 | ret = -EINVAL; | 200 | ret = -EINVAL; |
202 | goto done_proc; | 201 | goto done_proc; |
203 | } | 202 | } |
@@ -216,12 +215,13 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, | |||
216 | u32 field_index, s32 *value) | 215 | u32 field_index, s32 *value) |
217 | { | 216 | { |
218 | struct hid_report *report; | 217 | struct hid_report *report; |
219 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); | 218 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); |
220 | int ret = 0; | 219 | int ret = 0; |
221 | 220 | ||
222 | mutex_lock(&data->mutex); | 221 | mutex_lock(&data->mutex); |
223 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); | 222 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); |
224 | if (!report || (field_index >= report->maxfield)) { | 223 | if (!report || (field_index >= report->maxfield) || |
224 | report->field[field_index]->report_count < 1) { | ||
225 | ret = -EINVAL; | 225 | ret = -EINVAL; |
226 | goto done_proc; | 226 | goto done_proc; |
227 | } | 227 | } |
@@ -241,7 +241,7 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev, | |||
241 | u32 usage_id, | 241 | u32 usage_id, |
242 | u32 attr_usage_id, u32 report_id) | 242 | u32 attr_usage_id, u32 report_id) |
243 | { | 243 | { |
244 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); | 244 | struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); |
245 | unsigned long flags; | 245 | unsigned long flags; |
246 | struct hid_report *report; | 246 | struct hid_report *report; |
247 | int ret_val = 0; | 247 | int ret_val = 0; |
@@ -302,7 +302,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev, | |||
302 | 302 | ||
303 | /* Initialize with defaults */ | 303 | /* Initialize with defaults */ |
304 | info->usage_id = usage_id; | 304 | info->usage_id = usage_id; |
305 | info->attrib_id = attr_usage_id; | 305 | info->attrib_id = attr_usage_id; |
306 | info->report_id = -1; | 306 | info->report_id = -1; |
307 | info->index = -1; | 307 | info->index = -1; |
308 | info->units = -1; | 308 | info->units = -1; |
@@ -333,7 +333,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev, | |||
333 | if (field->usage[j].hid == | 333 | if (field->usage[j].hid == |
334 | attr_usage_id && | 334 | attr_usage_id && |
335 | field->usage[j].collection_index == | 335 | field->usage[j].collection_index == |
336 | collection_index) { | 336 | collection_index) { |
337 | sensor_hub_fill_attr_info(info, | 337 | sensor_hub_fill_attr_info(info, |
338 | i, report->id, | 338 | i, report->id, |
339 | field->unit, | 339 | field->unit, |
@@ -357,7 +357,7 @@ EXPORT_SYMBOL_GPL(sensor_hub_input_get_attribute_info); | |||
357 | #ifdef CONFIG_PM | 357 | #ifdef CONFIG_PM |
358 | static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message) | 358 | static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message) |
359 | { | 359 | { |
360 | struct sensor_hub_data *pdata = hid_get_drvdata(hdev); | 360 | struct sensor_hub_data *pdata = hid_get_drvdata(hdev); |
361 | struct hid_sensor_hub_callbacks_list *callback; | 361 | struct hid_sensor_hub_callbacks_list *callback; |
362 | 362 | ||
363 | hid_dbg(hdev, " sensor_hub_suspend\n"); | 363 | hid_dbg(hdev, " sensor_hub_suspend\n"); |
@@ -374,7 +374,7 @@ static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message) | |||
374 | 374 | ||
375 | static int sensor_hub_resume(struct hid_device *hdev) | 375 | static int sensor_hub_resume(struct hid_device *hdev) |
376 | { | 376 | { |
377 | struct sensor_hub_data *pdata = hid_get_drvdata(hdev); | 377 | struct sensor_hub_data *pdata = hid_get_drvdata(hdev); |
378 | struct hid_sensor_hub_callbacks_list *callback; | 378 | struct hid_sensor_hub_callbacks_list *callback; |
379 | 379 | ||
380 | hid_dbg(hdev, " sensor_hub_resume\n"); | 380 | hid_dbg(hdev, " sensor_hub_resume\n"); |
@@ -394,6 +394,7 @@ static int sensor_hub_reset_resume(struct hid_device *hdev) | |||
394 | return 0; | 394 | return 0; |
395 | } | 395 | } |
396 | #endif | 396 | #endif |
397 | |||
397 | /* | 398 | /* |
398 | * Handle raw report as sent by device | 399 | * Handle raw report as sent by device |
399 | */ | 400 | */ |
@@ -416,12 +417,11 @@ static int sensor_hub_raw_event(struct hid_device *hdev, | |||
416 | return 1; | 417 | return 1; |
417 | 418 | ||
418 | ptr = raw_data; | 419 | ptr = raw_data; |
419 | ptr++; /*Skip report id*/ | 420 | ptr++; /* Skip report id */ |
420 | 421 | ||
421 | spin_lock_irqsave(&pdata->lock, flags); | 422 | spin_lock_irqsave(&pdata->lock, flags); |
422 | 423 | ||
423 | for (i = 0; i < report->maxfield; ++i) { | 424 | for (i = 0; i < report->maxfield; ++i) { |
424 | |||
425 | hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n", | 425 | hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n", |
426 | i, report->field[i]->usage->collection_index, | 426 | i, report->field[i]->usage->collection_index, |
427 | report->field[i]->usage->hid, | 427 | report->field[i]->usage->hid, |
@@ -431,11 +431,10 @@ static int sensor_hub_raw_event(struct hid_device *hdev, | |||
431 | if (pdata->pending.status && pdata->pending.attr_usage_id == | 431 | if (pdata->pending.status && pdata->pending.attr_usage_id == |
432 | report->field[i]->usage->hid) { | 432 | report->field[i]->usage->hid) { |
433 | hid_dbg(hdev, "data was pending ...\n"); | 433 | hid_dbg(hdev, "data was pending ...\n"); |
434 | pdata->pending.raw_data = kmalloc(sz, GFP_ATOMIC); | 434 | pdata->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC); |
435 | if (pdata->pending.raw_data) { | 435 | if (pdata->pending.raw_data) |
436 | memcpy(pdata->pending.raw_data, ptr, sz); | 436 | pdata->pending.raw_size = sz; |
437 | pdata->pending.raw_size = sz; | 437 | else |
438 | } else | ||
439 | pdata->pending.raw_size = 0; | 438 | pdata->pending.raw_size = 0; |
440 | complete(&pdata->pending.ready); | 439 | complete(&pdata->pending.ready); |
441 | } | 440 | } |
@@ -478,16 +477,15 @@ static int sensor_hub_probe(struct hid_device *hdev, | |||
478 | struct hid_field *field; | 477 | struct hid_field *field; |
479 | int dev_cnt; | 478 | int dev_cnt; |
480 | 479 | ||
481 | sd = kzalloc(sizeof(struct sensor_hub_data), GFP_KERNEL); | 480 | sd = devm_kzalloc(&hdev->dev, sizeof(*sd), GFP_KERNEL); |
482 | if (!sd) { | 481 | if (!sd) { |
483 | hid_err(hdev, "cannot allocate Sensor data\n"); | 482 | hid_err(hdev, "cannot allocate Sensor data\n"); |
484 | return -ENOMEM; | 483 | return -ENOMEM; |
485 | } | 484 | } |
486 | sd->hsdev = kzalloc(sizeof(struct hid_sensor_hub_device), GFP_KERNEL); | 485 | sd->hsdev = devm_kzalloc(&hdev->dev, sizeof(*sd->hsdev), GFP_KERNEL); |
487 | if (!sd->hsdev) { | 486 | if (!sd->hsdev) { |
488 | hid_err(hdev, "cannot allocate hid_sensor_hub_device\n"); | 487 | hid_err(hdev, "cannot allocate hid_sensor_hub_device\n"); |
489 | ret = -ENOMEM; | 488 | return -ENOMEM; |
490 | goto err_free_hub; | ||
491 | } | 489 | } |
492 | hid_set_drvdata(hdev, sd); | 490 | hid_set_drvdata(hdev, sd); |
493 | sd->hsdev->hdev = hdev; | 491 | sd->hsdev->hdev = hdev; |
@@ -499,14 +497,14 @@ static int sensor_hub_probe(struct hid_device *hdev, | |||
499 | ret = hid_parse(hdev); | 497 | ret = hid_parse(hdev); |
500 | if (ret) { | 498 | if (ret) { |
501 | hid_err(hdev, "parse failed\n"); | 499 | hid_err(hdev, "parse failed\n"); |
502 | goto err_free; | 500 | return ret; |
503 | } | 501 | } |
504 | INIT_LIST_HEAD(&hdev->inputs); | 502 | INIT_LIST_HEAD(&hdev->inputs); |
505 | 503 | ||
506 | ret = hid_hw_start(hdev, 0); | 504 | ret = hid_hw_start(hdev, 0); |
507 | if (ret) { | 505 | if (ret) { |
508 | hid_err(hdev, "hw start failed\n"); | 506 | hid_err(hdev, "hw start failed\n"); |
509 | goto err_free; | 507 | return ret; |
510 | } | 508 | } |
511 | ret = hid_hw_open(hdev); | 509 | ret = hid_hw_open(hdev); |
512 | if (ret) { | 510 | if (ret) { |
@@ -539,7 +537,7 @@ static int sensor_hub_probe(struct hid_device *hdev, | |||
539 | field->physical) { | 537 | field->physical) { |
540 | name = kasprintf(GFP_KERNEL, "HID-SENSOR-%x", | 538 | name = kasprintf(GFP_KERNEL, "HID-SENSOR-%x", |
541 | field->physical); | 539 | field->physical); |
542 | if (name == NULL) { | 540 | if (name == NULL) { |
543 | hid_err(hdev, "Failed MFD device name\n"); | 541 | hid_err(hdev, "Failed MFD device name\n"); |
544 | ret = -ENOMEM; | 542 | ret = -ENOMEM; |
545 | goto err_free_names; | 543 | goto err_free_names; |
@@ -571,10 +569,6 @@ err_close: | |||
571 | hid_hw_close(hdev); | 569 | hid_hw_close(hdev); |
572 | err_stop_hw: | 570 | err_stop_hw: |
573 | hid_hw_stop(hdev); | 571 | hid_hw_stop(hdev); |
574 | err_free: | ||
575 | kfree(sd->hsdev); | ||
576 | err_free_hub: | ||
577 | kfree(sd); | ||
578 | 572 | ||
579 | return ret; | 573 | return ret; |
580 | } | 574 | } |
@@ -598,8 +592,6 @@ static void sensor_hub_remove(struct hid_device *hdev) | |||
598 | kfree(data->hid_sensor_hub_client_devs); | 592 | kfree(data->hid_sensor_hub_client_devs); |
599 | hid_set_drvdata(hdev, NULL); | 593 | hid_set_drvdata(hdev, NULL); |
600 | mutex_destroy(&data->mutex); | 594 | mutex_destroy(&data->mutex); |
601 | kfree(data->hsdev); | ||
602 | kfree(data); | ||
603 | } | 595 | } |
604 | 596 | ||
605 | static const struct hid_device_id sensor_hub_devices[] = { | 597 | static const struct hid_device_id sensor_hub_devices[] = { |
@@ -617,8 +609,8 @@ static struct hid_driver sensor_hub_driver = { | |||
617 | .raw_event = sensor_hub_raw_event, | 609 | .raw_event = sensor_hub_raw_event, |
618 | #ifdef CONFIG_PM | 610 | #ifdef CONFIG_PM |
619 | .suspend = sensor_hub_suspend, | 611 | .suspend = sensor_hub_suspend, |
620 | .resume = sensor_hub_resume, | 612 | .resume = sensor_hub_resume, |
621 | .reset_resume = sensor_hub_reset_resume, | 613 | .reset_resume = sensor_hub_reset_resume, |
622 | #endif | 614 | #endif |
623 | }; | 615 | }; |
624 | module_hid_driver(sensor_hub_driver); | 616 | module_hid_driver(sensor_hub_driver); |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 87fbe2924cfa..30dbb6b40bbf 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
@@ -624,7 +624,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
624 | struct sony_sc *sc; | 624 | struct sony_sc *sc; |
625 | unsigned int connect_mask = HID_CONNECT_DEFAULT; | 625 | unsigned int connect_mask = HID_CONNECT_DEFAULT; |
626 | 626 | ||
627 | sc = kzalloc(sizeof(*sc), GFP_KERNEL); | 627 | sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); |
628 | if (sc == NULL) { | 628 | if (sc == NULL) { |
629 | hid_err(hdev, "can't alloc sony descriptor\n"); | 629 | hid_err(hdev, "can't alloc sony descriptor\n"); |
630 | return -ENOMEM; | 630 | return -ENOMEM; |
@@ -636,7 +636,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
636 | ret = hid_parse(hdev); | 636 | ret = hid_parse(hdev); |
637 | if (ret) { | 637 | if (ret) { |
638 | hid_err(hdev, "parse failed\n"); | 638 | hid_err(hdev, "parse failed\n"); |
639 | goto err_free; | 639 | return ret; |
640 | } | 640 | } |
641 | 641 | ||
642 | if (sc->quirks & VAIO_RDESC_CONSTANT) | 642 | if (sc->quirks & VAIO_RDESC_CONSTANT) |
@@ -649,7 +649,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
649 | ret = hid_hw_start(hdev, connect_mask); | 649 | ret = hid_hw_start(hdev, connect_mask); |
650 | if (ret) { | 650 | if (ret) { |
651 | hid_err(hdev, "hw start failed\n"); | 651 | hid_err(hdev, "hw start failed\n"); |
652 | goto err_free; | 652 | return ret; |
653 | } | 653 | } |
654 | 654 | ||
655 | if (sc->quirks & SIXAXIS_CONTROLLER_USB) { | 655 | if (sc->quirks & SIXAXIS_CONTROLLER_USB) { |
@@ -669,8 +669,6 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
669 | return 0; | 669 | return 0; |
670 | err_stop: | 670 | err_stop: |
671 | hid_hw_stop(hdev); | 671 | hid_hw_stop(hdev); |
672 | err_free: | ||
673 | kfree(sc); | ||
674 | return ret; | 672 | return ret; |
675 | } | 673 | } |
676 | 674 | ||
@@ -682,7 +680,6 @@ static void sony_remove(struct hid_device *hdev) | |||
682 | buzz_remove(hdev); | 680 | buzz_remove(hdev); |
683 | 681 | ||
684 | hid_hw_stop(hdev); | 682 | hid_hw_stop(hdev); |
685 | kfree(sc); | ||
686 | } | 683 | } |
687 | 684 | ||
688 | static const struct hid_device_id sony_devices[] = { | 685 | static const struct hid_device_id sony_devices[] = { |
diff --git a/drivers/hid/hid-speedlink.c b/drivers/hid/hid-speedlink.c index a2f587d004e1..7112f3e832ee 100644 --- a/drivers/hid/hid-speedlink.c +++ b/drivers/hid/hid-speedlink.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * Fixes "jumpy" cursor and removes nonexistent keyboard LEDS from | 3 | * Fixes "jumpy" cursor and removes nonexistent keyboard LEDS from |
4 | * the HID descriptor. | 4 | * the HID descriptor. |
5 | * | 5 | * |
6 | * Copyright (c) 2011 Stefan Kriwanek <mail@stefankriwanek.de> | 6 | * Copyright (c) 2011, 2013 Stefan Kriwanek <dev@stefankriwanek.de> |
7 | */ | 7 | */ |
8 | 8 | ||
9 | /* | 9 | /* |
@@ -46,8 +46,13 @@ static int speedlink_event(struct hid_device *hdev, struct hid_field *field, | |||
46 | struct hid_usage *usage, __s32 value) | 46 | struct hid_usage *usage, __s32 value) |
47 | { | 47 | { |
48 | /* No other conditions due to usage_table. */ | 48 | /* No other conditions due to usage_table. */ |
49 | /* Fix "jumpy" cursor (invalid events sent by device). */ | 49 | |
50 | if (value == 256) | 50 | /* This fixes the "jumpy" cursor occuring due to invalid events sent |
51 | * by the device. Some devices only send them with value==+256, others | ||
52 | * don't. However, catching abs(value)>=256 is restrictive enough not | ||
53 | * to interfere with devices that were bug-free (has been tested). | ||
54 | */ | ||
55 | if (abs(value) >= 256) | ||
51 | return 1; | 56 | return 1; |
52 | /* Drop useless distance 0 events (on button clicks etc.) as well */ | 57 | /* Drop useless distance 0 events (on button clicks etc.) as well */ |
53 | if (value == 0) | 58 | if (value == 0) |
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index 0c06054cab8f..bd2bc4a1f378 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c | |||
@@ -212,10 +212,12 @@ static __u8 select_drm(struct wiimote_data *wdata) | |||
212 | 212 | ||
213 | if (ir == WIIPROTO_FLAG_IR_BASIC) { | 213 | if (ir == WIIPROTO_FLAG_IR_BASIC) { |
214 | if (wdata->state.flags & WIIPROTO_FLAG_ACCEL) { | 214 | if (wdata->state.flags & WIIPROTO_FLAG_ACCEL) { |
215 | if (ext) | 215 | /* GEN10 and ealier devices bind IR formats to DRMs. |
216 | return WIIPROTO_REQ_DRM_KAIE; | 216 | * Hence, we cannot use DRM_KAI here as it might be |
217 | else | 217 | * bound to IR_EXT. Use DRM_KAIE unconditionally so we |
218 | return WIIPROTO_REQ_DRM_KAI; | 218 | * work with all devices and our parsers can use the |
219 | * fixed formats, too. */ | ||
220 | return WIIPROTO_REQ_DRM_KAIE; | ||
219 | } else { | 221 | } else { |
220 | return WIIPROTO_REQ_DRM_KIE; | 222 | return WIIPROTO_REQ_DRM_KIE; |
221 | } | 223 | } |
@@ -439,8 +441,7 @@ static __u8 wiimote_cmd_read_ext(struct wiimote_data *wdata, __u8 *rmem) | |||
439 | if (ret != 6) | 441 | if (ret != 6) |
440 | return WIIMOTE_EXT_NONE; | 442 | return WIIMOTE_EXT_NONE; |
441 | 443 | ||
442 | hid_dbg(wdata->hdev, "extension ID: %02x:%02x %02x:%02x %02x:%02x\n", | 444 | hid_dbg(wdata->hdev, "extension ID: %6phC\n", rmem); |
443 | rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]); | ||
444 | 445 | ||
445 | if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff && | 446 | if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff && |
446 | rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff) | 447 | rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff) |
@@ -454,6 +455,12 @@ static __u8 wiimote_cmd_read_ext(struct wiimote_data *wdata, __u8 *rmem) | |||
454 | return WIIMOTE_EXT_BALANCE_BOARD; | 455 | return WIIMOTE_EXT_BALANCE_BOARD; |
455 | if (rmem[4] == 0x01 && rmem[5] == 0x20) | 456 | if (rmem[4] == 0x01 && rmem[5] == 0x20) |
456 | return WIIMOTE_EXT_PRO_CONTROLLER; | 457 | return WIIMOTE_EXT_PRO_CONTROLLER; |
458 | if (rmem[0] == 0x01 && rmem[1] == 0x00 && | ||
459 | rmem[4] == 0x01 && rmem[5] == 0x03) | ||
460 | return WIIMOTE_EXT_GUITAR_HERO_DRUMS; | ||
461 | if (rmem[0] == 0x00 && rmem[1] == 0x00 && | ||
462 | rmem[4] == 0x01 && rmem[5] == 0x03) | ||
463 | return WIIMOTE_EXT_GUITAR_HERO_GUITAR; | ||
457 | 464 | ||
458 | return WIIMOTE_EXT_UNKNOWN; | 465 | return WIIMOTE_EXT_UNKNOWN; |
459 | } | 466 | } |
@@ -487,6 +494,8 @@ static bool wiimote_cmd_map_mp(struct wiimote_data *wdata, __u8 exttype) | |||
487 | /* map MP with correct pass-through mode */ | 494 | /* map MP with correct pass-through mode */ |
488 | switch (exttype) { | 495 | switch (exttype) { |
489 | case WIIMOTE_EXT_CLASSIC_CONTROLLER: | 496 | case WIIMOTE_EXT_CLASSIC_CONTROLLER: |
497 | case WIIMOTE_EXT_GUITAR_HERO_DRUMS: | ||
498 | case WIIMOTE_EXT_GUITAR_HERO_GUITAR: | ||
490 | wmem = 0x07; | 499 | wmem = 0x07; |
491 | break; | 500 | break; |
492 | case WIIMOTE_EXT_NUNCHUK: | 501 | case WIIMOTE_EXT_NUNCHUK: |
@@ -510,14 +519,12 @@ static bool wiimote_cmd_read_mp(struct wiimote_data *wdata, __u8 *rmem) | |||
510 | if (ret != 6) | 519 | if (ret != 6) |
511 | return false; | 520 | return false; |
512 | 521 | ||
513 | hid_dbg(wdata->hdev, "motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n", | 522 | hid_dbg(wdata->hdev, "motion plus ID: %6phC\n", rmem); |
514 | rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]); | ||
515 | 523 | ||
516 | if (rmem[5] == 0x05) | 524 | if (rmem[5] == 0x05) |
517 | return true; | 525 | return true; |
518 | 526 | ||
519 | hid_info(wdata->hdev, "unknown motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n", | 527 | hid_info(wdata->hdev, "unknown motion plus ID: %6phC\n", rmem); |
520 | rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]); | ||
521 | 528 | ||
522 | return false; | 529 | return false; |
523 | } | 530 | } |
@@ -533,8 +540,7 @@ static __u8 wiimote_cmd_read_mp_mapped(struct wiimote_data *wdata) | |||
533 | if (ret != 6) | 540 | if (ret != 6) |
534 | return WIIMOTE_MP_NONE; | 541 | return WIIMOTE_MP_NONE; |
535 | 542 | ||
536 | hid_dbg(wdata->hdev, "mapped motion plus ID: %02x:%02x %02x:%02x %02x:%02x\n", | 543 | hid_dbg(wdata->hdev, "mapped motion plus ID: %6phC\n", rmem); |
537 | rmem[0], rmem[1], rmem[2], rmem[3], rmem[4], rmem[5]); | ||
538 | 544 | ||
539 | if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff && | 545 | if (rmem[0] == 0xff && rmem[1] == 0xff && rmem[2] == 0xff && |
540 | rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff) | 546 | rmem[3] == 0xff && rmem[4] == 0xff && rmem[5] == 0xff) |
@@ -1077,6 +1083,8 @@ static const char *wiimote_exttype_names[WIIMOTE_EXT_NUM] = { | |||
1077 | [WIIMOTE_EXT_CLASSIC_CONTROLLER] = "Nintendo Wii Classic Controller", | 1083 | [WIIMOTE_EXT_CLASSIC_CONTROLLER] = "Nintendo Wii Classic Controller", |
1078 | [WIIMOTE_EXT_BALANCE_BOARD] = "Nintendo Wii Balance Board", | 1084 | [WIIMOTE_EXT_BALANCE_BOARD] = "Nintendo Wii Balance Board", |
1079 | [WIIMOTE_EXT_PRO_CONTROLLER] = "Nintendo Wii U Pro Controller", | 1085 | [WIIMOTE_EXT_PRO_CONTROLLER] = "Nintendo Wii U Pro Controller", |
1086 | [WIIMOTE_EXT_GUITAR_HERO_DRUMS] = "Nintendo Wii Guitar Hero Drums", | ||
1087 | [WIIMOTE_EXT_GUITAR_HERO_GUITAR] = "Nintendo Wii Guitar Hero Guitar", | ||
1080 | }; | 1088 | }; |
1081 | 1089 | ||
1082 | /* | 1090 | /* |
@@ -1126,9 +1134,8 @@ static void wiimote_init_hotplug(struct wiimote_data *wdata) | |||
1126 | wiimote_ext_unload(wdata); | 1134 | wiimote_ext_unload(wdata); |
1127 | 1135 | ||
1128 | if (exttype == WIIMOTE_EXT_UNKNOWN) { | 1136 | if (exttype == WIIMOTE_EXT_UNKNOWN) { |
1129 | hid_info(wdata->hdev, "cannot detect extension; %02x:%02x %02x:%02x %02x:%02x\n", | 1137 | hid_info(wdata->hdev, "cannot detect extension; %6phC\n", |
1130 | extdata[0], extdata[1], extdata[2], | 1138 | extdata); |
1131 | extdata[3], extdata[4], extdata[5]); | ||
1132 | } else if (exttype == WIIMOTE_EXT_NONE) { | 1139 | } else if (exttype == WIIMOTE_EXT_NONE) { |
1133 | spin_lock_irq(&wdata->state.lock); | 1140 | spin_lock_irq(&wdata->state.lock); |
1134 | wdata->state.exttype = WIIMOTE_EXT_NONE; | 1141 | wdata->state.exttype = WIIMOTE_EXT_NONE; |
@@ -1663,6 +1670,10 @@ static ssize_t wiimote_ext_show(struct device *dev, | |||
1663 | return sprintf(buf, "balanceboard\n"); | 1670 | return sprintf(buf, "balanceboard\n"); |
1664 | case WIIMOTE_EXT_PRO_CONTROLLER: | 1671 | case WIIMOTE_EXT_PRO_CONTROLLER: |
1665 | return sprintf(buf, "procontroller\n"); | 1672 | return sprintf(buf, "procontroller\n"); |
1673 | case WIIMOTE_EXT_GUITAR_HERO_DRUMS: | ||
1674 | return sprintf(buf, "drums\n"); | ||
1675 | case WIIMOTE_EXT_GUITAR_HERO_GUITAR: | ||
1676 | return sprintf(buf, "guitar\n"); | ||
1666 | case WIIMOTE_EXT_UNKNOWN: | 1677 | case WIIMOTE_EXT_UNKNOWN: |
1667 | /* fallthrough */ | 1678 | /* fallthrough */ |
1668 | default: | 1679 | default: |
diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c index 2e7d644dba18..7e124c351e67 100644 --- a/drivers/hid/hid-wiimote-modules.c +++ b/drivers/hid/hid-wiimote-modules.c | |||
@@ -1834,6 +1834,396 @@ static const struct wiimod_ops wiimod_pro = { | |||
1834 | }; | 1834 | }; |
1835 | 1835 | ||
1836 | /* | 1836 | /* |
1837 | * Drums | ||
1838 | * Guitar-Hero, Rock-Band and other games came bundled with drums which can | ||
1839 | * be plugged as extension to a Wiimote. Drum-reports are still not entirely | ||
1840 | * figured out, but the most important information is known. | ||
1841 | * We create a separate device for drums and report all information via this | ||
1842 | * input device. | ||
1843 | */ | ||
1844 | |||
1845 | static inline void wiimod_drums_report_pressure(struct wiimote_data *wdata, | ||
1846 | __u8 none, __u8 which, | ||
1847 | __u8 pressure, __u8 onoff, | ||
1848 | __u8 *store, __u16 code, | ||
1849 | __u8 which_code) | ||
1850 | { | ||
1851 | static const __u8 default_pressure = 3; | ||
1852 | |||
1853 | if (!none && which == which_code) { | ||
1854 | *store = pressure; | ||
1855 | input_report_abs(wdata->extension.input, code, *store); | ||
1856 | } else if (onoff != !!*store) { | ||
1857 | *store = onoff ? default_pressure : 0; | ||
1858 | input_report_abs(wdata->extension.input, code, *store); | ||
1859 | } | ||
1860 | } | ||
1861 | |||
1862 | static void wiimod_drums_in_ext(struct wiimote_data *wdata, const __u8 *ext) | ||
1863 | { | ||
1864 | __u8 pressure, which, none, hhp, sx, sy; | ||
1865 | __u8 o, r, y, g, b, bass, bm, bp; | ||
1866 | |||
1867 | /* Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | ||
1868 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1869 | * 1 | 0 | 0 | SX <5:0> | | ||
1870 | * 2 | 0 | 0 | SY <5:0> | | ||
1871 | * -----+-----+-----+-----------------------------+-----+ | ||
1872 | * 3 | HPP | NON | WHICH <5:1> | ? | | ||
1873 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1874 | * 4 | SOFT <7:5> | 0 | 1 | 1 | 0 | ? | | ||
1875 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1876 | * 5 | ? | 1 | 1 | B- | 1 | B+ | 1 | ? | | ||
1877 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1878 | * 6 | O | R | Y | G | B | BSS | 1 | 1 | | ||
1879 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1880 | * All buttons are 0 if pressed | ||
1881 | * | ||
1882 | * With Motion+ enabled, the following bits will get invalid: | ||
1883 | * Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | ||
1884 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1885 | * 1 | 0 | 0 | SX <5:1> |XXXXX| | ||
1886 | * 2 | 0 | 0 | SY <5:1> |XXXXX| | ||
1887 | * -----+-----+-----+-----------------------------+-----+ | ||
1888 | * 3 | HPP | NON | WHICH <5:1> | ? | | ||
1889 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1890 | * 4 | SOFT <7:5> | 0 | 1 | 1 | 0 | ? | | ||
1891 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1892 | * 5 | ? | 1 | 1 | B- | 1 | B+ | 1 |XXXXX| | ||
1893 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1894 | * 6 | O | R | Y | G | B | BSS |XXXXX|XXXXX| | ||
1895 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
1896 | */ | ||
1897 | |||
1898 | pressure = 7 - (ext[3] >> 5); | ||
1899 | which = (ext[2] >> 1) & 0x1f; | ||
1900 | none = !!(ext[2] & 0x40); | ||
1901 | hhp = !(ext[2] & 0x80); | ||
1902 | sx = ext[0] & 0x3f; | ||
1903 | sy = ext[1] & 0x3f; | ||
1904 | o = !(ext[5] & 0x80); | ||
1905 | r = !(ext[5] & 0x40); | ||
1906 | y = !(ext[5] & 0x20); | ||
1907 | g = !(ext[5] & 0x10); | ||
1908 | b = !(ext[5] & 0x08); | ||
1909 | bass = !(ext[5] & 0x04); | ||
1910 | bm = !(ext[4] & 0x10); | ||
1911 | bp = !(ext[4] & 0x04); | ||
1912 | |||
1913 | wiimod_drums_report_pressure(wdata, none, which, pressure, | ||
1914 | o, &wdata->state.pressure_drums[0], | ||
1915 | ABS_CYMBAL_RIGHT, 0x0e); | ||
1916 | wiimod_drums_report_pressure(wdata, none, which, pressure, | ||
1917 | r, &wdata->state.pressure_drums[1], | ||
1918 | ABS_TOM_LEFT, 0x19); | ||
1919 | wiimod_drums_report_pressure(wdata, none, which, pressure, | ||
1920 | y, &wdata->state.pressure_drums[2], | ||
1921 | ABS_CYMBAL_LEFT, 0x11); | ||
1922 | wiimod_drums_report_pressure(wdata, none, which, pressure, | ||
1923 | g, &wdata->state.pressure_drums[3], | ||
1924 | ABS_TOM_FAR_RIGHT, 0x12); | ||
1925 | wiimod_drums_report_pressure(wdata, none, which, pressure, | ||
1926 | b, &wdata->state.pressure_drums[4], | ||
1927 | ABS_TOM_RIGHT, 0x0f); | ||
1928 | |||
1929 | /* Bass shares pressure with hi-hat (set via hhp) */ | ||
1930 | wiimod_drums_report_pressure(wdata, none, hhp ? 0xff : which, pressure, | ||
1931 | bass, &wdata->state.pressure_drums[5], | ||
1932 | ABS_BASS, 0x1b); | ||
1933 | /* Hi-hat has no on/off values, just pressure. Force to off/0. */ | ||
1934 | wiimod_drums_report_pressure(wdata, none, hhp ? which : 0xff, pressure, | ||
1935 | 0, &wdata->state.pressure_drums[6], | ||
1936 | ABS_HI_HAT, 0x0e); | ||
1937 | |||
1938 | input_report_abs(wdata->extension.input, ABS_X, sx - 0x20); | ||
1939 | input_report_abs(wdata->extension.input, ABS_Y, sy - 0x20); | ||
1940 | |||
1941 | input_report_key(wdata->extension.input, BTN_START, bp); | ||
1942 | input_report_key(wdata->extension.input, BTN_SELECT, bm); | ||
1943 | |||
1944 | input_sync(wdata->extension.input); | ||
1945 | } | ||
1946 | |||
1947 | static int wiimod_drums_open(struct input_dev *dev) | ||
1948 | { | ||
1949 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
1950 | unsigned long flags; | ||
1951 | |||
1952 | spin_lock_irqsave(&wdata->state.lock, flags); | ||
1953 | wdata->state.flags |= WIIPROTO_FLAG_EXT_USED; | ||
1954 | wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); | ||
1955 | spin_unlock_irqrestore(&wdata->state.lock, flags); | ||
1956 | |||
1957 | return 0; | ||
1958 | } | ||
1959 | |||
1960 | static void wiimod_drums_close(struct input_dev *dev) | ||
1961 | { | ||
1962 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
1963 | unsigned long flags; | ||
1964 | |||
1965 | spin_lock_irqsave(&wdata->state.lock, flags); | ||
1966 | wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED; | ||
1967 | wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); | ||
1968 | spin_unlock_irqrestore(&wdata->state.lock, flags); | ||
1969 | } | ||
1970 | |||
1971 | static int wiimod_drums_probe(const struct wiimod_ops *ops, | ||
1972 | struct wiimote_data *wdata) | ||
1973 | { | ||
1974 | int ret; | ||
1975 | |||
1976 | wdata->extension.input = input_allocate_device(); | ||
1977 | if (!wdata->extension.input) | ||
1978 | return -ENOMEM; | ||
1979 | |||
1980 | input_set_drvdata(wdata->extension.input, wdata); | ||
1981 | wdata->extension.input->open = wiimod_drums_open; | ||
1982 | wdata->extension.input->close = wiimod_drums_close; | ||
1983 | wdata->extension.input->dev.parent = &wdata->hdev->dev; | ||
1984 | wdata->extension.input->id.bustype = wdata->hdev->bus; | ||
1985 | wdata->extension.input->id.vendor = wdata->hdev->vendor; | ||
1986 | wdata->extension.input->id.product = wdata->hdev->product; | ||
1987 | wdata->extension.input->id.version = wdata->hdev->version; | ||
1988 | wdata->extension.input->name = WIIMOTE_NAME " Drums"; | ||
1989 | |||
1990 | set_bit(EV_KEY, wdata->extension.input->evbit); | ||
1991 | set_bit(BTN_START, wdata->extension.input->keybit); | ||
1992 | set_bit(BTN_SELECT, wdata->extension.input->keybit); | ||
1993 | |||
1994 | set_bit(EV_ABS, wdata->extension.input->evbit); | ||
1995 | set_bit(ABS_X, wdata->extension.input->absbit); | ||
1996 | set_bit(ABS_Y, wdata->extension.input->absbit); | ||
1997 | set_bit(ABS_TOM_LEFT, wdata->extension.input->absbit); | ||
1998 | set_bit(ABS_TOM_RIGHT, wdata->extension.input->absbit); | ||
1999 | set_bit(ABS_TOM_FAR_RIGHT, wdata->extension.input->absbit); | ||
2000 | set_bit(ABS_CYMBAL_LEFT, wdata->extension.input->absbit); | ||
2001 | set_bit(ABS_CYMBAL_RIGHT, wdata->extension.input->absbit); | ||
2002 | set_bit(ABS_BASS, wdata->extension.input->absbit); | ||
2003 | set_bit(ABS_HI_HAT, wdata->extension.input->absbit); | ||
2004 | input_set_abs_params(wdata->extension.input, | ||
2005 | ABS_X, -32, 31, 1, 1); | ||
2006 | input_set_abs_params(wdata->extension.input, | ||
2007 | ABS_Y, -32, 31, 1, 1); | ||
2008 | input_set_abs_params(wdata->extension.input, | ||
2009 | ABS_TOM_LEFT, 0, 7, 0, 0); | ||
2010 | input_set_abs_params(wdata->extension.input, | ||
2011 | ABS_TOM_RIGHT, 0, 7, 0, 0); | ||
2012 | input_set_abs_params(wdata->extension.input, | ||
2013 | ABS_TOM_FAR_RIGHT, 0, 7, 0, 0); | ||
2014 | input_set_abs_params(wdata->extension.input, | ||
2015 | ABS_CYMBAL_LEFT, 0, 7, 0, 0); | ||
2016 | input_set_abs_params(wdata->extension.input, | ||
2017 | ABS_CYMBAL_RIGHT, 0, 7, 0, 0); | ||
2018 | input_set_abs_params(wdata->extension.input, | ||
2019 | ABS_BASS, 0, 7, 0, 0); | ||
2020 | input_set_abs_params(wdata->extension.input, | ||
2021 | ABS_HI_HAT, 0, 7, 0, 0); | ||
2022 | |||
2023 | ret = input_register_device(wdata->extension.input); | ||
2024 | if (ret) | ||
2025 | goto err_free; | ||
2026 | |||
2027 | return 0; | ||
2028 | |||
2029 | err_free: | ||
2030 | input_free_device(wdata->extension.input); | ||
2031 | wdata->extension.input = NULL; | ||
2032 | return ret; | ||
2033 | } | ||
2034 | |||
2035 | static void wiimod_drums_remove(const struct wiimod_ops *ops, | ||
2036 | struct wiimote_data *wdata) | ||
2037 | { | ||
2038 | if (!wdata->extension.input) | ||
2039 | return; | ||
2040 | |||
2041 | input_unregister_device(wdata->extension.input); | ||
2042 | wdata->extension.input = NULL; | ||
2043 | } | ||
2044 | |||
2045 | static const struct wiimod_ops wiimod_drums = { | ||
2046 | .flags = 0, | ||
2047 | .arg = 0, | ||
2048 | .probe = wiimod_drums_probe, | ||
2049 | .remove = wiimod_drums_remove, | ||
2050 | .in_ext = wiimod_drums_in_ext, | ||
2051 | }; | ||
2052 | |||
2053 | /* | ||
2054 | * Guitar | ||
2055 | * Guitar-Hero, Rock-Band and other games came bundled with guitars which can | ||
2056 | * be plugged as extension to a Wiimote. | ||
2057 | * We create a separate device for guitars and report all information via this | ||
2058 | * input device. | ||
2059 | */ | ||
2060 | |||
2061 | static void wiimod_guitar_in_ext(struct wiimote_data *wdata, const __u8 *ext) | ||
2062 | { | ||
2063 | __u8 sx, sy, tb, wb, bd, bm, bp, bo, br, bb, bg, by, bu; | ||
2064 | |||
2065 | /* Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | ||
2066 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2067 | * 1 | 0 | 0 | SX <5:0> | | ||
2068 | * 2 | 0 | 0 | SY <5:0> | | ||
2069 | * -----+-----+-----+-----+-----------------------------+ | ||
2070 | * 3 | 0 | 0 | 0 | TB <4:0> | | ||
2071 | * -----+-----+-----+-----+-----------------------------+ | ||
2072 | * 4 | 0 | 0 | 0 | WB <4:0> | | ||
2073 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2074 | * 5 | 1 | BD | 1 | B- | 1 | B+ | 1 | 1 | | ||
2075 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2076 | * 6 | BO | BR | BB | BG | BY | 1 | 1 | BU | | ||
2077 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2078 | * All buttons are 0 if pressed | ||
2079 | * | ||
2080 | * With Motion+ enabled, the following bits will get invalid: | ||
2081 | * Byte | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | ||
2082 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2083 | * 1 | 0 | 0 | SX <5:1> |XXXXX| | ||
2084 | * 2 | 0 | 0 | SY <5:1> |XXXXX| | ||
2085 | * -----+-----+-----+-----+-----------------------+-----+ | ||
2086 | * 3 | 0 | 0 | 0 | TB <4:0> | | ||
2087 | * -----+-----+-----+-----+-----------------------------+ | ||
2088 | * 4 | 0 | 0 | 0 | WB <4:0> | | ||
2089 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2090 | * 5 | 1 | BD | 1 | B- | 1 | B+ | 1 |XXXXX| | ||
2091 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2092 | * 6 | BO | BR | BB | BG | BY | 1 |XXXXX|XXXXX| | ||
2093 | * -----+-----+-----+-----+-----+-----+-----+-----+-----+ | ||
2094 | */ | ||
2095 | |||
2096 | sx = ext[0] & 0x3f; | ||
2097 | sy = ext[1] & 0x3f; | ||
2098 | tb = ext[2] & 0x1f; | ||
2099 | wb = ext[3] & 0x1f; | ||
2100 | bd = !(ext[4] & 0x40); | ||
2101 | bm = !(ext[4] & 0x10); | ||
2102 | bp = !(ext[4] & 0x04); | ||
2103 | bo = !(ext[5] & 0x80); | ||
2104 | br = !(ext[5] & 0x40); | ||
2105 | bb = !(ext[5] & 0x20); | ||
2106 | bg = !(ext[5] & 0x10); | ||
2107 | by = !(ext[5] & 0x08); | ||
2108 | bu = !(ext[5] & 0x01); | ||
2109 | |||
2110 | input_report_abs(wdata->extension.input, ABS_X, sx - 0x20); | ||
2111 | input_report_abs(wdata->extension.input, ABS_Y, sy - 0x20); | ||
2112 | input_report_abs(wdata->extension.input, ABS_FRET_BOARD, tb); | ||
2113 | input_report_abs(wdata->extension.input, ABS_WHAMMY_BAR, wb - 0x10); | ||
2114 | |||
2115 | input_report_key(wdata->extension.input, BTN_MODE, bm); | ||
2116 | input_report_key(wdata->extension.input, BTN_START, bp); | ||
2117 | input_report_key(wdata->extension.input, BTN_STRUM_BAR_UP, bu); | ||
2118 | input_report_key(wdata->extension.input, BTN_STRUM_BAR_DOWN, bd); | ||
2119 | input_report_key(wdata->extension.input, BTN_FRET_FAR_UP, bg); | ||
2120 | input_report_key(wdata->extension.input, BTN_FRET_UP, br); | ||
2121 | input_report_key(wdata->extension.input, BTN_FRET_MID, by); | ||
2122 | input_report_key(wdata->extension.input, BTN_FRET_LOW, bb); | ||
2123 | input_report_key(wdata->extension.input, BTN_FRET_FAR_LOW, bo); | ||
2124 | |||
2125 | input_sync(wdata->extension.input); | ||
2126 | } | ||
2127 | |||
2128 | static int wiimod_guitar_open(struct input_dev *dev) | ||
2129 | { | ||
2130 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
2131 | unsigned long flags; | ||
2132 | |||
2133 | spin_lock_irqsave(&wdata->state.lock, flags); | ||
2134 | wdata->state.flags |= WIIPROTO_FLAG_EXT_USED; | ||
2135 | wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); | ||
2136 | spin_unlock_irqrestore(&wdata->state.lock, flags); | ||
2137 | |||
2138 | return 0; | ||
2139 | } | ||
2140 | |||
2141 | static void wiimod_guitar_close(struct input_dev *dev) | ||
2142 | { | ||
2143 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
2144 | unsigned long flags; | ||
2145 | |||
2146 | spin_lock_irqsave(&wdata->state.lock, flags); | ||
2147 | wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED; | ||
2148 | wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); | ||
2149 | spin_unlock_irqrestore(&wdata->state.lock, flags); | ||
2150 | } | ||
2151 | |||
2152 | static int wiimod_guitar_probe(const struct wiimod_ops *ops, | ||
2153 | struct wiimote_data *wdata) | ||
2154 | { | ||
2155 | int ret; | ||
2156 | |||
2157 | wdata->extension.input = input_allocate_device(); | ||
2158 | if (!wdata->extension.input) | ||
2159 | return -ENOMEM; | ||
2160 | |||
2161 | input_set_drvdata(wdata->extension.input, wdata); | ||
2162 | wdata->extension.input->open = wiimod_guitar_open; | ||
2163 | wdata->extension.input->close = wiimod_guitar_close; | ||
2164 | wdata->extension.input->dev.parent = &wdata->hdev->dev; | ||
2165 | wdata->extension.input->id.bustype = wdata->hdev->bus; | ||
2166 | wdata->extension.input->id.vendor = wdata->hdev->vendor; | ||
2167 | wdata->extension.input->id.product = wdata->hdev->product; | ||
2168 | wdata->extension.input->id.version = wdata->hdev->version; | ||
2169 | wdata->extension.input->name = WIIMOTE_NAME " Guitar"; | ||
2170 | |||
2171 | set_bit(EV_KEY, wdata->extension.input->evbit); | ||
2172 | set_bit(BTN_MODE, wdata->extension.input->keybit); | ||
2173 | set_bit(BTN_START, wdata->extension.input->keybit); | ||
2174 | set_bit(BTN_FRET_FAR_UP, wdata->extension.input->keybit); | ||
2175 | set_bit(BTN_FRET_UP, wdata->extension.input->keybit); | ||
2176 | set_bit(BTN_FRET_MID, wdata->extension.input->keybit); | ||
2177 | set_bit(BTN_FRET_LOW, wdata->extension.input->keybit); | ||
2178 | set_bit(BTN_FRET_FAR_LOW, wdata->extension.input->keybit); | ||
2179 | set_bit(BTN_STRUM_BAR_UP, wdata->extension.input->keybit); | ||
2180 | set_bit(BTN_STRUM_BAR_DOWN, wdata->extension.input->keybit); | ||
2181 | |||
2182 | set_bit(EV_ABS, wdata->extension.input->evbit); | ||
2183 | set_bit(ABS_X, wdata->extension.input->absbit); | ||
2184 | set_bit(ABS_Y, wdata->extension.input->absbit); | ||
2185 | set_bit(ABS_FRET_BOARD, wdata->extension.input->absbit); | ||
2186 | set_bit(ABS_WHAMMY_BAR, wdata->extension.input->absbit); | ||
2187 | input_set_abs_params(wdata->extension.input, | ||
2188 | ABS_X, -32, 31, 1, 1); | ||
2189 | input_set_abs_params(wdata->extension.input, | ||
2190 | ABS_Y, -32, 31, 1, 1); | ||
2191 | input_set_abs_params(wdata->extension.input, | ||
2192 | ABS_FRET_BOARD, 0, 0x1f, 1, 1); | ||
2193 | input_set_abs_params(wdata->extension.input, | ||
2194 | ABS_WHAMMY_BAR, 0, 0x0f, 1, 1); | ||
2195 | |||
2196 | ret = input_register_device(wdata->extension.input); | ||
2197 | if (ret) | ||
2198 | goto err_free; | ||
2199 | |||
2200 | return 0; | ||
2201 | |||
2202 | err_free: | ||
2203 | input_free_device(wdata->extension.input); | ||
2204 | wdata->extension.input = NULL; | ||
2205 | return ret; | ||
2206 | } | ||
2207 | |||
2208 | static void wiimod_guitar_remove(const struct wiimod_ops *ops, | ||
2209 | struct wiimote_data *wdata) | ||
2210 | { | ||
2211 | if (!wdata->extension.input) | ||
2212 | return; | ||
2213 | |||
2214 | input_unregister_device(wdata->extension.input); | ||
2215 | wdata->extension.input = NULL; | ||
2216 | } | ||
2217 | |||
2218 | static const struct wiimod_ops wiimod_guitar = { | ||
2219 | .flags = 0, | ||
2220 | .arg = 0, | ||
2221 | .probe = wiimod_guitar_probe, | ||
2222 | .remove = wiimod_guitar_remove, | ||
2223 | .in_ext = wiimod_guitar_in_ext, | ||
2224 | }; | ||
2225 | |||
2226 | /* | ||
1837 | * Builtin Motion Plus | 2227 | * Builtin Motion Plus |
1838 | * This module simply sets the WIIPROTO_FLAG_BUILTIN_MP protocol flag which | 2228 | * This module simply sets the WIIPROTO_FLAG_BUILTIN_MP protocol flag which |
1839 | * disables polling for Motion-Plus. This should be set only for devices which | 2229 | * disables polling for Motion-Plus. This should be set only for devices which |
@@ -2083,4 +2473,6 @@ const struct wiimod_ops *wiimod_ext_table[WIIMOTE_EXT_NUM] = { | |||
2083 | [WIIMOTE_EXT_CLASSIC_CONTROLLER] = &wiimod_classic, | 2473 | [WIIMOTE_EXT_CLASSIC_CONTROLLER] = &wiimod_classic, |
2084 | [WIIMOTE_EXT_BALANCE_BOARD] = &wiimod_bboard, | 2474 | [WIIMOTE_EXT_BALANCE_BOARD] = &wiimod_bboard, |
2085 | [WIIMOTE_EXT_PRO_CONTROLLER] = &wiimod_pro, | 2475 | [WIIMOTE_EXT_PRO_CONTROLLER] = &wiimod_pro, |
2476 | [WIIMOTE_EXT_GUITAR_HERO_DRUMS] = &wiimod_drums, | ||
2477 | [WIIMOTE_EXT_GUITAR_HERO_GUITAR] = &wiimod_guitar, | ||
2086 | }; | 2478 | }; |
diff --git a/drivers/hid/hid-wiimote.h b/drivers/hid/hid-wiimote.h index f1474f372c0b..379cdfb6bd25 100644 --- a/drivers/hid/hid-wiimote.h +++ b/drivers/hid/hid-wiimote.h | |||
@@ -88,6 +88,8 @@ enum wiimote_exttype { | |||
88 | WIIMOTE_EXT_CLASSIC_CONTROLLER, | 88 | WIIMOTE_EXT_CLASSIC_CONTROLLER, |
89 | WIIMOTE_EXT_BALANCE_BOARD, | 89 | WIIMOTE_EXT_BALANCE_BOARD, |
90 | WIIMOTE_EXT_PRO_CONTROLLER, | 90 | WIIMOTE_EXT_PRO_CONTROLLER, |
91 | WIIMOTE_EXT_GUITAR_HERO_DRUMS, | ||
92 | WIIMOTE_EXT_GUITAR_HERO_GUITAR, | ||
91 | WIIMOTE_EXT_NUM, | 93 | WIIMOTE_EXT_NUM, |
92 | }; | 94 | }; |
93 | 95 | ||
@@ -135,6 +137,7 @@ struct wiimote_state { | |||
135 | 137 | ||
136 | /* calibration data */ | 138 | /* calibration data */ |
137 | __u16 calib_bboard[4][3]; | 139 | __u16 calib_bboard[4][3]; |
140 | __u8 pressure_drums[7]; | ||
138 | }; | 141 | }; |
139 | 142 | ||
140 | struct wiimote_data { | 143 | struct wiimote_data { |
diff --git a/drivers/hid/hid-xinmo.c b/drivers/hid/hid-xinmo.c new file mode 100644 index 000000000000..7df5227a7e61 --- /dev/null +++ b/drivers/hid/hid-xinmo.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * HID driver for Xin-Mo devices, currently only the Dual Arcade controller. | ||
3 | * Fixes the negative axis event values (the devices sends -2) to match the | ||
4 | * logical axis minimum of the HID report descriptor (the report announces | ||
5 | * -1). It is needed because hid-input discards out of bounds values. | ||
6 | * (This module is based on "hid-saitek" and "hid-lg".) | ||
7 | * | ||
8 | * Copyright (c) 2013 Olivier Scherler | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms of the GNU General Public License as published by the Free | ||
14 | * Software Foundation; either version 2 of the License, or (at your option) | ||
15 | * any later version. | ||
16 | */ | ||
17 | |||
18 | #include <linux/device.h> | ||
19 | #include <linux/hid.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/kernel.h> | ||
22 | |||
23 | #include "hid-ids.h" | ||
24 | |||
25 | /* | ||
26 | * Fix negative events that are out of bounds. | ||
27 | */ | ||
28 | static int xinmo_event(struct hid_device *hdev, struct hid_field *field, | ||
29 | struct hid_usage *usage, __s32 value) | ||
30 | { | ||
31 | switch (usage->code) { | ||
32 | case ABS_X: | ||
33 | case ABS_Y: | ||
34 | case ABS_Z: | ||
35 | case ABS_RX: | ||
36 | if (value < -1) { | ||
37 | input_event(field->hidinput->input, usage->type, | ||
38 | usage->code, -1); | ||
39 | return 1; | ||
40 | } | ||
41 | break; | ||
42 | } | ||
43 | |||
44 | return 0; | ||
45 | } | ||
46 | |||
47 | static const struct hid_device_id xinmo_devices[] = { | ||
48 | { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) }, | ||
49 | { } | ||
50 | }; | ||
51 | |||
52 | MODULE_DEVICE_TABLE(hid, xinmo_devices); | ||
53 | |||
54 | static struct hid_driver xinmo_driver = { | ||
55 | .name = "xinmo", | ||
56 | .id_table = xinmo_devices, | ||
57 | .event = xinmo_event | ||
58 | }; | ||
59 | |||
60 | module_hid_driver(xinmo_driver); | ||
61 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/hid/hid-zydacron.c b/drivers/hid/hid-zydacron.c index e4cddeccd6b5..1a660bd97ab2 100644 --- a/drivers/hid/hid-zydacron.c +++ b/drivers/hid/hid-zydacron.c | |||
@@ -169,7 +169,7 @@ static int zc_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
169 | int ret; | 169 | int ret; |
170 | struct zc_device *zc; | 170 | struct zc_device *zc; |
171 | 171 | ||
172 | zc = kzalloc(sizeof(*zc), GFP_KERNEL); | 172 | zc = devm_kzalloc(&hdev->dev, sizeof(*zc), GFP_KERNEL); |
173 | if (zc == NULL) { | 173 | if (zc == NULL) { |
174 | hid_err(hdev, "can't alloc descriptor\n"); | 174 | hid_err(hdev, "can't alloc descriptor\n"); |
175 | return -ENOMEM; | 175 | return -ENOMEM; |
@@ -180,28 +180,16 @@ static int zc_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
180 | ret = hid_parse(hdev); | 180 | ret = hid_parse(hdev); |
181 | if (ret) { | 181 | if (ret) { |
182 | hid_err(hdev, "parse failed\n"); | 182 | hid_err(hdev, "parse failed\n"); |
183 | goto err_free; | 183 | return ret; |
184 | } | 184 | } |
185 | 185 | ||
186 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 186 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
187 | if (ret) { | 187 | if (ret) { |
188 | hid_err(hdev, "hw start failed\n"); | 188 | hid_err(hdev, "hw start failed\n"); |
189 | goto err_free; | 189 | return ret; |
190 | } | 190 | } |
191 | 191 | ||
192 | return 0; | 192 | return 0; |
193 | err_free: | ||
194 | kfree(zc); | ||
195 | |||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | static void zc_remove(struct hid_device *hdev) | ||
200 | { | ||
201 | struct zc_device *zc = hid_get_drvdata(hdev); | ||
202 | |||
203 | hid_hw_stop(hdev); | ||
204 | kfree(zc); | ||
205 | } | 193 | } |
206 | 194 | ||
207 | static const struct hid_device_id zc_devices[] = { | 195 | static const struct hid_device_id zc_devices[] = { |
@@ -217,7 +205,6 @@ static struct hid_driver zc_driver = { | |||
217 | .input_mapping = zc_input_mapping, | 205 | .input_mapping = zc_input_mapping, |
218 | .raw_event = zc_raw_event, | 206 | .raw_event = zc_raw_event, |
219 | .probe = zc_probe, | 207 | .probe = zc_probe, |
220 | .remove = zc_remove, | ||
221 | }; | 208 | }; |
222 | module_hid_driver(zc_driver); | 209 | module_hid_driver(zc_driver); |
223 | 210 | ||
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 6f1feb2c2e97..8918dd12bb69 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -113,7 +113,7 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, | |||
113 | __u8 *buf; | 113 | __u8 *buf; |
114 | int ret = 0; | 114 | int ret = 0; |
115 | 115 | ||
116 | if (!hidraw_table[minor]) { | 116 | if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { |
117 | ret = -ENODEV; | 117 | ret = -ENODEV; |
118 | goto out; | 118 | goto out; |
119 | } | 119 | } |
@@ -253,6 +253,7 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
253 | unsigned int minor = iminor(inode); | 253 | unsigned int minor = iminor(inode); |
254 | struct hidraw *dev; | 254 | struct hidraw *dev; |
255 | struct hidraw_list *list; | 255 | struct hidraw_list *list; |
256 | unsigned long flags; | ||
256 | int err = 0; | 257 | int err = 0; |
257 | 258 | ||
258 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { | 259 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { |
@@ -261,16 +262,11 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
261 | } | 262 | } |
262 | 263 | ||
263 | mutex_lock(&minors_lock); | 264 | mutex_lock(&minors_lock); |
264 | if (!hidraw_table[minor]) { | 265 | if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { |
265 | err = -ENODEV; | 266 | err = -ENODEV; |
266 | goto out_unlock; | 267 | goto out_unlock; |
267 | } | 268 | } |
268 | 269 | ||
269 | list->hidraw = hidraw_table[minor]; | ||
270 | mutex_init(&list->read_mutex); | ||
271 | list_add_tail(&list->node, &hidraw_table[minor]->list); | ||
272 | file->private_data = list; | ||
273 | |||
274 | dev = hidraw_table[minor]; | 270 | dev = hidraw_table[minor]; |
275 | if (!dev->open++) { | 271 | if (!dev->open++) { |
276 | err = hid_hw_power(dev->hid, PM_HINT_FULLON); | 272 | err = hid_hw_power(dev->hid, PM_HINT_FULLON); |
@@ -283,9 +279,16 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
283 | if (err < 0) { | 279 | if (err < 0) { |
284 | hid_hw_power(dev->hid, PM_HINT_NORMAL); | 280 | hid_hw_power(dev->hid, PM_HINT_NORMAL); |
285 | dev->open--; | 281 | dev->open--; |
282 | goto out_unlock; | ||
286 | } | 283 | } |
287 | } | 284 | } |
288 | 285 | ||
286 | list->hidraw = hidraw_table[minor]; | ||
287 | mutex_init(&list->read_mutex); | ||
288 | spin_lock_irqsave(&hidraw_table[minor]->list_lock, flags); | ||
289 | list_add_tail(&list->node, &hidraw_table[minor]->list); | ||
290 | spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags); | ||
291 | file->private_data = list; | ||
289 | out_unlock: | 292 | out_unlock: |
290 | mutex_unlock(&minors_lock); | 293 | mutex_unlock(&minors_lock); |
291 | out: | 294 | out: |
@@ -302,39 +305,41 @@ static int hidraw_fasync(int fd, struct file *file, int on) | |||
302 | return fasync_helper(fd, file, on, &list->fasync); | 305 | return fasync_helper(fd, file, on, &list->fasync); |
303 | } | 306 | } |
304 | 307 | ||
308 | static void drop_ref(struct hidraw *hidraw, int exists_bit) | ||
309 | { | ||
310 | if (exists_bit) { | ||
311 | hid_hw_close(hidraw->hid); | ||
312 | hidraw->exist = 0; | ||
313 | if (hidraw->open) | ||
314 | wake_up_interruptible(&hidraw->wait); | ||
315 | } else { | ||
316 | --hidraw->open; | ||
317 | } | ||
318 | |||
319 | if (!hidraw->open && !hidraw->exist) { | ||
320 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | ||
321 | hidraw_table[hidraw->minor] = NULL; | ||
322 | kfree(hidraw); | ||
323 | } | ||
324 | } | ||
325 | |||
305 | static int hidraw_release(struct inode * inode, struct file * file) | 326 | static int hidraw_release(struct inode * inode, struct file * file) |
306 | { | 327 | { |
307 | unsigned int minor = iminor(inode); | 328 | unsigned int minor = iminor(inode); |
308 | struct hidraw *dev; | ||
309 | struct hidraw_list *list = file->private_data; | 329 | struct hidraw_list *list = file->private_data; |
310 | int ret; | 330 | unsigned long flags; |
311 | int i; | ||
312 | 331 | ||
313 | mutex_lock(&minors_lock); | 332 | mutex_lock(&minors_lock); |
314 | if (!hidraw_table[minor]) { | ||
315 | ret = -ENODEV; | ||
316 | goto unlock; | ||
317 | } | ||
318 | 333 | ||
334 | spin_lock_irqsave(&hidraw_table[minor]->list_lock, flags); | ||
319 | list_del(&list->node); | 335 | list_del(&list->node); |
320 | dev = hidraw_table[minor]; | 336 | spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags); |
321 | if (!--dev->open) { | ||
322 | if (list->hidraw->exist) { | ||
323 | hid_hw_power(dev->hid, PM_HINT_NORMAL); | ||
324 | hid_hw_close(dev->hid); | ||
325 | } else { | ||
326 | kfree(list->hidraw); | ||
327 | } | ||
328 | } | ||
329 | |||
330 | for (i = 0; i < HIDRAW_BUFFER_SIZE; ++i) | ||
331 | kfree(list->buffer[i].value); | ||
332 | kfree(list); | 337 | kfree(list); |
333 | ret = 0; | ||
334 | unlock: | ||
335 | mutex_unlock(&minors_lock); | ||
336 | 338 | ||
337 | return ret; | 339 | drop_ref(hidraw_table[minor], 0); |
340 | |||
341 | mutex_unlock(&minors_lock); | ||
342 | return 0; | ||
338 | } | 343 | } |
339 | 344 | ||
340 | static long hidraw_ioctl(struct file *file, unsigned int cmd, | 345 | static long hidraw_ioctl(struct file *file, unsigned int cmd, |
@@ -457,7 +462,9 @@ int hidraw_report_event(struct hid_device *hid, u8 *data, int len) | |||
457 | struct hidraw *dev = hid->hidraw; | 462 | struct hidraw *dev = hid->hidraw; |
458 | struct hidraw_list *list; | 463 | struct hidraw_list *list; |
459 | int ret = 0; | 464 | int ret = 0; |
465 | unsigned long flags; | ||
460 | 466 | ||
467 | spin_lock_irqsave(&dev->list_lock, flags); | ||
461 | list_for_each_entry(list, &dev->list, node) { | 468 | list_for_each_entry(list, &dev->list, node) { |
462 | int new_head = (list->head + 1) & (HIDRAW_BUFFER_SIZE - 1); | 469 | int new_head = (list->head + 1) & (HIDRAW_BUFFER_SIZE - 1); |
463 | 470 | ||
@@ -472,6 +479,7 @@ int hidraw_report_event(struct hid_device *hid, u8 *data, int len) | |||
472 | list->head = new_head; | 479 | list->head = new_head; |
473 | kill_fasync(&list->fasync, SIGIO, POLL_IN); | 480 | kill_fasync(&list->fasync, SIGIO, POLL_IN); |
474 | } | 481 | } |
482 | spin_unlock_irqrestore(&dev->list_lock, flags); | ||
475 | 483 | ||
476 | wake_up_interruptible(&dev->wait); | 484 | wake_up_interruptible(&dev->wait); |
477 | return ret; | 485 | return ret; |
@@ -519,6 +527,7 @@ int hidraw_connect(struct hid_device *hid) | |||
519 | } | 527 | } |
520 | 528 | ||
521 | init_waitqueue_head(&dev->wait); | 529 | init_waitqueue_head(&dev->wait); |
530 | spin_lock_init(&dev->list_lock); | ||
522 | INIT_LIST_HEAD(&dev->list); | 531 | INIT_LIST_HEAD(&dev->list); |
523 | 532 | ||
524 | dev->hid = hid; | 533 | dev->hid = hid; |
@@ -539,18 +548,9 @@ void hidraw_disconnect(struct hid_device *hid) | |||
539 | struct hidraw *hidraw = hid->hidraw; | 548 | struct hidraw *hidraw = hid->hidraw; |
540 | 549 | ||
541 | mutex_lock(&minors_lock); | 550 | mutex_lock(&minors_lock); |
542 | hidraw->exist = 0; | ||
543 | 551 | ||
544 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | 552 | drop_ref(hidraw, 1); |
545 | 553 | ||
546 | hidraw_table[hidraw->minor] = NULL; | ||
547 | |||
548 | if (hidraw->open) { | ||
549 | hid_hw_close(hid); | ||
550 | wake_up_interruptible(&hidraw->wait); | ||
551 | } else { | ||
552 | kfree(hidraw); | ||
553 | } | ||
554 | mutex_unlock(&minors_lock); | 554 | mutex_unlock(&minors_lock); |
555 | } | 555 | } |
556 | EXPORT_SYMBOL_GPL(hidraw_disconnect); | 556 | EXPORT_SYMBOL_GPL(hidraw_disconnect); |
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index 879b0ed701a3..c1336193b04b 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/hid.h> | 35 | #include <linux/hid.h> |
36 | #include <linux/mutex.h> | 36 | #include <linux/mutex.h> |
37 | #include <linux/acpi.h> | 37 | #include <linux/acpi.h> |
38 | #include <linux/of.h> | ||
38 | 39 | ||
39 | #include <linux/i2c/i2c-hid.h> | 40 | #include <linux/i2c/i2c-hid.h> |
40 | 41 | ||
@@ -756,29 +757,6 @@ static int i2c_hid_power(struct hid_device *hid, int lvl) | |||
756 | return ret; | 757 | return ret; |
757 | } | 758 | } |
758 | 759 | ||
759 | static int i2c_hid_hidinput_input_event(struct input_dev *dev, | ||
760 | unsigned int type, unsigned int code, int value) | ||
761 | { | ||
762 | struct hid_device *hid = input_get_drvdata(dev); | ||
763 | struct hid_field *field; | ||
764 | int offset; | ||
765 | |||
766 | if (type == EV_FF) | ||
767 | return input_ff_event(dev, type, code, value); | ||
768 | |||
769 | if (type != EV_LED) | ||
770 | return -1; | ||
771 | |||
772 | offset = hidinput_find_field(hid, type, code, &field); | ||
773 | |||
774 | if (offset == -1) { | ||
775 | hid_warn(dev, "event field not found\n"); | ||
776 | return -1; | ||
777 | } | ||
778 | |||
779 | return hid_set_field(field, offset, value); | ||
780 | } | ||
781 | |||
782 | static struct hid_ll_driver i2c_hid_ll_driver = { | 760 | static struct hid_ll_driver i2c_hid_ll_driver = { |
783 | .parse = i2c_hid_parse, | 761 | .parse = i2c_hid_parse, |
784 | .start = i2c_hid_start, | 762 | .start = i2c_hid_start, |
@@ -787,7 +765,6 @@ static struct hid_ll_driver i2c_hid_ll_driver = { | |||
787 | .close = i2c_hid_close, | 765 | .close = i2c_hid_close, |
788 | .power = i2c_hid_power, | 766 | .power = i2c_hid_power, |
789 | .request = i2c_hid_request, | 767 | .request = i2c_hid_request, |
790 | .hidinput_input_event = i2c_hid_hidinput_input_event, | ||
791 | }; | 768 | }; |
792 | 769 | ||
793 | static int i2c_hid_init_irq(struct i2c_client *client) | 770 | static int i2c_hid_init_irq(struct i2c_client *client) |
@@ -824,8 +801,8 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) | |||
824 | * bytes 2-3 -> bcdVersion (has to be 1.00) */ | 801 | * bytes 2-3 -> bcdVersion (has to be 1.00) */ |
825 | ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, 4); | 802 | ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, 4); |
826 | 803 | ||
827 | i2c_hid_dbg(ihid, "%s, ihid->hdesc_buffer: %*ph\n", | 804 | i2c_hid_dbg(ihid, "%s, ihid->hdesc_buffer: %4ph\n", __func__, |
828 | __func__, 4, ihid->hdesc_buffer); | 805 | ihid->hdesc_buffer); |
829 | 806 | ||
830 | if (ret) { | 807 | if (ret) { |
831 | dev_err(&client->dev, | 808 | dev_err(&client->dev, |
@@ -897,8 +874,9 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client, | |||
897 | params[1].integer.value = 1; | 874 | params[1].integer.value = 1; |
898 | params[2].type = ACPI_TYPE_INTEGER; | 875 | params[2].type = ACPI_TYPE_INTEGER; |
899 | params[2].integer.value = 1; /* HID function */ | 876 | params[2].integer.value = 1; /* HID function */ |
900 | params[3].type = ACPI_TYPE_INTEGER; | 877 | params[3].type = ACPI_TYPE_PACKAGE; |
901 | params[3].integer.value = 0; | 878 | params[3].package.count = 0; |
879 | params[3].package.elements = NULL; | ||
902 | 880 | ||
903 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) { | 881 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) { |
904 | dev_err(&client->dev, "device _DSM execution failed\n"); | 882 | dev_err(&client->dev, "device _DSM execution failed\n"); |
@@ -933,6 +911,42 @@ static inline int i2c_hid_acpi_pdata(struct i2c_client *client, | |||
933 | } | 911 | } |
934 | #endif | 912 | #endif |
935 | 913 | ||
914 | #ifdef CONFIG_OF | ||
915 | static int i2c_hid_of_probe(struct i2c_client *client, | ||
916 | struct i2c_hid_platform_data *pdata) | ||
917 | { | ||
918 | struct device *dev = &client->dev; | ||
919 | u32 val; | ||
920 | int ret; | ||
921 | |||
922 | ret = of_property_read_u32(dev->of_node, "hid-descr-addr", &val); | ||
923 | if (ret) { | ||
924 | dev_err(&client->dev, "HID register address not provided\n"); | ||
925 | return -ENODEV; | ||
926 | } | ||
927 | if (val >> 16) { | ||
928 | dev_err(&client->dev, "Bad HID register address: 0x%08x\n", | ||
929 | val); | ||
930 | return -EINVAL; | ||
931 | } | ||
932 | pdata->hid_descriptor_address = val; | ||
933 | |||
934 | return 0; | ||
935 | } | ||
936 | |||
937 | static const struct of_device_id i2c_hid_of_match[] = { | ||
938 | { .compatible = "hid-over-i2c" }, | ||
939 | {}, | ||
940 | }; | ||
941 | MODULE_DEVICE_TABLE(of, i2c_hid_of_match); | ||
942 | #else | ||
943 | static inline int i2c_hid_of_probe(struct i2c_client *client, | ||
944 | struct i2c_hid_platform_data *pdata) | ||
945 | { | ||
946 | return -ENODEV; | ||
947 | } | ||
948 | #endif | ||
949 | |||
936 | static int i2c_hid_probe(struct i2c_client *client, | 950 | static int i2c_hid_probe(struct i2c_client *client, |
937 | const struct i2c_device_id *dev_id) | 951 | const struct i2c_device_id *dev_id) |
938 | { | 952 | { |
@@ -954,7 +968,11 @@ static int i2c_hid_probe(struct i2c_client *client, | |||
954 | if (!ihid) | 968 | if (!ihid) |
955 | return -ENOMEM; | 969 | return -ENOMEM; |
956 | 970 | ||
957 | if (!platform_data) { | 971 | if (client->dev.of_node) { |
972 | ret = i2c_hid_of_probe(client, &ihid->pdata); | ||
973 | if (ret) | ||
974 | goto err; | ||
975 | } else if (!platform_data) { | ||
958 | ret = i2c_hid_acpi_pdata(client, &ihid->pdata); | 976 | ret = i2c_hid_acpi_pdata(client, &ihid->pdata); |
959 | if (ret) { | 977 | if (ret) { |
960 | dev_err(&client->dev, | 978 | dev_err(&client->dev, |
@@ -1095,6 +1113,7 @@ static struct i2c_driver i2c_hid_driver = { | |||
1095 | .owner = THIS_MODULE, | 1113 | .owner = THIS_MODULE, |
1096 | .pm = &i2c_hid_pm, | 1114 | .pm = &i2c_hid_pm, |
1097 | .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match), | 1115 | .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match), |
1116 | .of_match_table = of_match_ptr(i2c_hid_of_match), | ||
1098 | }, | 1117 | }, |
1099 | 1118 | ||
1100 | .probe = i2c_hid_probe, | 1119 | .probe = i2c_hid_probe, |
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index fc307e0422af..5bf2fb785844 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c | |||
@@ -116,30 +116,6 @@ static void uhid_hid_close(struct hid_device *hid) | |||
116 | uhid_queue_event(uhid, UHID_CLOSE); | 116 | uhid_queue_event(uhid, UHID_CLOSE); |
117 | } | 117 | } |
118 | 118 | ||
119 | static int uhid_hid_input(struct input_dev *input, unsigned int type, | ||
120 | unsigned int code, int value) | ||
121 | { | ||
122 | struct hid_device *hid = input_get_drvdata(input); | ||
123 | struct uhid_device *uhid = hid->driver_data; | ||
124 | unsigned long flags; | ||
125 | struct uhid_event *ev; | ||
126 | |||
127 | ev = kzalloc(sizeof(*ev), GFP_ATOMIC); | ||
128 | if (!ev) | ||
129 | return -ENOMEM; | ||
130 | |||
131 | ev->type = UHID_OUTPUT_EV; | ||
132 | ev->u.output_ev.type = type; | ||
133 | ev->u.output_ev.code = code; | ||
134 | ev->u.output_ev.value = value; | ||
135 | |||
136 | spin_lock_irqsave(&uhid->qlock, flags); | ||
137 | uhid_queue(uhid, ev); | ||
138 | spin_unlock_irqrestore(&uhid->qlock, flags); | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static int uhid_hid_parse(struct hid_device *hid) | 119 | static int uhid_hid_parse(struct hid_device *hid) |
144 | { | 120 | { |
145 | struct uhid_device *uhid = hid->driver_data; | 121 | struct uhid_device *uhid = hid->driver_data; |
@@ -273,7 +249,6 @@ static struct hid_ll_driver uhid_hid_driver = { | |||
273 | .stop = uhid_hid_stop, | 249 | .stop = uhid_hid_stop, |
274 | .open = uhid_hid_open, | 250 | .open = uhid_hid_open, |
275 | .close = uhid_hid_close, | 251 | .close = uhid_hid_close, |
276 | .hidinput_input_event = uhid_hid_input, | ||
277 | .parse = uhid_hid_parse, | 252 | .parse = uhid_hid_parse, |
278 | }; | 253 | }; |
279 | 254 | ||
@@ -659,3 +634,4 @@ module_exit(uhid_exit); | |||
659 | MODULE_LICENSE("GPL"); | 634 | MODULE_LICENSE("GPL"); |
660 | MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>"); | 635 | MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>"); |
661 | MODULE_DESCRIPTION("User-space I/O driver support for HID subsystem"); | 636 | MODULE_DESCRIPTION("User-space I/O driver support for HID subsystem"); |
637 | MODULE_ALIAS("devname:" UHID_NAME); | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 99418285222c..44df131d390a 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -535,7 +535,6 @@ static void __usbhid_submit_report(struct hid_device *hid, struct hid_report *re | |||
535 | { | 535 | { |
536 | int head; | 536 | int head; |
537 | struct usbhid_device *usbhid = hid->driver_data; | 537 | struct usbhid_device *usbhid = hid->driver_data; |
538 | int len = ((report->size - 1) >> 3) + 1 + (report->id > 0); | ||
539 | 538 | ||
540 | if ((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN) | 539 | if ((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN) |
541 | return; | 540 | return; |
@@ -546,7 +545,7 @@ static void __usbhid_submit_report(struct hid_device *hid, struct hid_report *re | |||
546 | return; | 545 | return; |
547 | } | 546 | } |
548 | 547 | ||
549 | usbhid->out[usbhid->outhead].raw_report = kmalloc(len, GFP_ATOMIC); | 548 | usbhid->out[usbhid->outhead].raw_report = hid_alloc_report_buf(report, GFP_ATOMIC); |
550 | if (!usbhid->out[usbhid->outhead].raw_report) { | 549 | if (!usbhid->out[usbhid->outhead].raw_report) { |
551 | hid_warn(hid, "output queueing failed\n"); | 550 | hid_warn(hid, "output queueing failed\n"); |
552 | return; | 551 | return; |
@@ -595,7 +594,7 @@ static void __usbhid_submit_report(struct hid_device *hid, struct hid_report *re | |||
595 | } | 594 | } |
596 | 595 | ||
597 | if (dir == USB_DIR_OUT) { | 596 | if (dir == USB_DIR_OUT) { |
598 | usbhid->ctrl[usbhid->ctrlhead].raw_report = kmalloc(len, GFP_ATOMIC); | 597 | usbhid->ctrl[usbhid->ctrlhead].raw_report = hid_alloc_report_buf(report, GFP_ATOMIC); |
599 | if (!usbhid->ctrl[usbhid->ctrlhead].raw_report) { | 598 | if (!usbhid->ctrl[usbhid->ctrlhead].raw_report) { |
600 | hid_warn(hid, "control queueing failed\n"); | 599 | hid_warn(hid, "control queueing failed\n"); |
601 | return; | 600 | return; |
@@ -649,62 +648,6 @@ static void usbhid_submit_report(struct hid_device *hid, struct hid_report *repo | |||
649 | spin_unlock_irqrestore(&usbhid->lock, flags); | 648 | spin_unlock_irqrestore(&usbhid->lock, flags); |
650 | } | 649 | } |
651 | 650 | ||
652 | /* Workqueue routine to send requests to change LEDs */ | ||
653 | static void hid_led(struct work_struct *work) | ||
654 | { | ||
655 | struct usbhid_device *usbhid = | ||
656 | container_of(work, struct usbhid_device, led_work); | ||
657 | struct hid_device *hid = usbhid->hid; | ||
658 | struct hid_field *field; | ||
659 | unsigned long flags; | ||
660 | |||
661 | field = hidinput_get_led_field(hid); | ||
662 | if (!field) { | ||
663 | hid_warn(hid, "LED event field not found\n"); | ||
664 | return; | ||
665 | } | ||
666 | |||
667 | spin_lock_irqsave(&usbhid->lock, flags); | ||
668 | if (!test_bit(HID_DISCONNECTED, &usbhid->iofl)) { | ||
669 | usbhid->ledcount = hidinput_count_leds(hid); | ||
670 | hid_dbg(usbhid->hid, "New ledcount = %u\n", usbhid->ledcount); | ||
671 | __usbhid_submit_report(hid, field->report, USB_DIR_OUT); | ||
672 | } | ||
673 | spin_unlock_irqrestore(&usbhid->lock, flags); | ||
674 | } | ||
675 | |||
676 | static int usb_hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | ||
677 | { | ||
678 | struct hid_device *hid = input_get_drvdata(dev); | ||
679 | struct usbhid_device *usbhid = hid->driver_data; | ||
680 | struct hid_field *field; | ||
681 | unsigned long flags; | ||
682 | int offset; | ||
683 | |||
684 | if (type == EV_FF) | ||
685 | return input_ff_event(dev, type, code, value); | ||
686 | |||
687 | if (type != EV_LED) | ||
688 | return -1; | ||
689 | |||
690 | if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) { | ||
691 | hid_warn(dev, "event field not found\n"); | ||
692 | return -1; | ||
693 | } | ||
694 | |||
695 | spin_lock_irqsave(&usbhid->lock, flags); | ||
696 | hid_set_field(field, offset, value); | ||
697 | spin_unlock_irqrestore(&usbhid->lock, flags); | ||
698 | |||
699 | /* | ||
700 | * Defer performing requested LED action. | ||
701 | * This is more likely gather all LED changes into a single URB. | ||
702 | */ | ||
703 | schedule_work(&usbhid->led_work); | ||
704 | |||
705 | return 0; | ||
706 | } | ||
707 | |||
708 | static int usbhid_wait_io(struct hid_device *hid) | 651 | static int usbhid_wait_io(struct hid_device *hid) |
709 | { | 652 | { |
710 | struct usbhid_device *usbhid = hid->driver_data; | 653 | struct usbhid_device *usbhid = hid->driver_data; |
@@ -807,12 +750,17 @@ void usbhid_init_reports(struct hid_device *hid) | |||
807 | { | 750 | { |
808 | struct hid_report *report; | 751 | struct hid_report *report; |
809 | struct usbhid_device *usbhid = hid->driver_data; | 752 | struct usbhid_device *usbhid = hid->driver_data; |
753 | struct hid_report_enum *report_enum; | ||
810 | int err, ret; | 754 | int err, ret; |
811 | 755 | ||
812 | list_for_each_entry(report, &hid->report_enum[HID_INPUT_REPORT].report_list, list) | 756 | if (!(hid->quirks & HID_QUIRK_NO_INIT_INPUT_REPORTS)) { |
813 | usbhid_submit_report(hid, report, USB_DIR_IN); | 757 | report_enum = &hid->report_enum[HID_INPUT_REPORT]; |
758 | list_for_each_entry(report, &report_enum->report_list, list) | ||
759 | usbhid_submit_report(hid, report, USB_DIR_IN); | ||
760 | } | ||
814 | 761 | ||
815 | list_for_each_entry(report, &hid->report_enum[HID_FEATURE_REPORT].report_list, list) | 762 | report_enum = &hid->report_enum[HID_FEATURE_REPORT]; |
763 | list_for_each_entry(report, &report_enum->report_list, list) | ||
816 | usbhid_submit_report(hid, report, USB_DIR_IN); | 764 | usbhid_submit_report(hid, report, USB_DIR_IN); |
817 | 765 | ||
818 | err = 0; | 766 | err = 0; |
@@ -857,7 +805,7 @@ static int hid_find_field_early(struct hid_device *hid, unsigned int page, | |||
857 | return -1; | 805 | return -1; |
858 | } | 806 | } |
859 | 807 | ||
860 | void usbhid_set_leds(struct hid_device *hid) | 808 | static void usbhid_set_leds(struct hid_device *hid) |
861 | { | 809 | { |
862 | struct hid_field *field; | 810 | struct hid_field *field; |
863 | int offset; | 811 | int offset; |
@@ -867,7 +815,6 @@ void usbhid_set_leds(struct hid_device *hid) | |||
867 | usbhid_submit_report(hid, field->report, USB_DIR_OUT); | 815 | usbhid_submit_report(hid, field->report, USB_DIR_OUT); |
868 | } | 816 | } |
869 | } | 817 | } |
870 | EXPORT_SYMBOL_GPL(usbhid_set_leds); | ||
871 | 818 | ||
872 | /* | 819 | /* |
873 | * Traverse the supplied list of reports and find the longest | 820 | * Traverse the supplied list of reports and find the longest |
@@ -1274,7 +1221,6 @@ static struct hid_ll_driver usb_hid_driver = { | |||
1274 | .open = usbhid_open, | 1221 | .open = usbhid_open, |
1275 | .close = usbhid_close, | 1222 | .close = usbhid_close, |
1276 | .power = usbhid_power, | 1223 | .power = usbhid_power, |
1277 | .hidinput_input_event = usb_hidinput_input_event, | ||
1278 | .request = usbhid_request, | 1224 | .request = usbhid_request, |
1279 | .wait = usbhid_wait_io, | 1225 | .wait = usbhid_wait_io, |
1280 | .idle = usbhid_idle, | 1226 | .idle = usbhid_idle, |
@@ -1368,8 +1314,6 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * | |||
1368 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | 1314 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); |
1369 | spin_lock_init(&usbhid->lock); | 1315 | spin_lock_init(&usbhid->lock); |
1370 | 1316 | ||
1371 | INIT_WORK(&usbhid->led_work, hid_led); | ||
1372 | |||
1373 | ret = hid_add_device(hid); | 1317 | ret = hid_add_device(hid); |
1374 | if (ret) { | 1318 | if (ret) { |
1375 | if (ret != -ENODEV) | 1319 | if (ret != -ENODEV) |
@@ -1402,7 +1346,6 @@ static void hid_cancel_delayed_stuff(struct usbhid_device *usbhid) | |||
1402 | { | 1346 | { |
1403 | del_timer_sync(&usbhid->io_retry); | 1347 | del_timer_sync(&usbhid->io_retry); |
1404 | cancel_work_sync(&usbhid->reset_work); | 1348 | cancel_work_sync(&usbhid->reset_work); |
1405 | cancel_work_sync(&usbhid->led_work); | ||
1406 | } | 1349 | } |
1407 | 1350 | ||
1408 | static void hid_cease_io(struct usbhid_device *usbhid) | 1351 | static void hid_cease_io(struct usbhid_device *usbhid) |
@@ -1522,15 +1465,17 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | |||
1522 | struct usbhid_device *usbhid = hid->driver_data; | 1465 | struct usbhid_device *usbhid = hid->driver_data; |
1523 | int status = 0; | 1466 | int status = 0; |
1524 | bool driver_suspended = false; | 1467 | bool driver_suspended = false; |
1468 | unsigned int ledcount; | ||
1525 | 1469 | ||
1526 | if (PMSG_IS_AUTO(message)) { | 1470 | if (PMSG_IS_AUTO(message)) { |
1471 | ledcount = hidinput_count_leds(hid); | ||
1527 | spin_lock_irq(&usbhid->lock); /* Sync with error handler */ | 1472 | spin_lock_irq(&usbhid->lock); /* Sync with error handler */ |
1528 | if (!test_bit(HID_RESET_PENDING, &usbhid->iofl) | 1473 | if (!test_bit(HID_RESET_PENDING, &usbhid->iofl) |
1529 | && !test_bit(HID_CLEAR_HALT, &usbhid->iofl) | 1474 | && !test_bit(HID_CLEAR_HALT, &usbhid->iofl) |
1530 | && !test_bit(HID_OUT_RUNNING, &usbhid->iofl) | 1475 | && !test_bit(HID_OUT_RUNNING, &usbhid->iofl) |
1531 | && !test_bit(HID_CTRL_RUNNING, &usbhid->iofl) | 1476 | && !test_bit(HID_CTRL_RUNNING, &usbhid->iofl) |
1532 | && !test_bit(HID_KEYS_PRESSED, &usbhid->iofl) | 1477 | && !test_bit(HID_KEYS_PRESSED, &usbhid->iofl) |
1533 | && (!usbhid->ledcount || ignoreled)) | 1478 | && (!ledcount || ignoreled)) |
1534 | { | 1479 | { |
1535 | set_bit(HID_SUSPENDED, &usbhid->iofl); | 1480 | set_bit(HID_SUSPENDED, &usbhid->iofl); |
1536 | spin_unlock_irq(&usbhid->lock); | 1481 | spin_unlock_irq(&usbhid->lock); |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 19b8360f2330..07345521f421 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -109,6 +109,8 @@ static const struct hid_blacklist { | |||
109 | { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, | 109 | { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, |
110 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, | 110 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, |
111 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, | 111 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, |
112 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, | ||
113 | |||
112 | { 0, 0 } | 114 | { 0, 0 } |
113 | }; | 115 | }; |
114 | 116 | ||
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index dbb6af699135..f633c24ce28b 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h | |||
@@ -92,9 +92,6 @@ struct usbhid_device { | |||
92 | unsigned int retry_delay; /* Delay length in ms */ | 92 | unsigned int retry_delay; /* Delay length in ms */ |
93 | struct work_struct reset_work; /* Task context for resets */ | 93 | struct work_struct reset_work; /* Task context for resets */ |
94 | wait_queue_head_t wait; /* For sleeping */ | 94 | wait_queue_head_t wait; /* For sleeping */ |
95 | int ledcount; /* counting the number of active leds */ | ||
96 | |||
97 | struct work_struct led_work; /* Task context for setting LEDs */ | ||
98 | }; | 95 | }; |
99 | 96 | ||
100 | #define hid_to_usb_dev(hid_dev) \ | 97 | #define hid_to_usb_dev(hid_dev) \ |
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c index 4ef4d5e198ae..a73f9618b0ad 100644 --- a/drivers/input/mouse/bcm5974.c +++ b/drivers/input/mouse/bcm5974.c | |||
@@ -89,9 +89,9 @@ | |||
89 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a | 89 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a |
90 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b | 90 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b |
91 | /* MacbookAir6,2 (unibody, June 2013) */ | 91 | /* MacbookAir6,2 (unibody, June 2013) */ |
92 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0291 | 92 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 |
93 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0292 | 93 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 |
94 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0293 | 94 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 |
95 | 95 | ||
96 | #define BCM5974_DEVICE(prod) { \ | 96 | #define BCM5974_DEVICE(prod) { \ |
97 | .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ | 97 | .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ |
diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index ecefb7311dd6..32ba45158d39 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h | |||
@@ -172,7 +172,7 @@ struct hid_sensor_common { | |||
172 | struct hid_sensor_hub_attribute_info sensitivity; | 172 | struct hid_sensor_hub_attribute_info sensitivity; |
173 | }; | 173 | }; |
174 | 174 | ||
175 | /*Convert from hid unit expo to regular exponent*/ | 175 | /* Convert from hid unit expo to regular exponent */ |
176 | static inline int hid_sensor_convert_exponent(int unit_expo) | 176 | static inline int hid_sensor_convert_exponent(int unit_expo) |
177 | { | 177 | { |
178 | if (unit_expo < 0x08) | 178 | if (unit_expo < 0x08) |
diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h index 6f24446e7669..4f945d3ed49f 100644 --- a/include/linux/hid-sensor-ids.h +++ b/include/linux/hid-sensor-ids.h | |||
@@ -37,7 +37,7 @@ | |||
37 | #define HID_USAGE_SENSOR_ANGL_VELOCITY_Y_AXIS 0x200458 | 37 | #define HID_USAGE_SENSOR_ANGL_VELOCITY_Y_AXIS 0x200458 |
38 | #define HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS 0x200459 | 38 | #define HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS 0x200459 |
39 | 39 | ||
40 | /*ORIENTATION: Compass 3D: (200083) */ | 40 | /* ORIENTATION: Compass 3D: (200083) */ |
41 | #define HID_USAGE_SENSOR_COMPASS_3D 0x200083 | 41 | #define HID_USAGE_SENSOR_COMPASS_3D 0x200083 |
42 | #define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING 0x200471 | 42 | #define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING 0x200471 |
43 | #define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_X 0x200472 | 43 | #define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_X 0x200472 |
diff --git a/include/linux/hid.h b/include/linux/hid.h index 0c48991b0402..ee1ffc5e19c9 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -252,6 +252,8 @@ struct hid_item { | |||
252 | #define HID_OUTPUT_REPORT 1 | 252 | #define HID_OUTPUT_REPORT 1 |
253 | #define HID_FEATURE_REPORT 2 | 253 | #define HID_FEATURE_REPORT 2 |
254 | 254 | ||
255 | #define HID_REPORT_TYPES 3 | ||
256 | |||
255 | /* | 257 | /* |
256 | * HID connect requests | 258 | * HID connect requests |
257 | */ | 259 | */ |
@@ -283,6 +285,7 @@ struct hid_item { | |||
283 | #define HID_QUIRK_MULTI_INPUT 0x00000040 | 285 | #define HID_QUIRK_MULTI_INPUT 0x00000040 |
284 | #define HID_QUIRK_HIDINPUT_FORCE 0x00000080 | 286 | #define HID_QUIRK_HIDINPUT_FORCE 0x00000080 |
285 | #define HID_QUIRK_NO_EMPTY_INPUT 0x00000100 | 287 | #define HID_QUIRK_NO_EMPTY_INPUT 0x00000100 |
288 | #define HID_QUIRK_NO_INIT_INPUT_REPORTS 0x00000200 | ||
286 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 | 289 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 |
287 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 | 290 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 |
288 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 | 291 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 |
@@ -295,6 +298,7 @@ struct hid_item { | |||
295 | #define HID_GROUP_GENERIC 0x0001 | 298 | #define HID_GROUP_GENERIC 0x0001 |
296 | #define HID_GROUP_MULTITOUCH 0x0002 | 299 | #define HID_GROUP_MULTITOUCH 0x0002 |
297 | #define HID_GROUP_SENSOR_HUB 0x0003 | 300 | #define HID_GROUP_SENSOR_HUB 0x0003 |
301 | #define HID_GROUP_MULTITOUCH_WIN_8 0x0004 | ||
298 | 302 | ||
299 | /* | 303 | /* |
300 | * This is the global environment of the parser. This information is | 304 | * This is the global environment of the parser. This information is |
@@ -393,14 +397,14 @@ struct hid_report { | |||
393 | struct hid_device *device; /* associated device */ | 397 | struct hid_device *device; /* associated device */ |
394 | }; | 398 | }; |
395 | 399 | ||
400 | #define HID_MAX_IDS 256 | ||
401 | |||
396 | struct hid_report_enum { | 402 | struct hid_report_enum { |
397 | unsigned numbered; | 403 | unsigned numbered; |
398 | struct list_head report_list; | 404 | struct list_head report_list; |
399 | struct hid_report *report_id_hash[256]; | 405 | struct hid_report *report_id_hash[HID_MAX_IDS]; |
400 | }; | 406 | }; |
401 | 407 | ||
402 | #define HID_REPORT_TYPES 3 | ||
403 | |||
404 | #define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */ | 408 | #define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */ |
405 | #define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ | 409 | #define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ |
406 | #define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ | 410 | #define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ |
@@ -456,6 +460,7 @@ struct hid_device { /* device report descriptor */ | |||
456 | enum hid_type type; /* device type (mouse, kbd, ...) */ | 460 | enum hid_type type; /* device type (mouse, kbd, ...) */ |
457 | unsigned country; /* HID country */ | 461 | unsigned country; /* HID country */ |
458 | struct hid_report_enum report_enum[HID_REPORT_TYPES]; | 462 | struct hid_report_enum report_enum[HID_REPORT_TYPES]; |
463 | struct work_struct led_work; /* delayed LED worker */ | ||
459 | 464 | ||
460 | struct semaphore driver_lock; /* protects the current driver, except during input */ | 465 | struct semaphore driver_lock; /* protects the current driver, except during input */ |
461 | struct semaphore driver_input_lock; /* protects the current driver */ | 466 | struct semaphore driver_input_lock; /* protects the current driver */ |
@@ -532,6 +537,8 @@ static inline void hid_set_drvdata(struct hid_device *hdev, void *data) | |||
532 | #define HID_GLOBAL_STACK_SIZE 4 | 537 | #define HID_GLOBAL_STACK_SIZE 4 |
533 | #define HID_COLLECTION_STACK_SIZE 4 | 538 | #define HID_COLLECTION_STACK_SIZE 4 |
534 | 539 | ||
540 | #define HID_SCAN_FLAG_MT_WIN_8 0x00000001 | ||
541 | |||
535 | struct hid_parser { | 542 | struct hid_parser { |
536 | struct hid_global global; | 543 | struct hid_global global; |
537 | struct hid_global global_stack[HID_GLOBAL_STACK_SIZE]; | 544 | struct hid_global global_stack[HID_GLOBAL_STACK_SIZE]; |
@@ -540,6 +547,7 @@ struct hid_parser { | |||
540 | unsigned collection_stack[HID_COLLECTION_STACK_SIZE]; | 547 | unsigned collection_stack[HID_COLLECTION_STACK_SIZE]; |
541 | unsigned collection_stack_ptr; | 548 | unsigned collection_stack_ptr; |
542 | struct hid_device *device; | 549 | struct hid_device *device; |
550 | unsigned scan_flags; | ||
543 | }; | 551 | }; |
544 | 552 | ||
545 | struct hid_class_descriptor { | 553 | struct hid_class_descriptor { |
@@ -744,6 +752,7 @@ struct hid_field *hidinput_get_led_field(struct hid_device *hid); | |||
744 | unsigned int hidinput_count_leds(struct hid_device *hid); | 752 | unsigned int hidinput_count_leds(struct hid_device *hid); |
745 | __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code); | 753 | __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code); |
746 | void hid_output_report(struct hid_report *report, __u8 *data); | 754 | void hid_output_report(struct hid_report *report, __u8 *data); |
755 | u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags); | ||
747 | struct hid_device *hid_allocate_device(void); | 756 | struct hid_device *hid_allocate_device(void); |
748 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); | 757 | struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); |
749 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); | 758 | int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size); |
@@ -989,7 +998,6 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | |||
989 | u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct); | 998 | u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct); |
990 | int usbhid_quirks_init(char **quirks_param); | 999 | int usbhid_quirks_init(char **quirks_param); |
991 | void usbhid_quirks_exit(void); | 1000 | void usbhid_quirks_exit(void); |
992 | void usbhid_set_leds(struct hid_device *hid); | ||
993 | 1001 | ||
994 | #ifdef CONFIG_HID_PID | 1002 | #ifdef CONFIG_HID_PID |
995 | int hid_pidff_init(struct hid_device *hid); | 1003 | int hid_pidff_init(struct hid_device *hid); |
diff --git a/include/linux/hidraw.h b/include/linux/hidraw.h index 2451662c728a..ddf52612eed8 100644 --- a/include/linux/hidraw.h +++ b/include/linux/hidraw.h | |||
@@ -23,6 +23,7 @@ struct hidraw { | |||
23 | wait_queue_head_t wait; | 23 | wait_queue_head_t wait; |
24 | struct hid_device *hid; | 24 | struct hid_device *hid; |
25 | struct device *dev; | 25 | struct device *dev; |
26 | spinlock_t list_lock; | ||
26 | struct list_head list; | 27 | struct list_head list; |
27 | }; | 28 | }; |
28 | 29 | ||
diff --git a/include/linux/i2c/i2c-hid.h b/include/linux/i2c/i2c-hid.h index 60e411d764d4..7aa901d92058 100644 --- a/include/linux/i2c/i2c-hid.h +++ b/include/linux/i2c/i2c-hid.h | |||
@@ -19,7 +19,8 @@ | |||
19 | * @hid_descriptor_address: i2c register where the HID descriptor is stored. | 19 | * @hid_descriptor_address: i2c register where the HID descriptor is stored. |
20 | * | 20 | * |
21 | * Note that it is the responsibility of the platform driver (or the acpi 5.0 | 21 | * Note that it is the responsibility of the platform driver (or the acpi 5.0 |
22 | * driver) to setup the irq related to the gpio in the struct i2c_board_info. | 22 | * driver, or the flattened device tree) to setup the irq related to the gpio in |
23 | * the struct i2c_board_info. | ||
23 | * The platform driver should also setup the gpio according to the device: | 24 | * The platform driver should also setup the gpio according to the device: |
24 | * | 25 | * |
25 | * A typical example is the following: | 26 | * A typical example is the following: |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 45e921401b06..329aa307cb77 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -277,7 +277,7 @@ struct pcmcia_device_id { | |||
277 | #define INPUT_DEVICE_ID_KEY_MIN_INTERESTING 0x71 | 277 | #define INPUT_DEVICE_ID_KEY_MIN_INTERESTING 0x71 |
278 | #define INPUT_DEVICE_ID_KEY_MAX 0x2ff | 278 | #define INPUT_DEVICE_ID_KEY_MAX 0x2ff |
279 | #define INPUT_DEVICE_ID_REL_MAX 0x0f | 279 | #define INPUT_DEVICE_ID_REL_MAX 0x0f |
280 | #define INPUT_DEVICE_ID_ABS_MAX 0x3f | 280 | #define INPUT_DEVICE_ID_ABS_MAX 0x4f |
281 | #define INPUT_DEVICE_ID_MSC_MAX 0x07 | 281 | #define INPUT_DEVICE_ID_MSC_MAX 0x07 |
282 | #define INPUT_DEVICE_ID_LED_MAX 0x0f | 282 | #define INPUT_DEVICE_ID_LED_MAX 0x0f |
283 | #define INPUT_DEVICE_ID_SND_MAX 0x07 | 283 | #define INPUT_DEVICE_ID_SND_MAX 0x07 |
diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index d584047b072b..76457eef172a 100644 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h | |||
@@ -716,6 +716,14 @@ struct input_keymap_entry { | |||
716 | #define BTN_DPAD_LEFT 0x222 | 716 | #define BTN_DPAD_LEFT 0x222 |
717 | #define BTN_DPAD_RIGHT 0x223 | 717 | #define BTN_DPAD_RIGHT 0x223 |
718 | 718 | ||
719 | #define BTN_FRET_FAR_UP 0x224 | ||
720 | #define BTN_FRET_UP 0x225 | ||
721 | #define BTN_FRET_MID 0x226 | ||
722 | #define BTN_FRET_LOW 0x227 | ||
723 | #define BTN_FRET_FAR_LOW 0x228 | ||
724 | #define BTN_STRUM_BAR_UP 0x229 | ||
725 | #define BTN_STRUM_BAR_DOWN 0x22a | ||
726 | |||
719 | #define BTN_TRIGGER_HAPPY 0x2c0 | 727 | #define BTN_TRIGGER_HAPPY 0x2c0 |
720 | #define BTN_TRIGGER_HAPPY1 0x2c0 | 728 | #define BTN_TRIGGER_HAPPY1 0x2c0 |
721 | #define BTN_TRIGGER_HAPPY2 0x2c1 | 729 | #define BTN_TRIGGER_HAPPY2 0x2c1 |
@@ -829,8 +837,21 @@ struct input_keymap_entry { | |||
829 | #define ABS_MT_TOOL_X 0x3c /* Center X tool position */ | 837 | #define ABS_MT_TOOL_X 0x3c /* Center X tool position */ |
830 | #define ABS_MT_TOOL_Y 0x3d /* Center Y tool position */ | 838 | #define ABS_MT_TOOL_Y 0x3d /* Center Y tool position */ |
831 | 839 | ||
832 | 840 | /* Drums and guitars (mostly toys) */ | |
833 | #define ABS_MAX 0x3f | 841 | #define ABS_TOM_FAR_LEFT 0x40 |
842 | #define ABS_TOM_LEFT 0x41 | ||
843 | #define ABS_TOM_RIGHT 0x42 | ||
844 | #define ABS_TOM_FAR_RIGHT 0x43 | ||
845 | #define ABS_CYMBAL_FAR_LEFT 0x44 | ||
846 | #define ABS_CYMBAL_LEFT 0x45 | ||
847 | #define ABS_CYMBAL_RIGHT 0x46 | ||
848 | #define ABS_CYMBAL_FAR_RIGHT 0x47 | ||
849 | #define ABS_BASS 0x48 | ||
850 | #define ABS_HI_HAT 0x49 | ||
851 | #define ABS_FRET_BOARD 0x4a /* Guitar fret board, vertical pos */ | ||
852 | #define ABS_WHAMMY_BAR 0x4b /* Guitar whammy bar (or vibrato) */ | ||
853 | |||
854 | #define ABS_MAX 0x4f | ||
834 | #define ABS_CNT (ABS_MAX+1) | 855 | #define ABS_CNT (ABS_MAX+1) |
835 | 856 | ||
836 | /* | 857 | /* |
diff --git a/include/uapi/linux/uhid.h b/include/uapi/linux/uhid.h index e9ed951e2b09..414b74be4da1 100644 --- a/include/uapi/linux/uhid.h +++ b/include/uapi/linux/uhid.h | |||
@@ -30,7 +30,7 @@ enum uhid_event_type { | |||
30 | UHID_OPEN, | 30 | UHID_OPEN, |
31 | UHID_CLOSE, | 31 | UHID_CLOSE, |
32 | UHID_OUTPUT, | 32 | UHID_OUTPUT, |
33 | UHID_OUTPUT_EV, | 33 | UHID_OUTPUT_EV, /* obsolete! */ |
34 | UHID_INPUT, | 34 | UHID_INPUT, |
35 | UHID_FEATURE, | 35 | UHID_FEATURE, |
36 | UHID_FEATURE_ANSWER, | 36 | UHID_FEATURE_ANSWER, |
@@ -69,6 +69,8 @@ struct uhid_output_req { | |||
69 | __u8 rtype; | 69 | __u8 rtype; |
70 | } __attribute__((__packed__)); | 70 | } __attribute__((__packed__)); |
71 | 71 | ||
72 | /* Obsolete! Newer kernels will no longer send these events but instead convert | ||
73 | * it into raw output reports via UHID_OUTPUT. */ | ||
72 | struct uhid_output_ev_req { | 74 | struct uhid_output_ev_req { |
73 | __u16 type; | 75 | __u16 type; |
74 | __u16 code; | 76 | __u16 code; |
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 13863de433a4..bdc35a7a7fee 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -225,17 +225,22 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
225 | 225 | ||
226 | static int hidp_send_report(struct hidp_session *session, struct hid_report *report) | 226 | static int hidp_send_report(struct hidp_session *session, struct hid_report *report) |
227 | { | 227 | { |
228 | unsigned char buf[32], hdr; | 228 | unsigned char hdr; |
229 | int rsize; | 229 | u8 *buf; |
230 | int rsize, ret; | ||
230 | 231 | ||
231 | rsize = ((report->size - 1) >> 3) + 1 + (report->id > 0); | 232 | buf = hid_alloc_report_buf(report, GFP_ATOMIC); |
232 | if (rsize > sizeof(buf)) | 233 | if (!buf) |
233 | return -EIO; | 234 | return -EIO; |
234 | 235 | ||
235 | hid_output_report(report, buf); | 236 | hid_output_report(report, buf); |
236 | hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; | 237 | hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; |
237 | 238 | ||
238 | return hidp_send_intr_message(session, hdr, buf, rsize); | 239 | rsize = ((report->size - 1) >> 3) + 1 + (report->id > 0); |
240 | ret = hidp_send_intr_message(session, hdr, buf, rsize); | ||
241 | |||
242 | kfree(buf); | ||
243 | return ret; | ||
239 | } | 244 | } |
240 | 245 | ||
241 | static int hidp_hidinput_event(struct input_dev *dev, unsigned int type, | 246 | static int hidp_hidinput_event(struct input_dev *dev, unsigned int type, |
diff --git a/samples/hidraw/.gitignore b/samples/hidraw/.gitignore new file mode 100644 index 000000000000..05e51a685242 --- /dev/null +++ b/samples/hidraw/.gitignore | |||
@@ -0,0 +1 @@ | |||
hid-example | |||
diff --git a/samples/uhid/uhid-example.c b/samples/uhid/uhid-example.c index 03ce3c059a5e..7d58a4b8d324 100644 --- a/samples/uhid/uhid-example.c +++ b/samples/uhid/uhid-example.c | |||
@@ -1,14 +1,15 @@ | |||
1 | /* | 1 | /* |
2 | * UHID Example | 2 | * UHID Example |
3 | * | 3 | * |
4 | * Copyright (c) 2012 David Herrmann <dh.herrmann@googlemail.com> | 4 | * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com> |
5 | * | 5 | * |
6 | * The code may be used by anyone for any purpose, | 6 | * The code may be used by anyone for any purpose, |
7 | * and can serve as a starting point for developing | 7 | * and can serve as a starting point for developing |
8 | * applications using uhid. | 8 | * applications using uhid. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /* UHID Example | 11 | /* |
12 | * UHID Example | ||
12 | * This example emulates a basic 3 buttons mouse with wheel over UHID. Run this | 13 | * This example emulates a basic 3 buttons mouse with wheel over UHID. Run this |
13 | * program as root and then use the following keys to control the mouse: | 14 | * program as root and then use the following keys to control the mouse: |
14 | * q: Quit the application | 15 | * q: Quit the application |
@@ -22,6 +23,11 @@ | |||
22 | * r: Move wheel up | 23 | * r: Move wheel up |
23 | * f: Move wheel down | 24 | * f: Move wheel down |
24 | * | 25 | * |
26 | * Additionally to 3 button mouse, 3 keyboard LEDs are also supported (LED_NUML, | ||
27 | * LED_CAPSL and LED_SCROLLL). The device doesn't generate any related keyboard | ||
28 | * events, though. You need to manually write the EV_LED/LED_XY/1 activation | ||
29 | * input event to the evdev device to see it being sent to this device. | ||
30 | * | ||
25 | * If uhid is not available as /dev/uhid, then you can pass a different path as | 31 | * If uhid is not available as /dev/uhid, then you can pass a different path as |
26 | * first argument. | 32 | * first argument. |
27 | * If <linux/uhid.h> is not installed in /usr, then compile this with: | 33 | * If <linux/uhid.h> is not installed in /usr, then compile this with: |
@@ -41,11 +47,12 @@ | |||
41 | #include <unistd.h> | 47 | #include <unistd.h> |
42 | #include <linux/uhid.h> | 48 | #include <linux/uhid.h> |
43 | 49 | ||
44 | /* HID Report Desciptor | 50 | /* |
45 | * We emulate a basic 3 button mouse with wheel. This is the report-descriptor | 51 | * HID Report Desciptor |
46 | * as the kernel will parse it: | 52 | * We emulate a basic 3 button mouse with wheel and 3 keyboard LEDs. This is |
53 | * the report-descriptor as the kernel will parse it: | ||
47 | * | 54 | * |
48 | * INPUT[INPUT] | 55 | * INPUT(1)[INPUT] |
49 | * Field(0) | 56 | * Field(0) |
50 | * Physical(GenericDesktop.Pointer) | 57 | * Physical(GenericDesktop.Pointer) |
51 | * Application(GenericDesktop.Mouse) | 58 | * Application(GenericDesktop.Mouse) |
@@ -72,6 +79,19 @@ | |||
72 | * Report Count(3) | 79 | * Report Count(3) |
73 | * Report Offset(8) | 80 | * Report Offset(8) |
74 | * Flags( Variable Relative ) | 81 | * Flags( Variable Relative ) |
82 | * OUTPUT(2)[OUTPUT] | ||
83 | * Field(0) | ||
84 | * Application(GenericDesktop.Keyboard) | ||
85 | * Usage(3) | ||
86 | * LED.NumLock | ||
87 | * LED.CapsLock | ||
88 | * LED.ScrollLock | ||
89 | * Logical Minimum(0) | ||
90 | * Logical Maximum(1) | ||
91 | * Report Size(1) | ||
92 | * Report Count(3) | ||
93 | * Report Offset(0) | ||
94 | * Flags( Variable Absolute ) | ||
75 | * | 95 | * |
76 | * This is the mapping that we expect: | 96 | * This is the mapping that we expect: |
77 | * Button.0001 ---> Key.LeftBtn | 97 | * Button.0001 ---> Key.LeftBtn |
@@ -80,19 +100,59 @@ | |||
80 | * GenericDesktop.X ---> Relative.X | 100 | * GenericDesktop.X ---> Relative.X |
81 | * GenericDesktop.Y ---> Relative.Y | 101 | * GenericDesktop.Y ---> Relative.Y |
82 | * GenericDesktop.Wheel ---> Relative.Wheel | 102 | * GenericDesktop.Wheel ---> Relative.Wheel |
103 | * LED.NumLock ---> LED.NumLock | ||
104 | * LED.CapsLock ---> LED.CapsLock | ||
105 | * LED.ScrollLock ---> LED.ScrollLock | ||
83 | * | 106 | * |
84 | * This information can be verified by reading /sys/kernel/debug/hid/<dev>/rdesc | 107 | * This information can be verified by reading /sys/kernel/debug/hid/<dev>/rdesc |
85 | * This file should print the same information as showed above. | 108 | * This file should print the same information as showed above. |
86 | */ | 109 | */ |
87 | 110 | ||
88 | static unsigned char rdesc[] = { | 111 | static unsigned char rdesc[] = { |
89 | 0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x09, 0x01, | 112 | 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ |
90 | 0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, | 113 | 0x09, 0x02, /* USAGE (Mouse) */ |
91 | 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, | 114 | 0xa1, 0x01, /* COLLECTION (Application) */ |
92 | 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x01, | 115 | 0x09, 0x01, /* USAGE (Pointer) */ |
93 | 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x09, 0x38, | 116 | 0xa1, 0x00, /* COLLECTION (Physical) */ |
94 | 0x15, 0x80, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03, | 117 | 0x85, 0x01, /* REPORT_ID (1) */ |
95 | 0x81, 0x06, 0xc0, 0xc0, | 118 | 0x05, 0x09, /* USAGE_PAGE (Button) */ |
119 | 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ | ||
120 | 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */ | ||
121 | 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ | ||
122 | 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ | ||
123 | 0x95, 0x03, /* REPORT_COUNT (3) */ | ||
124 | 0x75, 0x01, /* REPORT_SIZE (1) */ | ||
125 | 0x81, 0x02, /* INPUT (Data,Var,Abs) */ | ||
126 | 0x95, 0x01, /* REPORT_COUNT (1) */ | ||
127 | 0x75, 0x05, /* REPORT_SIZE (5) */ | ||
128 | 0x81, 0x01, /* INPUT (Cnst,Var,Abs) */ | ||
129 | 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ | ||
130 | 0x09, 0x30, /* USAGE (X) */ | ||
131 | 0x09, 0x31, /* USAGE (Y) */ | ||
132 | 0x09, 0x38, /* USAGE (WHEEL) */ | ||
133 | 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ | ||
134 | 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ | ||
135 | 0x75, 0x08, /* REPORT_SIZE (8) */ | ||
136 | 0x95, 0x03, /* REPORT_COUNT (3) */ | ||
137 | 0x81, 0x06, /* INPUT (Data,Var,Rel) */ | ||
138 | 0xc0, /* END_COLLECTION */ | ||
139 | 0xc0, /* END_COLLECTION */ | ||
140 | 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ | ||
141 | 0x09, 0x06, /* USAGE (Keyboard) */ | ||
142 | 0xa1, 0x01, /* COLLECTION (Application) */ | ||
143 | 0x85, 0x02, /* REPORT_ID (2) */ | ||
144 | 0x05, 0x08, /* USAGE_PAGE (Led) */ | ||
145 | 0x19, 0x01, /* USAGE_MINIMUM (1) */ | ||
146 | 0x29, 0x03, /* USAGE_MAXIMUM (3) */ | ||
147 | 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ | ||
148 | 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ | ||
149 | 0x95, 0x03, /* REPORT_COUNT (3) */ | ||
150 | 0x75, 0x01, /* REPORT_SIZE (1) */ | ||
151 | 0x91, 0x02, /* Output (Data,Var,Abs) */ | ||
152 | 0x95, 0x01, /* REPORT_COUNT (1) */ | ||
153 | 0x75, 0x05, /* REPORT_SIZE (5) */ | ||
154 | 0x91, 0x01, /* Output (Cnst,Var,Abs) */ | ||
155 | 0xc0, /* END_COLLECTION */ | ||
96 | }; | 156 | }; |
97 | 157 | ||
98 | static int uhid_write(int fd, const struct uhid_event *ev) | 158 | static int uhid_write(int fd, const struct uhid_event *ev) |
@@ -140,6 +200,27 @@ static void destroy(int fd) | |||
140 | uhid_write(fd, &ev); | 200 | uhid_write(fd, &ev); |
141 | } | 201 | } |
142 | 202 | ||
203 | /* This parses raw output reports sent by the kernel to the device. A normal | ||
204 | * uhid program shouldn't do this but instead just forward the raw report. | ||
205 | * However, for ducomentational purposes, we try to detect LED events here and | ||
206 | * print debug messages for it. */ | ||
207 | static void handle_output(struct uhid_event *ev) | ||
208 | { | ||
209 | /* LED messages are adverised via OUTPUT reports; ignore the rest */ | ||
210 | if (ev->u.output.rtype != UHID_OUTPUT_REPORT) | ||
211 | return; | ||
212 | /* LED reports have length 2 bytes */ | ||
213 | if (ev->u.output.size != 2) | ||
214 | return; | ||
215 | /* first byte is report-id which is 0x02 for LEDs in our rdesc */ | ||
216 | if (ev->u.output.data[0] != 0x2) | ||
217 | return; | ||
218 | |||
219 | /* print flags payload */ | ||
220 | fprintf(stderr, "LED output report received with flags %x\n", | ||
221 | ev->u.output.data[1]); | ||
222 | } | ||
223 | |||
143 | static int event(int fd) | 224 | static int event(int fd) |
144 | { | 225 | { |
145 | struct uhid_event ev; | 226 | struct uhid_event ev; |
@@ -174,6 +255,7 @@ static int event(int fd) | |||
174 | break; | 255 | break; |
175 | case UHID_OUTPUT: | 256 | case UHID_OUTPUT: |
176 | fprintf(stderr, "UHID_OUTPUT from uhid-dev\n"); | 257 | fprintf(stderr, "UHID_OUTPUT from uhid-dev\n"); |
258 | handle_output(&ev); | ||
177 | break; | 259 | break; |
178 | case UHID_OUTPUT_EV: | 260 | case UHID_OUTPUT_EV: |
179 | fprintf(stderr, "UHID_OUTPUT_EV from uhid-dev\n"); | 261 | fprintf(stderr, "UHID_OUTPUT_EV from uhid-dev\n"); |
@@ -198,18 +280,19 @@ static int send_event(int fd) | |||
198 | 280 | ||
199 | memset(&ev, 0, sizeof(ev)); | 281 | memset(&ev, 0, sizeof(ev)); |
200 | ev.type = UHID_INPUT; | 282 | ev.type = UHID_INPUT; |
201 | ev.u.input.size = 4; | 283 | ev.u.input.size = 5; |
202 | 284 | ||
285 | ev.u.input.data[0] = 0x1; | ||
203 | if (btn1_down) | 286 | if (btn1_down) |
204 | ev.u.input.data[0] |= 0x1; | 287 | ev.u.input.data[1] |= 0x1; |
205 | if (btn2_down) | 288 | if (btn2_down) |
206 | ev.u.input.data[0] |= 0x2; | 289 | ev.u.input.data[1] |= 0x2; |
207 | if (btn3_down) | 290 | if (btn3_down) |
208 | ev.u.input.data[0] |= 0x4; | 291 | ev.u.input.data[1] |= 0x4; |
209 | 292 | ||
210 | ev.u.input.data[1] = abs_hor; | 293 | ev.u.input.data[2] = abs_hor; |
211 | ev.u.input.data[2] = abs_ver; | 294 | ev.u.input.data[3] = abs_ver; |
212 | ev.u.input.data[3] = wheel; | 295 | ev.u.input.data[4] = wheel; |
213 | 296 | ||
214 | return uhid_write(fd, &ev); | 297 | return uhid_write(fd, &ev); |
215 | } | 298 | } |