diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-01 13:38:09 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-01 13:38:09 -0500 |
commit | 8724fdb53d27d7b59b60c8a399cc67f9abfabb33 (patch) | |
tree | da2de791ed4845780376a5e6f844ab69957d565f | |
parent | bc535154137601400ffe44c2a7be047ca041fe06 (diff) | |
parent | 35858adbfca13678af99fb31618ef4428d6dedb0 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (62 commits)
Input: atkbd - release previously reserved keycodes 248 - 254
Input: add KEY_WPS_BUTTON definition
Input: ads7846 - add regulator support
Input: winbond-cir - fix suspend/resume
Input: gamecon - use pr_err() and friends
Input: gamecon - constify some of the setup structures
Input: gamecon - simplify pad type handling
Input: gamecon - simplify coordinate calculation for PSX
Input: gamecon - fix some formatting issues
Input: gamecon - add rumble support for N64 pads
Input: wacom - add device type to device name string
Input: s3c24xx_ts - report touch only when stylus is down
Input: s3c24xx_ts - re-enable IRQ on resume
Input: wacom - constify product features data
Input: wacom - use per-device instance of wacom_features
Input: sh_keysc - enable building on SH-Mobile ARM
Input: wacom - get features from driver info
Input: rotary-encoder - set gpio direction for each requested gpio
Input: sh_keysc - update the driver with mode 6
Input: sh_keysc - switch to using bitmaps
...
53 files changed, 3250 insertions, 1334 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index ea401495528d..732b1fa48cf2 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -538,3 +538,26 @@ Why: Duplicate functionality with the gspca_zc3xx driver, zc0301 only | |||
538 | sensors) wich are also supported by the gspca_zc3xx driver | 538 | sensors) wich are also supported by the gspca_zc3xx driver |
539 | (which supports 53 USB-ID's in total) | 539 | (which supports 53 USB-ID's in total) |
540 | Who: Hans de Goede <hdegoede@redhat.com> | 540 | Who: Hans de Goede <hdegoede@redhat.com> |
541 | |||
542 | ---------------------------- | ||
543 | |||
544 | What: corgikbd, spitzkbd, tosakbd driver | ||
545 | When: 2.6.35 | ||
546 | Files: drivers/input/keyboard/{corgi,spitz,tosa}kbd.c | ||
547 | Why: We now have a generic GPIO based matrix keyboard driver that | ||
548 | are fully capable of handling all the keys on these devices. | ||
549 | The original drivers manipulate the GPIO registers directly | ||
550 | and so are difficult to maintain. | ||
551 | Who: Eric Miao <eric.y.miao@gmail.com> | ||
552 | |||
553 | ---------------------------- | ||
554 | |||
555 | What: corgi_ssp and corgi_ts driver | ||
556 | When: 2.6.35 | ||
557 | Files: arch/arm/mach-pxa/corgi_ssp.c, drivers/input/touchscreen/corgi_ts.c | ||
558 | Why: The corgi touchscreen is now deprecated in favour of the generic | ||
559 | ads7846.c driver. The noise reduction technique used in corgi_ts.c, | ||
560 | that's to wait till vsync before ADC sampling, is also integrated into | ||
561 | ads7846 driver now. Provided that the original driver is not generic | ||
562 | and is difficult to maintain, it will be removed later. | ||
563 | Who: Eric Miao <eric.y.miao@gmail.com> | ||
diff --git a/Documentation/input/sentelic.txt b/Documentation/input/sentelic.txt index f7160a2fb6a2..b35affd5c649 100644 --- a/Documentation/input/sentelic.txt +++ b/Documentation/input/sentelic.txt | |||
@@ -1,5 +1,5 @@ | |||
1 | Copyright (C) 2002-2008 Sentelic Corporation. | 1 | Copyright (C) 2002-2010 Sentelic Corporation. |
2 | Last update: Oct-31-2008 | 2 | Last update: Jan-13-2010 |
3 | 3 | ||
4 | ============================================================================== | 4 | ============================================================================== |
5 | * Finger Sensing Pad Intellimouse Mode(scrolling wheel, 4th and 5th buttons) | 5 | * Finger Sensing Pad Intellimouse Mode(scrolling wheel, 4th and 5th buttons) |
@@ -44,7 +44,7 @@ B) MSID 6: Horizontal and Vertical scrolling. | |||
44 | Packet 1 | 44 | Packet 1 |
45 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | 45 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 |
46 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| | 46 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| |
47 | 1 |Y|X|y|x|1|M|R|L| 2 |X|X|X|X|X|X|X|X| 3 |Y|Y|Y|Y|Y|Y|Y|Y| 4 | | |B|F|l|r|u|d| | 47 | 1 |Y|X|y|x|1|M|R|L| 2 |X|X|X|X|X|X|X|X| 3 |Y|Y|Y|Y|Y|Y|Y|Y| 4 | | |B|F|r|l|u|d| |
48 | |---------------| |---------------| |---------------| |---------------| | 48 | |---------------| |---------------| |---------------| |---------------| |
49 | 49 | ||
50 | Byte 1: Bit7 => Y overflow | 50 | Byte 1: Bit7 => Y overflow |
@@ -59,15 +59,15 @@ Byte 2: X Movement(9-bit 2's complement integers) | |||
59 | Byte 3: Y Movement(9-bit 2's complement integers) | 59 | Byte 3: Y Movement(9-bit 2's complement integers) |
60 | Byte 4: Bit0 => the Vertical scrolling movement downward. | 60 | Byte 4: Bit0 => the Vertical scrolling movement downward. |
61 | Bit1 => the Vertical scrolling movement upward. | 61 | Bit1 => the Vertical scrolling movement upward. |
62 | Bit2 => the Vertical scrolling movement rightward. | 62 | Bit2 => the Horizontal scrolling movement leftward. |
63 | Bit3 => the Vertical scrolling movement leftward. | 63 | Bit3 => the Horizontal scrolling movement rightward. |
64 | Bit4 => 1 = 4th mouse button is pressed, Forward one page. | 64 | Bit4 => 1 = 4th mouse button is pressed, Forward one page. |
65 | 0 = 4th mouse button is not pressed. | 65 | 0 = 4th mouse button is not pressed. |
66 | Bit5 => 1 = 5th mouse button is pressed, Backward one page. | 66 | Bit5 => 1 = 5th mouse button is pressed, Backward one page. |
67 | 0 = 5th mouse button is not pressed. | 67 | 0 = 5th mouse button is not pressed. |
68 | 68 | ||
69 | C) MSID 7: | 69 | C) MSID 7: |
70 | # FSP uses 2 packets(8 Bytes) data to represent Absolute Position | 70 | # FSP uses 2 packets (8 Bytes) to represent Absolute Position. |
71 | so we have PACKET NUMBER to identify packets. | 71 | so we have PACKET NUMBER to identify packets. |
72 | If PACKET NUMBER is 0, the packet is Packet 1. | 72 | If PACKET NUMBER is 0, the packet is Packet 1. |
73 | If PACKET NUMBER is 1, the packet is Packet 2. | 73 | If PACKET NUMBER is 1, the packet is Packet 2. |
@@ -129,7 +129,7 @@ Byte 3: Message Type => 0x00 (Disabled) | |||
129 | Byte 4: Bit7~Bit0 => Don't Care | 129 | Byte 4: Bit7~Bit0 => Don't Care |
130 | 130 | ||
131 | ============================================================================== | 131 | ============================================================================== |
132 | * Absolute position for STL3888-A0. | 132 | * Absolute position for STL3888-Ax. |
133 | ============================================================================== | 133 | ============================================================================== |
134 | Packet 1 (ABSOLUTE POSITION) | 134 | Packet 1 (ABSOLUTE POSITION) |
135 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | 135 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 |
@@ -179,14 +179,14 @@ Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0]) | |||
179 | Bit5~Bit4 => y2_g | 179 | Bit5~Bit4 => y2_g |
180 | Bit7~Bit6 => x2_g | 180 | Bit7~Bit6 => x2_g |
181 | 181 | ||
182 | Notify Packet for STL3888-A0 | 182 | Notify Packet for STL3888-Ax |
183 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | 183 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 |
184 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| | 184 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| |
185 | 1 |1|0|1|P|1|M|R|L| 2 |C|C|C|C|C|C|C|C| 3 |0|0|F|F|0|0|0|i| 4 |r|l|d|u|0|0|0|0| | 185 | 1 |1|0|1|P|1|M|R|L| 2 |C|C|C|C|C|C|C|C| 3 |0|0|F|F|0|0|0|i| 4 |r|l|d|u|0|0|0|0| |
186 | |---------------| |---------------| |---------------| |---------------| | 186 | |---------------| |---------------| |---------------| |---------------| |
187 | 187 | ||
188 | Byte 1: Bit7~Bit6 => 00, Normal data packet | 188 | Byte 1: Bit7~Bit6 => 00, Normal data packet |
189 | => 01, Absolute coordination packet | 189 | => 01, Absolute coordinates packet |
190 | => 10, Notify packet | 190 | => 10, Notify packet |
191 | Bit5 => 1 | 191 | Bit5 => 1 |
192 | Bit4 => when in absolute coordinates mode (valid when EN_PKT_GO is 1): | 192 | Bit4 => when in absolute coordinates mode (valid when EN_PKT_GO is 1): |
@@ -205,15 +205,106 @@ Byte 4: Bit7 => scroll right button | |||
205 | Bit6 => scroll left button | 205 | Bit6 => scroll left button |
206 | Bit5 => scroll down button | 206 | Bit5 => scroll down button |
207 | Bit4 => scroll up button | 207 | Bit4 => scroll up button |
208 | * Note that if gesture and additional button (Bit4~Bit7) | 208 | * Note that if gesture and additional buttoni (Bit4~Bit7) |
209 | happen at the same time, the button information will not | 209 | happen at the same time, the button information will not |
210 | be sent. | 210 | be sent. |
211 | Bit3~Bit0 => Reserved | ||
212 | |||
213 | Sample sequence of Multi-finger, Multi-coordinate mode: | ||
214 | |||
215 | notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1, | ||
216 | abs pkt 2, ..., notify packet (valid bit == 0) | ||
217 | |||
218 | ============================================================================== | ||
219 | * Absolute position for STL3888-B0. | ||
220 | ============================================================================== | ||
221 | Packet 1(ABSOLUTE POSITION) | ||
222 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | ||
223 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| | ||
224 | 1 |0|1|V|F|1|0|R|L| 2 |X|X|X|X|X|X|X|X| 3 |Y|Y|Y|Y|Y|Y|Y|Y| 4 |r|l|u|d|X|X|Y|Y| | ||
225 | |---------------| |---------------| |---------------| |---------------| | ||
226 | |||
227 | Byte 1: Bit7~Bit6 => 00, Normal data packet | ||
228 | => 01, Absolute coordinates packet | ||
229 | => 10, Notify packet | ||
230 | Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up. | ||
231 | When both fingers are up, the last two reports have zero valid | ||
232 | bit. | ||
233 | Bit4 => finger up/down information. 1: finger down, 0: finger up. | ||
234 | Bit3 => 1 | ||
235 | Bit2 => finger index, 0 is the first finger, 1 is the second finger. | ||
236 | Bit1 => Right Button, 1 is pressed, 0 is not pressed. | ||
237 | Bit0 => Left Button, 1 is pressed, 0 is not pressed. | ||
238 | Byte 2: X coordinate (xpos[9:2]) | ||
239 | Byte 3: Y coordinate (ypos[9:2]) | ||
240 | Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0]) | ||
241 | Bit3~Bit2 => X coordinate (ypos[1:0]) | ||
242 | Bit4 => scroll down button | ||
243 | Bit5 => scroll up button | ||
244 | Bit6 => scroll left button | ||
245 | Bit7 => scroll right button | ||
246 | |||
247 | Packet 2 (ABSOLUTE POSITION) | ||
248 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | ||
249 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| | ||
250 | 1 |0|1|V|F|1|1|R|L| 2 |X|X|X|X|X|X|X|X| 3 |Y|Y|Y|Y|Y|Y|Y|Y| 4 |r|l|u|d|X|X|Y|Y| | ||
251 | |---------------| |---------------| |---------------| |---------------| | ||
252 | |||
253 | Byte 1: Bit7~Bit6 => 00, Normal data packet | ||
254 | => 01, Absolute coordination packet | ||
255 | => 10, Notify packet | ||
256 | Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up. | ||
257 | When both fingers are up, the last two reports have zero valid | ||
258 | bit. | ||
259 | Bit4 => finger up/down information. 1: finger down, 0: finger up. | ||
260 | Bit3 => 1 | ||
261 | Bit2 => finger index, 0 is the first finger, 1 is the second finger. | ||
262 | Bit1 => Right Button, 1 is pressed, 0 is not pressed. | ||
263 | Bit0 => Left Button, 1 is pressed, 0 is not pressed. | ||
264 | Byte 2: X coordinate (xpos[9:2]) | ||
265 | Byte 3: Y coordinate (ypos[9:2]) | ||
266 | Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0]) | ||
267 | Bit3~Bit2 => X coordinate (ypos[1:0]) | ||
268 | Bit4 => scroll down button | ||
269 | Bit5 => scroll up button | ||
270 | Bit6 => scroll left button | ||
271 | Bit7 => scroll right button | ||
272 | |||
273 | Notify Packet for STL3888-B0 | ||
274 | Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 | ||
275 | BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| | ||
276 | 1 |1|0|1|P|1|M|R|L| 2 |C|C|C|C|C|C|C|C| 3 |0|0|F|F|0|0|0|i| 4 |r|l|u|d|0|0|0|0| | ||
277 | |---------------| |---------------| |---------------| |---------------| | ||
278 | |||
279 | Byte 1: Bit7~Bit6 => 00, Normal data packet | ||
280 | => 01, Absolute coordination packet | ||
281 | => 10, Notify packet | ||
282 | Bit5 => 1 | ||
283 | Bit4 => when in absolute coordinate mode (valid when EN_PKT_GO is 1): | ||
284 | 0: left button is generated by the on-pad command | ||
285 | 1: left button is generated by the external button | ||
286 | Bit3 => 1 | ||
287 | Bit2 => Middle Button, 1 is pressed, 0 is not pressed. | ||
288 | Bit1 => Right Button, 1 is pressed, 0 is not pressed. | ||
289 | Bit0 => Left Button, 1 is pressed, 0 is not pressed. | ||
290 | Byte 2: Message Type => 0xB7 (Multi Finger, Multi Coordinate mode) | ||
291 | Byte 3: Bit7~Bit6 => Don't care | ||
292 | Bit5~Bit4 => Number of fingers | ||
293 | Bit3~Bit1 => Reserved | ||
294 | Bit0 => 1: enter gesture mode; 0: leaving gesture mode | ||
295 | Byte 4: Bit7 => scroll right button | ||
296 | Bit6 => scroll left button | ||
297 | Bit5 => scroll up button | ||
298 | Bit4 => scroll down button | ||
299 | * Note that if gesture and additional button(Bit4~Bit7) | ||
300 | happen at the same time, the button information will not | ||
301 | be sent. | ||
211 | Bit3~Bit0 => Reserved | 302 | Bit3~Bit0 => Reserved |
212 | 303 | ||
213 | Sample sequence of Multi-finger, Multi-coordinate mode: | 304 | Sample sequence of Multi-finger, Multi-coordinate mode: |
214 | 305 | ||
215 | notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1, | 306 | notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1, |
216 | abs pkt 2, ..., notify packet(valid bit == 0) | 307 | abs pkt 2, ..., notify packet (valid bit == 0) |
217 | 308 | ||
218 | ============================================================================== | 309 | ============================================================================== |
219 | * FSP Enable/Disable packet | 310 | * FSP Enable/Disable packet |
@@ -409,7 +500,8 @@ offset width default r/w name | |||
409 | 0: read only, 1: read/write enable | 500 | 0: read only, 1: read/write enable |
410 | (Note that following registers does not require clock gating being | 501 | (Note that following registers does not require clock gating being |
411 | enabled prior to write: 05 06 07 08 09 0c 0f 10 11 12 16 17 18 23 2e | 502 | enabled prior to write: 05 06 07 08 09 0c 0f 10 11 12 16 17 18 23 2e |
412 | 40 41 42 43.) | 503 | 40 41 42 43. In addition to that, this bit must be 1 when gesture |
504 | mode is enabled) | ||
413 | 505 | ||
414 | 0x31 RW on-pad command detection | 506 | 0x31 RW on-pad command detection |
415 | bit7 0 RW on-pad command left button down tag | 507 | bit7 0 RW on-pad command left button down tag |
@@ -463,6 +555,10 @@ offset width default r/w name | |||
463 | absolute coordinates; otherwise, host only receives packets with | 555 | absolute coordinates; otherwise, host only receives packets with |
464 | relative coordinate.) | 556 | relative coordinate.) |
465 | 557 | ||
558 | bit7 0 RW EN_PS2_F2: PS/2 gesture mode 2nd | ||
559 | finger packet enable | ||
560 | 0: disable, 1: enable | ||
561 | |||
466 | 0x43 RW on-pad control | 562 | 0x43 RW on-pad control |
467 | bit0 0 RW on-pad control enable | 563 | bit0 0 RW on-pad control enable |
468 | 0: disable, 1: enable | 564 | 0: disable, 1: enable |
diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h b/arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h index 62d17421e48c..1e2f4e97f428 100644 --- a/arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx_keypad.h | |||
@@ -5,6 +5,8 @@ | |||
5 | #ifndef __ASM_ARCH_EP93XX_KEYPAD_H | 5 | #ifndef __ASM_ARCH_EP93XX_KEYPAD_H |
6 | #define __ASM_ARCH_EP93XX_KEYPAD_H | 6 | #define __ASM_ARCH_EP93XX_KEYPAD_H |
7 | 7 | ||
8 | struct matrix_keymap_data; | ||
9 | |||
8 | /* flags for the ep93xx_keypad driver */ | 10 | /* flags for the ep93xx_keypad driver */ |
9 | #define EP93XX_KEYPAD_DISABLE_3_KEY (1<<0) /* disable 3-key reset */ | 11 | #define EP93XX_KEYPAD_DISABLE_3_KEY (1<<0) /* disable 3-key reset */ |
10 | #define EP93XX_KEYPAD_DIAG_MODE (1<<1) /* diagnostic mode */ | 12 | #define EP93XX_KEYPAD_DIAG_MODE (1<<1) /* diagnostic mode */ |
@@ -15,15 +17,13 @@ | |||
15 | 17 | ||
16 | /** | 18 | /** |
17 | * struct ep93xx_keypad_platform_data - platform specific device structure | 19 | * struct ep93xx_keypad_platform_data - platform specific device structure |
18 | * @matrix_key_map: array of keycodes defining the keypad matrix | 20 | * @keymap_data: pointer to &matrix_keymap_data |
19 | * @matrix_key_map_size: ARRAY_SIZE(matrix_key_map) | 21 | * @debounce: debounce start count; terminal count is 0xff |
20 | * @debounce: debounce start count; terminal count is 0xff | 22 | * @prescale: row/column counter pre-scaler load value |
21 | * @prescale: row/column counter pre-scaler load value | 23 | * @flags: see above |
22 | * @flags: see above | ||
23 | */ | 24 | */ |
24 | struct ep93xx_keypad_platform_data { | 25 | struct ep93xx_keypad_platform_data { |
25 | unsigned int *matrix_key_map; | 26 | struct matrix_keymap_data *keymap_data; |
26 | int matrix_key_map_size; | ||
27 | unsigned int debounce; | 27 | unsigned int debounce; |
28 | unsigned int prescale; | 28 | unsigned int prescale; |
29 | unsigned int flags; | 29 | unsigned int flags; |
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index f706b1dffdb3..ada25bb8941e 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -1185,11 +1185,6 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw) | |||
1185 | 1185 | ||
1186 | rep = (down == 2); | 1186 | rep = (down == 2); |
1187 | 1187 | ||
1188 | #ifdef CONFIG_MAC_EMUMOUSEBTN | ||
1189 | if (mac_hid_mouse_emulate_buttons(1, keycode, down)) | ||
1190 | return; | ||
1191 | #endif /* CONFIG_MAC_EMUMOUSEBTN */ | ||
1192 | |||
1193 | if ((raw_mode = (kbd->kbdmode == VC_RAW)) && !hw_raw) | 1188 | if ((raw_mode = (kbd->kbdmode == VC_RAW)) && !hw_raw) |
1194 | if (emulate_raw(vc, keycode, !down << 7)) | 1189 | if (emulate_raw(vc, keycode, !down << 7)) |
1195 | if (keycode < BTN_MISC && printk_ratelimit()) | 1190 | if (keycode < BTN_MISC && printk_ratelimit()) |
@@ -1328,6 +1323,21 @@ static void kbd_event(struct input_handle *handle, unsigned int event_type, | |||
1328 | schedule_console_callback(); | 1323 | schedule_console_callback(); |
1329 | } | 1324 | } |
1330 | 1325 | ||
1326 | static bool kbd_match(struct input_handler *handler, struct input_dev *dev) | ||
1327 | { | ||
1328 | int i; | ||
1329 | |||
1330 | if (test_bit(EV_SND, dev->evbit)) | ||
1331 | return true; | ||
1332 | |||
1333 | if (test_bit(EV_KEY, dev->evbit)) | ||
1334 | for (i = KEY_RESERVED; i < BTN_MISC; i++) | ||
1335 | if (test_bit(i, dev->keybit)) | ||
1336 | return true; | ||
1337 | |||
1338 | return false; | ||
1339 | } | ||
1340 | |||
1331 | /* | 1341 | /* |
1332 | * When a keyboard (or other input device) is found, the kbd_connect | 1342 | * When a keyboard (or other input device) is found, the kbd_connect |
1333 | * function is called. The function then looks at the device, and if it | 1343 | * function is called. The function then looks at the device, and if it |
@@ -1339,14 +1349,6 @@ static int kbd_connect(struct input_handler *handler, struct input_dev *dev, | |||
1339 | { | 1349 | { |
1340 | struct input_handle *handle; | 1350 | struct input_handle *handle; |
1341 | int error; | 1351 | int error; |
1342 | int i; | ||
1343 | |||
1344 | for (i = KEY_RESERVED; i < BTN_MISC; i++) | ||
1345 | if (test_bit(i, dev->keybit)) | ||
1346 | break; | ||
1347 | |||
1348 | if (i == BTN_MISC && !test_bit(EV_SND, dev->evbit)) | ||
1349 | return -ENODEV; | ||
1350 | 1352 | ||
1351 | handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); | 1353 | handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); |
1352 | if (!handle) | 1354 | if (!handle) |
@@ -1412,6 +1414,7 @@ MODULE_DEVICE_TABLE(input, kbd_ids); | |||
1412 | 1414 | ||
1413 | static struct input_handler kbd_handler = { | 1415 | static struct input_handler kbd_handler = { |
1414 | .event = kbd_event, | 1416 | .event = kbd_event, |
1417 | .match = kbd_match, | ||
1415 | .connect = kbd_connect, | 1418 | .connect = kbd_connect, |
1416 | .disconnect = kbd_disconnect, | 1419 | .disconnect = kbd_disconnect, |
1417 | .start = kbd_start, | 1420 | .start = kbd_start, |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 258c639571b5..9f9816baeb97 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -278,6 +278,8 @@ static int evdev_open(struct inode *inode, struct file *file) | |||
278 | goto err_free_client; | 278 | goto err_free_client; |
279 | 279 | ||
280 | file->private_data = client; | 280 | file->private_data = client; |
281 | nonseekable_open(inode, file); | ||
282 | |||
281 | return 0; | 283 | return 0; |
282 | 284 | ||
283 | err_free_client: | 285 | err_free_client: |
diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c index b04930f7ea7d..7392992da424 100644 --- a/drivers/input/gameport/emu10k1-gp.c +++ b/drivers/input/gameport/emu10k1-gp.c | |||
@@ -46,7 +46,7 @@ struct emu { | |||
46 | int size; | 46 | int size; |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static struct pci_device_id emu_tbl[] = { | 49 | static const struct pci_device_id emu_tbl[] = { |
50 | 50 | ||
51 | { 0x1102, 0x7002, PCI_ANY_ID, PCI_ANY_ID }, /* SB Live gameport */ | 51 | { 0x1102, 0x7002, PCI_ANY_ID, PCI_ANY_ID }, /* SB Live gameport */ |
52 | { 0x1102, 0x7003, PCI_ANY_ID, PCI_ANY_ID }, /* Audigy gameport */ | 52 | { 0x1102, 0x7003, PCI_ANY_ID, PCI_ANY_ID }, /* Audigy gameport */ |
diff --git a/drivers/input/gameport/fm801-gp.c b/drivers/input/gameport/fm801-gp.c index 8a1810f88b9e..14d3f3e208a2 100644 --- a/drivers/input/gameport/fm801-gp.c +++ b/drivers/input/gameport/fm801-gp.c | |||
@@ -140,7 +140,7 @@ static void __devexit fm801_gp_remove(struct pci_dev *pci) | |||
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
143 | static struct pci_device_id fm801_gp_id_table[] = { | 143 | static const struct pci_device_id fm801_gp_id_table[] = { |
144 | { PCI_VENDOR_ID_FORTEMEDIA, PCI_DEVICE_ID_FM801_GP, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 144 | { PCI_VENDOR_ID_FORTEMEDIA, PCI_DEVICE_ID_FM801_GP, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, |
145 | { 0 } | 145 | { 0 } |
146 | }; | 146 | }; |
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index ac11be08585e..7e18bcf05a66 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -11,6 +11,8 @@ | |||
11 | * the Free Software Foundation. | 11 | * the Free Software Foundation. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
15 | |||
14 | #include <linux/stddef.h> | 16 | #include <linux/stddef.h> |
15 | #include <linux/module.h> | 17 | #include <linux/module.h> |
16 | #include <linux/ioport.h> | 18 | #include <linux/ioport.h> |
@@ -190,9 +192,8 @@ static int gameport_bind_driver(struct gameport *gameport, struct gameport_drive | |||
190 | 192 | ||
191 | error = device_bind_driver(&gameport->dev); | 193 | error = device_bind_driver(&gameport->dev); |
192 | if (error) { | 194 | if (error) { |
193 | printk(KERN_WARNING | 195 | dev_warn(&gameport->dev, |
194 | "gameport: device_bind_driver() failed " | 196 | "device_bind_driver() failed for %s (%s) and %s, error: %d\n", |
195 | "for %s (%s) and %s, error: %d\n", | ||
196 | gameport->phys, gameport->name, | 197 | gameport->phys, gameport->name, |
197 | drv->description, error); | 198 | drv->description, error); |
198 | drv->disconnect(gameport); | 199 | drv->disconnect(gameport); |
@@ -209,9 +210,9 @@ static void gameport_find_driver(struct gameport *gameport) | |||
209 | 210 | ||
210 | error = device_attach(&gameport->dev); | 211 | error = device_attach(&gameport->dev); |
211 | if (error < 0) | 212 | if (error < 0) |
212 | printk(KERN_WARNING | 213 | dev_warn(&gameport->dev, |
213 | "gameport: device_attach() failed for %s (%s), error: %d\n", | 214 | "device_attach() failed for %s (%s), error: %d\n", |
214 | gameport->phys, gameport->name, error); | 215 | gameport->phys, gameport->name, error); |
215 | } | 216 | } |
216 | 217 | ||
217 | 218 | ||
@@ -262,17 +263,14 @@ static int gameport_queue_event(void *object, struct module *owner, | |||
262 | 263 | ||
263 | event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); | 264 | event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); |
264 | if (!event) { | 265 | if (!event) { |
265 | printk(KERN_ERR | 266 | pr_err("Not enough memory to queue event %d\n", event_type); |
266 | "gameport: Not enough memory to queue event %d\n", | ||
267 | event_type); | ||
268 | retval = -ENOMEM; | 267 | retval = -ENOMEM; |
269 | goto out; | 268 | goto out; |
270 | } | 269 | } |
271 | 270 | ||
272 | if (!try_module_get(owner)) { | 271 | if (!try_module_get(owner)) { |
273 | printk(KERN_WARNING | 272 | pr_warning("Can't get module reference, dropping event %d\n", |
274 | "gameport: Can't get module reference, dropping event %d\n", | 273 | event_type); |
275 | event_type); | ||
276 | kfree(event); | 274 | kfree(event); |
277 | retval = -EINVAL; | 275 | retval = -EINVAL; |
278 | goto out; | 276 | goto out; |
@@ -298,14 +296,12 @@ static void gameport_free_event(struct gameport_event *event) | |||
298 | 296 | ||
299 | static void gameport_remove_duplicate_events(struct gameport_event *event) | 297 | static void gameport_remove_duplicate_events(struct gameport_event *event) |
300 | { | 298 | { |
301 | struct list_head *node, *next; | 299 | struct gameport_event *e, *next; |
302 | struct gameport_event *e; | ||
303 | unsigned long flags; | 300 | unsigned long flags; |
304 | 301 | ||
305 | spin_lock_irqsave(&gameport_event_lock, flags); | 302 | spin_lock_irqsave(&gameport_event_lock, flags); |
306 | 303 | ||
307 | list_for_each_safe(node, next, &gameport_event_list) { | 304 | list_for_each_entry_safe(e, next, &gameport_event_list, node) { |
308 | e = list_entry(node, struct gameport_event, node); | ||
309 | if (event->object == e->object) { | 305 | if (event->object == e->object) { |
310 | /* | 306 | /* |
311 | * If this event is of different type we should not | 307 | * If this event is of different type we should not |
@@ -315,7 +311,7 @@ static void gameport_remove_duplicate_events(struct gameport_event *event) | |||
315 | if (event->type != e->type) | 311 | if (event->type != e->type) |
316 | break; | 312 | break; |
317 | 313 | ||
318 | list_del_init(node); | 314 | list_del_init(&e->node); |
319 | gameport_free_event(e); | 315 | gameport_free_event(e); |
320 | } | 316 | } |
321 | } | 317 | } |
@@ -325,23 +321,18 @@ static void gameport_remove_duplicate_events(struct gameport_event *event) | |||
325 | 321 | ||
326 | static struct gameport_event *gameport_get_event(void) | 322 | static struct gameport_event *gameport_get_event(void) |
327 | { | 323 | { |
328 | struct gameport_event *event; | 324 | struct gameport_event *event = NULL; |
329 | struct list_head *node; | ||
330 | unsigned long flags; | 325 | unsigned long flags; |
331 | 326 | ||
332 | spin_lock_irqsave(&gameport_event_lock, flags); | 327 | spin_lock_irqsave(&gameport_event_lock, flags); |
333 | 328 | ||
334 | if (list_empty(&gameport_event_list)) { | 329 | if (!list_empty(&gameport_event_list)) { |
335 | spin_unlock_irqrestore(&gameport_event_lock, flags); | 330 | event = list_first_entry(&gameport_event_list, |
336 | return NULL; | 331 | struct gameport_event, node); |
332 | list_del_init(&event->node); | ||
337 | } | 333 | } |
338 | 334 | ||
339 | node = gameport_event_list.next; | ||
340 | event = list_entry(node, struct gameport_event, node); | ||
341 | list_del_init(node); | ||
342 | |||
343 | spin_unlock_irqrestore(&gameport_event_lock, flags); | 335 | spin_unlock_irqrestore(&gameport_event_lock, flags); |
344 | |||
345 | return event; | 336 | return event; |
346 | } | 337 | } |
347 | 338 | ||
@@ -360,16 +351,14 @@ static void gameport_handle_event(void) | |||
360 | if ((event = gameport_get_event())) { | 351 | if ((event = gameport_get_event())) { |
361 | 352 | ||
362 | switch (event->type) { | 353 | switch (event->type) { |
363 | case GAMEPORT_REGISTER_PORT: | ||
364 | gameport_add_port(event->object); | ||
365 | break; | ||
366 | 354 | ||
367 | case GAMEPORT_ATTACH_DRIVER: | 355 | case GAMEPORT_REGISTER_PORT: |
368 | gameport_attach_driver(event->object); | 356 | gameport_add_port(event->object); |
369 | break; | 357 | break; |
370 | 358 | ||
371 | default: | 359 | case GAMEPORT_ATTACH_DRIVER: |
372 | break; | 360 | gameport_attach_driver(event->object); |
361 | break; | ||
373 | } | 362 | } |
374 | 363 | ||
375 | gameport_remove_duplicate_events(event); | 364 | gameport_remove_duplicate_events(event); |
@@ -385,16 +374,14 @@ static void gameport_handle_event(void) | |||
385 | */ | 374 | */ |
386 | static void gameport_remove_pending_events(void *object) | 375 | static void gameport_remove_pending_events(void *object) |
387 | { | 376 | { |
388 | struct list_head *node, *next; | 377 | struct gameport_event *event, *next; |
389 | struct gameport_event *event; | ||
390 | unsigned long flags; | 378 | unsigned long flags; |
391 | 379 | ||
392 | spin_lock_irqsave(&gameport_event_lock, flags); | 380 | spin_lock_irqsave(&gameport_event_lock, flags); |
393 | 381 | ||
394 | list_for_each_safe(node, next, &gameport_event_list) { | 382 | list_for_each_entry_safe(event, next, &gameport_event_list, node) { |
395 | event = list_entry(node, struct gameport_event, node); | ||
396 | if (event->object == object) { | 383 | if (event->object == object) { |
397 | list_del_init(node); | 384 | list_del_init(&event->node); |
398 | gameport_free_event(event); | 385 | gameport_free_event(event); |
399 | } | 386 | } |
400 | } | 387 | } |
@@ -441,7 +428,6 @@ static int gameport_thread(void *nothing) | |||
441 | kthread_should_stop() || !list_empty(&gameport_event_list)); | 428 | kthread_should_stop() || !list_empty(&gameport_event_list)); |
442 | } while (!kthread_should_stop()); | 429 | } while (!kthread_should_stop()); |
443 | 430 | ||
444 | printk(KERN_DEBUG "gameport: kgameportd exiting\n"); | ||
445 | return 0; | 431 | return 0; |
446 | } | 432 | } |
447 | 433 | ||
@@ -453,6 +439,7 @@ static int gameport_thread(void *nothing) | |||
453 | static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf) | 439 | static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf) |
454 | { | 440 | { |
455 | struct gameport *gameport = to_gameport_port(dev); | 441 | struct gameport *gameport = to_gameport_port(dev); |
442 | |||
456 | return sprintf(buf, "%s\n", gameport->name); | 443 | return sprintf(buf, "%s\n", gameport->name); |
457 | } | 444 | } |
458 | 445 | ||
@@ -521,7 +508,8 @@ static void gameport_init_port(struct gameport *gameport) | |||
521 | 508 | ||
522 | mutex_init(&gameport->drv_mutex); | 509 | mutex_init(&gameport->drv_mutex); |
523 | device_initialize(&gameport->dev); | 510 | device_initialize(&gameport->dev); |
524 | dev_set_name(&gameport->dev, "gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1); | 511 | dev_set_name(&gameport->dev, "gameport%lu", |
512 | (unsigned long)atomic_inc_return(&gameport_no) - 1); | ||
525 | gameport->dev.bus = &gameport_bus; | 513 | gameport->dev.bus = &gameport_bus; |
526 | gameport->dev.release = gameport_release_port; | 514 | gameport->dev.release = gameport_release_port; |
527 | if (gameport->parent) | 515 | if (gameport->parent) |
@@ -550,19 +538,17 @@ static void gameport_add_port(struct gameport *gameport) | |||
550 | list_add_tail(&gameport->node, &gameport_list); | 538 | list_add_tail(&gameport->node, &gameport_list); |
551 | 539 | ||
552 | if (gameport->io) | 540 | if (gameport->io) |
553 | printk(KERN_INFO "gameport: %s is %s, io %#x, speed %dkHz\n", | 541 | dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n", |
554 | gameport->name, gameport->phys, gameport->io, gameport->speed); | 542 | gameport->name, gameport->phys, gameport->io, gameport->speed); |
555 | else | 543 | else |
556 | printk(KERN_INFO "gameport: %s is %s, speed %dkHz\n", | 544 | dev_info(&gameport->dev, "%s is %s, speed %dkHz\n", |
557 | gameport->name, gameport->phys, gameport->speed); | 545 | gameport->name, gameport->phys, gameport->speed); |
558 | 546 | ||
559 | error = device_add(&gameport->dev); | 547 | error = device_add(&gameport->dev); |
560 | if (error) | 548 | if (error) |
561 | printk(KERN_ERR | 549 | dev_err(&gameport->dev, |
562 | "gameport: device_add() failed for %s (%s), error: %d\n", | 550 | "device_add() failed for %s (%s), error: %d\n", |
563 | gameport->phys, gameport->name, error); | 551 | gameport->phys, gameport->name, error); |
564 | else | ||
565 | gameport->registered = 1; | ||
566 | } | 552 | } |
567 | 553 | ||
568 | /* | 554 | /* |
@@ -584,10 +570,8 @@ static void gameport_destroy_port(struct gameport *gameport) | |||
584 | gameport->parent = NULL; | 570 | gameport->parent = NULL; |
585 | } | 571 | } |
586 | 572 | ||
587 | if (gameport->registered) { | 573 | if (device_is_registered(&gameport->dev)) |
588 | device_del(&gameport->dev); | 574 | device_del(&gameport->dev); |
589 | gameport->registered = 0; | ||
590 | } | ||
591 | 575 | ||
592 | list_del_init(&gameport->node); | 576 | list_del_init(&gameport->node); |
593 | 577 | ||
@@ -705,8 +689,7 @@ static void gameport_attach_driver(struct gameport_driver *drv) | |||
705 | 689 | ||
706 | error = driver_attach(&drv->driver); | 690 | error = driver_attach(&drv->driver); |
707 | if (error) | 691 | if (error) |
708 | printk(KERN_ERR | 692 | pr_err("driver_attach() failed for %s, error: %d\n", |
709 | "gameport: driver_attach() failed for %s, error: %d\n", | ||
710 | drv->driver.name, error); | 693 | drv->driver.name, error); |
711 | } | 694 | } |
712 | 695 | ||
@@ -727,8 +710,7 @@ int __gameport_register_driver(struct gameport_driver *drv, struct module *owner | |||
727 | 710 | ||
728 | error = driver_register(&drv->driver); | 711 | error = driver_register(&drv->driver); |
729 | if (error) { | 712 | if (error) { |
730 | printk(KERN_ERR | 713 | pr_err("driver_register() failed for %s, error: %d\n", |
731 | "gameport: driver_register() failed for %s, error: %d\n", | ||
732 | drv->driver.name, error); | 714 | drv->driver.name, error); |
733 | return error; | 715 | return error; |
734 | } | 716 | } |
@@ -828,7 +810,7 @@ static int __init gameport_init(void) | |||
828 | 810 | ||
829 | error = bus_register(&gameport_bus); | 811 | error = bus_register(&gameport_bus); |
830 | if (error) { | 812 | if (error) { |
831 | printk(KERN_ERR "gameport: failed to register gameport bus, error: %d\n", error); | 813 | pr_err("failed to register gameport bus, error: %d\n", error); |
832 | return error; | 814 | return error; |
833 | } | 815 | } |
834 | 816 | ||
@@ -836,7 +818,7 @@ static int __init gameport_init(void) | |||
836 | if (IS_ERR(gameport_task)) { | 818 | if (IS_ERR(gameport_task)) { |
837 | bus_unregister(&gameport_bus); | 819 | bus_unregister(&gameport_bus); |
838 | error = PTR_ERR(gameport_task); | 820 | error = PTR_ERR(gameport_task); |
839 | printk(KERN_ERR "gameport: Failed to start kgameportd, error: %d\n", error); | 821 | pr_err("Failed to start kgameportd, error: %d\n", error); |
840 | return error; | 822 | return error; |
841 | } | 823 | } |
842 | 824 | ||
diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c index db556b71ddda..7c217848613e 100644 --- a/drivers/input/gameport/ns558.c +++ b/drivers/input/gameport/ns558.c | |||
@@ -166,7 +166,7 @@ static int ns558_isa_probe(int io) | |||
166 | 166 | ||
167 | #ifdef CONFIG_PNP | 167 | #ifdef CONFIG_PNP |
168 | 168 | ||
169 | static struct pnp_device_id pnp_devids[] = { | 169 | static const struct pnp_device_id pnp_devids[] = { |
170 | { .id = "@P@0001", .driver_data = 0 }, /* ALS 100 */ | 170 | { .id = "@P@0001", .driver_data = 0 }, /* ALS 100 */ |
171 | { .id = "@P@0020", .driver_data = 0 }, /* ALS 200 */ | 171 | { .id = "@P@0020", .driver_data = 0 }, /* ALS 200 */ |
172 | { .id = "@P@1001", .driver_data = 0 }, /* ALS 100+ */ | 172 | { .id = "@P@1001", .driver_data = 0 }, /* ALS 100+ */ |
diff --git a/drivers/input/input.c b/drivers/input/input.c index 86cb2d2196ff..41168d5f8c17 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -87,12 +87,14 @@ static int input_defuzz_abs_event(int value, int old_val, int fuzz) | |||
87 | } | 87 | } |
88 | 88 | ||
89 | /* | 89 | /* |
90 | * Pass event through all open handles. This function is called with | 90 | * Pass event first through all filters and then, if event has not been |
91 | * filtered out, through all open handles. This function is called with | ||
91 | * dev->event_lock held and interrupts disabled. | 92 | * dev->event_lock held and interrupts disabled. |
92 | */ | 93 | */ |
93 | static void input_pass_event(struct input_dev *dev, | 94 | static void input_pass_event(struct input_dev *dev, |
94 | unsigned int type, unsigned int code, int value) | 95 | unsigned int type, unsigned int code, int value) |
95 | { | 96 | { |
97 | struct input_handler *handler; | ||
96 | struct input_handle *handle; | 98 | struct input_handle *handle; |
97 | 99 | ||
98 | rcu_read_lock(); | 100 | rcu_read_lock(); |
@@ -100,11 +102,25 @@ static void input_pass_event(struct input_dev *dev, | |||
100 | handle = rcu_dereference(dev->grab); | 102 | handle = rcu_dereference(dev->grab); |
101 | if (handle) | 103 | if (handle) |
102 | handle->handler->event(handle, type, code, value); | 104 | handle->handler->event(handle, type, code, value); |
103 | else | 105 | else { |
104 | list_for_each_entry_rcu(handle, &dev->h_list, d_node) | 106 | bool filtered = false; |
105 | if (handle->open) | 107 | |
106 | handle->handler->event(handle, | 108 | list_for_each_entry_rcu(handle, &dev->h_list, d_node) { |
107 | type, code, value); | 109 | if (!handle->open) |
110 | continue; | ||
111 | |||
112 | handler = handle->handler; | ||
113 | if (!handler->filter) { | ||
114 | if (filtered) | ||
115 | break; | ||
116 | |||
117 | handler->event(handle, type, code, value); | ||
118 | |||
119 | } else if (handler->filter(handle, type, code, value)) | ||
120 | filtered = true; | ||
121 | } | ||
122 | } | ||
123 | |||
108 | rcu_read_unlock(); | 124 | rcu_read_unlock(); |
109 | } | 125 | } |
110 | 126 | ||
@@ -615,12 +631,12 @@ static int input_default_setkeycode(struct input_dev *dev, | |||
615 | } | 631 | } |
616 | } | 632 | } |
617 | 633 | ||
618 | clear_bit(old_keycode, dev->keybit); | 634 | __clear_bit(old_keycode, dev->keybit); |
619 | set_bit(keycode, dev->keybit); | 635 | __set_bit(keycode, dev->keybit); |
620 | 636 | ||
621 | for (i = 0; i < dev->keycodemax; i++) { | 637 | for (i = 0; i < dev->keycodemax; i++) { |
622 | if (input_fetch_keycode(dev, i) == old_keycode) { | 638 | if (input_fetch_keycode(dev, i) == old_keycode) { |
623 | set_bit(old_keycode, dev->keybit); | 639 | __set_bit(old_keycode, dev->keybit); |
624 | break; /* Setting the bit twice is useless, so break */ | 640 | break; /* Setting the bit twice is useless, so break */ |
625 | } | 641 | } |
626 | } | 642 | } |
@@ -678,6 +694,9 @@ int input_set_keycode(struct input_dev *dev, int scancode, int keycode) | |||
678 | if (retval) | 694 | if (retval) |
679 | goto out; | 695 | goto out; |
680 | 696 | ||
697 | /* Make sure KEY_RESERVED did not get enabled. */ | ||
698 | __clear_bit(KEY_RESERVED, dev->keybit); | ||
699 | |||
681 | /* | 700 | /* |
682 | * Simulate keyup event if keycode is not present | 701 | * Simulate keyup event if keycode is not present |
683 | * in the keymap anymore | 702 | * in the keymap anymore |
@@ -705,12 +724,13 @@ EXPORT_SYMBOL(input_set_keycode); | |||
705 | if (i != BITS_TO_LONGS(max)) \ | 724 | if (i != BITS_TO_LONGS(max)) \ |
706 | continue; | 725 | continue; |
707 | 726 | ||
708 | static const struct input_device_id *input_match_device(const struct input_device_id *id, | 727 | static const struct input_device_id *input_match_device(struct input_handler *handler, |
709 | struct input_dev *dev) | 728 | struct input_dev *dev) |
710 | { | 729 | { |
730 | const struct input_device_id *id; | ||
711 | int i; | 731 | int i; |
712 | 732 | ||
713 | for (; id->flags || id->driver_info; id++) { | 733 | for (id = handler->id_table; id->flags || id->driver_info; id++) { |
714 | 734 | ||
715 | if (id->flags & INPUT_DEVICE_ID_MATCH_BUS) | 735 | if (id->flags & INPUT_DEVICE_ID_MATCH_BUS) |
716 | if (id->bustype != dev->id.bustype) | 736 | if (id->bustype != dev->id.bustype) |
@@ -738,7 +758,8 @@ static const struct input_device_id *input_match_device(const struct input_devic | |||
738 | MATCH_BIT(ffbit, FF_MAX); | 758 | MATCH_BIT(ffbit, FF_MAX); |
739 | MATCH_BIT(swbit, SW_MAX); | 759 | MATCH_BIT(swbit, SW_MAX); |
740 | 760 | ||
741 | return id; | 761 | if (!handler->match || handler->match(handler, dev)) |
762 | return id; | ||
742 | } | 763 | } |
743 | 764 | ||
744 | return NULL; | 765 | return NULL; |
@@ -749,10 +770,7 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han | |||
749 | const struct input_device_id *id; | 770 | const struct input_device_id *id; |
750 | int error; | 771 | int error; |
751 | 772 | ||
752 | if (handler->blacklist && input_match_device(handler->blacklist, dev)) | 773 | id = input_match_device(handler, dev); |
753 | return -ENODEV; | ||
754 | |||
755 | id = input_match_device(handler->id_table, dev); | ||
756 | if (!id) | 774 | if (!id) |
757 | return -ENODEV; | 775 | return -ENODEV; |
758 | 776 | ||
@@ -988,6 +1006,8 @@ static int input_handlers_seq_show(struct seq_file *seq, void *v) | |||
988 | union input_seq_state *state = (union input_seq_state *)&seq->private; | 1006 | union input_seq_state *state = (union input_seq_state *)&seq->private; |
989 | 1007 | ||
990 | seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name); | 1008 | seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name); |
1009 | if (handler->filter) | ||
1010 | seq_puts(seq, " (filter)"); | ||
991 | if (handler->fops) | 1011 | if (handler->fops) |
992 | seq_printf(seq, " Minor=%d", handler->minor); | 1012 | seq_printf(seq, " Minor=%d", handler->minor); |
993 | seq_putc(seq, '\n'); | 1013 | seq_putc(seq, '\n'); |
@@ -1551,6 +1571,25 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int | |||
1551 | } | 1571 | } |
1552 | EXPORT_SYMBOL(input_set_capability); | 1572 | EXPORT_SYMBOL(input_set_capability); |
1553 | 1573 | ||
1574 | #define INPUT_CLEANSE_BITMASK(dev, type, bits) \ | ||
1575 | do { \ | ||
1576 | if (!test_bit(EV_##type, dev->evbit)) \ | ||
1577 | memset(dev->bits##bit, 0, \ | ||
1578 | sizeof(dev->bits##bit)); \ | ||
1579 | } while (0) | ||
1580 | |||
1581 | static void input_cleanse_bitmasks(struct input_dev *dev) | ||
1582 | { | ||
1583 | INPUT_CLEANSE_BITMASK(dev, KEY, key); | ||
1584 | INPUT_CLEANSE_BITMASK(dev, REL, rel); | ||
1585 | INPUT_CLEANSE_BITMASK(dev, ABS, abs); | ||
1586 | INPUT_CLEANSE_BITMASK(dev, MSC, msc); | ||
1587 | INPUT_CLEANSE_BITMASK(dev, LED, led); | ||
1588 | INPUT_CLEANSE_BITMASK(dev, SND, snd); | ||
1589 | INPUT_CLEANSE_BITMASK(dev, FF, ff); | ||
1590 | INPUT_CLEANSE_BITMASK(dev, SW, sw); | ||
1591 | } | ||
1592 | |||
1554 | /** | 1593 | /** |
1555 | * input_register_device - register device with input core | 1594 | * input_register_device - register device with input core |
1556 | * @dev: device to be registered | 1595 | * @dev: device to be registered |
@@ -1570,13 +1609,19 @@ int input_register_device(struct input_dev *dev) | |||
1570 | const char *path; | 1609 | const char *path; |
1571 | int error; | 1610 | int error; |
1572 | 1611 | ||
1612 | /* Every input device generates EV_SYN/SYN_REPORT events. */ | ||
1573 | __set_bit(EV_SYN, dev->evbit); | 1613 | __set_bit(EV_SYN, dev->evbit); |
1574 | 1614 | ||
1615 | /* KEY_RESERVED is not supposed to be transmitted to userspace. */ | ||
1616 | __clear_bit(KEY_RESERVED, dev->keybit); | ||
1617 | |||
1618 | /* Make sure that bitmasks not mentioned in dev->evbit are clean. */ | ||
1619 | input_cleanse_bitmasks(dev); | ||
1620 | |||
1575 | /* | 1621 | /* |
1576 | * If delay and period are pre-set by the driver, then autorepeating | 1622 | * If delay and period are pre-set by the driver, then autorepeating |
1577 | * is handled by the driver itself and we don't do it in input.c. | 1623 | * is handled by the driver itself and we don't do it in input.c. |
1578 | */ | 1624 | */ |
1579 | |||
1580 | init_timer(&dev->timer); | 1625 | init_timer(&dev->timer); |
1581 | if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) { | 1626 | if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) { |
1582 | dev->timer.data = (long) dev; | 1627 | dev->timer.data = (long) dev; |
@@ -1776,7 +1821,16 @@ int input_register_handle(struct input_handle *handle) | |||
1776 | error = mutex_lock_interruptible(&dev->mutex); | 1821 | error = mutex_lock_interruptible(&dev->mutex); |
1777 | if (error) | 1822 | if (error) |
1778 | return error; | 1823 | return error; |
1779 | list_add_tail_rcu(&handle->d_node, &dev->h_list); | 1824 | |
1825 | /* | ||
1826 | * Filters go to the head of the list, normal handlers | ||
1827 | * to the tail. | ||
1828 | */ | ||
1829 | if (handler->filter) | ||
1830 | list_add_rcu(&handle->d_node, &dev->h_list); | ||
1831 | else | ||
1832 | list_add_tail_rcu(&handle->d_node, &dev->h_list); | ||
1833 | |||
1780 | mutex_unlock(&dev->mutex); | 1834 | mutex_unlock(&dev->mutex); |
1781 | 1835 | ||
1782 | /* | 1836 | /* |
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c index b1bd6dd32286..c52bec4d0530 100644 --- a/drivers/input/joydev.c +++ b/drivers/input/joydev.c | |||
@@ -286,6 +286,8 @@ static int joydev_open(struct inode *inode, struct file *file) | |||
286 | goto err_free_client; | 286 | goto err_free_client; |
287 | 287 | ||
288 | file->private_data = client; | 288 | file->private_data = client; |
289 | nonseekable_open(inode, file); | ||
290 | |||
289 | return 0; | 291 | return 0; |
290 | 292 | ||
291 | err_free_client: | 293 | err_free_client: |
@@ -775,6 +777,20 @@ static void joydev_cleanup(struct joydev *joydev) | |||
775 | input_close_device(handle); | 777 | input_close_device(handle); |
776 | } | 778 | } |
777 | 779 | ||
780 | |||
781 | static bool joydev_match(struct input_handler *handler, struct input_dev *dev) | ||
782 | { | ||
783 | /* Avoid touchpads and touchscreens */ | ||
784 | if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit)) | ||
785 | return false; | ||
786 | |||
787 | /* Avoid tablets, digitisers and similar devices */ | ||
788 | if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_DIGI, dev->keybit)) | ||
789 | return false; | ||
790 | |||
791 | return true; | ||
792 | } | ||
793 | |||
778 | static int joydev_connect(struct input_handler *handler, struct input_dev *dev, | 794 | static int joydev_connect(struct input_handler *handler, struct input_dev *dev, |
779 | const struct input_device_id *id) | 795 | const struct input_device_id *id) |
780 | { | 796 | { |
@@ -894,22 +910,6 @@ static void joydev_disconnect(struct input_handle *handle) | |||
894 | put_device(&joydev->dev); | 910 | put_device(&joydev->dev); |
895 | } | 911 | } |
896 | 912 | ||
897 | static const struct input_device_id joydev_blacklist[] = { | ||
898 | { | ||
899 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT | | ||
900 | INPUT_DEVICE_ID_MATCH_KEYBIT, | ||
901 | .evbit = { BIT_MASK(EV_KEY) }, | ||
902 | .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, | ||
903 | }, /* Avoid itouchpads and touchscreens */ | ||
904 | { | ||
905 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT | | ||
906 | INPUT_DEVICE_ID_MATCH_KEYBIT, | ||
907 | .evbit = { BIT_MASK(EV_KEY) }, | ||
908 | .keybit = { [BIT_WORD(BTN_DIGI)] = BIT_MASK(BTN_DIGI) }, | ||
909 | }, /* Avoid tablets, digitisers and similar devices */ | ||
910 | { } /* Terminating entry */ | ||
911 | }; | ||
912 | |||
913 | static const struct input_device_id joydev_ids[] = { | 913 | static const struct input_device_id joydev_ids[] = { |
914 | { | 914 | { |
915 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT | | 915 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT | |
@@ -936,13 +936,13 @@ MODULE_DEVICE_TABLE(input, joydev_ids); | |||
936 | 936 | ||
937 | static struct input_handler joydev_handler = { | 937 | static struct input_handler joydev_handler = { |
938 | .event = joydev_event, | 938 | .event = joydev_event, |
939 | .match = joydev_match, | ||
939 | .connect = joydev_connect, | 940 | .connect = joydev_connect, |
940 | .disconnect = joydev_disconnect, | 941 | .disconnect = joydev_disconnect, |
941 | .fops = &joydev_fops, | 942 | .fops = &joydev_fops, |
942 | .minor = JOYDEV_MINOR_BASE, | 943 | .minor = JOYDEV_MINOR_BASE, |
943 | .name = "joydev", | 944 | .name = "joydev", |
944 | .id_table = joydev_ids, | 945 | .id_table = joydev_ids, |
945 | .blacklist = joydev_blacklist, | ||
946 | }; | 946 | }; |
947 | 947 | ||
948 | static int __init joydev_init(void) | 948 | static int __init joydev_init(void) |
diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig index b11419590cfe..5b596165b571 100644 --- a/drivers/input/joystick/Kconfig +++ b/drivers/input/joystick/Kconfig | |||
@@ -221,6 +221,7 @@ config JOYSTICK_DB9 | |||
221 | config JOYSTICK_GAMECON | 221 | config JOYSTICK_GAMECON |
222 | tristate "Multisystem, NES, SNES, N64, PSX joysticks and gamepads" | 222 | tristate "Multisystem, NES, SNES, N64, PSX joysticks and gamepads" |
223 | depends on PARPORT | 223 | depends on PARPORT |
224 | select INPUT_FF_MEMLESS | ||
224 | ---help--- | 225 | ---help--- |
225 | Say Y here if you have a Nintendo Entertainment System gamepad, | 226 | Say Y here if you have a Nintendo Entertainment System gamepad, |
226 | Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad, | 227 | Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad, |
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index 07a32aff5a31..ae998d99a5ae 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
@@ -30,6 +30,8 @@ | |||
30 | * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic | 30 | * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
34 | |||
33 | #include <linux/kernel.h> | 35 | #include <linux/kernel.h> |
34 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
35 | #include <linux/module.h> | 37 | #include <linux/module.h> |
@@ -61,48 +63,73 @@ MODULE_PARM_DESC(map3, "Describes third set of devices"); | |||
61 | 63 | ||
62 | /* see also gs_psx_delay parameter in PSX support section */ | 64 | /* see also gs_psx_delay parameter in PSX support section */ |
63 | 65 | ||
64 | #define GC_SNES 1 | 66 | enum gc_type { |
65 | #define GC_NES 2 | 67 | GC_NONE = 0, |
66 | #define GC_NES4 3 | 68 | GC_SNES, |
67 | #define GC_MULTI 4 | 69 | GC_NES, |
68 | #define GC_MULTI2 5 | 70 | GC_NES4, |
69 | #define GC_N64 6 | 71 | GC_MULTI, |
70 | #define GC_PSX 7 | 72 | GC_MULTI2, |
71 | #define GC_DDR 8 | 73 | GC_N64, |
72 | #define GC_SNESMOUSE 9 | 74 | GC_PSX, |
73 | 75 | GC_DDR, | |
74 | #define GC_MAX 9 | 76 | GC_SNESMOUSE, |
77 | GC_MAX | ||
78 | }; | ||
75 | 79 | ||
76 | #define GC_REFRESH_TIME HZ/100 | 80 | #define GC_REFRESH_TIME HZ/100 |
77 | 81 | ||
82 | struct gc_pad { | ||
83 | struct input_dev *dev; | ||
84 | enum gc_type type; | ||
85 | char phys[32]; | ||
86 | }; | ||
87 | |||
78 | struct gc { | 88 | struct gc { |
79 | struct pardevice *pd; | 89 | struct pardevice *pd; |
90 | struct gc_pad pads[GC_MAX_DEVICES]; | ||
80 | struct input_dev *dev[GC_MAX_DEVICES]; | 91 | struct input_dev *dev[GC_MAX_DEVICES]; |
81 | struct timer_list timer; | 92 | struct timer_list timer; |
82 | unsigned char pads[GC_MAX + 1]; | 93 | int pad_count[GC_MAX]; |
83 | int used; | 94 | int used; |
84 | struct mutex mutex; | 95 | struct mutex mutex; |
85 | char phys[GC_MAX_DEVICES][32]; | 96 | }; |
97 | |||
98 | struct gc_subdev { | ||
99 | unsigned int idx; | ||
86 | }; | 100 | }; |
87 | 101 | ||
88 | static struct gc *gc_base[3]; | 102 | static struct gc *gc_base[3]; |
89 | 103 | ||
90 | static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; | 104 | static const int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; |
105 | |||
106 | static const char *gc_names[] = { | ||
107 | NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", | ||
108 | "Multisystem 2-button joystick", "N64 controller", "PSX controller", | ||
109 | "PSX DDR controller", "SNES mouse" | ||
110 | }; | ||
91 | 111 | ||
92 | static char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", | ||
93 | "Multisystem 2-button joystick", "N64 controller", "PSX controller", | ||
94 | "PSX DDR controller", "SNES mouse" }; | ||
95 | /* | 112 | /* |
96 | * N64 support. | 113 | * N64 support. |
97 | */ | 114 | */ |
98 | 115 | ||
99 | static unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 }; | 116 | static const unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 }; |
100 | static short gc_n64_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START }; | 117 | static const short gc_n64_btn[] = { |
118 | BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, | ||
119 | BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START | ||
120 | }; | ||
101 | 121 | ||
102 | #define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */ | 122 | #define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */ |
103 | #define GC_N64_REQUEST_LENGTH 37 /* transmit request sequence is 9 bits long */ | 123 | #define GC_N64_STOP_LENGTH 5 /* Length of encoded stop bit */ |
124 | #define GC_N64_CMD_00 0x11111111UL | ||
125 | #define GC_N64_CMD_01 0xd1111111UL | ||
126 | #define GC_N64_CMD_03 0xdd111111UL | ||
127 | #define GC_N64_CMD_1b 0xdd1dd111UL | ||
128 | #define GC_N64_CMD_c0 0x111111ddUL | ||
129 | #define GC_N64_CMD_80 0x1111111dUL | ||
130 | #define GC_N64_STOP_BIT 0x1d /* Encoded stop bit */ | ||
131 | #define GC_N64_REQUEST_DATA GC_N64_CMD_01 /* the request data command */ | ||
104 | #define GC_N64_DELAY 133 /* delay between transmit request, and response ready (us) */ | 132 | #define GC_N64_DELAY 133 /* delay between transmit request, and response ready (us) */ |
105 | #define GC_N64_REQUEST 0x1dd1111111ULL /* the request data command (encoded for 000000011) */ | ||
106 | #define GC_N64_DWS 3 /* delay between write segments (required for sound playback because of ISA DMA) */ | 133 | #define GC_N64_DWS 3 /* delay between write segments (required for sound playback because of ISA DMA) */ |
107 | /* GC_N64_DWS > 24 is known to fail */ | 134 | /* GC_N64_DWS > 24 is known to fail */ |
108 | #define GC_N64_POWER_W 0xe2 /* power during write (transmit request) */ | 135 | #define GC_N64_POWER_W 0xe2 /* power during write (transmit request) */ |
@@ -114,8 +141,40 @@ static short gc_n64_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, | |||
114 | #define GC_N64_CLOCK 0x02 /* clock bits for read */ | 141 | #define GC_N64_CLOCK 0x02 /* clock bits for read */ |
115 | 142 | ||
116 | /* | 143 | /* |
144 | * Used for rumble code. | ||
145 | */ | ||
146 | |||
147 | /* Send encoded command */ | ||
148 | static void gc_n64_send_command(struct gc *gc, unsigned long cmd, | ||
149 | unsigned char target) | ||
150 | { | ||
151 | struct parport *port = gc->pd->port; | ||
152 | int i; | ||
153 | |||
154 | for (i = 0; i < GC_N64_LENGTH; i++) { | ||
155 | unsigned char data = (cmd >> i) & 1 ? target : 0; | ||
156 | parport_write_data(port, GC_N64_POWER_W | data); | ||
157 | udelay(GC_N64_DWS); | ||
158 | } | ||
159 | } | ||
160 | |||
161 | /* Send stop bit */ | ||
162 | static void gc_n64_send_stop_bit(struct gc *gc, unsigned char target) | ||
163 | { | ||
164 | struct parport *port = gc->pd->port; | ||
165 | int i; | ||
166 | |||
167 | for (i = 0; i < GC_N64_STOP_LENGTH; i++) { | ||
168 | unsigned char data = (GC_N64_STOP_BIT >> i) & 1 ? target : 0; | ||
169 | parport_write_data(port, GC_N64_POWER_W | data); | ||
170 | udelay(GC_N64_DWS); | ||
171 | } | ||
172 | } | ||
173 | |||
174 | /* | ||
117 | * gc_n64_read_packet() reads an N64 packet. | 175 | * gc_n64_read_packet() reads an N64 packet. |
118 | * Each pad uses one bit per byte. So all pads connected to this port are read in parallel. | 176 | * Each pad uses one bit per byte. So all pads connected to this port |
177 | * are read in parallel. | ||
119 | */ | 178 | */ |
120 | 179 | ||
121 | static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | 180 | static void gc_n64_read_packet(struct gc *gc, unsigned char *data) |
@@ -128,14 +187,13 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
128 | */ | 187 | */ |
129 | 188 | ||
130 | local_irq_save(flags); | 189 | local_irq_save(flags); |
131 | for (i = 0; i < GC_N64_REQUEST_LENGTH; i++) { | 190 | gc_n64_send_command(gc, GC_N64_REQUEST_DATA, GC_N64_OUT); |
132 | parport_write_data(gc->pd->port, GC_N64_POWER_W | ((GC_N64_REQUEST >> i) & 1 ? GC_N64_OUT : 0)); | 191 | gc_n64_send_stop_bit(gc, GC_N64_OUT); |
133 | udelay(GC_N64_DWS); | ||
134 | } | ||
135 | local_irq_restore(flags); | 192 | local_irq_restore(flags); |
136 | 193 | ||
137 | /* | 194 | /* |
138 | * Wait for the pad response to be loaded into the 33-bit register of the adapter | 195 | * Wait for the pad response to be loaded into the 33-bit register |
196 | * of the adapter. | ||
139 | */ | 197 | */ |
140 | 198 | ||
141 | udelay(GC_N64_DELAY); | 199 | udelay(GC_N64_DELAY); |
@@ -146,13 +204,15 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
146 | 204 | ||
147 | for (i = 0; i < GC_N64_LENGTH; i++) { | 205 | for (i = 0; i < GC_N64_LENGTH; i++) { |
148 | parport_write_data(gc->pd->port, GC_N64_POWER_R); | 206 | parport_write_data(gc->pd->port, GC_N64_POWER_R); |
207 | udelay(2); | ||
149 | data[i] = parport_read_status(gc->pd->port); | 208 | data[i] = parport_read_status(gc->pd->port); |
150 | parport_write_data(gc->pd->port, GC_N64_POWER_R | GC_N64_CLOCK); | 209 | parport_write_data(gc->pd->port, GC_N64_POWER_R | GC_N64_CLOCK); |
151 | } | 210 | } |
152 | 211 | ||
153 | /* | 212 | /* |
154 | * We must wait 200 ms here for the controller to reinitialize before the next read request. | 213 | * We must wait 200 ms here for the controller to reinitialize before |
155 | * No worries as long as gc_read is polled less frequently than this. | 214 | * the next read request. No worries as long as gc_read is polled less |
215 | * frequently than this. | ||
156 | */ | 216 | */ |
157 | 217 | ||
158 | } | 218 | } |
@@ -160,45 +220,112 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
160 | static void gc_n64_process_packet(struct gc *gc) | 220 | static void gc_n64_process_packet(struct gc *gc) |
161 | { | 221 | { |
162 | unsigned char data[GC_N64_LENGTH]; | 222 | unsigned char data[GC_N64_LENGTH]; |
163 | signed char axes[2]; | ||
164 | struct input_dev *dev; | 223 | struct input_dev *dev; |
165 | int i, j, s; | 224 | int i, j, s; |
225 | signed char x, y; | ||
166 | 226 | ||
167 | gc_n64_read_packet(gc, data); | 227 | gc_n64_read_packet(gc, data); |
168 | 228 | ||
169 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 229 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
170 | 230 | ||
171 | dev = gc->dev[i]; | 231 | if (gc->pads[i].type != GC_N64) |
172 | if (!dev) | ||
173 | continue; | 232 | continue; |
174 | 233 | ||
234 | dev = gc->pads[i].dev; | ||
175 | s = gc_status_bit[i]; | 235 | s = gc_status_bit[i]; |
176 | 236 | ||
177 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { | 237 | if (s & ~(data[8] | data[9])) { |
178 | 238 | ||
179 | axes[0] = axes[1] = 0; | 239 | x = y = 0; |
180 | 240 | ||
181 | for (j = 0; j < 8; j++) { | 241 | for (j = 0; j < 8; j++) { |
182 | if (data[23 - j] & s) | 242 | if (data[23 - j] & s) |
183 | axes[0] |= 1 << j; | 243 | x |= 1 << j; |
184 | if (data[31 - j] & s) | 244 | if (data[31 - j] & s) |
185 | axes[1] |= 1 << j; | 245 | y |= 1 << j; |
186 | } | 246 | } |
187 | 247 | ||
188 | input_report_abs(dev, ABS_X, axes[0]); | 248 | input_report_abs(dev, ABS_X, x); |
189 | input_report_abs(dev, ABS_Y, -axes[1]); | 249 | input_report_abs(dev, ABS_Y, -y); |
190 | 250 | ||
191 | input_report_abs(dev, ABS_HAT0X, !(s & data[6]) - !(s & data[7])); | 251 | input_report_abs(dev, ABS_HAT0X, |
192 | input_report_abs(dev, ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); | 252 | !(s & data[6]) - !(s & data[7])); |
253 | input_report_abs(dev, ABS_HAT0Y, | ||
254 | !(s & data[4]) - !(s & data[5])); | ||
193 | 255 | ||
194 | for (j = 0; j < 10; j++) | 256 | for (j = 0; j < 10; j++) |
195 | input_report_key(dev, gc_n64_btn[j], s & data[gc_n64_bytes[j]]); | 257 | input_report_key(dev, gc_n64_btn[j], |
258 | s & data[gc_n64_bytes[j]]); | ||
196 | 259 | ||
197 | input_sync(dev); | 260 | input_sync(dev); |
198 | } | 261 | } |
199 | } | 262 | } |
200 | } | 263 | } |
201 | 264 | ||
265 | static int gc_n64_play_effect(struct input_dev *dev, void *data, | ||
266 | struct ff_effect *effect) | ||
267 | { | ||
268 | int i; | ||
269 | unsigned long flags; | ||
270 | struct gc *gc = input_get_drvdata(dev); | ||
271 | struct gc_subdev *sdev = data; | ||
272 | unsigned char target = 1 << sdev->idx; /* select desired pin */ | ||
273 | |||
274 | if (effect->type == FF_RUMBLE) { | ||
275 | struct ff_rumble_effect *rumble = &effect->u.rumble; | ||
276 | unsigned int cmd = | ||
277 | rumble->strong_magnitude || rumble->weak_magnitude ? | ||
278 | GC_N64_CMD_01 : GC_N64_CMD_00; | ||
279 | |||
280 | local_irq_save(flags); | ||
281 | |||
282 | /* Init Rumble - 0x03, 0x80, 0x01, (34)0x80 */ | ||
283 | gc_n64_send_command(gc, GC_N64_CMD_03, target); | ||
284 | gc_n64_send_command(gc, GC_N64_CMD_80, target); | ||
285 | gc_n64_send_command(gc, GC_N64_CMD_01, target); | ||
286 | for (i = 0; i < 32; i++) | ||
287 | gc_n64_send_command(gc, GC_N64_CMD_80, target); | ||
288 | gc_n64_send_stop_bit(gc, target); | ||
289 | |||
290 | udelay(GC_N64_DELAY); | ||
291 | |||
292 | /* Now start or stop it - 0x03, 0xc0, 0zx1b, (32)0x01/0x00 */ | ||
293 | gc_n64_send_command(gc, GC_N64_CMD_03, target); | ||
294 | gc_n64_send_command(gc, GC_N64_CMD_c0, target); | ||
295 | gc_n64_send_command(gc, GC_N64_CMD_1b, target); | ||
296 | for (i = 0; i < 32; i++) | ||
297 | gc_n64_send_command(gc, cmd, target); | ||
298 | gc_n64_send_stop_bit(gc, target); | ||
299 | |||
300 | local_irq_restore(flags); | ||
301 | |||
302 | } | ||
303 | |||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | static int __init gc_n64_init_ff(struct input_dev *dev, int i) | ||
308 | { | ||
309 | struct gc_subdev *sdev; | ||
310 | int err; | ||
311 | |||
312 | sdev = kmalloc(sizeof(*sdev), GFP_KERNEL); | ||
313 | if (!sdev) | ||
314 | return -ENOMEM; | ||
315 | |||
316 | sdev->idx = i; | ||
317 | |||
318 | input_set_capability(dev, EV_FF, FF_RUMBLE); | ||
319 | |||
320 | err = input_ff_create_memless(dev, sdev, gc_n64_play_effect); | ||
321 | if (err) { | ||
322 | kfree(sdev); | ||
323 | return err; | ||
324 | } | ||
325 | |||
326 | return 0; | ||
327 | } | ||
328 | |||
202 | /* | 329 | /* |
203 | * NES/SNES support. | 330 | * NES/SNES support. |
204 | */ | 331 | */ |
@@ -214,9 +341,11 @@ static void gc_n64_process_packet(struct gc *gc) | |||
214 | #define GC_NES_CLOCK 0x01 | 341 | #define GC_NES_CLOCK 0x01 |
215 | #define GC_NES_LATCH 0x02 | 342 | #define GC_NES_LATCH 0x02 |
216 | 343 | ||
217 | static unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 }; | 344 | static const unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 }; |
218 | static unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 }; | 345 | static const unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 }; |
219 | static short gc_snes_btn[] = { BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR }; | 346 | static const short gc_snes_btn[] = { |
347 | BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR | ||
348 | }; | ||
220 | 349 | ||
221 | /* | 350 | /* |
222 | * gc_nes_read_packet() reads a NES/SNES packet. | 351 | * gc_nes_read_packet() reads a NES/SNES packet. |
@@ -244,40 +373,51 @@ static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data) | |||
244 | static void gc_nes_process_packet(struct gc *gc) | 373 | static void gc_nes_process_packet(struct gc *gc) |
245 | { | 374 | { |
246 | unsigned char data[GC_SNESMOUSE_LENGTH]; | 375 | unsigned char data[GC_SNESMOUSE_LENGTH]; |
376 | struct gc_pad *pad; | ||
247 | struct input_dev *dev; | 377 | struct input_dev *dev; |
248 | int i, j, s, len; | 378 | int i, j, s, len; |
249 | char x_rel, y_rel; | 379 | char x_rel, y_rel; |
250 | 380 | ||
251 | len = gc->pads[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : | 381 | len = gc->pad_count[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : |
252 | (gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); | 382 | (gc->pad_count[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); |
253 | 383 | ||
254 | gc_nes_read_packet(gc, len, data); | 384 | gc_nes_read_packet(gc, len, data); |
255 | 385 | ||
256 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 386 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
257 | 387 | ||
388 | pad = &gc->pads[i]; | ||
258 | dev = gc->dev[i]; | 389 | dev = gc->dev[i]; |
259 | if (!dev) | ||
260 | continue; | ||
261 | |||
262 | s = gc_status_bit[i]; | 390 | s = gc_status_bit[i]; |
263 | 391 | ||
264 | if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { | 392 | switch (pad->type) { |
393 | |||
394 | case GC_NES: | ||
395 | |||
265 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); | 396 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); |
266 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); | 397 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); |
267 | } | ||
268 | 398 | ||
269 | if (s & gc->pads[GC_NES]) | ||
270 | for (j = 0; j < 4; j++) | 399 | for (j = 0; j < 4; j++) |
271 | input_report_key(dev, gc_snes_btn[j], s & data[gc_nes_bytes[j]]); | 400 | input_report_key(dev, gc_snes_btn[j], |
401 | s & data[gc_nes_bytes[j]]); | ||
402 | input_sync(dev); | ||
403 | break; | ||
404 | |||
405 | case GC_SNES: | ||
406 | |||
407 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); | ||
408 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); | ||
272 | 409 | ||
273 | if (s & gc->pads[GC_SNES]) | ||
274 | for (j = 0; j < 8; j++) | 410 | for (j = 0; j < 8; j++) |
275 | input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]); | 411 | input_report_key(dev, gc_snes_btn[j], |
412 | s & data[gc_snes_bytes[j]]); | ||
413 | input_sync(dev); | ||
414 | break; | ||
276 | 415 | ||
277 | if (s & gc->pads[GC_SNESMOUSE]) { | 416 | case GC_SNESMOUSE: |
278 | /* | 417 | /* |
279 | * The 4 unused bits from SNES controllers appear to be ID bits | 418 | * The 4 unused bits from SNES controllers appear |
280 | * so use them to make sure iwe are dealing with a mouse. | 419 | * to be ID bits so use them to make sure we are |
420 | * dealing with a mouse. | ||
281 | * gamepad is connected. This is important since | 421 | * gamepad is connected. This is important since |
282 | * my SNES gamepad sends 1's for bits 16-31, which | 422 | * my SNES gamepad sends 1's for bits 16-31, which |
283 | * cause the mouse pointer to quickly move to the | 423 | * cause the mouse pointer to quickly move to the |
@@ -310,9 +450,14 @@ static void gc_nes_process_packet(struct gc *gc) | |||
310 | y_rel = -y_rel; | 450 | y_rel = -y_rel; |
311 | input_report_rel(dev, REL_Y, y_rel); | 451 | input_report_rel(dev, REL_Y, y_rel); |
312 | } | 452 | } |
453 | |||
454 | input_sync(dev); | ||
313 | } | 455 | } |
456 | break; | ||
457 | |||
458 | default: | ||
459 | break; | ||
314 | } | 460 | } |
315 | input_sync(dev); | ||
316 | } | 461 | } |
317 | } | 462 | } |
318 | 463 | ||
@@ -340,29 +485,35 @@ static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data) | |||
340 | static void gc_multi_process_packet(struct gc *gc) | 485 | static void gc_multi_process_packet(struct gc *gc) |
341 | { | 486 | { |
342 | unsigned char data[GC_MULTI2_LENGTH]; | 487 | unsigned char data[GC_MULTI2_LENGTH]; |
488 | int data_len = gc->pad_count[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH; | ||
489 | struct gc_pad *pad; | ||
343 | struct input_dev *dev; | 490 | struct input_dev *dev; |
344 | int i, s; | 491 | int i, s; |
345 | 492 | ||
346 | gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); | 493 | gc_multi_read_packet(gc, data_len, data); |
347 | 494 | ||
348 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 495 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
349 | 496 | pad = &gc->pads[i]; | |
350 | dev = gc->dev[i]; | 497 | dev = pad->dev; |
351 | if (!dev) | ||
352 | continue; | ||
353 | |||
354 | s = gc_status_bit[i]; | 498 | s = gc_status_bit[i]; |
355 | 499 | ||
356 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { | 500 | switch (pad->type) { |
357 | input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3])); | 501 | case GC_MULTI2: |
358 | input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1])); | ||
359 | input_report_key(dev, BTN_TRIGGER, s & data[4]); | ||
360 | } | ||
361 | |||
362 | if (s & gc->pads[GC_MULTI2]) | ||
363 | input_report_key(dev, BTN_THUMB, s & data[5]); | 502 | input_report_key(dev, BTN_THUMB, s & data[5]); |
503 | /* fall through */ | ||
364 | 504 | ||
365 | input_sync(dev); | 505 | case GC_MULTI: |
506 | input_report_abs(dev, ABS_X, | ||
507 | !(s & data[2]) - !(s & data[3])); | ||
508 | input_report_abs(dev, ABS_Y, | ||
509 | !(s & data[0]) - !(s & data[1])); | ||
510 | input_report_key(dev, BTN_TRIGGER, s & data[4]); | ||
511 | input_sync(dev); | ||
512 | break; | ||
513 | |||
514 | default: | ||
515 | break; | ||
516 | } | ||
366 | } | 517 | } |
367 | } | 518 | } |
368 | 519 | ||
@@ -398,30 +549,41 @@ static int gc_psx_delay = GC_PSX_DELAY; | |||
398 | module_param_named(psx_delay, gc_psx_delay, uint, 0); | 549 | module_param_named(psx_delay, gc_psx_delay, uint, 0); |
399 | MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)"); | 550 | MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)"); |
400 | 551 | ||
401 | static short gc_psx_abs[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y }; | 552 | static const short gc_psx_abs[] = { |
402 | static short gc_psx_btn[] = { BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y, | 553 | ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y |
403 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR }; | 554 | }; |
404 | static short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; | 555 | static const short gc_psx_btn[] = { |
556 | BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y, | ||
557 | BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR | ||
558 | }; | ||
559 | static const short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; | ||
405 | 560 | ||
406 | /* | 561 | /* |
407 | * gc_psx_command() writes 8bit command and reads 8bit data from | 562 | * gc_psx_command() writes 8bit command and reads 8bit data from |
408 | * the psx pad. | 563 | * the psx pad. |
409 | */ | 564 | */ |
410 | 565 | ||
411 | static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVICES]) | 566 | static void gc_psx_command(struct gc *gc, int b, unsigned char *data) |
412 | { | 567 | { |
568 | struct parport *port = gc->pd->port; | ||
413 | int i, j, cmd, read; | 569 | int i, j, cmd, read; |
414 | 570 | ||
415 | for (i = 0; i < GC_MAX_DEVICES; i++) | 571 | memset(data, 0, GC_MAX_DEVICES); |
416 | data[i] = 0; | ||
417 | 572 | ||
418 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { | 573 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { |
419 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; | 574 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; |
420 | parport_write_data(gc->pd->port, cmd | GC_PSX_POWER); | 575 | parport_write_data(port, cmd | GC_PSX_POWER); |
421 | udelay(gc_psx_delay); | 576 | udelay(gc_psx_delay); |
422 | read = parport_read_status(gc->pd->port) ^ 0x80; | 577 | |
423 | for (j = 0; j < GC_MAX_DEVICES; j++) | 578 | read = parport_read_status(port) ^ 0x80; |
424 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; | 579 | |
580 | for (j = 0; j < GC_MAX_DEVICES; j++) { | ||
581 | struct gc_pad *pad = &gc->pads[i]; | ||
582 | |||
583 | if (pad->type == GC_PSX || pad->type == GC_DDR) | ||
584 | data[j] |= (read & gc_status_bit[j]) ? (1 << i) : 0; | ||
585 | } | ||
586 | |||
425 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); | 587 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); |
426 | udelay(gc_psx_delay); | 588 | udelay(gc_psx_delay); |
427 | } | 589 | } |
@@ -432,31 +594,40 @@ static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVIC | |||
432 | * device identifier code. | 594 | * device identifier code. |
433 | */ | 595 | */ |
434 | 596 | ||
435 | static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], | 597 | static void gc_psx_read_packet(struct gc *gc, |
598 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], | ||
436 | unsigned char id[GC_MAX_DEVICES]) | 599 | unsigned char id[GC_MAX_DEVICES]) |
437 | { | 600 | { |
438 | int i, j, max_len = 0; | 601 | int i, j, max_len = 0; |
439 | unsigned long flags; | 602 | unsigned long flags; |
440 | unsigned char data2[GC_MAX_DEVICES]; | 603 | unsigned char data2[GC_MAX_DEVICES]; |
441 | 604 | ||
442 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */ | 605 | /* Select pad */ |
606 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); | ||
443 | udelay(gc_psx_delay); | 607 | udelay(gc_psx_delay); |
444 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER); /* Deselect, begin command */ | 608 | /* Deselect, begin command */ |
609 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER); | ||
445 | udelay(gc_psx_delay); | 610 | udelay(gc_psx_delay); |
446 | 611 | ||
447 | local_irq_save(flags); | 612 | local_irq_save(flags); |
448 | 613 | ||
449 | gc_psx_command(gc, 0x01, data2); /* Access pad */ | 614 | gc_psx_command(gc, 0x01, data2); /* Access pad */ |
450 | gc_psx_command(gc, 0x42, id); /* Get device ids */ | 615 | gc_psx_command(gc, 0x42, id); /* Get device ids */ |
451 | gc_psx_command(gc, 0, data2); /* Dump status */ | 616 | gc_psx_command(gc, 0, data2); /* Dump status */ |
617 | |||
618 | /* Find the longest pad */ | ||
619 | for (i = 0; i < GC_MAX_DEVICES; i++) { | ||
620 | struct gc_pad *pad = &gc->pads[i]; | ||
452 | 621 | ||
453 | for (i =0; i < GC_MAX_DEVICES; i++) /* Find the longest pad */ | 622 | if ((pad->type == GC_PSX || pad->type == GC_DDR) && |
454 | if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) | 623 | GC_PSX_LEN(id[i]) > max_len && |
455 | && (GC_PSX_LEN(id[i]) > max_len) | 624 | GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) { |
456 | && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES)) | ||
457 | max_len = GC_PSX_LEN(id[i]); | 625 | max_len = GC_PSX_LEN(id[i]); |
626 | } | ||
627 | } | ||
458 | 628 | ||
459 | for (i = 0; i < max_len; i++) { /* Read in all the data */ | 629 | /* Read in all the data */ |
630 | for (i = 0; i < max_len; i++) { | ||
460 | gc_psx_command(gc, 0, data2); | 631 | gc_psx_command(gc, 0, data2); |
461 | for (j = 0; j < GC_MAX_DEVICES; j++) | 632 | for (j = 0; j < GC_MAX_DEVICES; j++) |
462 | data[j][i] = data2[j]; | 633 | data[j][i] = data2[j]; |
@@ -466,86 +637,104 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES] | |||
466 | 637 | ||
467 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); | 638 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); |
468 | 639 | ||
469 | for(i = 0; i < GC_MAX_DEVICES; i++) /* Set id's to the real value */ | 640 | /* Set id's to the real value */ |
641 | for (i = 0; i < GC_MAX_DEVICES; i++) | ||
470 | id[i] = GC_PSX_ID(id[i]); | 642 | id[i] = GC_PSX_ID(id[i]); |
471 | } | 643 | } |
472 | 644 | ||
473 | static void gc_psx_process_packet(struct gc *gc) | 645 | static void gc_psx_report_one(struct gc_pad *pad, unsigned char psx_type, |
646 | unsigned char *data) | ||
474 | { | 647 | { |
475 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; | 648 | struct input_dev *dev = pad->dev; |
476 | unsigned char id[GC_MAX_DEVICES]; | 649 | int i; |
477 | struct input_dev *dev; | ||
478 | int i, j; | ||
479 | 650 | ||
480 | gc_psx_read_packet(gc, data, id); | 651 | switch (psx_type) { |
481 | 652 | ||
482 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 653 | case GC_PSX_RUMBLE: |
483 | 654 | ||
484 | dev = gc->dev[i]; | 655 | input_report_key(dev, BTN_THUMBL, ~data[0] & 0x04); |
485 | if (!dev) | 656 | input_report_key(dev, BTN_THUMBR, ~data[0] & 0x02); |
486 | continue; | ||
487 | 657 | ||
488 | switch (id[i]) { | 658 | case GC_PSX_NEGCON: |
659 | case GC_PSX_ANALOG: | ||
489 | 660 | ||
490 | case GC_PSX_RUMBLE: | 661 | if (pad->type == GC_DDR) { |
662 | for (i = 0; i < 4; i++) | ||
663 | input_report_key(dev, gc_psx_ddr_btn[i], | ||
664 | ~data[0] & (0x10 << i)); | ||
665 | } else { | ||
666 | for (i = 0; i < 4; i++) | ||
667 | input_report_abs(dev, gc_psx_abs[i + 2], | ||
668 | data[i + 2]); | ||
491 | 669 | ||
492 | input_report_key(dev, BTN_THUMBL, ~data[i][0] & 0x04); | 670 | input_report_abs(dev, ABS_X, |
493 | input_report_key(dev, BTN_THUMBR, ~data[i][0] & 0x02); | 671 | !!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127); |
672 | input_report_abs(dev, ABS_Y, | ||
673 | !!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127); | ||
674 | } | ||
494 | 675 | ||
495 | case GC_PSX_NEGCON: | 676 | for (i = 0; i < 8; i++) |
496 | case GC_PSX_ANALOG: | 677 | input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); |
497 | 678 | ||
498 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | 679 | input_report_key(dev, BTN_START, ~data[0] & 0x08); |
499 | for(j = 0; j < 4; j++) | 680 | input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); |
500 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | ||
501 | } else { | ||
502 | for (j = 0; j < 4; j++) | ||
503 | input_report_abs(dev, gc_psx_abs[j + 2], data[i][j + 2]); | ||
504 | 681 | ||
505 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); | 682 | input_sync(dev); |
506 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); | ||
507 | } | ||
508 | 683 | ||
509 | for (j = 0; j < 8; j++) | 684 | break; |
510 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); | ||
511 | 685 | ||
512 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | 686 | case GC_PSX_NORMAL: |
513 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | ||
514 | 687 | ||
515 | input_sync(dev); | 688 | if (pad->type == GC_DDR) { |
689 | for (i = 0; i < 4; i++) | ||
690 | input_report_key(dev, gc_psx_ddr_btn[i], | ||
691 | ~data[0] & (0x10 << i)); | ||
692 | } else { | ||
693 | input_report_abs(dev, ABS_X, | ||
694 | !!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127); | ||
695 | input_report_abs(dev, ABS_Y, | ||
696 | !!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127); | ||
516 | 697 | ||
517 | break; | 698 | /* |
518 | 699 | * For some reason if the extra axes are left unset | |
519 | case GC_PSX_NORMAL: | 700 | * they drift. |
520 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | 701 | * for (i = 0; i < 4; i++) |
521 | for(j = 0; j < 4; j++) | 702 | input_report_abs(dev, gc_psx_abs[i + 2], 128); |
522 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | 703 | * This needs to be debugged properly, |
523 | } else { | 704 | * maybe fuzz processing needs to be done |
524 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); | 705 | * in input_sync() |
525 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); | 706 | * --vojtech |
526 | 707 | */ | |
527 | /* for some reason if the extra axes are left unset they drift */ | 708 | } |
528 | /* for (j = 0; j < 4; j++) | ||
529 | input_report_abs(dev, gc_psx_abs[j + 2], 128); | ||
530 | * This needs to be debugged properly, | ||
531 | * maybe fuzz processing needs to be done in input_sync() | ||
532 | * --vojtech | ||
533 | */ | ||
534 | } | ||
535 | 709 | ||
536 | for (j = 0; j < 8; j++) | 710 | for (i = 0; i < 8; i++) |
537 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); | 711 | input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); |
538 | 712 | ||
539 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | 713 | input_report_key(dev, BTN_START, ~data[0] & 0x08); |
540 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | 714 | input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); |
541 | 715 | ||
542 | input_sync(dev); | 716 | input_sync(dev); |
543 | 717 | ||
544 | break; | 718 | break; |
545 | 719 | ||
546 | case 0: /* not a pad, ignore */ | 720 | default: /* not a pad, ignore */ |
547 | break; | 721 | break; |
548 | } | 722 | } |
723 | } | ||
724 | |||
725 | static void gc_psx_process_packet(struct gc *gc) | ||
726 | { | ||
727 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; | ||
728 | unsigned char id[GC_MAX_DEVICES]; | ||
729 | struct gc_pad *pad; | ||
730 | int i; | ||
731 | |||
732 | gc_psx_read_packet(gc, data, id); | ||
733 | |||
734 | for (i = 0; i < GC_MAX_DEVICES; i++) { | ||
735 | pad = &gc->pads[i]; | ||
736 | if (pad->type == GC_PSX || pad->type == GC_DDR) | ||
737 | gc_psx_report_one(pad, id[i], data[i]); | ||
549 | } | 738 | } |
550 | } | 739 | } |
551 | 740 | ||
@@ -561,28 +750,31 @@ static void gc_timer(unsigned long private) | |||
561 | * N64 pads - must be read first, any read confuses them for 200 us | 750 | * N64 pads - must be read first, any read confuses them for 200 us |
562 | */ | 751 | */ |
563 | 752 | ||
564 | if (gc->pads[GC_N64]) | 753 | if (gc->pad_count[GC_N64]) |
565 | gc_n64_process_packet(gc); | 754 | gc_n64_process_packet(gc); |
566 | 755 | ||
567 | /* | 756 | /* |
568 | * NES and SNES pads or mouse | 757 | * NES and SNES pads or mouse |
569 | */ | 758 | */ |
570 | 759 | ||
571 | if (gc->pads[GC_NES] || gc->pads[GC_SNES] || gc->pads[GC_SNESMOUSE]) | 760 | if (gc->pad_count[GC_NES] || |
761 | gc->pad_count[GC_SNES] || | ||
762 | gc->pad_count[GC_SNESMOUSE]) { | ||
572 | gc_nes_process_packet(gc); | 763 | gc_nes_process_packet(gc); |
764 | } | ||
573 | 765 | ||
574 | /* | 766 | /* |
575 | * Multi and Multi2 joysticks | 767 | * Multi and Multi2 joysticks |
576 | */ | 768 | */ |
577 | 769 | ||
578 | if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) | 770 | if (gc->pad_count[GC_MULTI] || gc->pad_count[GC_MULTI2]) |
579 | gc_multi_process_packet(gc); | 771 | gc_multi_process_packet(gc); |
580 | 772 | ||
581 | /* | 773 | /* |
582 | * PSX controllers | 774 | * PSX controllers |
583 | */ | 775 | */ |
584 | 776 | ||
585 | if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) | 777 | if (gc->pad_count[GC_PSX] || gc->pad_count[GC_DDR]) |
586 | gc_psx_process_packet(gc); | 778 | gc_psx_process_packet(gc); |
587 | 779 | ||
588 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); | 780 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); |
@@ -622,25 +814,29 @@ static void gc_close(struct input_dev *dev) | |||
622 | 814 | ||
623 | static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | 815 | static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) |
624 | { | 816 | { |
817 | struct gc_pad *pad = &gc->pads[idx]; | ||
625 | struct input_dev *input_dev; | 818 | struct input_dev *input_dev; |
626 | int i; | 819 | int i; |
627 | 820 | int err; | |
628 | if (!pad_type) | ||
629 | return 0; | ||
630 | 821 | ||
631 | if (pad_type < 1 || pad_type > GC_MAX) { | 822 | if (pad_type < 1 || pad_type > GC_MAX) { |
632 | printk(KERN_WARNING "gamecon.c: Pad type %d unknown\n", pad_type); | 823 | pr_err("Pad type %d unknown\n", pad_type); |
633 | return -EINVAL; | 824 | return -EINVAL; |
634 | } | 825 | } |
635 | 826 | ||
636 | gc->dev[idx] = input_dev = input_allocate_device(); | 827 | pad->dev = input_dev = input_allocate_device(); |
637 | if (!input_dev) { | 828 | if (!input_dev) { |
638 | printk(KERN_ERR "gamecon.c: Not enough memory for input device\n"); | 829 | pr_err("Not enough memory for input device\n"); |
639 | return -ENOMEM; | 830 | return -ENOMEM; |
640 | } | 831 | } |
641 | 832 | ||
833 | pad->type = pad_type; | ||
834 | |||
835 | snprintf(pad->phys, sizeof(pad->phys), | ||
836 | "%s/input%d", gc->pd->port->name, idx); | ||
837 | |||
642 | input_dev->name = gc_names[pad_type]; | 838 | input_dev->name = gc_names[pad_type]; |
643 | input_dev->phys = gc->phys[idx]; | 839 | input_dev->phys = pad->phys; |
644 | input_dev->id.bustype = BUS_PARPORT; | 840 | input_dev->id.bustype = BUS_PARPORT; |
645 | input_dev->id.vendor = 0x0001; | 841 | input_dev->id.vendor = 0x0001; |
646 | input_dev->id.product = pad_type; | 842 | input_dev->id.product = pad_type; |
@@ -659,61 +855,76 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
659 | } else | 855 | } else |
660 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); | 856 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); |
661 | 857 | ||
662 | gc->pads[0] |= gc_status_bit[idx]; | 858 | gc->pad_count[pad_type]++; |
663 | gc->pads[pad_type] |= gc_status_bit[idx]; | ||
664 | 859 | ||
665 | switch (pad_type) { | 860 | switch (pad_type) { |
666 | 861 | ||
667 | case GC_N64: | 862 | case GC_N64: |
668 | for (i = 0; i < 10; i++) | 863 | for (i = 0; i < 10; i++) |
669 | set_bit(gc_n64_btn[i], input_dev->keybit); | 864 | __set_bit(gc_n64_btn[i], input_dev->keybit); |
670 | |||
671 | for (i = 0; i < 2; i++) { | ||
672 | input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2); | ||
673 | input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); | ||
674 | } | ||
675 | |||
676 | break; | ||
677 | |||
678 | case GC_SNESMOUSE: | ||
679 | set_bit(BTN_LEFT, input_dev->keybit); | ||
680 | set_bit(BTN_RIGHT, input_dev->keybit); | ||
681 | set_bit(REL_X, input_dev->relbit); | ||
682 | set_bit(REL_Y, input_dev->relbit); | ||
683 | break; | ||
684 | |||
685 | case GC_SNES: | ||
686 | for (i = 4; i < 8; i++) | ||
687 | set_bit(gc_snes_btn[i], input_dev->keybit); | ||
688 | case GC_NES: | ||
689 | for (i = 0; i < 4; i++) | ||
690 | set_bit(gc_snes_btn[i], input_dev->keybit); | ||
691 | break; | ||
692 | |||
693 | case GC_MULTI2: | ||
694 | set_bit(BTN_THUMB, input_dev->keybit); | ||
695 | case GC_MULTI: | ||
696 | set_bit(BTN_TRIGGER, input_dev->keybit); | ||
697 | break; | ||
698 | |||
699 | case GC_PSX: | ||
700 | for (i = 0; i < 6; i++) | ||
701 | input_set_abs_params(input_dev, gc_psx_abs[i], 4, 252, 0, 2); | ||
702 | for (i = 0; i < 12; i++) | ||
703 | set_bit(gc_psx_btn[i], input_dev->keybit); | ||
704 | 865 | ||
705 | break; | 866 | for (i = 0; i < 2; i++) { |
867 | input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2); | ||
868 | input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); | ||
869 | } | ||
706 | 870 | ||
707 | case GC_DDR: | 871 | err = gc_n64_init_ff(input_dev, idx); |
708 | for (i = 0; i < 4; i++) | 872 | if (err) { |
709 | set_bit(gc_psx_ddr_btn[i], input_dev->keybit); | 873 | pr_warning("Failed to initiate rumble for N64 device %d\n", idx); |
710 | for (i = 0; i < 12; i++) | 874 | goto err_free_dev; |
711 | set_bit(gc_psx_btn[i], input_dev->keybit); | 875 | } |
712 | 876 | ||
713 | break; | 877 | break; |
878 | |||
879 | case GC_SNESMOUSE: | ||
880 | __set_bit(BTN_LEFT, input_dev->keybit); | ||
881 | __set_bit(BTN_RIGHT, input_dev->keybit); | ||
882 | __set_bit(REL_X, input_dev->relbit); | ||
883 | __set_bit(REL_Y, input_dev->relbit); | ||
884 | break; | ||
885 | |||
886 | case GC_SNES: | ||
887 | for (i = 4; i < 8; i++) | ||
888 | __set_bit(gc_snes_btn[i], input_dev->keybit); | ||
889 | case GC_NES: | ||
890 | for (i = 0; i < 4; i++) | ||
891 | __set_bit(gc_snes_btn[i], input_dev->keybit); | ||
892 | break; | ||
893 | |||
894 | case GC_MULTI2: | ||
895 | __set_bit(BTN_THUMB, input_dev->keybit); | ||
896 | case GC_MULTI: | ||
897 | __set_bit(BTN_TRIGGER, input_dev->keybit); | ||
898 | break; | ||
899 | |||
900 | case GC_PSX: | ||
901 | for (i = 0; i < 6; i++) | ||
902 | input_set_abs_params(input_dev, | ||
903 | gc_psx_abs[i], 4, 252, 0, 2); | ||
904 | for (i = 0; i < 12; i++) | ||
905 | __set_bit(gc_psx_btn[i], input_dev->keybit); | ||
906 | |||
907 | break; | ||
908 | |||
909 | case GC_DDR: | ||
910 | for (i = 0; i < 4; i++) | ||
911 | __set_bit(gc_psx_ddr_btn[i], input_dev->keybit); | ||
912 | for (i = 0; i < 12; i++) | ||
913 | __set_bit(gc_psx_btn[i], input_dev->keybit); | ||
914 | |||
915 | break; | ||
714 | } | 916 | } |
715 | 917 | ||
918 | err = input_register_device(pad->dev); | ||
919 | if (err) | ||
920 | goto err_free_dev; | ||
921 | |||
716 | return 0; | 922 | return 0; |
923 | |||
924 | err_free_dev: | ||
925 | input_free_device(pad->dev); | ||
926 | pad->dev = NULL; | ||
927 | return err; | ||
717 | } | 928 | } |
718 | 929 | ||
719 | static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | 930 | static struct gc __init *gc_probe(int parport, int *pads, int n_pads) |
@@ -722,52 +933,47 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
722 | struct parport *pp; | 933 | struct parport *pp; |
723 | struct pardevice *pd; | 934 | struct pardevice *pd; |
724 | int i; | 935 | int i; |
936 | int count = 0; | ||
725 | int err; | 937 | int err; |
726 | 938 | ||
727 | pp = parport_find_number(parport); | 939 | pp = parport_find_number(parport); |
728 | if (!pp) { | 940 | if (!pp) { |
729 | printk(KERN_ERR "gamecon.c: no such parport\n"); | 941 | pr_err("no such parport %d\n", parport); |
730 | err = -EINVAL; | 942 | err = -EINVAL; |
731 | goto err_out; | 943 | goto err_out; |
732 | } | 944 | } |
733 | 945 | ||
734 | pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); | 946 | pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); |
735 | if (!pd) { | 947 | if (!pd) { |
736 | printk(KERN_ERR "gamecon.c: parport busy already - lp.o loaded?\n"); | 948 | pr_err("parport busy already - lp.o loaded?\n"); |
737 | err = -EBUSY; | 949 | err = -EBUSY; |
738 | goto err_put_pp; | 950 | goto err_put_pp; |
739 | } | 951 | } |
740 | 952 | ||
741 | gc = kzalloc(sizeof(struct gc), GFP_KERNEL); | 953 | gc = kzalloc(sizeof(struct gc), GFP_KERNEL); |
742 | if (!gc) { | 954 | if (!gc) { |
743 | printk(KERN_ERR "gamecon.c: Not enough memory\n"); | 955 | pr_err("Not enough memory\n"); |
744 | err = -ENOMEM; | 956 | err = -ENOMEM; |
745 | goto err_unreg_pardev; | 957 | goto err_unreg_pardev; |
746 | } | 958 | } |
747 | 959 | ||
748 | mutex_init(&gc->mutex); | 960 | mutex_init(&gc->mutex); |
749 | gc->pd = pd; | 961 | gc->pd = pd; |
750 | init_timer(&gc->timer); | 962 | setup_timer(&gc->timer, gc_timer, (long) gc); |
751 | gc->timer.data = (long) gc; | ||
752 | gc->timer.function = gc_timer; | ||
753 | 963 | ||
754 | for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { | 964 | for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { |
755 | if (!pads[i]) | 965 | if (!pads[i]) |
756 | continue; | 966 | continue; |
757 | 967 | ||
758 | snprintf(gc->phys[i], sizeof(gc->phys[i]), | ||
759 | "%s/input%d", gc->pd->port->name, i); | ||
760 | err = gc_setup_pad(gc, i, pads[i]); | 968 | err = gc_setup_pad(gc, i, pads[i]); |
761 | if (err) | 969 | if (err) |
762 | goto err_unreg_devs; | 970 | goto err_unreg_devs; |
763 | 971 | ||
764 | err = input_register_device(gc->dev[i]); | 972 | count++; |
765 | if (err) | ||
766 | goto err_free_dev; | ||
767 | } | 973 | } |
768 | 974 | ||
769 | if (!gc->pads[0]) { | 975 | if (count == 0) { |
770 | printk(KERN_ERR "gamecon.c: No valid devices specified\n"); | 976 | pr_err("No valid devices specified\n"); |
771 | err = -EINVAL; | 977 | err = -EINVAL; |
772 | goto err_free_gc; | 978 | goto err_free_gc; |
773 | } | 979 | } |
@@ -775,12 +981,10 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
775 | parport_put_port(pp); | 981 | parport_put_port(pp); |
776 | return gc; | 982 | return gc; |
777 | 983 | ||
778 | err_free_dev: | ||
779 | input_free_device(gc->dev[i]); | ||
780 | err_unreg_devs: | 984 | err_unreg_devs: |
781 | while (--i >= 0) | 985 | while (--i >= 0) |
782 | if (gc->dev[i]) | 986 | if (gc->pads[i].dev) |
783 | input_unregister_device(gc->dev[i]); | 987 | input_unregister_device(gc->pads[i].dev); |
784 | err_free_gc: | 988 | err_free_gc: |
785 | kfree(gc); | 989 | kfree(gc); |
786 | err_unreg_pardev: | 990 | err_unreg_pardev: |
@@ -796,8 +1000,8 @@ static void gc_remove(struct gc *gc) | |||
796 | int i; | 1000 | int i; |
797 | 1001 | ||
798 | for (i = 0; i < GC_MAX_DEVICES; i++) | 1002 | for (i = 0; i < GC_MAX_DEVICES; i++) |
799 | if (gc->dev[i]) | 1003 | if (gc->pads[i].dev) |
800 | input_unregister_device(gc->dev[i]); | 1004 | input_unregister_device(gc->pads[i].dev); |
801 | parport_unregister_device(gc->pd); | 1005 | parport_unregister_device(gc->pd); |
802 | kfree(gc); | 1006 | kfree(gc); |
803 | } | 1007 | } |
@@ -813,7 +1017,7 @@ static int __init gc_init(void) | |||
813 | continue; | 1017 | continue; |
814 | 1018 | ||
815 | if (gc_cfg[i].nargs < 2) { | 1019 | if (gc_cfg[i].nargs < 2) { |
816 | printk(KERN_ERR "gamecon.c: at least one device must be specified\n"); | 1020 | pr_err("at least one device must be specified\n"); |
817 | err = -EINVAL; | 1021 | err = -EINVAL; |
818 | break; | 1022 | break; |
819 | } | 1023 | } |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 8a28fb7846dc..9b3353b404da 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -86,9 +86,8 @@ | |||
86 | 86 | ||
87 | /* xbox d-pads should map to buttons, as is required for DDR pads | 87 | /* xbox d-pads should map to buttons, as is required for DDR pads |
88 | but we map them to axes when possible to simplify things */ | 88 | but we map them to axes when possible to simplify things */ |
89 | #define MAP_DPAD_TO_BUTTONS 0 | 89 | #define MAP_DPAD_TO_BUTTONS (1 << 0) |
90 | #define MAP_DPAD_TO_AXES 1 | 90 | #define MAP_TRIGGERS_TO_BUTTONS (1 << 1) |
91 | #define MAP_DPAD_UNKNOWN 2 | ||
92 | 91 | ||
93 | #define XTYPE_XBOX 0 | 92 | #define XTYPE_XBOX 0 |
94 | #define XTYPE_XBOX360 1 | 93 | #define XTYPE_XBOX360 1 |
@@ -99,57 +98,61 @@ static int dpad_to_buttons; | |||
99 | module_param(dpad_to_buttons, bool, S_IRUGO); | 98 | module_param(dpad_to_buttons, bool, S_IRUGO); |
100 | MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads"); | 99 | MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads"); |
101 | 100 | ||
101 | static int triggers_to_buttons; | ||
102 | module_param(triggers_to_buttons, bool, S_IRUGO); | ||
103 | MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads"); | ||
104 | |||
102 | static const struct xpad_device { | 105 | static const struct xpad_device { |
103 | u16 idVendor; | 106 | u16 idVendor; |
104 | u16 idProduct; | 107 | u16 idProduct; |
105 | char *name; | 108 | char *name; |
106 | u8 dpad_mapping; | 109 | u8 mapping; |
107 | u8 xtype; | 110 | u8 xtype; |
108 | } xpad_device[] = { | 111 | } xpad_device[] = { |
109 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 112 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, |
110 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 113 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, |
111 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 114 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, |
112 | { 0x045e, 0x0287, "Microsoft Xbox Controller S", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 115 | { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, |
113 | { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, | 116 | { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, |
114 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 117 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
115 | { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 118 | { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, |
116 | { 0x046d, 0xc242, "Logitech Chillstream Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 119 | { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, |
117 | { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 120 | { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, |
118 | { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 121 | { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX }, |
119 | { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 122 | { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX }, |
120 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 123 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, |
121 | { 0x0738, 0x4516, "Mad Catz Control Pad", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 124 | { 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX }, |
122 | { 0x0738, 0x4522, "Mad Catz LumiCON", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 125 | { 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX }, |
123 | { 0x0738, 0x4526, "Mad Catz Control Pad Pro", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 126 | { 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX }, |
124 | { 0x0738, 0x4536, "Mad Catz MicroCON", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 127 | { 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX }, |
125 | { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 128 | { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
126 | { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 129 | { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, |
127 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 130 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, |
128 | { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 131 | { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, |
129 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 132 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
130 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 133 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, |
131 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 134 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, |
132 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 135 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, |
133 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 136 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, |
134 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 137 | { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, |
135 | { 0x0e4c, 0x2390, "Radica Games Jtech Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 138 | { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, |
136 | { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 139 | { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, |
137 | { 0x0e6f, 0x0005, "Eclipse wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 140 | { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, |
138 | { 0x0e6f, 0x0006, "Edge wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 141 | { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, |
139 | { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 142 | { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, |
140 | { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 143 | { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, |
141 | { 0x0f30, 0x0202, "Joytech Advanced Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 144 | { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, |
142 | { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 145 | { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, |
143 | { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 146 | { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, |
144 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 147 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
145 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 148 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, |
146 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 149 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
147 | { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 150 | { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, |
148 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 151 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, |
149 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, | 152 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, |
150 | { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 153 | { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, |
151 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 154 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, |
152 | { 0x0000, 0x0000, "Generic X-Box pad", MAP_DPAD_UNKNOWN, XTYPE_UNKNOWN } | 155 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } |
153 | }; | 156 | }; |
154 | 157 | ||
155 | /* buttons shared with xbox and xbox360 */ | 158 | /* buttons shared with xbox and xbox360 */ |
@@ -165,13 +168,20 @@ static const signed short xpad_btn[] = { | |||
165 | -1 /* terminating entry */ | 168 | -1 /* terminating entry */ |
166 | }; | 169 | }; |
167 | 170 | ||
168 | /* only used if MAP_DPAD_TO_BUTTONS */ | 171 | /* used when dpad is mapped to nuttons */ |
169 | static const signed short xpad_btn_pad[] = { | 172 | static const signed short xpad_btn_pad[] = { |
170 | BTN_LEFT, BTN_RIGHT, /* d-pad left, right */ | 173 | BTN_LEFT, BTN_RIGHT, /* d-pad left, right */ |
171 | BTN_0, BTN_1, /* d-pad up, down (XXX names??) */ | 174 | BTN_0, BTN_1, /* d-pad up, down (XXX names??) */ |
172 | -1 /* terminating entry */ | 175 | -1 /* terminating entry */ |
173 | }; | 176 | }; |
174 | 177 | ||
178 | /* used when triggers are mapped to buttons */ | ||
179 | static const signed short xpad_btn_triggers[] = { | ||
180 | BTN_TL2, BTN_TR2, /* triggers left/right */ | ||
181 | -1 | ||
182 | }; | ||
183 | |||
184 | |||
175 | static const signed short xpad360_btn[] = { /* buttons for x360 controller */ | 185 | static const signed short xpad360_btn[] = { /* buttons for x360 controller */ |
176 | BTN_TL, BTN_TR, /* Button LB/RB */ | 186 | BTN_TL, BTN_TR, /* Button LB/RB */ |
177 | BTN_MODE, /* The big X button */ | 187 | BTN_MODE, /* The big X button */ |
@@ -181,16 +191,21 @@ static const signed short xpad360_btn[] = { /* buttons for x360 controller */ | |||
181 | static const signed short xpad_abs[] = { | 191 | static const signed short xpad_abs[] = { |
182 | ABS_X, ABS_Y, /* left stick */ | 192 | ABS_X, ABS_Y, /* left stick */ |
183 | ABS_RX, ABS_RY, /* right stick */ | 193 | ABS_RX, ABS_RY, /* right stick */ |
184 | ABS_Z, ABS_RZ, /* triggers left/right */ | ||
185 | -1 /* terminating entry */ | 194 | -1 /* terminating entry */ |
186 | }; | 195 | }; |
187 | 196 | ||
188 | /* only used if MAP_DPAD_TO_AXES */ | 197 | /* used when dpad is mapped to axes */ |
189 | static const signed short xpad_abs_pad[] = { | 198 | static const signed short xpad_abs_pad[] = { |
190 | ABS_HAT0X, ABS_HAT0Y, /* d-pad axes */ | 199 | ABS_HAT0X, ABS_HAT0Y, /* d-pad axes */ |
191 | -1 /* terminating entry */ | 200 | -1 /* terminating entry */ |
192 | }; | 201 | }; |
193 | 202 | ||
203 | /* used when triggers are mapped to axes */ | ||
204 | static const signed short xpad_abs_triggers[] = { | ||
205 | ABS_Z, ABS_RZ, /* triggers left/right */ | ||
206 | -1 | ||
207 | }; | ||
208 | |||
194 | /* Xbox 360 has a vendor-specific class, so we cannot match it with only | 209 | /* Xbox 360 has a vendor-specific class, so we cannot match it with only |
195 | * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we | 210 | * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we |
196 | * match against vendor id as well. Wired Xbox 360 devices have protocol 1, | 211 | * match against vendor id as well. Wired Xbox 360 devices have protocol 1, |
@@ -246,7 +261,7 @@ struct usb_xpad { | |||
246 | 261 | ||
247 | char phys[64]; /* physical device path */ | 262 | char phys[64]; /* physical device path */ |
248 | 263 | ||
249 | int dpad_mapping; /* map d-pad to buttons or to axes */ | 264 | int mapping; /* map d-pad to buttons or to axes */ |
250 | int xtype; /* type of xbox device */ | 265 | int xtype; /* type of xbox device */ |
251 | }; | 266 | }; |
252 | 267 | ||
@@ -277,20 +292,25 @@ static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *d | |||
277 | ~(__s16) le16_to_cpup((__le16 *)(data + 18))); | 292 | ~(__s16) le16_to_cpup((__le16 *)(data + 18))); |
278 | 293 | ||
279 | /* triggers left/right */ | 294 | /* triggers left/right */ |
280 | input_report_abs(dev, ABS_Z, data[10]); | 295 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { |
281 | input_report_abs(dev, ABS_RZ, data[11]); | 296 | input_report_key(dev, BTN_TL2, data[10]); |
297 | input_report_key(dev, BTN_TR2, data[11]); | ||
298 | } else { | ||
299 | input_report_abs(dev, ABS_Z, data[10]); | ||
300 | input_report_abs(dev, ABS_RZ, data[11]); | ||
301 | } | ||
282 | 302 | ||
283 | /* digital pad */ | 303 | /* digital pad */ |
284 | if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) { | 304 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
285 | input_report_abs(dev, ABS_HAT0X, | ||
286 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | ||
287 | input_report_abs(dev, ABS_HAT0Y, | ||
288 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | ||
289 | } else /* xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS */ { | ||
290 | input_report_key(dev, BTN_LEFT, data[2] & 0x04); | 305 | input_report_key(dev, BTN_LEFT, data[2] & 0x04); |
291 | input_report_key(dev, BTN_RIGHT, data[2] & 0x08); | 306 | input_report_key(dev, BTN_RIGHT, data[2] & 0x08); |
292 | input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ | 307 | input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ |
293 | input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ | 308 | input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ |
309 | } else { | ||
310 | input_report_abs(dev, ABS_HAT0X, | ||
311 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | ||
312 | input_report_abs(dev, ABS_HAT0Y, | ||
313 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | ||
294 | } | 314 | } |
295 | 315 | ||
296 | /* start/back buttons and stick press left/right */ | 316 | /* start/back buttons and stick press left/right */ |
@@ -328,17 +348,17 @@ static void xpad360_process_packet(struct usb_xpad *xpad, | |||
328 | struct input_dev *dev = xpad->dev; | 348 | struct input_dev *dev = xpad->dev; |
329 | 349 | ||
330 | /* digital pad */ | 350 | /* digital pad */ |
331 | if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) { | 351 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
332 | input_report_abs(dev, ABS_HAT0X, | ||
333 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | ||
334 | input_report_abs(dev, ABS_HAT0Y, | ||
335 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | ||
336 | } else if (xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS) { | ||
337 | /* dpad as buttons (right, left, down, up) */ | 352 | /* dpad as buttons (right, left, down, up) */ |
338 | input_report_key(dev, BTN_LEFT, data[2] & 0x04); | 353 | input_report_key(dev, BTN_LEFT, data[2] & 0x04); |
339 | input_report_key(dev, BTN_RIGHT, data[2] & 0x08); | 354 | input_report_key(dev, BTN_RIGHT, data[2] & 0x08); |
340 | input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ | 355 | input_report_key(dev, BTN_0, data[2] & 0x01); /* up */ |
341 | input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ | 356 | input_report_key(dev, BTN_1, data[2] & 0x02); /* down */ |
357 | } else { | ||
358 | input_report_abs(dev, ABS_HAT0X, | ||
359 | !!(data[2] & 0x08) - !!(data[2] & 0x04)); | ||
360 | input_report_abs(dev, ABS_HAT0Y, | ||
361 | !!(data[2] & 0x02) - !!(data[2] & 0x01)); | ||
342 | } | 362 | } |
343 | 363 | ||
344 | /* start/back buttons */ | 364 | /* start/back buttons */ |
@@ -371,8 +391,13 @@ static void xpad360_process_packet(struct usb_xpad *xpad, | |||
371 | ~(__s16) le16_to_cpup((__le16 *)(data + 12))); | 391 | ~(__s16) le16_to_cpup((__le16 *)(data + 12))); |
372 | 392 | ||
373 | /* triggers left/right */ | 393 | /* triggers left/right */ |
374 | input_report_abs(dev, ABS_Z, data[4]); | 394 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { |
375 | input_report_abs(dev, ABS_RZ, data[5]); | 395 | input_report_key(dev, BTN_TL2, data[4]); |
396 | input_report_key(dev, BTN_TR2, data[5]); | ||
397 | } else { | ||
398 | input_report_abs(dev, ABS_Z, data[4]); | ||
399 | input_report_abs(dev, ABS_RZ, data[5]); | ||
400 | } | ||
376 | 401 | ||
377 | input_sync(dev); | 402 | input_sync(dev); |
378 | } | 403 | } |
@@ -505,7 +530,7 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) | |||
505 | struct usb_endpoint_descriptor *ep_irq_out; | 530 | struct usb_endpoint_descriptor *ep_irq_out; |
506 | int error = -ENOMEM; | 531 | int error = -ENOMEM; |
507 | 532 | ||
508 | if (xpad->xtype != XTYPE_XBOX360) | 533 | if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX) |
509 | return 0; | 534 | return 0; |
510 | 535 | ||
511 | xpad->odata = usb_buffer_alloc(xpad->udev, XPAD_PKT_LEN, | 536 | xpad->odata = usb_buffer_alloc(xpad->udev, XPAD_PKT_LEN, |
@@ -535,13 +560,13 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) | |||
535 | 560 | ||
536 | static void xpad_stop_output(struct usb_xpad *xpad) | 561 | static void xpad_stop_output(struct usb_xpad *xpad) |
537 | { | 562 | { |
538 | if (xpad->xtype == XTYPE_XBOX360) | 563 | if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX) |
539 | usb_kill_urb(xpad->irq_out); | 564 | usb_kill_urb(xpad->irq_out); |
540 | } | 565 | } |
541 | 566 | ||
542 | static void xpad_deinit_output(struct usb_xpad *xpad) | 567 | static void xpad_deinit_output(struct usb_xpad *xpad) |
543 | { | 568 | { |
544 | if (xpad->xtype == XTYPE_XBOX360) { | 569 | if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX) { |
545 | usb_free_urb(xpad->irq_out); | 570 | usb_free_urb(xpad->irq_out); |
546 | usb_buffer_free(xpad->udev, XPAD_PKT_LEN, | 571 | usb_buffer_free(xpad->udev, XPAD_PKT_LEN, |
547 | xpad->odata, xpad->odata_dma); | 572 | xpad->odata, xpad->odata_dma); |
@@ -554,24 +579,45 @@ static void xpad_stop_output(struct usb_xpad *xpad) {} | |||
554 | #endif | 579 | #endif |
555 | 580 | ||
556 | #ifdef CONFIG_JOYSTICK_XPAD_FF | 581 | #ifdef CONFIG_JOYSTICK_XPAD_FF |
557 | static int xpad_play_effect(struct input_dev *dev, void *data, | 582 | static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) |
558 | struct ff_effect *effect) | ||
559 | { | 583 | { |
560 | struct usb_xpad *xpad = input_get_drvdata(dev); | 584 | struct usb_xpad *xpad = input_get_drvdata(dev); |
561 | 585 | ||
562 | if (effect->type == FF_RUMBLE) { | 586 | if (effect->type == FF_RUMBLE) { |
563 | __u16 strong = effect->u.rumble.strong_magnitude; | 587 | __u16 strong = effect->u.rumble.strong_magnitude; |
564 | __u16 weak = effect->u.rumble.weak_magnitude; | 588 | __u16 weak = effect->u.rumble.weak_magnitude; |
565 | xpad->odata[0] = 0x00; | 589 | |
566 | xpad->odata[1] = 0x08; | 590 | switch (xpad->xtype) { |
567 | xpad->odata[2] = 0x00; | 591 | |
568 | xpad->odata[3] = strong / 256; | 592 | case XTYPE_XBOX: |
569 | xpad->odata[4] = weak / 256; | 593 | xpad->odata[0] = 0x00; |
570 | xpad->odata[5] = 0x00; | 594 | xpad->odata[1] = 0x06; |
571 | xpad->odata[6] = 0x00; | 595 | xpad->odata[2] = 0x00; |
572 | xpad->odata[7] = 0x00; | 596 | xpad->odata[3] = strong / 256; /* left actuator */ |
573 | xpad->irq_out->transfer_buffer_length = 8; | 597 | xpad->odata[4] = 0x00; |
574 | usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | 598 | xpad->odata[5] = weak / 256; /* right actuator */ |
599 | xpad->irq_out->transfer_buffer_length = 6; | ||
600 | |||
601 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | ||
602 | |||
603 | case XTYPE_XBOX360: | ||
604 | xpad->odata[0] = 0x00; | ||
605 | xpad->odata[1] = 0x08; | ||
606 | xpad->odata[2] = 0x00; | ||
607 | xpad->odata[3] = strong / 256; /* left actuator? */ | ||
608 | xpad->odata[4] = weak / 256; /* right actuator? */ | ||
609 | xpad->odata[5] = 0x00; | ||
610 | xpad->odata[6] = 0x00; | ||
611 | xpad->odata[7] = 0x00; | ||
612 | xpad->irq_out->transfer_buffer_length = 8; | ||
613 | |||
614 | return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); | ||
615 | |||
616 | default: | ||
617 | dbg("%s - rumble command sent to unsupported xpad type: %d", | ||
618 | __func__, xpad->xtype); | ||
619 | return -1; | ||
620 | } | ||
575 | } | 621 | } |
576 | 622 | ||
577 | return 0; | 623 | return 0; |
@@ -579,7 +625,7 @@ static int xpad_play_effect(struct input_dev *dev, void *data, | |||
579 | 625 | ||
580 | static int xpad_init_ff(struct usb_xpad *xpad) | 626 | static int xpad_init_ff(struct usb_xpad *xpad) |
581 | { | 627 | { |
582 | if (xpad->xtype != XTYPE_XBOX360) | 628 | if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX) |
583 | return 0; | 629 | return 0; |
584 | 630 | ||
585 | input_set_capability(xpad->dev, EV_FF, FF_RUMBLE); | 631 | input_set_capability(xpad->dev, EV_FF, FF_RUMBLE); |
@@ -712,11 +758,11 @@ static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs) | |||
712 | input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128); | 758 | input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128); |
713 | break; | 759 | break; |
714 | case ABS_Z: | 760 | case ABS_Z: |
715 | case ABS_RZ: /* the triggers */ | 761 | case ABS_RZ: /* the triggers (if mapped to axes) */ |
716 | input_set_abs_params(input_dev, abs, 0, 255, 0, 0); | 762 | input_set_abs_params(input_dev, abs, 0, 255, 0, 0); |
717 | break; | 763 | break; |
718 | case ABS_HAT0X: | 764 | case ABS_HAT0X: |
719 | case ABS_HAT0Y: /* the d-pad (only if MAP_DPAD_TO_AXES) */ | 765 | case ABS_HAT0Y: /* the d-pad (only if dpad is mapped to axes */ |
720 | input_set_abs_params(input_dev, abs, -1, 1, 0, 0); | 766 | input_set_abs_params(input_dev, abs, -1, 1, 0, 0); |
721 | break; | 767 | break; |
722 | } | 768 | } |
@@ -752,10 +798,9 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
752 | goto fail2; | 798 | goto fail2; |
753 | 799 | ||
754 | xpad->udev = udev; | 800 | xpad->udev = udev; |
755 | xpad->dpad_mapping = xpad_device[i].dpad_mapping; | 801 | xpad->mapping = xpad_device[i].mapping; |
756 | xpad->xtype = xpad_device[i].xtype; | 802 | xpad->xtype = xpad_device[i].xtype; |
757 | if (xpad->dpad_mapping == MAP_DPAD_UNKNOWN) | 803 | |
758 | xpad->dpad_mapping = !dpad_to_buttons; | ||
759 | if (xpad->xtype == XTYPE_UNKNOWN) { | 804 | if (xpad->xtype == XTYPE_UNKNOWN) { |
760 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { | 805 | if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { |
761 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) | 806 | if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) |
@@ -764,7 +809,13 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
764 | xpad->xtype = XTYPE_XBOX360; | 809 | xpad->xtype = XTYPE_XBOX360; |
765 | } else | 810 | } else |
766 | xpad->xtype = XTYPE_XBOX; | 811 | xpad->xtype = XTYPE_XBOX; |
812 | |||
813 | if (dpad_to_buttons) | ||
814 | xpad->mapping |= MAP_DPAD_TO_BUTTONS; | ||
815 | if (triggers_to_buttons) | ||
816 | xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS; | ||
767 | } | 817 | } |
818 | |||
768 | xpad->dev = input_dev; | 819 | xpad->dev = input_dev; |
769 | usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); | 820 | usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); |
770 | strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); | 821 | strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); |
@@ -781,25 +832,37 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
781 | 832 | ||
782 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | 833 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); |
783 | 834 | ||
784 | /* set up buttons */ | 835 | /* set up standard buttons and axes */ |
785 | for (i = 0; xpad_common_btn[i] >= 0; i++) | 836 | for (i = 0; xpad_common_btn[i] >= 0; i++) |
786 | set_bit(xpad_common_btn[i], input_dev->keybit); | 837 | __set_bit(xpad_common_btn[i], input_dev->keybit); |
787 | if ((xpad->xtype == XTYPE_XBOX360) || (xpad->xtype == XTYPE_XBOX360W)) | ||
788 | for (i = 0; xpad360_btn[i] >= 0; i++) | ||
789 | set_bit(xpad360_btn[i], input_dev->keybit); | ||
790 | else | ||
791 | for (i = 0; xpad_btn[i] >= 0; i++) | ||
792 | set_bit(xpad_btn[i], input_dev->keybit); | ||
793 | if (xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS) | ||
794 | for (i = 0; xpad_btn_pad[i] >= 0; i++) | ||
795 | set_bit(xpad_btn_pad[i], input_dev->keybit); | ||
796 | 838 | ||
797 | /* set up axes */ | ||
798 | for (i = 0; xpad_abs[i] >= 0; i++) | 839 | for (i = 0; xpad_abs[i] >= 0; i++) |
799 | xpad_set_up_abs(input_dev, xpad_abs[i]); | 840 | xpad_set_up_abs(input_dev, xpad_abs[i]); |
800 | if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) | 841 | |
842 | /* Now set up model-specific ones */ | ||
843 | if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W) { | ||
844 | for (i = 0; xpad360_btn[i] >= 0; i++) | ||
845 | __set_bit(xpad360_btn[i], input_dev->keybit); | ||
846 | } else { | ||
847 | for (i = 0; xpad_btn[i] >= 0; i++) | ||
848 | __set_bit(xpad_btn[i], input_dev->keybit); | ||
849 | } | ||
850 | |||
851 | if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { | ||
852 | for (i = 0; xpad_btn_pad[i] >= 0; i++) | ||
853 | __set_bit(xpad_btn_pad[i], input_dev->keybit); | ||
854 | } else { | ||
801 | for (i = 0; xpad_abs_pad[i] >= 0; i++) | 855 | for (i = 0; xpad_abs_pad[i] >= 0; i++) |
802 | xpad_set_up_abs(input_dev, xpad_abs_pad[i]); | 856 | xpad_set_up_abs(input_dev, xpad_abs_pad[i]); |
857 | } | ||
858 | |||
859 | if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { | ||
860 | for (i = 0; xpad_btn_triggers[i] >= 0; i++) | ||
861 | __set_bit(xpad_btn_triggers[i], input_dev->keybit); | ||
862 | } else { | ||
863 | for (i = 0; xpad_abs_triggers[i] >= 0; i++) | ||
864 | xpad_set_up_abs(input_dev, xpad_abs_triggers[i]); | ||
865 | } | ||
803 | 866 | ||
804 | error = xpad_init_output(intf, xpad); | 867 | error = xpad_init_output(intf, xpad); |
805 | if (error) | 868 | if (error) |
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 02c836e11813..64c102355f53 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig | |||
@@ -35,10 +35,10 @@ config KEYBOARD_ADP5520 | |||
35 | be called adp5520-keys. | 35 | be called adp5520-keys. |
36 | 36 | ||
37 | config KEYBOARD_ADP5588 | 37 | config KEYBOARD_ADP5588 |
38 | tristate "ADP5588 I2C QWERTY Keypad and IO Expander" | 38 | tristate "ADP5588/87 I2C QWERTY Keypad and IO Expander" |
39 | depends on I2C | 39 | depends on I2C |
40 | help | 40 | help |
41 | Say Y here if you want to use a ADP5588 attached to your | 41 | Say Y here if you want to use a ADP5588/87 attached to your |
42 | system I2C bus. | 42 | system I2C bus. |
43 | 43 | ||
44 | To compile this driver as a module, choose M here: the | 44 | To compile this driver as a module, choose M here: the |
@@ -144,13 +144,15 @@ config KEYBOARD_BFIN | |||
144 | module will be called bf54x-keys. | 144 | module will be called bf54x-keys. |
145 | 145 | ||
146 | config KEYBOARD_CORGI | 146 | config KEYBOARD_CORGI |
147 | tristate "Corgi keyboard" | 147 | tristate "Corgi keyboard (deprecated)" |
148 | depends on PXA_SHARPSL | 148 | depends on PXA_SHARPSL |
149 | default y | ||
150 | help | 149 | help |
151 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx | 150 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx |
152 | series of PDAs. | 151 | series of PDAs. |
153 | 152 | ||
153 | This driver is now deprecated, use generic GPIO based matrix | ||
154 | keyboard driver instead. | ||
155 | |||
154 | To compile this driver as a module, choose M here: the | 156 | To compile this driver as a module, choose M here: the |
155 | module will be called corgikbd. | 157 | module will be called corgikbd. |
156 | 158 | ||
@@ -292,6 +294,15 @@ config KEYBOARD_MAX7359 | |||
292 | To compile this driver as a module, choose M here: the | 294 | To compile this driver as a module, choose M here: the |
293 | module will be called max7359_keypad. | 295 | module will be called max7359_keypad. |
294 | 296 | ||
297 | config KEYBOARD_IMX | ||
298 | tristate "IMX keypad support" | ||
299 | depends on ARCH_MXC | ||
300 | help | ||
301 | Enable support for IMX keypad port. | ||
302 | |||
303 | To compile this driver as a module, choose M here: the | ||
304 | module will be called imx_keypad. | ||
305 | |||
295 | config KEYBOARD_NEWTON | 306 | config KEYBOARD_NEWTON |
296 | tristate "Newton keyboard" | 307 | tristate "Newton keyboard" |
297 | select SERIO | 308 | select SERIO |
@@ -329,13 +340,15 @@ config KEYBOARD_PXA930_ROTARY | |||
329 | module will be called pxa930_rotary. | 340 | module will be called pxa930_rotary. |
330 | 341 | ||
331 | config KEYBOARD_SPITZ | 342 | config KEYBOARD_SPITZ |
332 | tristate "Spitz keyboard" | 343 | tristate "Spitz keyboard (deprecated)" |
333 | depends on PXA_SHARPSL | 344 | depends on PXA_SHARPSL |
334 | default y | ||
335 | help | 345 | help |
336 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, | 346 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, |
337 | SL-C3000 and Sl-C3100 series of PDAs. | 347 | SL-C3000 and Sl-C3100 series of PDAs. |
338 | 348 | ||
349 | This driver is now deprecated, use generic GPIO based matrix | ||
350 | keyboard driver instead. | ||
351 | |||
339 | To compile this driver as a module, choose M here: the | 352 | To compile this driver as a module, choose M here: the |
340 | module will be called spitzkbd. | 353 | module will be called spitzkbd. |
341 | 354 | ||
@@ -363,7 +376,7 @@ config KEYBOARD_SUNKBD | |||
363 | 376 | ||
364 | config KEYBOARD_SH_KEYSC | 377 | config KEYBOARD_SH_KEYSC |
365 | tristate "SuperH KEYSC keypad support" | 378 | tristate "SuperH KEYSC keypad support" |
366 | depends on SUPERH | 379 | depends on SUPERH || ARCH_SHMOBILE |
367 | help | 380 | help |
368 | Say Y here if you want to use a keypad attached to the KEYSC block | 381 | Say Y here if you want to use a keypad attached to the KEYSC block |
369 | on SuperH processors such as sh7722 and sh7343. | 382 | on SuperH processors such as sh7722 and sh7343. |
@@ -402,12 +415,14 @@ config KEYBOARD_TWL4030 | |||
402 | module will be called twl4030_keypad. | 415 | module will be called twl4030_keypad. |
403 | 416 | ||
404 | config KEYBOARD_TOSA | 417 | config KEYBOARD_TOSA |
405 | tristate "Tosa keyboard" | 418 | tristate "Tosa keyboard (deprecated)" |
406 | depends on MACH_TOSA | 419 | depends on MACH_TOSA |
407 | default y | ||
408 | help | 420 | help |
409 | Say Y here to enable the keyboard on the Sharp Zaurus SL-6000x (Tosa) | 421 | Say Y here to enable the keyboard on the Sharp Zaurus SL-6000x (Tosa) |
410 | 422 | ||
423 | This driver is now deprecated, use generic GPIO based matrix | ||
424 | keyboard driver instead. | ||
425 | |||
411 | To compile this driver as a module, choose M here: the | 426 | To compile this driver as a module, choose M here: the |
412 | module will be called tosakbd. | 427 | module will be called tosakbd. |
413 | 428 | ||
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 78654ef65206..706c6b5ed5f4 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile | |||
@@ -17,6 +17,7 @@ obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o | |||
17 | obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o | 17 | obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o |
18 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o | 18 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o |
19 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o | 19 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o |
20 | obj-$(CONFIG_KEYBOARD_IMX) += imx_keypad.o | ||
20 | obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o | 21 | obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o |
21 | obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o | 22 | obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o |
22 | obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o | 23 | obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o |
diff --git a/drivers/input/keyboard/adp5588-keys.c b/drivers/input/keyboard/adp5588-keys.c index 1edb596d927b..b5142d2d5112 100644 --- a/drivers/input/keyboard/adp5588-keys.c +++ b/drivers/input/keyboard/adp5588-keys.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * File: drivers/input/keyboard/adp5588_keys.c | 2 | * File: drivers/input/keyboard/adp5588_keys.c |
3 | * Description: keypad driver for ADP5588 I2C QWERTY Keypad and IO Expander | 3 | * Description: keypad driver for ADP5588 and ADP5587 |
4 | * I2C QWERTY Keypad and IO Expander | ||
4 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 5 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ |
5 | * | 6 | * |
6 | * Copyright (C) 2008-2009 Analog Devices Inc. | 7 | * Copyright (C) 2008-2009 Analog Devices Inc. |
@@ -327,6 +328,7 @@ static const struct dev_pm_ops adp5588_dev_pm_ops = { | |||
327 | 328 | ||
328 | static const struct i2c_device_id adp5588_id[] = { | 329 | static const struct i2c_device_id adp5588_id[] = { |
329 | { KBUILD_MODNAME, 0 }, | 330 | { KBUILD_MODNAME, 0 }, |
331 | { "adp5587-keys", 0 }, | ||
330 | { } | 332 | { } |
331 | }; | 333 | }; |
332 | MODULE_DEVICE_TABLE(i2c, adp5588_id); | 334 | MODULE_DEVICE_TABLE(i2c, adp5588_id); |
@@ -357,5 +359,5 @@ module_exit(adp5588_exit); | |||
357 | 359 | ||
358 | MODULE_LICENSE("GPL"); | 360 | MODULE_LICENSE("GPL"); |
359 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); | 361 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); |
360 | MODULE_DESCRIPTION("ADP5588 Keypad driver"); | 362 | MODULE_DESCRIPTION("ADP5588/87 Keypad driver"); |
361 | MODULE_ALIAS("platform:adp5588-keys"); | 363 | MODULE_ALIAS("platform:adp5588-keys"); |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 7b4056292eaf..d358ef8623f4 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -40,26 +40,26 @@ module_param_named(set, atkbd_set, int, 0); | |||
40 | MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); | 40 | MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); |
41 | 41 | ||
42 | #if defined(__i386__) || defined(__x86_64__) || defined(__hppa__) | 42 | #if defined(__i386__) || defined(__x86_64__) || defined(__hppa__) |
43 | static int atkbd_reset; | 43 | static bool atkbd_reset; |
44 | #else | 44 | #else |
45 | static int atkbd_reset = 1; | 45 | static bool atkbd_reset = true; |
46 | #endif | 46 | #endif |
47 | module_param_named(reset, atkbd_reset, bool, 0); | 47 | module_param_named(reset, atkbd_reset, bool, 0); |
48 | MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); | 48 | MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); |
49 | 49 | ||
50 | static int atkbd_softrepeat; | 50 | static bool atkbd_softrepeat; |
51 | module_param_named(softrepeat, atkbd_softrepeat, bool, 0); | 51 | module_param_named(softrepeat, atkbd_softrepeat, bool, 0); |
52 | MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); | 52 | MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); |
53 | 53 | ||
54 | static int atkbd_softraw = 1; | 54 | static bool atkbd_softraw = true; |
55 | module_param_named(softraw, atkbd_softraw, bool, 0); | 55 | module_param_named(softraw, atkbd_softraw, bool, 0); |
56 | MODULE_PARM_DESC(softraw, "Use software generated rawmode"); | 56 | MODULE_PARM_DESC(softraw, "Use software generated rawmode"); |
57 | 57 | ||
58 | static int atkbd_scroll; | 58 | static bool atkbd_scroll; |
59 | module_param_named(scroll, atkbd_scroll, bool, 0); | 59 | module_param_named(scroll, atkbd_scroll, bool, 0); |
60 | MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); | 60 | MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); |
61 | 61 | ||
62 | static int atkbd_extra; | 62 | static bool atkbd_extra; |
63 | module_param_named(extra, atkbd_extra, bool, 0); | 63 | module_param_named(extra, atkbd_extra, bool, 0); |
64 | MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"); | 64 | MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"); |
65 | 65 | ||
@@ -153,16 +153,16 @@ static const unsigned short atkbd_unxlate_table[128] = { | |||
153 | #define ATKBD_RET_HANGEUL 0xf2 | 153 | #define ATKBD_RET_HANGEUL 0xf2 |
154 | #define ATKBD_RET_ERR 0xff | 154 | #define ATKBD_RET_ERR 0xff |
155 | 155 | ||
156 | #define ATKBD_KEY_UNKNOWN 0 | 156 | #define ATKBD_KEY_UNKNOWN 0 |
157 | #define ATKBD_KEY_NULL 255 | 157 | #define ATKBD_KEY_NULL 255 |
158 | 158 | ||
159 | #define ATKBD_SCR_1 254 | 159 | #define ATKBD_SCR_1 0xfffe |
160 | #define ATKBD_SCR_2 253 | 160 | #define ATKBD_SCR_2 0xfffd |
161 | #define ATKBD_SCR_4 252 | 161 | #define ATKBD_SCR_4 0xfffc |
162 | #define ATKBD_SCR_8 251 | 162 | #define ATKBD_SCR_8 0xfffb |
163 | #define ATKBD_SCR_CLICK 250 | 163 | #define ATKBD_SCR_CLICK 0xfffa |
164 | #define ATKBD_SCR_LEFT 249 | 164 | #define ATKBD_SCR_LEFT 0xfff9 |
165 | #define ATKBD_SCR_RIGHT 248 | 165 | #define ATKBD_SCR_RIGHT 0xfff8 |
166 | 166 | ||
167 | #define ATKBD_SPECIAL ATKBD_SCR_RIGHT | 167 | #define ATKBD_SPECIAL ATKBD_SCR_RIGHT |
168 | 168 | ||
@@ -177,7 +177,7 @@ static const unsigned short atkbd_unxlate_table[128] = { | |||
177 | #define ATKBD_XL_HANJA 0x20 | 177 | #define ATKBD_XL_HANJA 0x20 |
178 | 178 | ||
179 | static const struct { | 179 | static const struct { |
180 | unsigned char keycode; | 180 | unsigned short keycode; |
181 | unsigned char set2; | 181 | unsigned char set2; |
182 | } atkbd_scroll_keys[] = { | 182 | } atkbd_scroll_keys[] = { |
183 | { ATKBD_SCR_1, 0xc5 }, | 183 | { ATKBD_SCR_1, 0xc5 }, |
@@ -206,18 +206,18 @@ struct atkbd { | |||
206 | unsigned short keycode[ATKBD_KEYMAP_SIZE]; | 206 | unsigned short keycode[ATKBD_KEYMAP_SIZE]; |
207 | DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE); | 207 | DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE); |
208 | unsigned char set; | 208 | unsigned char set; |
209 | unsigned char translated; | 209 | bool translated; |
210 | unsigned char extra; | 210 | bool extra; |
211 | unsigned char write; | 211 | bool write; |
212 | unsigned char softrepeat; | 212 | bool softrepeat; |
213 | unsigned char softraw; | 213 | bool softraw; |
214 | unsigned char scroll; | 214 | bool scroll; |
215 | unsigned char enabled; | 215 | bool enabled; |
216 | 216 | ||
217 | /* Accessed only from interrupt */ | 217 | /* Accessed only from interrupt */ |
218 | unsigned char emul; | 218 | unsigned char emul; |
219 | unsigned char resend; | 219 | bool resend; |
220 | unsigned char release; | 220 | bool release; |
221 | unsigned long xl_bit; | 221 | unsigned long xl_bit; |
222 | unsigned int last; | 222 | unsigned int last; |
223 | unsigned long time; | 223 | unsigned long time; |
@@ -301,18 +301,18 @@ static const unsigned int xl_table[] = { | |||
301 | * Checks if we should mangle the scancode to extract 'release' bit | 301 | * Checks if we should mangle the scancode to extract 'release' bit |
302 | * in translated mode. | 302 | * in translated mode. |
303 | */ | 303 | */ |
304 | static int atkbd_need_xlate(unsigned long xl_bit, unsigned char code) | 304 | static bool atkbd_need_xlate(unsigned long xl_bit, unsigned char code) |
305 | { | 305 | { |
306 | int i; | 306 | int i; |
307 | 307 | ||
308 | if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) | 308 | if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) |
309 | return 0; | 309 | return false; |
310 | 310 | ||
311 | for (i = 0; i < ARRAY_SIZE(xl_table); i++) | 311 | for (i = 0; i < ARRAY_SIZE(xl_table); i++) |
312 | if (code == xl_table[i]) | 312 | if (code == xl_table[i]) |
313 | return test_bit(i, &xl_bit); | 313 | return test_bit(i, &xl_bit); |
314 | 314 | ||
315 | return 1; | 315 | return true; |
316 | } | 316 | } |
317 | 317 | ||
318 | /* | 318 | /* |
@@ -359,7 +359,7 @@ static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code | |||
359 | */ | 359 | */ |
360 | 360 | ||
361 | static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | 361 | static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, |
362 | unsigned int flags) | 362 | unsigned int flags) |
363 | { | 363 | { |
364 | struct atkbd *atkbd = serio_get_drvdata(serio); | 364 | struct atkbd *atkbd = serio_get_drvdata(serio); |
365 | struct input_dev *dev = atkbd->dev; | 365 | struct input_dev *dev = atkbd->dev; |
@@ -368,20 +368,18 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
368 | int value; | 368 | int value; |
369 | unsigned short keycode; | 369 | unsigned short keycode; |
370 | 370 | ||
371 | #ifdef ATKBD_DEBUG | 371 | dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, flags); |
372 | printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); | ||
373 | #endif | ||
374 | 372 | ||
375 | #if !defined(__i386__) && !defined (__x86_64__) | 373 | #if !defined(__i386__) && !defined (__x86_64__) |
376 | if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { | 374 | if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { |
377 | printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags); | 375 | dev_warn(&serio->dev, "Frame/parity error: %02x\n", flags); |
378 | serio_write(serio, ATKBD_CMD_RESEND); | 376 | serio_write(serio, ATKBD_CMD_RESEND); |
379 | atkbd->resend = 1; | 377 | atkbd->resend = true; |
380 | goto out; | 378 | goto out; |
381 | } | 379 | } |
382 | 380 | ||
383 | if (!flags && data == ATKBD_RET_ACK) | 381 | if (!flags && data == ATKBD_RET_ACK) |
384 | atkbd->resend = 0; | 382 | atkbd->resend = false; |
385 | #endif | 383 | #endif |
386 | 384 | ||
387 | if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) | 385 | if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) |
@@ -412,32 +410,32 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
412 | } | 410 | } |
413 | 411 | ||
414 | switch (code) { | 412 | switch (code) { |
415 | case ATKBD_RET_BAT: | 413 | case ATKBD_RET_BAT: |
416 | atkbd->enabled = 0; | 414 | atkbd->enabled = false; |
417 | serio_reconnect(atkbd->ps2dev.serio); | 415 | serio_reconnect(atkbd->ps2dev.serio); |
418 | goto out; | 416 | goto out; |
419 | case ATKBD_RET_EMUL0: | 417 | case ATKBD_RET_EMUL0: |
420 | atkbd->emul = 1; | 418 | atkbd->emul = 1; |
421 | goto out; | 419 | goto out; |
422 | case ATKBD_RET_EMUL1: | 420 | case ATKBD_RET_EMUL1: |
423 | atkbd->emul = 2; | 421 | atkbd->emul = 2; |
424 | goto out; | 422 | goto out; |
425 | case ATKBD_RET_RELEASE: | 423 | case ATKBD_RET_RELEASE: |
426 | atkbd->release = 1; | 424 | atkbd->release = true; |
427 | goto out; | 425 | goto out; |
428 | case ATKBD_RET_ACK: | 426 | case ATKBD_RET_ACK: |
429 | case ATKBD_RET_NAK: | 427 | case ATKBD_RET_NAK: |
430 | if (printk_ratelimit()) | 428 | if (printk_ratelimit()) |
431 | printk(KERN_WARNING "atkbd.c: Spurious %s on %s. " | 429 | dev_warn(&serio->dev, |
432 | "Some program might be trying access hardware directly.\n", | 430 | "Spurious %s on %s. " |
433 | data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); | 431 | "Some program might be trying access hardware directly.\n", |
434 | goto out; | 432 | data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); |
435 | case ATKBD_RET_ERR: | 433 | goto out; |
436 | atkbd->err_count++; | 434 | case ATKBD_RET_ERR: |
437 | #ifdef ATKBD_DEBUG | 435 | atkbd->err_count++; |
438 | printk(KERN_DEBUG "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys); | 436 | dev_dbg(&serio->dev, "Keyboard on %s reports too many keys pressed.\n", |
439 | #endif | 437 | serio->phys); |
440 | goto out; | 438 | goto out; |
441 | } | 439 | } |
442 | 440 | ||
443 | code = atkbd_compat_scancode(atkbd, code); | 441 | code = atkbd_compat_scancode(atkbd, code); |
@@ -451,71 +449,72 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
451 | input_event(dev, EV_MSC, MSC_SCAN, code); | 449 | input_event(dev, EV_MSC, MSC_SCAN, code); |
452 | 450 | ||
453 | switch (keycode) { | 451 | switch (keycode) { |
454 | case ATKBD_KEY_NULL: | 452 | case ATKBD_KEY_NULL: |
455 | break; | 453 | break; |
456 | case ATKBD_KEY_UNKNOWN: | 454 | case ATKBD_KEY_UNKNOWN: |
457 | printk(KERN_WARNING | 455 | dev_warn(&serio->dev, |
458 | "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n", | 456 | "Unknown key %s (%s set %d, code %#x on %s).\n", |
459 | atkbd->release ? "released" : "pressed", | 457 | atkbd->release ? "released" : "pressed", |
460 | atkbd->translated ? "translated" : "raw", | 458 | atkbd->translated ? "translated" : "raw", |
461 | atkbd->set, code, serio->phys); | 459 | atkbd->set, code, serio->phys); |
462 | printk(KERN_WARNING | 460 | dev_warn(&serio->dev, |
463 | "atkbd.c: Use 'setkeycodes %s%02x <keycode>' to make it known.\n", | 461 | "Use 'setkeycodes %s%02x <keycode>' to make it known.\n", |
464 | code & 0x80 ? "e0" : "", code & 0x7f); | 462 | code & 0x80 ? "e0" : "", code & 0x7f); |
465 | input_sync(dev); | 463 | input_sync(dev); |
466 | break; | 464 | break; |
467 | case ATKBD_SCR_1: | 465 | case ATKBD_SCR_1: |
468 | scroll = 1 - atkbd->release * 2; | 466 | scroll = 1; |
469 | break; | 467 | break; |
470 | case ATKBD_SCR_2: | 468 | case ATKBD_SCR_2: |
471 | scroll = 2 - atkbd->release * 4; | 469 | scroll = 2; |
472 | break; | 470 | break; |
473 | case ATKBD_SCR_4: | 471 | case ATKBD_SCR_4: |
474 | scroll = 4 - atkbd->release * 8; | 472 | scroll = 4; |
475 | break; | 473 | break; |
476 | case ATKBD_SCR_8: | 474 | case ATKBD_SCR_8: |
477 | scroll = 8 - atkbd->release * 16; | 475 | scroll = 8; |
478 | break; | 476 | break; |
479 | case ATKBD_SCR_CLICK: | 477 | case ATKBD_SCR_CLICK: |
480 | click = !atkbd->release; | 478 | click = !atkbd->release; |
481 | break; | 479 | break; |
482 | case ATKBD_SCR_LEFT: | 480 | case ATKBD_SCR_LEFT: |
483 | hscroll = -1; | 481 | hscroll = -1; |
484 | break; | 482 | break; |
485 | case ATKBD_SCR_RIGHT: | 483 | case ATKBD_SCR_RIGHT: |
486 | hscroll = 1; | 484 | hscroll = 1; |
487 | break; | 485 | break; |
488 | default: | 486 | default: |
489 | if (atkbd->release) { | 487 | if (atkbd->release) { |
490 | value = 0; | 488 | value = 0; |
491 | atkbd->last = 0; | 489 | atkbd->last = 0; |
492 | } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { | 490 | } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { |
493 | /* Workaround Toshiba laptop multiple keypress */ | 491 | /* Workaround Toshiba laptop multiple keypress */ |
494 | value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; | 492 | value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; |
495 | } else { | 493 | } else { |
496 | value = 1; | 494 | value = 1; |
497 | atkbd->last = code; | 495 | atkbd->last = code; |
498 | atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; | 496 | atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; |
499 | } | 497 | } |
500 | 498 | ||
501 | input_event(dev, EV_KEY, keycode, value); | 499 | input_event(dev, EV_KEY, keycode, value); |
502 | input_sync(dev); | 500 | input_sync(dev); |
503 | 501 | ||
504 | if (value && test_bit(code, atkbd->force_release_mask)) { | 502 | if (value && test_bit(code, atkbd->force_release_mask)) { |
505 | input_report_key(dev, keycode, 0); | 503 | input_report_key(dev, keycode, 0); |
506 | input_sync(dev); | 504 | input_sync(dev); |
507 | } | 505 | } |
508 | } | 506 | } |
509 | 507 | ||
510 | if (atkbd->scroll) { | 508 | if (atkbd->scroll) { |
511 | if (click != -1) | 509 | if (click != -1) |
512 | input_report_key(dev, BTN_MIDDLE, click); | 510 | input_report_key(dev, BTN_MIDDLE, click); |
513 | input_report_rel(dev, REL_WHEEL, scroll); | 511 | input_report_rel(dev, REL_WHEEL, |
512 | atkbd->release ? -scroll : scroll); | ||
514 | input_report_rel(dev, REL_HWHEEL, hscroll); | 513 | input_report_rel(dev, REL_HWHEEL, hscroll); |
515 | input_sync(dev); | 514 | input_sync(dev); |
516 | } | 515 | } |
517 | 516 | ||
518 | atkbd->release = 0; | 517 | atkbd->release = false; |
519 | out: | 518 | out: |
520 | return IRQ_HANDLED; | 519 | return IRQ_HANDLED; |
521 | } | 520 | } |
@@ -634,17 +633,18 @@ static int atkbd_event(struct input_dev *dev, | |||
634 | 633 | ||
635 | switch (type) { | 634 | switch (type) { |
636 | 635 | ||
637 | case EV_LED: | 636 | case EV_LED: |
638 | atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT); | 637 | atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT); |
639 | return 0; | 638 | return 0; |
640 | 639 | ||
641 | case EV_REP: | 640 | case EV_REP: |
642 | if (!atkbd->softrepeat) | 641 | if (!atkbd->softrepeat) |
643 | atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT); | 642 | atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT); |
644 | return 0; | 643 | return 0; |
645 | } | ||
646 | 644 | ||
647 | return -1; | 645 | default: |
646 | return -1; | ||
647 | } | ||
648 | } | 648 | } |
649 | 649 | ||
650 | /* | 650 | /* |
@@ -655,7 +655,7 @@ static int atkbd_event(struct input_dev *dev, | |||
655 | static inline void atkbd_enable(struct atkbd *atkbd) | 655 | static inline void atkbd_enable(struct atkbd *atkbd) |
656 | { | 656 | { |
657 | serio_pause_rx(atkbd->ps2dev.serio); | 657 | serio_pause_rx(atkbd->ps2dev.serio); |
658 | atkbd->enabled = 1; | 658 | atkbd->enabled = true; |
659 | serio_continue_rx(atkbd->ps2dev.serio); | 659 | serio_continue_rx(atkbd->ps2dev.serio); |
660 | } | 660 | } |
661 | 661 | ||
@@ -667,7 +667,7 @@ static inline void atkbd_enable(struct atkbd *atkbd) | |||
667 | static inline void atkbd_disable(struct atkbd *atkbd) | 667 | static inline void atkbd_disable(struct atkbd *atkbd) |
668 | { | 668 | { |
669 | serio_pause_rx(atkbd->ps2dev.serio); | 669 | serio_pause_rx(atkbd->ps2dev.serio); |
670 | atkbd->enabled = 0; | 670 | atkbd->enabled = false; |
671 | serio_continue_rx(atkbd->ps2dev.serio); | 671 | serio_continue_rx(atkbd->ps2dev.serio); |
672 | } | 672 | } |
673 | 673 | ||
@@ -688,7 +688,9 @@ static int atkbd_probe(struct atkbd *atkbd) | |||
688 | 688 | ||
689 | if (atkbd_reset) | 689 | if (atkbd_reset) |
690 | if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT)) | 690 | if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT)) |
691 | printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys); | 691 | dev_warn(&ps2dev->serio->dev, |
692 | "keyboard reset failed on %s\n", | ||
693 | ps2dev->serio->phys); | ||
692 | 694 | ||
693 | /* | 695 | /* |
694 | * Then we check the keyboard ID. We should get 0xab83 under normal conditions. | 696 | * Then we check the keyboard ID. We should get 0xab83 under normal conditions. |
@@ -718,8 +720,9 @@ static int atkbd_probe(struct atkbd *atkbd) | |||
718 | atkbd->id = (param[0] << 8) | param[1]; | 720 | atkbd->id = (param[0] << 8) | param[1]; |
719 | 721 | ||
720 | if (atkbd->id == 0xaca1 && atkbd->translated) { | 722 | if (atkbd->id == 0xaca1 && atkbd->translated) { |
721 | printk(KERN_ERR "atkbd.c: NCD terminal keyboards are only supported on non-translating\n"); | 723 | dev_err(&ps2dev->serio->dev, |
722 | printk(KERN_ERR "atkbd.c: controllers. Use i8042.direct=1 to disable translation.\n"); | 724 | "NCD terminal keyboards are only supported on non-translating controlelrs. " |
725 | "Use i8042.direct=1 to disable translation.\n"); | ||
723 | return -1; | 726 | return -1; |
724 | } | 727 | } |
725 | 728 | ||
@@ -737,7 +740,7 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra | |||
737 | struct ps2dev *ps2dev = &atkbd->ps2dev; | 740 | struct ps2dev *ps2dev = &atkbd->ps2dev; |
738 | unsigned char param[2]; | 741 | unsigned char param[2]; |
739 | 742 | ||
740 | atkbd->extra = 0; | 743 | atkbd->extra = false; |
741 | /* | 744 | /* |
742 | * For known special keyboards we can go ahead and set the correct set. | 745 | * For known special keyboards we can go ahead and set the correct set. |
743 | * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and | 746 | * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and |
@@ -756,7 +759,7 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra | |||
756 | if (allow_extra) { | 759 | if (allow_extra) { |
757 | param[0] = 0x71; | 760 | param[0] = 0x71; |
758 | if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) { | 761 | if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) { |
759 | atkbd->extra = 1; | 762 | atkbd->extra = true; |
760 | return 2; | 763 | return 2; |
761 | } | 764 | } |
762 | } | 765 | } |
@@ -821,7 +824,8 @@ static int atkbd_activate(struct atkbd *atkbd) | |||
821 | */ | 824 | */ |
822 | 825 | ||
823 | if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) { | 826 | if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) { |
824 | printk(KERN_ERR "atkbd.c: Failed to enable keyboard on %s\n", | 827 | dev_err(&ps2dev->serio->dev, |
828 | "Failed to enable keyboard on %s\n", | ||
825 | ps2dev->serio->phys); | 829 | ps2dev->serio->phys); |
826 | return -1; | 830 | return -1; |
827 | } | 831 | } |
@@ -1070,9 +1074,13 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd) | |||
1070 | input_dev->keycodesize = sizeof(unsigned short); | 1074 | input_dev->keycodesize = sizeof(unsigned short); |
1071 | input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); | 1075 | input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); |
1072 | 1076 | ||
1073 | for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) | 1077 | for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) { |
1074 | if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL) | 1078 | if (atkbd->keycode[i] != KEY_RESERVED && |
1079 | atkbd->keycode[i] != ATKBD_KEY_NULL && | ||
1080 | atkbd->keycode[i] < ATKBD_SPECIAL) { | ||
1075 | __set_bit(atkbd->keycode[i], input_dev->keybit); | 1081 | __set_bit(atkbd->keycode[i], input_dev->keybit); |
1082 | } | ||
1083 | } | ||
1076 | } | 1084 | } |
1077 | 1085 | ||
1078 | /* | 1086 | /* |
@@ -1100,12 +1108,14 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) | |||
1100 | 1108 | ||
1101 | switch (serio->id.type) { | 1109 | switch (serio->id.type) { |
1102 | 1110 | ||
1103 | case SERIO_8042_XL: | 1111 | case SERIO_8042_XL: |
1104 | atkbd->translated = 1; | 1112 | atkbd->translated = true; |
1105 | case SERIO_8042: | 1113 | /* Fall through */ |
1106 | if (serio->write) | 1114 | |
1107 | atkbd->write = 1; | 1115 | case SERIO_8042: |
1108 | break; | 1116 | if (serio->write) |
1117 | atkbd->write = true; | ||
1118 | break; | ||
1109 | } | 1119 | } |
1110 | 1120 | ||
1111 | atkbd->softraw = atkbd_softraw; | 1121 | atkbd->softraw = atkbd_softraw; |
@@ -1113,7 +1123,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) | |||
1113 | atkbd->scroll = atkbd_scroll; | 1123 | atkbd->scroll = atkbd_scroll; |
1114 | 1124 | ||
1115 | if (atkbd->softrepeat) | 1125 | if (atkbd->softrepeat) |
1116 | atkbd->softraw = 1; | 1126 | atkbd->softraw = true; |
1117 | 1127 | ||
1118 | serio_set_drvdata(serio, atkbd); | 1128 | serio_set_drvdata(serio, atkbd); |
1119 | 1129 | ||
@@ -1172,7 +1182,8 @@ static int atkbd_reconnect(struct serio *serio) | |||
1172 | int retval = -1; | 1182 | int retval = -1; |
1173 | 1183 | ||
1174 | if (!atkbd || !drv) { | 1184 | if (!atkbd || !drv) { |
1175 | printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); | 1185 | dev_dbg(&serio->dev, |
1186 | "reconnect request, but serio is disconnected, ignoring...\n"); | ||
1176 | return -1; | 1187 | return -1; |
1177 | } | 1188 | } |
1178 | 1189 | ||
@@ -1286,7 +1297,8 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun | |||
1286 | struct input_dev *old_dev, *new_dev; | 1297 | struct input_dev *old_dev, *new_dev; |
1287 | unsigned long value; | 1298 | unsigned long value; |
1288 | int err; | 1299 | int err; |
1289 | unsigned char old_extra, old_set; | 1300 | bool old_extra; |
1301 | unsigned char old_set; | ||
1290 | 1302 | ||
1291 | if (!atkbd->write) | 1303 | if (!atkbd->write) |
1292 | return -EIO; | 1304 | return -EIO; |
@@ -1369,7 +1381,7 @@ static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t cou | |||
1369 | struct input_dev *old_dev, *new_dev; | 1381 | struct input_dev *old_dev, *new_dev; |
1370 | unsigned long value; | 1382 | unsigned long value; |
1371 | int err; | 1383 | int err; |
1372 | unsigned char old_scroll; | 1384 | bool old_scroll; |
1373 | 1385 | ||
1374 | if (strict_strtoul(buf, 10, &value) || value > 1) | 1386 | if (strict_strtoul(buf, 10, &value) || value > 1) |
1375 | return -EINVAL; | 1387 | return -EINVAL; |
@@ -1413,7 +1425,8 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count) | |||
1413 | struct input_dev *old_dev, *new_dev; | 1425 | struct input_dev *old_dev, *new_dev; |
1414 | unsigned long value; | 1426 | unsigned long value; |
1415 | int err; | 1427 | int err; |
1416 | unsigned char old_set, old_extra; | 1428 | unsigned char old_set; |
1429 | bool old_extra; | ||
1417 | 1430 | ||
1418 | if (!atkbd->write) | 1431 | if (!atkbd->write) |
1419 | return -EIO; | 1432 | return -EIO; |
@@ -1463,7 +1476,7 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t | |||
1463 | struct input_dev *old_dev, *new_dev; | 1476 | struct input_dev *old_dev, *new_dev; |
1464 | unsigned long value; | 1477 | unsigned long value; |
1465 | int err; | 1478 | int err; |
1466 | unsigned char old_softrepeat, old_softraw; | 1479 | bool old_softrepeat, old_softraw; |
1467 | 1480 | ||
1468 | if (!atkbd->write) | 1481 | if (!atkbd->write) |
1469 | return -EIO; | 1482 | return -EIO; |
@@ -1483,7 +1496,7 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t | |||
1483 | atkbd->dev = new_dev; | 1496 | atkbd->dev = new_dev; |
1484 | atkbd->softrepeat = value; | 1497 | atkbd->softrepeat = value; |
1485 | if (atkbd->softrepeat) | 1498 | if (atkbd->softrepeat) |
1486 | atkbd->softraw = 1; | 1499 | atkbd->softraw = true; |
1487 | atkbd_set_device_attrs(atkbd); | 1500 | atkbd_set_device_attrs(atkbd); |
1488 | 1501 | ||
1489 | err = input_register_device(atkbd->dev); | 1502 | err = input_register_device(atkbd->dev); |
@@ -1513,7 +1526,7 @@ static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t co | |||
1513 | struct input_dev *old_dev, *new_dev; | 1526 | struct input_dev *old_dev, *new_dev; |
1514 | unsigned long value; | 1527 | unsigned long value; |
1515 | int err; | 1528 | int err; |
1516 | unsigned char old_softraw; | 1529 | bool old_softraw; |
1517 | 1530 | ||
1518 | if (strict_strtoul(buf, 10, &value) || value > 1) | 1531 | if (strict_strtoul(buf, 10, &value) || value > 1) |
1519 | return -EINVAL; | 1532 | return -EINVAL; |
diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c index e45740429f7e..bd25a3af1664 100644 --- a/drivers/input/keyboard/ep93xx_keypad.c +++ b/drivers/input/keyboard/ep93xx_keypad.c | |||
@@ -69,7 +69,7 @@ struct ep93xx_keypad { | |||
69 | 69 | ||
70 | void __iomem *mmio_base; | 70 | void __iomem *mmio_base; |
71 | 71 | ||
72 | unsigned int matrix_keycodes[EP93XX_MATRIX_SIZE]; | 72 | unsigned short keycodes[EP93XX_MATRIX_SIZE]; |
73 | 73 | ||
74 | int key1; | 74 | int key1; |
75 | int key2; | 75 | int key2; |
@@ -79,24 +79,6 @@ struct ep93xx_keypad { | |||
79 | bool enabled; | 79 | bool enabled; |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static void ep93xx_keypad_build_keycode(struct ep93xx_keypad *keypad) | ||
83 | { | ||
84 | struct ep93xx_keypad_platform_data *pdata = keypad->pdata; | ||
85 | struct input_dev *input_dev = keypad->input_dev; | ||
86 | unsigned int *key; | ||
87 | int i; | ||
88 | |||
89 | key = &pdata->matrix_key_map[0]; | ||
90 | for (i = 0; i < pdata->matrix_key_map_size; i++, key++) { | ||
91 | int row = KEY_ROW(*key); | ||
92 | int col = KEY_COL(*key); | ||
93 | int code = KEY_VAL(*key); | ||
94 | |||
95 | keypad->matrix_keycodes[(row << 3) + col] = code; | ||
96 | __set_bit(code, input_dev->keybit); | ||
97 | } | ||
98 | } | ||
99 | |||
100 | static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) | 82 | static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) |
101 | { | 83 | { |
102 | struct ep93xx_keypad *keypad = dev_id; | 84 | struct ep93xx_keypad *keypad = dev_id; |
@@ -107,10 +89,10 @@ static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) | |||
107 | status = __raw_readl(keypad->mmio_base + KEY_REG); | 89 | status = __raw_readl(keypad->mmio_base + KEY_REG); |
108 | 90 | ||
109 | keycode = (status & KEY_REG_KEY1_MASK) >> KEY_REG_KEY1_SHIFT; | 91 | keycode = (status & KEY_REG_KEY1_MASK) >> KEY_REG_KEY1_SHIFT; |
110 | key1 = keypad->matrix_keycodes[keycode]; | 92 | key1 = keypad->keycodes[keycode]; |
111 | 93 | ||
112 | keycode = (status & KEY_REG_KEY2_MASK) >> KEY_REG_KEY2_SHIFT; | 94 | keycode = (status & KEY_REG_KEY2_MASK) >> KEY_REG_KEY2_SHIFT; |
113 | key2 = keypad->matrix_keycodes[keycode]; | 95 | key2 = keypad->keycodes[keycode]; |
114 | 96 | ||
115 | if (status & KEY_REG_2KEYS) { | 97 | if (status & KEY_REG_2KEYS) { |
116 | if (keypad->key1 && key1 != keypad->key1 && key2 != keypad->key1) | 98 | if (keypad->key1 && key1 != keypad->key1 && key2 != keypad->key1) |
@@ -256,6 +238,7 @@ static int ep93xx_keypad_resume(struct platform_device *pdev) | |||
256 | static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) | 238 | static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) |
257 | { | 239 | { |
258 | struct ep93xx_keypad *keypad; | 240 | struct ep93xx_keypad *keypad; |
241 | const struct matrix_keymap_data *keymap_data; | ||
259 | struct input_dev *input_dev; | 242 | struct input_dev *input_dev; |
260 | struct resource *res; | 243 | struct resource *res; |
261 | int err; | 244 | int err; |
@@ -270,6 +253,12 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) | |||
270 | goto failed_free; | 253 | goto failed_free; |
271 | } | 254 | } |
272 | 255 | ||
256 | keymap_data = keypad->pdata->keymap_data; | ||
257 | if (!keymap_data) { | ||
258 | err = -EINVAL; | ||
259 | goto failed_free; | ||
260 | } | ||
261 | |||
273 | keypad->irq = platform_get_irq(pdev, 0); | 262 | keypad->irq = platform_get_irq(pdev, 0); |
274 | if (!keypad->irq) { | 263 | if (!keypad->irq) { |
275 | err = -ENXIO; | 264 | err = -ENXIO; |
@@ -317,9 +306,9 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) | |||
317 | input_dev->open = ep93xx_keypad_open; | 306 | input_dev->open = ep93xx_keypad_open; |
318 | input_dev->close = ep93xx_keypad_close; | 307 | input_dev->close = ep93xx_keypad_close; |
319 | input_dev->dev.parent = &pdev->dev; | 308 | input_dev->dev.parent = &pdev->dev; |
320 | input_dev->keycode = keypad->matrix_keycodes; | 309 | input_dev->keycode = keypad->keycodes; |
321 | input_dev->keycodesize = sizeof(keypad->matrix_keycodes[0]); | 310 | input_dev->keycodesize = sizeof(keypad->keycodes[0]); |
322 | input_dev->keycodemax = ARRAY_SIZE(keypad->matrix_keycodes); | 311 | input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); |
323 | 312 | ||
324 | input_set_drvdata(input_dev, keypad); | 313 | input_set_drvdata(input_dev, keypad); |
325 | 314 | ||
@@ -327,7 +316,8 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) | |||
327 | if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) | 316 | if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) |
328 | input_dev->evbit[0] |= BIT_MASK(EV_REP); | 317 | input_dev->evbit[0] |= BIT_MASK(EV_REP); |
329 | 318 | ||
330 | ep93xx_keypad_build_keycode(keypad); | 319 | matrix_keypad_build_keymap(keymap_data, 3, |
320 | input_dev->keycode, input_dev->keybit); | ||
331 | platform_set_drvdata(pdev, keypad); | 321 | platform_set_drvdata(pdev, keypad); |
332 | 322 | ||
333 | err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, | 323 | err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, |
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 1aff3b76effd..2b708aa85553 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -30,13 +30,289 @@ struct gpio_button_data { | |||
30 | struct input_dev *input; | 30 | struct input_dev *input; |
31 | struct timer_list timer; | 31 | struct timer_list timer; |
32 | struct work_struct work; | 32 | struct work_struct work; |
33 | bool disabled; | ||
33 | }; | 34 | }; |
34 | 35 | ||
35 | struct gpio_keys_drvdata { | 36 | struct gpio_keys_drvdata { |
36 | struct input_dev *input; | 37 | struct input_dev *input; |
38 | struct mutex disable_lock; | ||
39 | unsigned int n_buttons; | ||
37 | struct gpio_button_data data[0]; | 40 | struct gpio_button_data data[0]; |
38 | }; | 41 | }; |
39 | 42 | ||
43 | /* | ||
44 | * SYSFS interface for enabling/disabling keys and switches: | ||
45 | * | ||
46 | * There are 4 attributes under /sys/devices/platform/gpio-keys/ | ||
47 | * keys [ro] - bitmap of keys (EV_KEY) which can be | ||
48 | * disabled | ||
49 | * switches [ro] - bitmap of switches (EV_SW) which can be | ||
50 | * disabled | ||
51 | * disabled_keys [rw] - bitmap of keys currently disabled | ||
52 | * disabled_switches [rw] - bitmap of switches currently disabled | ||
53 | * | ||
54 | * Userland can change these values and hence disable event generation | ||
55 | * for each key (or switch). Disabling a key means its interrupt line | ||
56 | * is disabled. | ||
57 | * | ||
58 | * For example, if we have following switches set up as gpio-keys: | ||
59 | * SW_DOCK = 5 | ||
60 | * SW_CAMERA_LENS_COVER = 9 | ||
61 | * SW_KEYPAD_SLIDE = 10 | ||
62 | * SW_FRONT_PROXIMITY = 11 | ||
63 | * This is read from switches: | ||
64 | * 11-9,5 | ||
65 | * Next we want to disable proximity (11) and dock (5), we write: | ||
66 | * 11,5 | ||
67 | * to file disabled_switches. Now proximity and dock IRQs are disabled. | ||
68 | * This can be verified by reading the file disabled_switches: | ||
69 | * 11,5 | ||
70 | * If we now want to enable proximity (11) switch we write: | ||
71 | * 5 | ||
72 | * to disabled_switches. | ||
73 | * | ||
74 | * We can disable only those keys which don't allow sharing the irq. | ||
75 | */ | ||
76 | |||
77 | /** | ||
78 | * get_n_events_by_type() - returns maximum number of events per @type | ||
79 | * @type: type of button (%EV_KEY, %EV_SW) | ||
80 | * | ||
81 | * Return value of this function can be used to allocate bitmap | ||
82 | * large enough to hold all bits for given type. | ||
83 | */ | ||
84 | static inline int get_n_events_by_type(int type) | ||
85 | { | ||
86 | BUG_ON(type != EV_SW && type != EV_KEY); | ||
87 | |||
88 | return (type == EV_KEY) ? KEY_CNT : SW_CNT; | ||
89 | } | ||
90 | |||
91 | /** | ||
92 | * gpio_keys_disable_button() - disables given GPIO button | ||
93 | * @bdata: button data for button to be disabled | ||
94 | * | ||
95 | * Disables button pointed by @bdata. This is done by masking | ||
96 | * IRQ line. After this function is called, button won't generate | ||
97 | * input events anymore. Note that one can only disable buttons | ||
98 | * that don't share IRQs. | ||
99 | * | ||
100 | * Make sure that @bdata->disable_lock is locked when entering | ||
101 | * this function to avoid races when concurrent threads are | ||
102 | * disabling buttons at the same time. | ||
103 | */ | ||
104 | static void gpio_keys_disable_button(struct gpio_button_data *bdata) | ||
105 | { | ||
106 | if (!bdata->disabled) { | ||
107 | /* | ||
108 | * Disable IRQ and possible debouncing timer. | ||
109 | */ | ||
110 | disable_irq(gpio_to_irq(bdata->button->gpio)); | ||
111 | if (bdata->button->debounce_interval) | ||
112 | del_timer_sync(&bdata->timer); | ||
113 | |||
114 | bdata->disabled = true; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | /** | ||
119 | * gpio_keys_enable_button() - enables given GPIO button | ||
120 | * @bdata: button data for button to be disabled | ||
121 | * | ||
122 | * Enables given button pointed by @bdata. | ||
123 | * | ||
124 | * Make sure that @bdata->disable_lock is locked when entering | ||
125 | * this function to avoid races with concurrent threads trying | ||
126 | * to enable the same button at the same time. | ||
127 | */ | ||
128 | static void gpio_keys_enable_button(struct gpio_button_data *bdata) | ||
129 | { | ||
130 | if (bdata->disabled) { | ||
131 | enable_irq(gpio_to_irq(bdata->button->gpio)); | ||
132 | bdata->disabled = false; | ||
133 | } | ||
134 | } | ||
135 | |||
136 | /** | ||
137 | * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons | ||
138 | * @ddata: pointer to drvdata | ||
139 | * @buf: buffer where stringified bitmap is written | ||
140 | * @type: button type (%EV_KEY, %EV_SW) | ||
141 | * @only_disabled: does caller want only those buttons that are | ||
142 | * currently disabled or all buttons that can be | ||
143 | * disabled | ||
144 | * | ||
145 | * This function writes buttons that can be disabled to @buf. If | ||
146 | * @only_disabled is true, then @buf contains only those buttons | ||
147 | * that are currently disabled. Returns 0 on success or negative | ||
148 | * errno on failure. | ||
149 | */ | ||
150 | static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata, | ||
151 | char *buf, unsigned int type, | ||
152 | bool only_disabled) | ||
153 | { | ||
154 | int n_events = get_n_events_by_type(type); | ||
155 | unsigned long *bits; | ||
156 | ssize_t ret; | ||
157 | int i; | ||
158 | |||
159 | bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); | ||
160 | if (!bits) | ||
161 | return -ENOMEM; | ||
162 | |||
163 | for (i = 0; i < ddata->n_buttons; i++) { | ||
164 | struct gpio_button_data *bdata = &ddata->data[i]; | ||
165 | |||
166 | if (bdata->button->type != type) | ||
167 | continue; | ||
168 | |||
169 | if (only_disabled && !bdata->disabled) | ||
170 | continue; | ||
171 | |||
172 | __set_bit(bdata->button->code, bits); | ||
173 | } | ||
174 | |||
175 | ret = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, bits, n_events); | ||
176 | buf[ret++] = '\n'; | ||
177 | buf[ret] = '\0'; | ||
178 | |||
179 | kfree(bits); | ||
180 | |||
181 | return ret; | ||
182 | } | ||
183 | |||
184 | /** | ||
185 | * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap | ||
186 | * @ddata: pointer to drvdata | ||
187 | * @buf: buffer from userspace that contains stringified bitmap | ||
188 | * @type: button type (%EV_KEY, %EV_SW) | ||
189 | * | ||
190 | * This function parses stringified bitmap from @buf and disables/enables | ||
191 | * GPIO buttons accordinly. Returns 0 on success and negative error | ||
192 | * on failure. | ||
193 | */ | ||
194 | static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata, | ||
195 | const char *buf, unsigned int type) | ||
196 | { | ||
197 | int n_events = get_n_events_by_type(type); | ||
198 | unsigned long *bits; | ||
199 | ssize_t error; | ||
200 | int i; | ||
201 | |||
202 | bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); | ||
203 | if (!bits) | ||
204 | return -ENOMEM; | ||
205 | |||
206 | error = bitmap_parselist(buf, bits, n_events); | ||
207 | if (error) | ||
208 | goto out; | ||
209 | |||
210 | /* First validate */ | ||
211 | for (i = 0; i < ddata->n_buttons; i++) { | ||
212 | struct gpio_button_data *bdata = &ddata->data[i]; | ||
213 | |||
214 | if (bdata->button->type != type) | ||
215 | continue; | ||
216 | |||
217 | if (test_bit(bdata->button->code, bits) && | ||
218 | !bdata->button->can_disable) { | ||
219 | error = -EINVAL; | ||
220 | goto out; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | mutex_lock(&ddata->disable_lock); | ||
225 | |||
226 | for (i = 0; i < ddata->n_buttons; i++) { | ||
227 | struct gpio_button_data *bdata = &ddata->data[i]; | ||
228 | |||
229 | if (bdata->button->type != type) | ||
230 | continue; | ||
231 | |||
232 | if (test_bit(bdata->button->code, bits)) | ||
233 | gpio_keys_disable_button(bdata); | ||
234 | else | ||
235 | gpio_keys_enable_button(bdata); | ||
236 | } | ||
237 | |||
238 | mutex_unlock(&ddata->disable_lock); | ||
239 | |||
240 | out: | ||
241 | kfree(bits); | ||
242 | return error; | ||
243 | } | ||
244 | |||
245 | #define ATTR_SHOW_FN(name, type, only_disabled) \ | ||
246 | static ssize_t gpio_keys_show_##name(struct device *dev, \ | ||
247 | struct device_attribute *attr, \ | ||
248 | char *buf) \ | ||
249 | { \ | ||
250 | struct platform_device *pdev = to_platform_device(dev); \ | ||
251 | struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ | ||
252 | \ | ||
253 | return gpio_keys_attr_show_helper(ddata, buf, \ | ||
254 | type, only_disabled); \ | ||
255 | } | ||
256 | |||
257 | ATTR_SHOW_FN(keys, EV_KEY, false); | ||
258 | ATTR_SHOW_FN(switches, EV_SW, false); | ||
259 | ATTR_SHOW_FN(disabled_keys, EV_KEY, true); | ||
260 | ATTR_SHOW_FN(disabled_switches, EV_SW, true); | ||
261 | |||
262 | /* | ||
263 | * ATTRIBUTES: | ||
264 | * | ||
265 | * /sys/devices/platform/gpio-keys/keys [ro] | ||
266 | * /sys/devices/platform/gpio-keys/switches [ro] | ||
267 | */ | ||
268 | static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL); | ||
269 | static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL); | ||
270 | |||
271 | #define ATTR_STORE_FN(name, type) \ | ||
272 | static ssize_t gpio_keys_store_##name(struct device *dev, \ | ||
273 | struct device_attribute *attr, \ | ||
274 | const char *buf, \ | ||
275 | size_t count) \ | ||
276 | { \ | ||
277 | struct platform_device *pdev = to_platform_device(dev); \ | ||
278 | struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ | ||
279 | ssize_t error; \ | ||
280 | \ | ||
281 | error = gpio_keys_attr_store_helper(ddata, buf, type); \ | ||
282 | if (error) \ | ||
283 | return error; \ | ||
284 | \ | ||
285 | return count; \ | ||
286 | } | ||
287 | |||
288 | ATTR_STORE_FN(disabled_keys, EV_KEY); | ||
289 | ATTR_STORE_FN(disabled_switches, EV_SW); | ||
290 | |||
291 | /* | ||
292 | * ATTRIBUTES: | ||
293 | * | ||
294 | * /sys/devices/platform/gpio-keys/disabled_keys [rw] | ||
295 | * /sys/devices/platform/gpio-keys/disables_switches [rw] | ||
296 | */ | ||
297 | static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO, | ||
298 | gpio_keys_show_disabled_keys, | ||
299 | gpio_keys_store_disabled_keys); | ||
300 | static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO, | ||
301 | gpio_keys_show_disabled_switches, | ||
302 | gpio_keys_store_disabled_switches); | ||
303 | |||
304 | static struct attribute *gpio_keys_attrs[] = { | ||
305 | &dev_attr_keys.attr, | ||
306 | &dev_attr_switches.attr, | ||
307 | &dev_attr_disabled_keys.attr, | ||
308 | &dev_attr_disabled_switches.attr, | ||
309 | NULL, | ||
310 | }; | ||
311 | |||
312 | static struct attribute_group gpio_keys_attr_group = { | ||
313 | .attrs = gpio_keys_attrs, | ||
314 | }; | ||
315 | |||
40 | static void gpio_keys_report_event(struct gpio_button_data *bdata) | 316 | static void gpio_keys_report_event(struct gpio_button_data *bdata) |
41 | { | 317 | { |
42 | struct gpio_keys_button *button = bdata->button; | 318 | struct gpio_keys_button *button = bdata->button; |
@@ -79,11 +355,13 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id) | |||
79 | return IRQ_HANDLED; | 355 | return IRQ_HANDLED; |
80 | } | 356 | } |
81 | 357 | ||
82 | static int __devinit gpio_keys_setup_key(struct device *dev, | 358 | static int __devinit gpio_keys_setup_key(struct platform_device *pdev, |
83 | struct gpio_button_data *bdata, | 359 | struct gpio_button_data *bdata, |
84 | struct gpio_keys_button *button) | 360 | struct gpio_keys_button *button) |
85 | { | 361 | { |
86 | char *desc = button->desc ? button->desc : "gpio_keys"; | 362 | char *desc = button->desc ? button->desc : "gpio_keys"; |
363 | struct device *dev = &pdev->dev; | ||
364 | unsigned long irqflags; | ||
87 | int irq, error; | 365 | int irq, error; |
88 | 366 | ||
89 | setup_timer(&bdata->timer, gpio_keys_timer, (unsigned long)bdata); | 367 | setup_timer(&bdata->timer, gpio_keys_timer, (unsigned long)bdata); |
@@ -112,10 +390,15 @@ static int __devinit gpio_keys_setup_key(struct device *dev, | |||
112 | goto fail3; | 390 | goto fail3; |
113 | } | 391 | } |
114 | 392 | ||
115 | error = request_irq(irq, gpio_keys_isr, | 393 | irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; |
116 | IRQF_SHARED | | 394 | /* |
117 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 395 | * If platform has specified that the button can be disabled, |
118 | desc, bdata); | 396 | * we don't want it to share the interrupt line. |
397 | */ | ||
398 | if (!button->can_disable) | ||
399 | irqflags |= IRQF_SHARED; | ||
400 | |||
401 | error = request_irq(irq, gpio_keys_isr, irqflags, desc, bdata); | ||
119 | if (error) { | 402 | if (error) { |
120 | dev_err(dev, "Unable to claim irq %d; error %d\n", | 403 | dev_err(dev, "Unable to claim irq %d; error %d\n", |
121 | irq, error); | 404 | irq, error); |
@@ -149,6 +432,10 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
149 | goto fail1; | 432 | goto fail1; |
150 | } | 433 | } |
151 | 434 | ||
435 | ddata->input = input; | ||
436 | ddata->n_buttons = pdata->nbuttons; | ||
437 | mutex_init(&ddata->disable_lock); | ||
438 | |||
152 | platform_set_drvdata(pdev, ddata); | 439 | platform_set_drvdata(pdev, ddata); |
153 | 440 | ||
154 | input->name = pdev->name; | 441 | input->name = pdev->name; |
@@ -164,8 +451,6 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
164 | if (pdata->rep) | 451 | if (pdata->rep) |
165 | __set_bit(EV_REP, input->evbit); | 452 | __set_bit(EV_REP, input->evbit); |
166 | 453 | ||
167 | ddata->input = input; | ||
168 | |||
169 | for (i = 0; i < pdata->nbuttons; i++) { | 454 | for (i = 0; i < pdata->nbuttons; i++) { |
170 | struct gpio_keys_button *button = &pdata->buttons[i]; | 455 | struct gpio_keys_button *button = &pdata->buttons[i]; |
171 | struct gpio_button_data *bdata = &ddata->data[i]; | 456 | struct gpio_button_data *bdata = &ddata->data[i]; |
@@ -174,7 +459,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
174 | bdata->input = input; | 459 | bdata->input = input; |
175 | bdata->button = button; | 460 | bdata->button = button; |
176 | 461 | ||
177 | error = gpio_keys_setup_key(dev, bdata, button); | 462 | error = gpio_keys_setup_key(pdev, bdata, button); |
178 | if (error) | 463 | if (error) |
179 | goto fail2; | 464 | goto fail2; |
180 | 465 | ||
@@ -184,13 +469,20 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
184 | input_set_capability(input, type, button->code); | 469 | input_set_capability(input, type, button->code); |
185 | } | 470 | } |
186 | 471 | ||
187 | error = input_register_device(input); | 472 | error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group); |
188 | if (error) { | 473 | if (error) { |
189 | dev_err(dev, "Unable to register input device, " | 474 | dev_err(dev, "Unable to export keys/switches, error: %d\n", |
190 | "error: %d\n", error); | 475 | error); |
191 | goto fail2; | 476 | goto fail2; |
192 | } | 477 | } |
193 | 478 | ||
479 | error = input_register_device(input); | ||
480 | if (error) { | ||
481 | dev_err(dev, "Unable to register input device, error: %d\n", | ||
482 | error); | ||
483 | goto fail3; | ||
484 | } | ||
485 | |||
194 | /* get current state of buttons */ | 486 | /* get current state of buttons */ |
195 | for (i = 0; i < pdata->nbuttons; i++) | 487 | for (i = 0; i < pdata->nbuttons; i++) |
196 | gpio_keys_report_event(&ddata->data[i]); | 488 | gpio_keys_report_event(&ddata->data[i]); |
@@ -200,6 +492,8 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
200 | 492 | ||
201 | return 0; | 493 | return 0; |
202 | 494 | ||
495 | fail3: | ||
496 | sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); | ||
203 | fail2: | 497 | fail2: |
204 | while (--i >= 0) { | 498 | while (--i >= 0) { |
205 | free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]); | 499 | free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]); |
@@ -224,6 +518,8 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev) | |||
224 | struct input_dev *input = ddata->input; | 518 | struct input_dev *input = ddata->input; |
225 | int i; | 519 | int i; |
226 | 520 | ||
521 | sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); | ||
522 | |||
227 | device_init_wakeup(&pdev->dev, 0); | 523 | device_init_wakeup(&pdev->dev, 0); |
228 | 524 | ||
229 | for (i = 0; i < pdata->nbuttons; i++) { | 525 | for (i = 0; i < pdata->nbuttons; i++) { |
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c new file mode 100644 index 000000000000..2ee5b798024d --- /dev/null +++ b/drivers/input/keyboard/imx_keypad.c | |||
@@ -0,0 +1,594 @@ | |||
1 | /* | ||
2 | * Driver for the IMX keypad port. | ||
3 | * Copyright (C) 2009 Alberto Panizzo <maramaopercheseimorto@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * <<Power management needs to be implemented>>. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/device.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/input/matrix_keypad.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/jiffies.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/timer.h> | ||
25 | |||
26 | /* | ||
27 | * Keypad Controller registers (halfword) | ||
28 | */ | ||
29 | #define KPCR 0x00 /* Keypad Control Register */ | ||
30 | |||
31 | #define KPSR 0x02 /* Keypad Status Register */ | ||
32 | #define KBD_STAT_KPKD (0x1 << 0) /* Key Press Interrupt Status bit (w1c) */ | ||
33 | #define KBD_STAT_KPKR (0x1 << 1) /* Key Release Interrupt Status bit (w1c) */ | ||
34 | #define KBD_STAT_KDSC (0x1 << 2) /* Key Depress Synch Chain Status bit (w1c)*/ | ||
35 | #define KBD_STAT_KRSS (0x1 << 3) /* Key Release Synch Status bit (w1c)*/ | ||
36 | #define KBD_STAT_KDIE (0x1 << 8) /* Key Depress Interrupt Enable Status bit */ | ||
37 | #define KBD_STAT_KRIE (0x1 << 9) /* Key Release Interrupt Enable */ | ||
38 | #define KBD_STAT_KPPEN (0x1 << 10) /* Keypad Clock Enable */ | ||
39 | |||
40 | #define KDDR 0x04 /* Keypad Data Direction Register */ | ||
41 | #define KPDR 0x06 /* Keypad Data Register */ | ||
42 | |||
43 | #define MAX_MATRIX_KEY_ROWS 8 | ||
44 | #define MAX_MATRIX_KEY_COLS 8 | ||
45 | #define MATRIX_ROW_SHIFT 3 | ||
46 | |||
47 | #define MAX_MATRIX_KEY_NUM (MAX_MATRIX_KEY_ROWS * MAX_MATRIX_KEY_COLS) | ||
48 | |||
49 | struct imx_keypad { | ||
50 | |||
51 | struct clk *clk; | ||
52 | struct input_dev *input_dev; | ||
53 | void __iomem *mmio_base; | ||
54 | |||
55 | int irq; | ||
56 | struct timer_list check_matrix_timer; | ||
57 | |||
58 | /* | ||
59 | * The matrix is stable only if no changes are detected after | ||
60 | * IMX_KEYPAD_SCANS_FOR_STABILITY scans | ||
61 | */ | ||
62 | #define IMX_KEYPAD_SCANS_FOR_STABILITY 3 | ||
63 | int stable_count; | ||
64 | |||
65 | bool enabled; | ||
66 | |||
67 | /* Masks for enabled rows/cols */ | ||
68 | unsigned short rows_en_mask; | ||
69 | unsigned short cols_en_mask; | ||
70 | |||
71 | unsigned short keycodes[MAX_MATRIX_KEY_NUM]; | ||
72 | |||
73 | /* | ||
74 | * Matrix states: | ||
75 | * -stable: achieved after a complete debounce process. | ||
76 | * -unstable: used in the debouncing process. | ||
77 | */ | ||
78 | unsigned short matrix_stable_state[MAX_MATRIX_KEY_COLS]; | ||
79 | unsigned short matrix_unstable_state[MAX_MATRIX_KEY_COLS]; | ||
80 | }; | ||
81 | |||
82 | /* Scan the matrix and return the new state in *matrix_volatile_state. */ | ||
83 | static void imx_keypad_scan_matrix(struct imx_keypad *keypad, | ||
84 | unsigned short *matrix_volatile_state) | ||
85 | { | ||
86 | int col; | ||
87 | unsigned short reg_val; | ||
88 | |||
89 | for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { | ||
90 | if ((keypad->cols_en_mask & (1 << col)) == 0) | ||
91 | continue; | ||
92 | /* | ||
93 | * Discharge keypad capacitance: | ||
94 | * 2. write 1s on column data. | ||
95 | * 3. configure columns as totem-pole to discharge capacitance. | ||
96 | * 4. configure columns as open-drain. | ||
97 | */ | ||
98 | reg_val = readw(keypad->mmio_base + KPDR); | ||
99 | reg_val |= 0xff00; | ||
100 | writew(reg_val, keypad->mmio_base + KPDR); | ||
101 | |||
102 | reg_val = readw(keypad->mmio_base + KPCR); | ||
103 | reg_val &= ~((keypad->cols_en_mask & 0xff) << 8); | ||
104 | writew(reg_val, keypad->mmio_base + KPCR); | ||
105 | |||
106 | udelay(2); | ||
107 | |||
108 | reg_val = readw(keypad->mmio_base + KPCR); | ||
109 | reg_val |= (keypad->cols_en_mask & 0xff) << 8; | ||
110 | writew(reg_val, keypad->mmio_base + KPCR); | ||
111 | |||
112 | /* | ||
113 | * 5. Write a single column to 0, others to 1. | ||
114 | * 6. Sample row inputs and save data. | ||
115 | * 7. Repeat steps 2 - 6 for remaining columns. | ||
116 | */ | ||
117 | reg_val = readw(keypad->mmio_base + KPDR); | ||
118 | reg_val &= ~(1 << (8 + col)); | ||
119 | writew(reg_val, keypad->mmio_base + KPDR); | ||
120 | |||
121 | /* | ||
122 | * Delay added to avoid propagating the 0 from column to row | ||
123 | * when scanning. | ||
124 | */ | ||
125 | udelay(5); | ||
126 | |||
127 | /* | ||
128 | * 1s in matrix_volatile_state[col] means key pressures | ||
129 | * throw data from non enabled rows. | ||
130 | */ | ||
131 | reg_val = readw(keypad->mmio_base + KPDR); | ||
132 | matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask; | ||
133 | } | ||
134 | |||
135 | /* | ||
136 | * Return in standby mode: | ||
137 | * 9. write 0s to columns | ||
138 | */ | ||
139 | reg_val = readw(keypad->mmio_base + KPDR); | ||
140 | reg_val &= 0x00ff; | ||
141 | writew(reg_val, keypad->mmio_base + KPDR); | ||
142 | } | ||
143 | |||
144 | /* | ||
145 | * Compare the new matrix state (volatile) with the stable one stored in | ||
146 | * keypad->matrix_stable_state and fire events if changes are detected. | ||
147 | */ | ||
148 | static void imx_keypad_fire_events(struct imx_keypad *keypad, | ||
149 | unsigned short *matrix_volatile_state) | ||
150 | { | ||
151 | struct input_dev *input_dev = keypad->input_dev; | ||
152 | int row, col; | ||
153 | |||
154 | for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { | ||
155 | unsigned short bits_changed; | ||
156 | int code; | ||
157 | |||
158 | if ((keypad->cols_en_mask & (1 << col)) == 0) | ||
159 | continue; /* Column is not enabled */ | ||
160 | |||
161 | bits_changed = keypad->matrix_stable_state[col] ^ | ||
162 | matrix_volatile_state[col]; | ||
163 | |||
164 | if (bits_changed == 0) | ||
165 | continue; /* Column does not contain changes */ | ||
166 | |||
167 | for (row = 0; row < MAX_MATRIX_KEY_ROWS; row++) { | ||
168 | if ((keypad->rows_en_mask & (1 << row)) == 0) | ||
169 | continue; /* Row is not enabled */ | ||
170 | if ((bits_changed & (1 << row)) == 0) | ||
171 | continue; /* Row does not contain changes */ | ||
172 | |||
173 | code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); | ||
174 | input_event(input_dev, EV_MSC, MSC_SCAN, code); | ||
175 | input_report_key(input_dev, keypad->keycodes[code], | ||
176 | matrix_volatile_state[col] & (1 << row)); | ||
177 | dev_dbg(&input_dev->dev, "Event code: %d, val: %d", | ||
178 | keypad->keycodes[code], | ||
179 | matrix_volatile_state[col] & (1 << row)); | ||
180 | } | ||
181 | } | ||
182 | input_sync(input_dev); | ||
183 | } | ||
184 | |||
185 | /* | ||
186 | * imx_keypad_check_for_events is the timer handler. | ||
187 | */ | ||
188 | static void imx_keypad_check_for_events(unsigned long data) | ||
189 | { | ||
190 | struct imx_keypad *keypad = (struct imx_keypad *) data; | ||
191 | unsigned short matrix_volatile_state[MAX_MATRIX_KEY_COLS]; | ||
192 | unsigned short reg_val; | ||
193 | bool state_changed, is_zero_matrix; | ||
194 | int i; | ||
195 | |||
196 | memset(matrix_volatile_state, 0, sizeof(matrix_volatile_state)); | ||
197 | |||
198 | imx_keypad_scan_matrix(keypad, matrix_volatile_state); | ||
199 | |||
200 | state_changed = false; | ||
201 | for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { | ||
202 | if ((keypad->cols_en_mask & (1 << i)) == 0) | ||
203 | continue; | ||
204 | |||
205 | if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) { | ||
206 | state_changed = true; | ||
207 | break; | ||
208 | } | ||
209 | } | ||
210 | |||
211 | /* | ||
212 | * If the matrix state is changed from the previous scan | ||
213 | * (Re)Begin the debouncing process, saving the new state in | ||
214 | * keypad->matrix_unstable_state. | ||
215 | * else | ||
216 | * Increase the count of number of scans with a stable state. | ||
217 | */ | ||
218 | if (state_changed) { | ||
219 | memcpy(keypad->matrix_unstable_state, matrix_volatile_state, | ||
220 | sizeof(matrix_volatile_state)); | ||
221 | keypad->stable_count = 0; | ||
222 | } else | ||
223 | keypad->stable_count++; | ||
224 | |||
225 | /* | ||
226 | * If the matrix is not as stable as we want reschedule scan | ||
227 | * in the near future. | ||
228 | */ | ||
229 | if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) { | ||
230 | mod_timer(&keypad->check_matrix_timer, | ||
231 | jiffies + msecs_to_jiffies(10)); | ||
232 | return; | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * If the matrix state is stable, fire the events and save the new | ||
237 | * stable state. Note, if the matrix is kept stable for longer | ||
238 | * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all | ||
239 | * events have already been generated. | ||
240 | */ | ||
241 | if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) { | ||
242 | imx_keypad_fire_events(keypad, matrix_volatile_state); | ||
243 | |||
244 | memcpy(keypad->matrix_stable_state, matrix_volatile_state, | ||
245 | sizeof(matrix_volatile_state)); | ||
246 | } | ||
247 | |||
248 | is_zero_matrix = true; | ||
249 | for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { | ||
250 | if (matrix_volatile_state[i] != 0) { | ||
251 | is_zero_matrix = false; | ||
252 | break; | ||
253 | } | ||
254 | } | ||
255 | |||
256 | |||
257 | if (is_zero_matrix) { | ||
258 | /* | ||
259 | * All keys have been released. Enable only the KDI | ||
260 | * interrupt for future key presses (clear the KDI | ||
261 | * status bit and its sync chain before that). | ||
262 | */ | ||
263 | reg_val = readw(keypad->mmio_base + KPSR); | ||
264 | reg_val |= KBD_STAT_KPKD | KBD_STAT_KDSC; | ||
265 | writew(reg_val, keypad->mmio_base + KPSR); | ||
266 | |||
267 | reg_val = readw(keypad->mmio_base + KPSR); | ||
268 | reg_val |= KBD_STAT_KDIE; | ||
269 | reg_val &= ~KBD_STAT_KRIE; | ||
270 | writew(reg_val, keypad->mmio_base + KPSR); | ||
271 | } else { | ||
272 | /* | ||
273 | * Some keys are still pressed. Schedule a rescan in | ||
274 | * attempt to detect multiple key presses and enable | ||
275 | * the KRI interrupt to react quickly to key release | ||
276 | * event. | ||
277 | */ | ||
278 | mod_timer(&keypad->check_matrix_timer, | ||
279 | jiffies + msecs_to_jiffies(60)); | ||
280 | |||
281 | reg_val = readw(keypad->mmio_base + KPSR); | ||
282 | reg_val |= KBD_STAT_KPKR | KBD_STAT_KRSS; | ||
283 | writew(reg_val, keypad->mmio_base + KPSR); | ||
284 | |||
285 | reg_val = readw(keypad->mmio_base + KPSR); | ||
286 | reg_val |= KBD_STAT_KRIE; | ||
287 | reg_val &= ~KBD_STAT_KDIE; | ||
288 | writew(reg_val, keypad->mmio_base + KPSR); | ||
289 | } | ||
290 | } | ||
291 | |||
292 | static irqreturn_t imx_keypad_irq_handler(int irq, void *dev_id) | ||
293 | { | ||
294 | struct imx_keypad *keypad = dev_id; | ||
295 | unsigned short reg_val; | ||
296 | |||
297 | reg_val = readw(keypad->mmio_base + KPSR); | ||
298 | |||
299 | /* Disable both interrupt types */ | ||
300 | reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); | ||
301 | /* Clear interrupts status bits */ | ||
302 | reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; | ||
303 | writew(reg_val, keypad->mmio_base + KPSR); | ||
304 | |||
305 | if (keypad->enabled) { | ||
306 | /* The matrix is supposed to be changed */ | ||
307 | keypad->stable_count = 0; | ||
308 | |||
309 | /* Schedule the scanning procedure near in the future */ | ||
310 | mod_timer(&keypad->check_matrix_timer, | ||
311 | jiffies + msecs_to_jiffies(2)); | ||
312 | } | ||
313 | |||
314 | return IRQ_HANDLED; | ||
315 | } | ||
316 | |||
317 | static void imx_keypad_config(struct imx_keypad *keypad) | ||
318 | { | ||
319 | unsigned short reg_val; | ||
320 | |||
321 | /* | ||
322 | * Include enabled rows in interrupt generation (KPCR[7:0]) | ||
323 | * Configure keypad columns as open-drain (KPCR[15:8]) | ||
324 | */ | ||
325 | reg_val = readw(keypad->mmio_base + KPCR); | ||
326 | reg_val |= keypad->rows_en_mask & 0xff; /* rows */ | ||
327 | reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */ | ||
328 | writew(reg_val, keypad->mmio_base + KPCR); | ||
329 | |||
330 | /* Write 0's to KPDR[15:8] (Colums) */ | ||
331 | reg_val = readw(keypad->mmio_base + KPDR); | ||
332 | reg_val &= 0x00ff; | ||
333 | writew(reg_val, keypad->mmio_base + KPDR); | ||
334 | |||
335 | /* Configure columns as output, rows as input (KDDR[15:0]) */ | ||
336 | writew(0xff00, keypad->mmio_base + KDDR); | ||
337 | |||
338 | /* | ||
339 | * Clear Key Depress and Key Release status bit. | ||
340 | * Clear both synchronizer chain. | ||
341 | */ | ||
342 | reg_val = readw(keypad->mmio_base + KPSR); | ||
343 | reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD | | ||
344 | KBD_STAT_KDSC | KBD_STAT_KRSS; | ||
345 | writew(reg_val, keypad->mmio_base + KPSR); | ||
346 | |||
347 | /* Enable KDI and disable KRI (avoid false release events). */ | ||
348 | reg_val |= KBD_STAT_KDIE; | ||
349 | reg_val &= ~KBD_STAT_KRIE; | ||
350 | writew(reg_val, keypad->mmio_base + KPSR); | ||
351 | } | ||
352 | |||
353 | static void imx_keypad_inhibit(struct imx_keypad *keypad) | ||
354 | { | ||
355 | unsigned short reg_val; | ||
356 | |||
357 | /* Inhibit KDI and KRI interrupts. */ | ||
358 | reg_val = readw(keypad->mmio_base + KPSR); | ||
359 | reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); | ||
360 | writew(reg_val, keypad->mmio_base + KPSR); | ||
361 | |||
362 | /* Colums as open drain and disable all rows */ | ||
363 | writew(0xff00, keypad->mmio_base + KPCR); | ||
364 | } | ||
365 | |||
366 | static void imx_keypad_close(struct input_dev *dev) | ||
367 | { | ||
368 | struct imx_keypad *keypad = input_get_drvdata(dev); | ||
369 | |||
370 | dev_dbg(&dev->dev, ">%s\n", __func__); | ||
371 | |||
372 | /* Mark keypad as being inactive */ | ||
373 | keypad->enabled = false; | ||
374 | synchronize_irq(keypad->irq); | ||
375 | del_timer_sync(&keypad->check_matrix_timer); | ||
376 | |||
377 | imx_keypad_inhibit(keypad); | ||
378 | |||
379 | /* Disable clock unit */ | ||
380 | clk_disable(keypad->clk); | ||
381 | } | ||
382 | |||
383 | static int imx_keypad_open(struct input_dev *dev) | ||
384 | { | ||
385 | struct imx_keypad *keypad = input_get_drvdata(dev); | ||
386 | |||
387 | dev_dbg(&dev->dev, ">%s\n", __func__); | ||
388 | |||
389 | /* We became active from now */ | ||
390 | keypad->enabled = true; | ||
391 | |||
392 | /* Enable the kpp clock */ | ||
393 | clk_enable(keypad->clk); | ||
394 | imx_keypad_config(keypad); | ||
395 | |||
396 | /* Sanity control, not all the rows must be actived now. */ | ||
397 | if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) { | ||
398 | dev_err(&dev->dev, | ||
399 | "too many keys pressed, control pins initialisation\n"); | ||
400 | goto open_err; | ||
401 | } | ||
402 | |||
403 | return 0; | ||
404 | |||
405 | open_err: | ||
406 | imx_keypad_close(dev); | ||
407 | return -EIO; | ||
408 | } | ||
409 | |||
410 | static int __devinit imx_keypad_probe(struct platform_device *pdev) | ||
411 | { | ||
412 | const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; | ||
413 | struct imx_keypad *keypad; | ||
414 | struct input_dev *input_dev; | ||
415 | struct resource *res; | ||
416 | int irq, error, i; | ||
417 | |||
418 | if (keymap_data == NULL) { | ||
419 | dev_err(&pdev->dev, "no keymap defined\n"); | ||
420 | return -EINVAL; | ||
421 | } | ||
422 | |||
423 | irq = platform_get_irq(pdev, 0); | ||
424 | if (irq < 0) { | ||
425 | dev_err(&pdev->dev, "no irq defined in platform data\n"); | ||
426 | return -EINVAL; | ||
427 | } | ||
428 | |||
429 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
430 | if (res == NULL) { | ||
431 | dev_err(&pdev->dev, "no I/O memory defined in platform data\n"); | ||
432 | return -EINVAL; | ||
433 | } | ||
434 | |||
435 | res = request_mem_region(res->start, resource_size(res), pdev->name); | ||
436 | if (res == NULL) { | ||
437 | dev_err(&pdev->dev, "failed to request I/O memory\n"); | ||
438 | return -EBUSY; | ||
439 | } | ||
440 | |||
441 | input_dev = input_allocate_device(); | ||
442 | if (!input_dev) { | ||
443 | dev_err(&pdev->dev, "failed to allocate the input device\n"); | ||
444 | error = -ENOMEM; | ||
445 | goto failed_rel_mem; | ||
446 | } | ||
447 | |||
448 | keypad = kzalloc(sizeof(struct imx_keypad), GFP_KERNEL); | ||
449 | if (!keypad) { | ||
450 | dev_err(&pdev->dev, "not enough memory for driver data\n"); | ||
451 | error = -ENOMEM; | ||
452 | goto failed_free_input; | ||
453 | } | ||
454 | |||
455 | keypad->input_dev = input_dev; | ||
456 | keypad->irq = irq; | ||
457 | keypad->stable_count = 0; | ||
458 | |||
459 | setup_timer(&keypad->check_matrix_timer, | ||
460 | imx_keypad_check_for_events, (unsigned long) keypad); | ||
461 | |||
462 | keypad->mmio_base = ioremap(res->start, resource_size(res)); | ||
463 | if (keypad->mmio_base == NULL) { | ||
464 | dev_err(&pdev->dev, "failed to remap I/O memory\n"); | ||
465 | error = -ENOMEM; | ||
466 | goto failed_free_priv; | ||
467 | } | ||
468 | |||
469 | keypad->clk = clk_get(&pdev->dev, "kpp"); | ||
470 | if (IS_ERR(keypad->clk)) { | ||
471 | dev_err(&pdev->dev, "failed to get keypad clock\n"); | ||
472 | error = PTR_ERR(keypad->clk); | ||
473 | goto failed_unmap; | ||
474 | } | ||
475 | |||
476 | /* Search for rows and cols enabled */ | ||
477 | for (i = 0; i < keymap_data->keymap_size; i++) { | ||
478 | keypad->rows_en_mask |= 1 << KEY_ROW(keymap_data->keymap[i]); | ||
479 | keypad->cols_en_mask |= 1 << KEY_COL(keymap_data->keymap[i]); | ||
480 | } | ||
481 | |||
482 | if (keypad->rows_en_mask > ((1 << MAX_MATRIX_KEY_ROWS) - 1) || | ||
483 | keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) { | ||
484 | dev_err(&pdev->dev, | ||
485 | "invalid key data (too many rows or colums)\n"); | ||
486 | error = -EINVAL; | ||
487 | goto failed_clock_put; | ||
488 | } | ||
489 | dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); | ||
490 | dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); | ||
491 | |||
492 | /* Init the Input device */ | ||
493 | input_dev->name = pdev->name; | ||
494 | input_dev->id.bustype = BUS_HOST; | ||
495 | input_dev->dev.parent = &pdev->dev; | ||
496 | input_dev->open = imx_keypad_open; | ||
497 | input_dev->close = imx_keypad_close; | ||
498 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); | ||
499 | input_dev->keycode = keypad->keycodes; | ||
500 | input_dev->keycodesize = sizeof(keypad->keycodes[0]); | ||
501 | input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); | ||
502 | |||
503 | matrix_keypad_build_keymap(keymap_data, MATRIX_ROW_SHIFT, | ||
504 | keypad->keycodes, input_dev->keybit); | ||
505 | |||
506 | input_set_capability(input_dev, EV_MSC, MSC_SCAN); | ||
507 | input_set_drvdata(input_dev, keypad); | ||
508 | |||
509 | /* Ensure that the keypad will stay dormant until opened */ | ||
510 | imx_keypad_inhibit(keypad); | ||
511 | |||
512 | error = request_irq(irq, imx_keypad_irq_handler, IRQF_DISABLED, | ||
513 | pdev->name, keypad); | ||
514 | if (error) { | ||
515 | dev_err(&pdev->dev, "failed to request IRQ\n"); | ||
516 | goto failed_clock_put; | ||
517 | } | ||
518 | |||
519 | /* Register the input device */ | ||
520 | error = input_register_device(input_dev); | ||
521 | if (error) { | ||
522 | dev_err(&pdev->dev, "failed to register input device\n"); | ||
523 | goto failed_free_irq; | ||
524 | } | ||
525 | |||
526 | platform_set_drvdata(pdev, keypad); | ||
527 | device_init_wakeup(&pdev->dev, 1); | ||
528 | |||
529 | return 0; | ||
530 | |||
531 | failed_free_irq: | ||
532 | free_irq(irq, pdev); | ||
533 | failed_clock_put: | ||
534 | clk_put(keypad->clk); | ||
535 | failed_unmap: | ||
536 | iounmap(keypad->mmio_base); | ||
537 | failed_free_priv: | ||
538 | kfree(keypad); | ||
539 | failed_free_input: | ||
540 | input_free_device(input_dev); | ||
541 | failed_rel_mem: | ||
542 | release_mem_region(res->start, resource_size(res)); | ||
543 | return error; | ||
544 | } | ||
545 | |||
546 | static int __devexit imx_keypad_remove(struct platform_device *pdev) | ||
547 | { | ||
548 | struct imx_keypad *keypad = platform_get_drvdata(pdev); | ||
549 | struct resource *res; | ||
550 | |||
551 | dev_dbg(&pdev->dev, ">%s\n", __func__); | ||
552 | |||
553 | platform_set_drvdata(pdev, NULL); | ||
554 | |||
555 | input_unregister_device(keypad->input_dev); | ||
556 | |||
557 | free_irq(keypad->irq, keypad); | ||
558 | clk_put(keypad->clk); | ||
559 | |||
560 | iounmap(keypad->mmio_base); | ||
561 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
562 | release_mem_region(res->start, resource_size(res)); | ||
563 | |||
564 | kfree(keypad); | ||
565 | |||
566 | return 0; | ||
567 | } | ||
568 | |||
569 | static struct platform_driver imx_keypad_driver = { | ||
570 | .driver = { | ||
571 | .name = "imx-keypad", | ||
572 | .owner = THIS_MODULE, | ||
573 | }, | ||
574 | .probe = imx_keypad_probe, | ||
575 | .remove = __devexit_p(imx_keypad_remove), | ||
576 | }; | ||
577 | |||
578 | static int __init imx_keypad_init(void) | ||
579 | { | ||
580 | return platform_driver_register(&imx_keypad_driver); | ||
581 | } | ||
582 | |||
583 | static void __exit imx_keypad_exit(void) | ||
584 | { | ||
585 | platform_driver_unregister(&imx_keypad_driver); | ||
586 | } | ||
587 | |||
588 | module_init(imx_keypad_init); | ||
589 | module_exit(imx_keypad_exit); | ||
590 | |||
591 | MODULE_AUTHOR("Alberto Panizzo <maramaopercheseimorto@gmail.com>"); | ||
592 | MODULE_DESCRIPTION("IMX Keypad Port Driver"); | ||
593 | MODULE_LICENSE("GPL v2"); | ||
594 | MODULE_ALIAS("platform:imx-keypad"); | ||
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c index 191cc51d6cf8..31f30087b591 100644 --- a/drivers/input/keyboard/qt2160.c +++ b/drivers/input/keyboard/qt2160.c | |||
@@ -362,7 +362,7 @@ static int __devexit qt2160_remove(struct i2c_client *client) | |||
362 | return 0; | 362 | return 0; |
363 | } | 363 | } |
364 | 364 | ||
365 | static struct i2c_device_id qt2160_idtable[] = { | 365 | static const struct i2c_device_id qt2160_idtable[] = { |
366 | { "qt2160", 0, }, | 366 | { "qt2160", 0, }, |
367 | { } | 367 | { } |
368 | }; | 368 | }; |
diff --git a/drivers/input/keyboard/sh_keysc.c b/drivers/input/keyboard/sh_keysc.c index 8e9380bfed40..854e2035cd6e 100644 --- a/drivers/input/keyboard/sh_keysc.c +++ b/drivers/input/keyboard/sh_keysc.c | |||
@@ -19,101 +19,141 @@ | |||
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/input.h> | 20 | #include <linux/input.h> |
21 | #include <linux/input/sh_keysc.h> | 21 | #include <linux/input/sh_keysc.h> |
22 | #include <linux/bitmap.h> | ||
22 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
24 | 25 | ||
25 | #define KYCR1_OFFS 0x00 | ||
26 | #define KYCR2_OFFS 0x04 | ||
27 | #define KYINDR_OFFS 0x08 | ||
28 | #define KYOUTDR_OFFS 0x0c | ||
29 | |||
30 | #define KYCR2_IRQ_LEVEL 0x10 | ||
31 | #define KYCR2_IRQ_DISABLED 0x00 | ||
32 | |||
33 | static const struct { | 26 | static const struct { |
34 | unsigned char kymd, keyout, keyin; | 27 | unsigned char kymd, keyout, keyin; |
35 | } sh_keysc_mode[] = { | 28 | } sh_keysc_mode[] = { |
36 | [SH_KEYSC_MODE_1] = { 0, 6, 5 }, | 29 | [SH_KEYSC_MODE_1] = { 0, 6, 5 }, |
37 | [SH_KEYSC_MODE_2] = { 1, 5, 6 }, | 30 | [SH_KEYSC_MODE_2] = { 1, 5, 6 }, |
38 | [SH_KEYSC_MODE_3] = { 2, 4, 7 }, | 31 | [SH_KEYSC_MODE_3] = { 2, 4, 7 }, |
32 | [SH_KEYSC_MODE_4] = { 3, 6, 6 }, | ||
33 | [SH_KEYSC_MODE_5] = { 4, 6, 7 }, | ||
34 | [SH_KEYSC_MODE_6] = { 5, 7, 7 }, | ||
39 | }; | 35 | }; |
40 | 36 | ||
41 | struct sh_keysc_priv { | 37 | struct sh_keysc_priv { |
42 | void __iomem *iomem_base; | 38 | void __iomem *iomem_base; |
43 | struct clk *clk; | 39 | struct clk *clk; |
44 | unsigned long last_keys; | 40 | DECLARE_BITMAP(last_keys, SH_KEYSC_MAXKEYS); |
45 | struct input_dev *input; | 41 | struct input_dev *input; |
46 | struct sh_keysc_info pdata; | 42 | struct sh_keysc_info pdata; |
47 | }; | 43 | }; |
48 | 44 | ||
45 | #define KYCR1 0 | ||
46 | #define KYCR2 1 | ||
47 | #define KYINDR 2 | ||
48 | #define KYOUTDR 3 | ||
49 | |||
50 | #define KYCR2_IRQ_LEVEL 0x10 | ||
51 | #define KYCR2_IRQ_DISABLED 0x00 | ||
52 | |||
53 | static unsigned long sh_keysc_read(struct sh_keysc_priv *p, int reg_nr) | ||
54 | { | ||
55 | return ioread16(p->iomem_base + (reg_nr << 2)); | ||
56 | } | ||
57 | |||
58 | static void sh_keysc_write(struct sh_keysc_priv *p, int reg_nr, | ||
59 | unsigned long value) | ||
60 | { | ||
61 | iowrite16(value, p->iomem_base + (reg_nr << 2)); | ||
62 | } | ||
63 | |||
64 | static void sh_keysc_level_mode(struct sh_keysc_priv *p, | ||
65 | unsigned long keys_set) | ||
66 | { | ||
67 | struct sh_keysc_info *pdata = &p->pdata; | ||
68 | |||
69 | sh_keysc_write(p, KYOUTDR, 0); | ||
70 | sh_keysc_write(p, KYCR2, KYCR2_IRQ_LEVEL | (keys_set << 8)); | ||
71 | |||
72 | if (pdata->kycr2_delay) | ||
73 | udelay(pdata->kycr2_delay); | ||
74 | } | ||
75 | |||
76 | static void sh_keysc_map_dbg(struct device *dev, unsigned long *map, | ||
77 | const char *str) | ||
78 | { | ||
79 | int k; | ||
80 | |||
81 | for (k = 0; k < BITS_TO_LONGS(SH_KEYSC_MAXKEYS); k++) | ||
82 | dev_dbg(dev, "%s[%d] 0x%lx\n", str, k, map[k]); | ||
83 | } | ||
84 | |||
49 | static irqreturn_t sh_keysc_isr(int irq, void *dev_id) | 85 | static irqreturn_t sh_keysc_isr(int irq, void *dev_id) |
50 | { | 86 | { |
51 | struct platform_device *pdev = dev_id; | 87 | struct platform_device *pdev = dev_id; |
52 | struct sh_keysc_priv *priv = platform_get_drvdata(pdev); | 88 | struct sh_keysc_priv *priv = platform_get_drvdata(pdev); |
53 | struct sh_keysc_info *pdata = &priv->pdata; | 89 | struct sh_keysc_info *pdata = &priv->pdata; |
54 | unsigned long keys, keys1, keys0, mask; | 90 | int keyout_nr = sh_keysc_mode[pdata->mode].keyout; |
91 | int keyin_nr = sh_keysc_mode[pdata->mode].keyin; | ||
92 | DECLARE_BITMAP(keys, SH_KEYSC_MAXKEYS); | ||
93 | DECLARE_BITMAP(keys0, SH_KEYSC_MAXKEYS); | ||
94 | DECLARE_BITMAP(keys1, SH_KEYSC_MAXKEYS); | ||
55 | unsigned char keyin_set, tmp; | 95 | unsigned char keyin_set, tmp; |
56 | int i, k; | 96 | int i, k, n; |
57 | 97 | ||
58 | dev_dbg(&pdev->dev, "isr!\n"); | 98 | dev_dbg(&pdev->dev, "isr!\n"); |
59 | 99 | ||
60 | keys1 = ~0; | 100 | bitmap_fill(keys1, SH_KEYSC_MAXKEYS); |
61 | keys0 = 0; | 101 | bitmap_zero(keys0, SH_KEYSC_MAXKEYS); |
62 | 102 | ||
63 | do { | 103 | do { |
64 | keys = 0; | 104 | bitmap_zero(keys, SH_KEYSC_MAXKEYS); |
65 | keyin_set = 0; | 105 | keyin_set = 0; |
66 | 106 | ||
67 | iowrite16(KYCR2_IRQ_DISABLED, priv->iomem_base + KYCR2_OFFS); | 107 | sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); |
108 | |||
109 | for (i = 0; i < keyout_nr; i++) { | ||
110 | n = keyin_nr * i; | ||
68 | 111 | ||
69 | for (i = 0; i < sh_keysc_mode[pdata->mode].keyout; i++) { | 112 | /* drive one KEYOUT pin low, read KEYIN pins */ |
70 | iowrite16(0xfff ^ (3 << (i * 2)), | 113 | sh_keysc_write(priv, KYOUTDR, 0xffff ^ (3 << (i * 2))); |
71 | priv->iomem_base + KYOUTDR_OFFS); | ||
72 | udelay(pdata->delay); | 114 | udelay(pdata->delay); |
73 | tmp = ioread16(priv->iomem_base + KYINDR_OFFS); | 115 | tmp = sh_keysc_read(priv, KYINDR); |
74 | keys |= tmp << (sh_keysc_mode[pdata->mode].keyin * i); | ||
75 | tmp ^= (1 << sh_keysc_mode[pdata->mode].keyin) - 1; | ||
76 | keyin_set |= tmp; | ||
77 | } | ||
78 | 116 | ||
79 | iowrite16(0, priv->iomem_base + KYOUTDR_OFFS); | 117 | /* set bit if key press has been detected */ |
80 | iowrite16(KYCR2_IRQ_LEVEL | (keyin_set << 8), | 118 | for (k = 0; k < keyin_nr; k++) { |
81 | priv->iomem_base + KYCR2_OFFS); | 119 | if (tmp & (1 << k)) |
120 | __set_bit(n + k, keys); | ||
121 | } | ||
82 | 122 | ||
83 | if (pdata->kycr2_delay) | 123 | /* keep track of which KEYIN bits that have been set */ |
84 | udelay(pdata->kycr2_delay); | 124 | keyin_set |= tmp ^ ((1 << keyin_nr) - 1); |
125 | } | ||
85 | 126 | ||
86 | keys ^= ~0; | 127 | sh_keysc_level_mode(priv, keyin_set); |
87 | keys &= (1 << (sh_keysc_mode[pdata->mode].keyin * | ||
88 | sh_keysc_mode[pdata->mode].keyout)) - 1; | ||
89 | keys1 &= keys; | ||
90 | keys0 |= keys; | ||
91 | 128 | ||
92 | dev_dbg(&pdev->dev, "keys 0x%08lx\n", keys); | 129 | bitmap_complement(keys, keys, SH_KEYSC_MAXKEYS); |
130 | bitmap_and(keys1, keys1, keys, SH_KEYSC_MAXKEYS); | ||
131 | bitmap_or(keys0, keys0, keys, SH_KEYSC_MAXKEYS); | ||
93 | 132 | ||
94 | } while (ioread16(priv->iomem_base + KYCR2_OFFS) & 0x01); | 133 | sh_keysc_map_dbg(&pdev->dev, keys, "keys"); |
95 | 134 | ||
96 | dev_dbg(&pdev->dev, "last_keys 0x%08lx keys0 0x%08lx keys1 0x%08lx\n", | 135 | } while (sh_keysc_read(priv, KYCR2) & 0x01); |
97 | priv->last_keys, keys0, keys1); | 136 | |
137 | sh_keysc_map_dbg(&pdev->dev, priv->last_keys, "last_keys"); | ||
138 | sh_keysc_map_dbg(&pdev->dev, keys0, "keys0"); | ||
139 | sh_keysc_map_dbg(&pdev->dev, keys1, "keys1"); | ||
98 | 140 | ||
99 | for (i = 0; i < SH_KEYSC_MAXKEYS; i++) { | 141 | for (i = 0; i < SH_KEYSC_MAXKEYS; i++) { |
100 | k = pdata->keycodes[i]; | 142 | k = pdata->keycodes[i]; |
101 | if (!k) | 143 | if (!k) |
102 | continue; | 144 | continue; |
103 | 145 | ||
104 | mask = 1 << i; | 146 | if (test_bit(i, keys0) == test_bit(i, priv->last_keys)) |
105 | |||
106 | if (!((priv->last_keys ^ keys0) & mask)) | ||
107 | continue; | 147 | continue; |
108 | 148 | ||
109 | if ((keys1 | keys0) & mask) { | 149 | if (test_bit(i, keys1) || test_bit(i, keys0)) { |
110 | input_event(priv->input, EV_KEY, k, 1); | 150 | input_event(priv->input, EV_KEY, k, 1); |
111 | priv->last_keys |= mask; | 151 | __set_bit(i, priv->last_keys); |
112 | } | 152 | } |
113 | 153 | ||
114 | if (!(keys1 & mask)) { | 154 | if (!test_bit(i, keys1)) { |
115 | input_event(priv->input, EV_KEY, k, 0); | 155 | input_event(priv->input, EV_KEY, k, 0); |
116 | priv->last_keys &= ~mask; | 156 | __clear_bit(i, priv->last_keys); |
117 | } | 157 | } |
118 | 158 | ||
119 | } | 159 | } |
@@ -122,8 +162,6 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id) | |||
122 | return IRQ_HANDLED; | 162 | return IRQ_HANDLED; |
123 | } | 163 | } |
124 | 164 | ||
125 | #define res_size(res) ((res)->end - (res)->start + 1) | ||
126 | |||
127 | static int __devinit sh_keysc_probe(struct platform_device *pdev) | 165 | static int __devinit sh_keysc_probe(struct platform_device *pdev) |
128 | { | 166 | { |
129 | struct sh_keysc_priv *priv; | 167 | struct sh_keysc_priv *priv; |
@@ -164,7 +202,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev) | |||
164 | memcpy(&priv->pdata, pdev->dev.platform_data, sizeof(priv->pdata)); | 202 | memcpy(&priv->pdata, pdev->dev.platform_data, sizeof(priv->pdata)); |
165 | pdata = &priv->pdata; | 203 | pdata = &priv->pdata; |
166 | 204 | ||
167 | priv->iomem_base = ioremap_nocache(res->start, res_size(res)); | 205 | priv->iomem_base = ioremap_nocache(res->start, resource_size(res)); |
168 | if (priv->iomem_base == NULL) { | 206 | if (priv->iomem_base == NULL) { |
169 | dev_err(&pdev->dev, "failed to remap I/O memory\n"); | 207 | dev_err(&pdev->dev, "failed to remap I/O memory\n"); |
170 | error = -ENXIO; | 208 | error = -ENXIO; |
@@ -220,10 +258,9 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev) | |||
220 | 258 | ||
221 | clk_enable(priv->clk); | 259 | clk_enable(priv->clk); |
222 | 260 | ||
223 | iowrite16((sh_keysc_mode[pdata->mode].kymd << 8) | | 261 | sh_keysc_write(priv, KYCR1, (sh_keysc_mode[pdata->mode].kymd << 8) | |
224 | pdata->scan_timing, priv->iomem_base + KYCR1_OFFS); | 262 | pdata->scan_timing); |
225 | iowrite16(0, priv->iomem_base + KYOUTDR_OFFS); | 263 | sh_keysc_level_mode(priv, 0); |
226 | iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS); | ||
227 | 264 | ||
228 | device_init_wakeup(&pdev->dev, 1); | 265 | device_init_wakeup(&pdev->dev, 1); |
229 | 266 | ||
@@ -248,7 +285,7 @@ static int __devexit sh_keysc_remove(struct platform_device *pdev) | |||
248 | { | 285 | { |
249 | struct sh_keysc_priv *priv = platform_get_drvdata(pdev); | 286 | struct sh_keysc_priv *priv = platform_get_drvdata(pdev); |
250 | 287 | ||
251 | iowrite16(KYCR2_IRQ_DISABLED, priv->iomem_base + KYCR2_OFFS); | 288 | sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); |
252 | 289 | ||
253 | input_unregister_device(priv->input); | 290 | input_unregister_device(priv->input); |
254 | free_irq(platform_get_irq(pdev, 0), pdev); | 291 | free_irq(platform_get_irq(pdev, 0), pdev); |
@@ -270,7 +307,7 @@ static int sh_keysc_suspend(struct device *dev) | |||
270 | int irq = platform_get_irq(pdev, 0); | 307 | int irq = platform_get_irq(pdev, 0); |
271 | unsigned short value; | 308 | unsigned short value; |
272 | 309 | ||
273 | value = ioread16(priv->iomem_base + KYCR1_OFFS); | 310 | value = sh_keysc_read(priv, KYCR1); |
274 | 311 | ||
275 | if (device_may_wakeup(dev)) { | 312 | if (device_may_wakeup(dev)) { |
276 | value |= 0x80; | 313 | value |= 0x80; |
@@ -279,7 +316,7 @@ static int sh_keysc_suspend(struct device *dev) | |||
279 | value &= ~0x80; | 316 | value &= ~0x80; |
280 | } | 317 | } |
281 | 318 | ||
282 | iowrite16(value, priv->iomem_base + KYCR1_OFFS); | 319 | sh_keysc_write(priv, KYCR1, value); |
283 | 320 | ||
284 | return 0; | 321 | return 0; |
285 | } | 322 | } |
diff --git a/drivers/input/misc/apanel.c b/drivers/input/misc/apanel.c index 71b82434264d..a8d2b8db4e35 100644 --- a/drivers/input/misc/apanel.c +++ b/drivers/input/misc/apanel.c | |||
@@ -149,7 +149,7 @@ static void apanel_shutdown(struct i2c_client *client) | |||
149 | apanel_remove(client); | 149 | apanel_remove(client); |
150 | } | 150 | } |
151 | 151 | ||
152 | static struct i2c_device_id apanel_id[] = { | 152 | static const struct i2c_device_id apanel_id[] = { |
153 | { "fujitsu_apanel", 0 }, | 153 | { "fujitsu_apanel", 0 }, |
154 | { } | 154 | { } |
155 | }; | 155 | }; |
diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index 3b9f588fc747..4ae07935985e 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c | |||
@@ -152,6 +152,13 @@ static int __devinit rotary_encoder_probe(struct platform_device *pdev) | |||
152 | goto exit_unregister_input; | 152 | goto exit_unregister_input; |
153 | } | 153 | } |
154 | 154 | ||
155 | err = gpio_direction_input(pdata->gpio_a); | ||
156 | if (err) { | ||
157 | dev_err(&pdev->dev, "unable to set GPIO %d for input\n", | ||
158 | pdata->gpio_a); | ||
159 | goto exit_unregister_input; | ||
160 | } | ||
161 | |||
155 | err = gpio_request(pdata->gpio_b, DRV_NAME); | 162 | err = gpio_request(pdata->gpio_b, DRV_NAME); |
156 | if (err) { | 163 | if (err) { |
157 | dev_err(&pdev->dev, "unable to request GPIO %d\n", | 164 | dev_err(&pdev->dev, "unable to request GPIO %d\n", |
@@ -159,6 +166,13 @@ static int __devinit rotary_encoder_probe(struct platform_device *pdev) | |||
159 | goto exit_free_gpio_a; | 166 | goto exit_free_gpio_a; |
160 | } | 167 | } |
161 | 168 | ||
169 | err = gpio_direction_input(pdata->gpio_b); | ||
170 | if (err) { | ||
171 | dev_err(&pdev->dev, "unable to set GPIO %d for input\n", | ||
172 | pdata->gpio_b); | ||
173 | goto exit_free_gpio_a; | ||
174 | } | ||
175 | |||
162 | /* request the IRQs */ | 176 | /* request the IRQs */ |
163 | err = request_irq(encoder->irq_a, &rotary_encoder_irq, | 177 | err = request_irq(encoder->irq_a, &rotary_encoder_irq, |
164 | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, | 178 | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, |
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c index d3f57245420a..1477466076ad 100644 --- a/drivers/input/misc/uinput.c +++ b/drivers/input/misc/uinput.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/init.h> | 36 | #include <linux/init.h> |
37 | #include <linux/smp_lock.h> | ||
38 | #include <linux/fs.h> | 37 | #include <linux/fs.h> |
39 | #include <linux/miscdevice.h> | 38 | #include <linux/miscdevice.h> |
40 | #include <linux/uinput.h> | 39 | #include <linux/uinput.h> |
@@ -284,7 +283,6 @@ static int uinput_open(struct inode *inode, struct file *file) | |||
284 | if (!newdev) | 283 | if (!newdev) |
285 | return -ENOMEM; | 284 | return -ENOMEM; |
286 | 285 | ||
287 | lock_kernel(); | ||
288 | mutex_init(&newdev->mutex); | 286 | mutex_init(&newdev->mutex); |
289 | spin_lock_init(&newdev->requests_lock); | 287 | spin_lock_init(&newdev->requests_lock); |
290 | init_waitqueue_head(&newdev->requests_waitq); | 288 | init_waitqueue_head(&newdev->requests_waitq); |
@@ -292,7 +290,7 @@ static int uinput_open(struct inode *inode, struct file *file) | |||
292 | newdev->state = UIST_NEW_DEVICE; | 290 | newdev->state = UIST_NEW_DEVICE; |
293 | 291 | ||
294 | file->private_data = newdev; | 292 | file->private_data = newdev; |
295 | unlock_kernel(); | 293 | nonseekable_open(inode, file); |
296 | 294 | ||
297 | return 0; | 295 | return 0; |
298 | } | 296 | } |
diff --git a/drivers/input/misc/winbond-cir.c b/drivers/input/misc/winbond-cir.c index c8f5a9a3fa14..cbec3dfdd42b 100644 --- a/drivers/input/misc/winbond-cir.c +++ b/drivers/input/misc/winbond-cir.c | |||
@@ -538,6 +538,7 @@ wbcir_reset_irdata(struct wbcir_data *data) | |||
538 | data->irdata_count = 0; | 538 | data->irdata_count = 0; |
539 | data->irdata_off = 0; | 539 | data->irdata_off = 0; |
540 | data->irdata_error = 0; | 540 | data->irdata_error = 0; |
541 | data->idle_count = 0; | ||
541 | } | 542 | } |
542 | 543 | ||
543 | /* Adds one bit of irdata */ | 544 | /* Adds one bit of irdata */ |
@@ -1006,7 +1007,6 @@ wbcir_irq_handler(int irqno, void *cookie) | |||
1006 | } | 1007 | } |
1007 | 1008 | ||
1008 | wbcir_reset_irdata(data); | 1009 | wbcir_reset_irdata(data); |
1009 | data->idle_count = 0; | ||
1010 | } | 1010 | } |
1011 | 1011 | ||
1012 | out: | 1012 | out: |
@@ -1018,7 +1018,7 @@ out: | |||
1018 | 1018 | ||
1019 | /***************************************************************************** | 1019 | /***************************************************************************** |
1020 | * | 1020 | * |
1021 | * SUSPEND/RESUME FUNCTIONS | 1021 | * SETUP/INIT/SUSPEND/RESUME FUNCTIONS |
1022 | * | 1022 | * |
1023 | *****************************************************************************/ | 1023 | *****************************************************************************/ |
1024 | 1024 | ||
@@ -1197,7 +1197,16 @@ finish: | |||
1197 | } | 1197 | } |
1198 | 1198 | ||
1199 | /* Disable interrupts */ | 1199 | /* Disable interrupts */ |
1200 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1200 | outb(WBCIR_IRQ_NONE, data->sbase + WBCIR_REG_SP3_IER); | 1201 | outb(WBCIR_IRQ_NONE, data->sbase + WBCIR_REG_SP3_IER); |
1202 | |||
1203 | /* | ||
1204 | * ACPI will set the HW disable bit for SP3 which means that the | ||
1205 | * output signals are left in an undefined state which may cause | ||
1206 | * spurious interrupts which we need to ignore until the hardware | ||
1207 | * is reinitialized. | ||
1208 | */ | ||
1209 | disable_irq(data->irq); | ||
1201 | } | 1210 | } |
1202 | 1211 | ||
1203 | static int | 1212 | static int |
@@ -1207,37 +1216,15 @@ wbcir_suspend(struct pnp_dev *device, pm_message_t state) | |||
1207 | return 0; | 1216 | return 0; |
1208 | } | 1217 | } |
1209 | 1218 | ||
1210 | static int | ||
1211 | wbcir_resume(struct pnp_dev *device) | ||
1212 | { | ||
1213 | struct wbcir_data *data = pnp_get_drvdata(device); | ||
1214 | |||
1215 | /* Clear BUFF_EN, Clear END_EN, Clear MATCH_EN */ | ||
1216 | wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); | ||
1217 | |||
1218 | /* Clear CEIR_EN */ | ||
1219 | wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x00, 0x01); | ||
1220 | |||
1221 | /* Enable interrupts */ | ||
1222 | wbcir_reset_irdata(data); | ||
1223 | outb(WBCIR_IRQ_RX | WBCIR_IRQ_ERR, data->sbase + WBCIR_REG_SP3_IER); | ||
1224 | |||
1225 | return 0; | ||
1226 | } | ||
1227 | |||
1228 | |||
1229 | |||
1230 | /***************************************************************************** | ||
1231 | * | ||
1232 | * SETUP/INIT FUNCTIONS | ||
1233 | * | ||
1234 | *****************************************************************************/ | ||
1235 | |||
1236 | static void | 1219 | static void |
1237 | wbcir_cfg_ceir(struct wbcir_data *data) | 1220 | wbcir_init_hw(struct wbcir_data *data) |
1238 | { | 1221 | { |
1239 | u8 tmp; | 1222 | u8 tmp; |
1240 | 1223 | ||
1224 | /* Disable interrupts */ | ||
1225 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1226 | outb(WBCIR_IRQ_NONE, data->sbase + WBCIR_REG_SP3_IER); | ||
1227 | |||
1241 | /* Set PROT_SEL, RX_INV, Clear CEIR_EN (needed for the led) */ | 1228 | /* Set PROT_SEL, RX_INV, Clear CEIR_EN (needed for the led) */ |
1242 | tmp = protocol << 4; | 1229 | tmp = protocol << 4; |
1243 | if (invert) | 1230 | if (invert) |
@@ -1264,6 +1251,93 @@ wbcir_cfg_ceir(struct wbcir_data *data) | |||
1264 | * set SP3_IRRX_SW to binary 01, helpfully not documented | 1251 | * set SP3_IRRX_SW to binary 01, helpfully not documented |
1265 | */ | 1252 | */ |
1266 | outb(0x10, data->ebase + WBCIR_REG_ECEIR_CTS); | 1253 | outb(0x10, data->ebase + WBCIR_REG_ECEIR_CTS); |
1254 | |||
1255 | /* Enable extended mode */ | ||
1256 | wbcir_select_bank(data, WBCIR_BANK_2); | ||
1257 | outb(WBCIR_EXT_ENABLE, data->sbase + WBCIR_REG_SP3_EXCR1); | ||
1258 | |||
1259 | /* | ||
1260 | * Configure baud generator, IR data will be sampled at | ||
1261 | * a bitrate of: (24Mhz * prescaler) / (divisor * 16). | ||
1262 | * | ||
1263 | * The ECIR registers include a flag to change the | ||
1264 | * 24Mhz clock freq to 48Mhz. | ||
1265 | * | ||
1266 | * It's not documented in the specs, but fifo levels | ||
1267 | * other than 16 seems to be unsupported. | ||
1268 | */ | ||
1269 | |||
1270 | /* prescaler 1.0, tx/rx fifo lvl 16 */ | ||
1271 | outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2); | ||
1272 | |||
1273 | /* Set baud divisor to generate one byte per bit/cell */ | ||
1274 | switch (protocol) { | ||
1275 | case IR_PROTOCOL_RC5: | ||
1276 | outb(0xA7, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1277 | break; | ||
1278 | case IR_PROTOCOL_RC6: | ||
1279 | outb(0x53, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1280 | break; | ||
1281 | case IR_PROTOCOL_NEC: | ||
1282 | outb(0x69, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1283 | break; | ||
1284 | } | ||
1285 | outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH); | ||
1286 | |||
1287 | /* Set CEIR mode */ | ||
1288 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1289 | outb(0xC0, data->sbase + WBCIR_REG_SP3_MCR); | ||
1290 | inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */ | ||
1291 | inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */ | ||
1292 | |||
1293 | /* Disable RX demod, run-length encoding/decoding, set freq span */ | ||
1294 | wbcir_select_bank(data, WBCIR_BANK_7); | ||
1295 | outb(0x10, data->sbase + WBCIR_REG_SP3_RCCFG); | ||
1296 | |||
1297 | /* Disable timer */ | ||
1298 | wbcir_select_bank(data, WBCIR_BANK_4); | ||
1299 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR1); | ||
1300 | |||
1301 | /* Enable MSR interrupt, Clear AUX_IRX */ | ||
1302 | wbcir_select_bank(data, WBCIR_BANK_5); | ||
1303 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR2); | ||
1304 | |||
1305 | /* Disable CRC */ | ||
1306 | wbcir_select_bank(data, WBCIR_BANK_6); | ||
1307 | outb(0x20, data->sbase + WBCIR_REG_SP3_IRCR3); | ||
1308 | |||
1309 | /* Set RX/TX (de)modulation freq, not really used */ | ||
1310 | wbcir_select_bank(data, WBCIR_BANK_7); | ||
1311 | outb(0xF2, data->sbase + WBCIR_REG_SP3_IRRXDC); | ||
1312 | outb(0x69, data->sbase + WBCIR_REG_SP3_IRTXMC); | ||
1313 | |||
1314 | /* Set invert and pin direction */ | ||
1315 | if (invert) | ||
1316 | outb(0x10, data->sbase + WBCIR_REG_SP3_IRCFG4); | ||
1317 | else | ||
1318 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCFG4); | ||
1319 | |||
1320 | /* Set FIFO thresholds (RX = 8, TX = 3), reset RX/TX */ | ||
1321 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1322 | outb(0x97, data->sbase + WBCIR_REG_SP3_FCR); | ||
1323 | |||
1324 | /* Clear AUX status bits */ | ||
1325 | outb(0xE0, data->sbase + WBCIR_REG_SP3_ASCR); | ||
1326 | |||
1327 | /* Enable interrupts */ | ||
1328 | wbcir_reset_irdata(data); | ||
1329 | outb(WBCIR_IRQ_RX | WBCIR_IRQ_ERR, data->sbase + WBCIR_REG_SP3_IER); | ||
1330 | } | ||
1331 | |||
1332 | static int | ||
1333 | wbcir_resume(struct pnp_dev *device) | ||
1334 | { | ||
1335 | struct wbcir_data *data = pnp_get_drvdata(device); | ||
1336 | |||
1337 | wbcir_init_hw(data); | ||
1338 | enable_irq(data->irq); | ||
1339 | |||
1340 | return 0; | ||
1267 | } | 1341 | } |
1268 | 1342 | ||
1269 | static int __devinit | 1343 | static int __devinit |
@@ -1393,86 +1467,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) | |||
1393 | 1467 | ||
1394 | device_init_wakeup(&device->dev, 1); | 1468 | device_init_wakeup(&device->dev, 1); |
1395 | 1469 | ||
1396 | wbcir_cfg_ceir(data); | 1470 | wbcir_init_hw(data); |
1397 | |||
1398 | /* Disable interrupts */ | ||
1399 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1400 | outb(WBCIR_IRQ_NONE, data->sbase + WBCIR_REG_SP3_IER); | ||
1401 | |||
1402 | /* Enable extended mode */ | ||
1403 | wbcir_select_bank(data, WBCIR_BANK_2); | ||
1404 | outb(WBCIR_EXT_ENABLE, data->sbase + WBCIR_REG_SP3_EXCR1); | ||
1405 | |||
1406 | /* | ||
1407 | * Configure baud generator, IR data will be sampled at | ||
1408 | * a bitrate of: (24Mhz * prescaler) / (divisor * 16). | ||
1409 | * | ||
1410 | * The ECIR registers include a flag to change the | ||
1411 | * 24Mhz clock freq to 48Mhz. | ||
1412 | * | ||
1413 | * It's not documented in the specs, but fifo levels | ||
1414 | * other than 16 seems to be unsupported. | ||
1415 | */ | ||
1416 | |||
1417 | /* prescaler 1.0, tx/rx fifo lvl 16 */ | ||
1418 | outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2); | ||
1419 | |||
1420 | /* Set baud divisor to generate one byte per bit/cell */ | ||
1421 | switch (protocol) { | ||
1422 | case IR_PROTOCOL_RC5: | ||
1423 | outb(0xA7, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1424 | break; | ||
1425 | case IR_PROTOCOL_RC6: | ||
1426 | outb(0x53, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1427 | break; | ||
1428 | case IR_PROTOCOL_NEC: | ||
1429 | outb(0x69, data->sbase + WBCIR_REG_SP3_BGDL); | ||
1430 | break; | ||
1431 | } | ||
1432 | outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH); | ||
1433 | |||
1434 | /* Set CEIR mode */ | ||
1435 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1436 | outb(0xC0, data->sbase + WBCIR_REG_SP3_MCR); | ||
1437 | inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */ | ||
1438 | inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */ | ||
1439 | |||
1440 | /* Disable RX demod, run-length encoding/decoding, set freq span */ | ||
1441 | wbcir_select_bank(data, WBCIR_BANK_7); | ||
1442 | outb(0x10, data->sbase + WBCIR_REG_SP3_RCCFG); | ||
1443 | |||
1444 | /* Disable timer */ | ||
1445 | wbcir_select_bank(data, WBCIR_BANK_4); | ||
1446 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR1); | ||
1447 | |||
1448 | /* Enable MSR interrupt, Clear AUX_IRX */ | ||
1449 | wbcir_select_bank(data, WBCIR_BANK_5); | ||
1450 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR2); | ||
1451 | |||
1452 | /* Disable CRC */ | ||
1453 | wbcir_select_bank(data, WBCIR_BANK_6); | ||
1454 | outb(0x20, data->sbase + WBCIR_REG_SP3_IRCR3); | ||
1455 | |||
1456 | /* Set RX/TX (de)modulation freq, not really used */ | ||
1457 | wbcir_select_bank(data, WBCIR_BANK_7); | ||
1458 | outb(0xF2, data->sbase + WBCIR_REG_SP3_IRRXDC); | ||
1459 | outb(0x69, data->sbase + WBCIR_REG_SP3_IRTXMC); | ||
1460 | |||
1461 | /* Set invert and pin direction */ | ||
1462 | if (invert) | ||
1463 | outb(0x10, data->sbase + WBCIR_REG_SP3_IRCFG4); | ||
1464 | else | ||
1465 | outb(0x00, data->sbase + WBCIR_REG_SP3_IRCFG4); | ||
1466 | |||
1467 | /* Set FIFO thresholds (RX = 8, TX = 3), reset RX/TX */ | ||
1468 | wbcir_select_bank(data, WBCIR_BANK_0); | ||
1469 | outb(0x97, data->sbase + WBCIR_REG_SP3_FCR); | ||
1470 | |||
1471 | /* Clear AUX status bits */ | ||
1472 | outb(0xE0, data->sbase + WBCIR_REG_SP3_ASCR); | ||
1473 | |||
1474 | /* Enable interrupts */ | ||
1475 | outb(WBCIR_IRQ_RX | WBCIR_IRQ_ERR, data->sbase + WBCIR_REG_SP3_IER); | ||
1476 | 1471 | ||
1477 | return 0; | 1472 | return 0; |
1478 | 1473 | ||
diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index 90be30e93556..9169d1591c1f 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c | |||
@@ -68,10 +68,6 @@ module_param(post_interrupt_delay, int, 0644); | |||
68 | MODULE_PARM_DESC(post_interrupt_delay, | 68 | MODULE_PARM_DESC(post_interrupt_delay, |
69 | "delay (ms) before recal after recal interrupt detected"); | 69 | "delay (ms) before recal after recal interrupt detected"); |
70 | 70 | ||
71 | static int autorecal = 1; | ||
72 | module_param(autorecal, int, 0644); | ||
73 | MODULE_PARM_DESC(autorecal, "enable recalibration in the driver"); | ||
74 | |||
75 | /* | 71 | /* |
76 | * When the touchpad gets ultra-sensitive, one can keep their finger 1/2" | 72 | * When the touchpad gets ultra-sensitive, one can keep their finger 1/2" |
77 | * above the pad and still have it send packets. This causes a jump cursor | 73 | * above the pad and still have it send packets. This causes a jump cursor |
diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c index 1dacbe0d9348..797314be7af2 100644 --- a/drivers/input/serio/pcips2.c +++ b/drivers/input/serio/pcips2.c | |||
@@ -186,7 +186,7 @@ static void __devexit pcips2_remove(struct pci_dev *dev) | |||
186 | pci_disable_device(dev); | 186 | pci_disable_device(dev); |
187 | } | 187 | } |
188 | 188 | ||
189 | static struct pci_device_id pcips2_ids[] = { | 189 | static const struct pci_device_id pcips2_ids[] = { |
190 | { | 190 | { |
191 | .vendor = 0x14f2, /* MOBILITY */ | 191 | .vendor = 0x14f2, /* MOBILITY */ |
192 | .device = 0x0123, /* Keyboard */ | 192 | .device = 0x0123, /* Keyboard */ |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index e0f30186d513..c3b626e9eae7 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -26,6 +26,8 @@ | |||
26 | * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic | 26 | * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic |
27 | */ | 27 | */ |
28 | 28 | ||
29 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
30 | |||
29 | #include <linux/stddef.h> | 31 | #include <linux/stddef.h> |
30 | #include <linux/module.h> | 32 | #include <linux/module.h> |
31 | #include <linux/serio.h> | 33 | #include <linux/serio.h> |
@@ -119,11 +121,10 @@ static int serio_bind_driver(struct serio *serio, struct serio_driver *drv) | |||
119 | 121 | ||
120 | error = device_bind_driver(&serio->dev); | 122 | error = device_bind_driver(&serio->dev); |
121 | if (error) { | 123 | if (error) { |
122 | printk(KERN_WARNING | 124 | dev_warn(&serio->dev, |
123 | "serio: device_bind_driver() failed " | 125 | "device_bind_driver() failed for %s (%s) and %s, error: %d\n", |
124 | "for %s (%s) and %s, error: %d\n", | 126 | serio->phys, serio->name, |
125 | serio->phys, serio->name, | 127 | drv->description, error); |
126 | drv->description, error); | ||
127 | serio_disconnect_driver(serio); | 128 | serio_disconnect_driver(serio); |
128 | serio->dev.driver = NULL; | 129 | serio->dev.driver = NULL; |
129 | return error; | 130 | return error; |
@@ -138,9 +139,9 @@ static void serio_find_driver(struct serio *serio) | |||
138 | 139 | ||
139 | error = device_attach(&serio->dev); | 140 | error = device_attach(&serio->dev); |
140 | if (error < 0) | 141 | if (error < 0) |
141 | printk(KERN_WARNING | 142 | dev_warn(&serio->dev, |
142 | "serio: device_attach() failed for %s (%s), error: %d\n", | 143 | "device_attach() failed for %s (%s), error: %d\n", |
143 | serio->phys, serio->name, error); | 144 | serio->phys, serio->name, error); |
144 | } | 145 | } |
145 | 146 | ||
146 | 147 | ||
@@ -194,17 +195,14 @@ static int serio_queue_event(void *object, struct module *owner, | |||
194 | 195 | ||
195 | event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC); | 196 | event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC); |
196 | if (!event) { | 197 | if (!event) { |
197 | printk(KERN_ERR | 198 | pr_err("Not enough memory to queue event %d\n", event_type); |
198 | "serio: Not enough memory to queue event %d\n", | ||
199 | event_type); | ||
200 | retval = -ENOMEM; | 199 | retval = -ENOMEM; |
201 | goto out; | 200 | goto out; |
202 | } | 201 | } |
203 | 202 | ||
204 | if (!try_module_get(owner)) { | 203 | if (!try_module_get(owner)) { |
205 | printk(KERN_WARNING | 204 | pr_warning("Can't get module reference, dropping event %d\n", |
206 | "serio: Can't get module reference, dropping event %d\n", | 205 | event_type); |
207 | event_type); | ||
208 | kfree(event); | 206 | kfree(event); |
209 | retval = -EINVAL; | 207 | retval = -EINVAL; |
210 | goto out; | 208 | goto out; |
@@ -230,14 +228,12 @@ static void serio_free_event(struct serio_event *event) | |||
230 | 228 | ||
231 | static void serio_remove_duplicate_events(struct serio_event *event) | 229 | static void serio_remove_duplicate_events(struct serio_event *event) |
232 | { | 230 | { |
233 | struct list_head *node, *next; | 231 | struct serio_event *e, *next; |
234 | struct serio_event *e; | ||
235 | unsigned long flags; | 232 | unsigned long flags; |
236 | 233 | ||
237 | spin_lock_irqsave(&serio_event_lock, flags); | 234 | spin_lock_irqsave(&serio_event_lock, flags); |
238 | 235 | ||
239 | list_for_each_safe(node, next, &serio_event_list) { | 236 | list_for_each_entry_safe(e, next, &serio_event_list, node) { |
240 | e = list_entry(node, struct serio_event, node); | ||
241 | if (event->object == e->object) { | 237 | if (event->object == e->object) { |
242 | /* | 238 | /* |
243 | * If this event is of different type we should not | 239 | * If this event is of different type we should not |
@@ -247,7 +243,7 @@ static void serio_remove_duplicate_events(struct serio_event *event) | |||
247 | if (event->type != e->type) | 243 | if (event->type != e->type) |
248 | break; | 244 | break; |
249 | 245 | ||
250 | list_del_init(node); | 246 | list_del_init(&e->node); |
251 | serio_free_event(e); | 247 | serio_free_event(e); |
252 | } | 248 | } |
253 | } | 249 | } |
@@ -258,23 +254,18 @@ static void serio_remove_duplicate_events(struct serio_event *event) | |||
258 | 254 | ||
259 | static struct serio_event *serio_get_event(void) | 255 | static struct serio_event *serio_get_event(void) |
260 | { | 256 | { |
261 | struct serio_event *event; | 257 | struct serio_event *event = NULL; |
262 | struct list_head *node; | ||
263 | unsigned long flags; | 258 | unsigned long flags; |
264 | 259 | ||
265 | spin_lock_irqsave(&serio_event_lock, flags); | 260 | spin_lock_irqsave(&serio_event_lock, flags); |
266 | 261 | ||
267 | if (list_empty(&serio_event_list)) { | 262 | if (!list_empty(&serio_event_list)) { |
268 | spin_unlock_irqrestore(&serio_event_lock, flags); | 263 | event = list_first_entry(&serio_event_list, |
269 | return NULL; | 264 | struct serio_event, node); |
265 | list_del_init(&event->node); | ||
270 | } | 266 | } |
271 | 267 | ||
272 | node = serio_event_list.next; | ||
273 | event = list_entry(node, struct serio_event, node); | ||
274 | list_del_init(node); | ||
275 | |||
276 | spin_unlock_irqrestore(&serio_event_lock, flags); | 268 | spin_unlock_irqrestore(&serio_event_lock, flags); |
277 | |||
278 | return event; | 269 | return event; |
279 | } | 270 | } |
280 | 271 | ||
@@ -287,29 +278,27 @@ static void serio_handle_event(void) | |||
287 | while ((event = serio_get_event())) { | 278 | while ((event = serio_get_event())) { |
288 | 279 | ||
289 | switch (event->type) { | 280 | switch (event->type) { |
290 | case SERIO_REGISTER_PORT: | ||
291 | serio_add_port(event->object); | ||
292 | break; | ||
293 | 281 | ||
294 | case SERIO_RECONNECT_PORT: | 282 | case SERIO_REGISTER_PORT: |
295 | serio_reconnect_port(event->object); | 283 | serio_add_port(event->object); |
296 | break; | 284 | break; |
297 | 285 | ||
298 | case SERIO_RESCAN_PORT: | 286 | case SERIO_RECONNECT_PORT: |
299 | serio_disconnect_port(event->object); | 287 | serio_reconnect_port(event->object); |
300 | serio_find_driver(event->object); | 288 | break; |
301 | break; | ||
302 | 289 | ||
303 | case SERIO_RECONNECT_CHAIN: | 290 | case SERIO_RESCAN_PORT: |
304 | serio_reconnect_chain(event->object); | 291 | serio_disconnect_port(event->object); |
305 | break; | 292 | serio_find_driver(event->object); |
293 | break; | ||
306 | 294 | ||
307 | case SERIO_ATTACH_DRIVER: | 295 | case SERIO_RECONNECT_CHAIN: |
308 | serio_attach_driver(event->object); | 296 | serio_reconnect_chain(event->object); |
309 | break; | 297 | break; |
310 | 298 | ||
311 | default: | 299 | case SERIO_ATTACH_DRIVER: |
312 | break; | 300 | serio_attach_driver(event->object); |
301 | break; | ||
313 | } | 302 | } |
314 | 303 | ||
315 | serio_remove_duplicate_events(event); | 304 | serio_remove_duplicate_events(event); |
@@ -325,16 +314,14 @@ static void serio_handle_event(void) | |||
325 | */ | 314 | */ |
326 | static void serio_remove_pending_events(void *object) | 315 | static void serio_remove_pending_events(void *object) |
327 | { | 316 | { |
328 | struct list_head *node, *next; | 317 | struct serio_event *event, *next; |
329 | struct serio_event *event; | ||
330 | unsigned long flags; | 318 | unsigned long flags; |
331 | 319 | ||
332 | spin_lock_irqsave(&serio_event_lock, flags); | 320 | spin_lock_irqsave(&serio_event_lock, flags); |
333 | 321 | ||
334 | list_for_each_safe(node, next, &serio_event_list) { | 322 | list_for_each_entry_safe(event, next, &serio_event_list, node) { |
335 | event = list_entry(node, struct serio_event, node); | ||
336 | if (event->object == object) { | 323 | if (event->object == object) { |
337 | list_del_init(node); | 324 | list_del_init(&event->node); |
338 | serio_free_event(event); | 325 | serio_free_event(event); |
339 | } | 326 | } |
340 | } | 327 | } |
@@ -380,7 +367,6 @@ static int serio_thread(void *nothing) | |||
380 | kthread_should_stop() || !list_empty(&serio_event_list)); | 367 | kthread_should_stop() || !list_empty(&serio_event_list)); |
381 | } while (!kthread_should_stop()); | 368 | } while (!kthread_should_stop()); |
382 | 369 | ||
383 | printk(KERN_DEBUG "serio: kseriod exiting\n"); | ||
384 | return 0; | 370 | return 0; |
385 | } | 371 | } |
386 | 372 | ||
@@ -445,6 +431,11 @@ static struct attribute_group serio_id_attr_group = { | |||
445 | .attrs = serio_device_id_attrs, | 431 | .attrs = serio_device_id_attrs, |
446 | }; | 432 | }; |
447 | 433 | ||
434 | static const struct attribute_group *serio_device_attr_groups[] = { | ||
435 | &serio_id_attr_group, | ||
436 | NULL | ||
437 | }; | ||
438 | |||
448 | static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 439 | static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
449 | { | 440 | { |
450 | struct serio *serio = to_serio_port(dev); | 441 | struct serio *serio = to_serio_port(dev); |
@@ -532,6 +523,7 @@ static void serio_init_port(struct serio *serio) | |||
532 | (long)atomic_inc_return(&serio_no) - 1); | 523 | (long)atomic_inc_return(&serio_no) - 1); |
533 | serio->dev.bus = &serio_bus; | 524 | serio->dev.bus = &serio_bus; |
534 | serio->dev.release = serio_release_port; | 525 | serio->dev.release = serio_release_port; |
526 | serio->dev.groups = serio_device_attr_groups; | ||
535 | if (serio->parent) { | 527 | if (serio->parent) { |
536 | serio->dev.parent = &serio->parent->dev; | 528 | serio->dev.parent = &serio->parent->dev; |
537 | serio->depth = serio->parent->depth + 1; | 529 | serio->depth = serio->parent->depth + 1; |
@@ -555,21 +547,15 @@ static void serio_add_port(struct serio *serio) | |||
555 | } | 547 | } |
556 | 548 | ||
557 | list_add_tail(&serio->node, &serio_list); | 549 | list_add_tail(&serio->node, &serio_list); |
550 | |||
558 | if (serio->start) | 551 | if (serio->start) |
559 | serio->start(serio); | 552 | serio->start(serio); |
553 | |||
560 | error = device_add(&serio->dev); | 554 | error = device_add(&serio->dev); |
561 | if (error) | 555 | if (error) |
562 | printk(KERN_ERR | 556 | dev_err(&serio->dev, |
563 | "serio: device_add() failed for %s (%s), error: %d\n", | 557 | "device_add() failed for %s (%s), error: %d\n", |
564 | serio->phys, serio->name, error); | 558 | serio->phys, serio->name, error); |
565 | else { | ||
566 | serio->registered = true; | ||
567 | error = sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); | ||
568 | if (error) | ||
569 | printk(KERN_ERR | ||
570 | "serio: sysfs_create_group() failed for %s (%s), error: %d\n", | ||
571 | serio->phys, serio->name, error); | ||
572 | } | ||
573 | } | 559 | } |
574 | 560 | ||
575 | /* | 561 | /* |
@@ -596,11 +582,8 @@ static void serio_destroy_port(struct serio *serio) | |||
596 | serio->parent = NULL; | 582 | serio->parent = NULL; |
597 | } | 583 | } |
598 | 584 | ||
599 | if (serio->registered) { | 585 | if (device_is_registered(&serio->dev)) |
600 | sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group); | ||
601 | device_del(&serio->dev); | 586 | device_del(&serio->dev); |
602 | serio->registered = false; | ||
603 | } | ||
604 | 587 | ||
605 | list_del_init(&serio->node); | 588 | list_del_init(&serio->node); |
606 | serio_remove_pending_events(serio); | 589 | serio_remove_pending_events(serio); |
@@ -798,9 +781,8 @@ static void serio_attach_driver(struct serio_driver *drv) | |||
798 | 781 | ||
799 | error = driver_attach(&drv->driver); | 782 | error = driver_attach(&drv->driver); |
800 | if (error) | 783 | if (error) |
801 | printk(KERN_WARNING | 784 | pr_warning("driver_attach() failed for %s with error %d\n", |
802 | "serio: driver_attach() failed for %s with error %d\n", | 785 | drv->driver.name, error); |
803 | drv->driver.name, error); | ||
804 | } | 786 | } |
805 | 787 | ||
806 | int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name) | 788 | int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name) |
@@ -820,8 +802,7 @@ int __serio_register_driver(struct serio_driver *drv, struct module *owner, cons | |||
820 | 802 | ||
821 | error = driver_register(&drv->driver); | 803 | error = driver_register(&drv->driver); |
822 | if (error) { | 804 | if (error) { |
823 | printk(KERN_ERR | 805 | pr_err("driver_register() failed for %s, error: %d\n", |
824 | "serio: driver_register() failed for %s, error: %d\n", | ||
825 | drv->driver.name, error); | 806 | drv->driver.name, error); |
826 | return error; | 807 | return error; |
827 | } | 808 | } |
@@ -987,7 +968,7 @@ irqreturn_t serio_interrupt(struct serio *serio, | |||
987 | 968 | ||
988 | if (likely(serio->drv)) { | 969 | if (likely(serio->drv)) { |
989 | ret = serio->drv->interrupt(serio, data, dfl); | 970 | ret = serio->drv->interrupt(serio, data, dfl); |
990 | } else if (!dfl && serio->registered) { | 971 | } else if (!dfl && device_is_registered(&serio->dev)) { |
991 | serio_rescan(serio); | 972 | serio_rescan(serio); |
992 | ret = IRQ_HANDLED; | 973 | ret = IRQ_HANDLED; |
993 | } | 974 | } |
@@ -1018,7 +999,7 @@ static int __init serio_init(void) | |||
1018 | 999 | ||
1019 | error = bus_register(&serio_bus); | 1000 | error = bus_register(&serio_bus); |
1020 | if (error) { | 1001 | if (error) { |
1021 | printk(KERN_ERR "serio: failed to register serio bus, error: %d\n", error); | 1002 | pr_err("Failed to register serio bus, error: %d\n", error); |
1022 | return error; | 1003 | return error; |
1023 | } | 1004 | } |
1024 | 1005 | ||
@@ -1026,7 +1007,7 @@ static int __init serio_init(void) | |||
1026 | if (IS_ERR(serio_task)) { | 1007 | if (IS_ERR(serio_task)) { |
1027 | bus_unregister(&serio_bus); | 1008 | bus_unregister(&serio_bus); |
1028 | error = PTR_ERR(serio_task); | 1009 | error = PTR_ERR(serio_task); |
1029 | printk(KERN_ERR "serio: Failed to start kseriod, error: %d\n", error); | 1010 | pr_err("Failed to start kseriod, error: %d\n", error); |
1030 | return error; | 1011 | return error; |
1031 | } | 1012 | } |
1032 | 1013 | ||
diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c index ebb22f88c842..8298e1f68234 100644 --- a/drivers/input/serio/xilinx_ps2.c +++ b/drivers/input/serio/xilinx_ps2.c | |||
@@ -270,7 +270,7 @@ static int __devinit xps2_of_probe(struct of_device *ofdev, | |||
270 | drvdata->irq = r_irq.start; | 270 | drvdata->irq = r_irq.start; |
271 | 271 | ||
272 | phys_addr = r_mem.start; | 272 | phys_addr = r_mem.start; |
273 | remap_size = r_mem.end - r_mem.start + 1; | 273 | remap_size = resource_size(&r_mem); |
274 | if (!request_mem_region(phys_addr, remap_size, DRIVER_NAME)) { | 274 | if (!request_mem_region(phys_addr, remap_size, DRIVER_NAME)) { |
275 | dev_err(dev, "Couldn't lock memory region at 0x%08llX\n", | 275 | dev_err(dev, "Couldn't lock memory region at 0x%08llX\n", |
276 | (unsigned long long)phys_addr); | 276 | (unsigned long long)phys_addr); |
@@ -344,7 +344,7 @@ static int __devexit xps2_of_remove(struct of_device *of_dev) | |||
344 | if (of_address_to_resource(of_dev->node, 0, &r_mem)) | 344 | if (of_address_to_resource(of_dev->node, 0, &r_mem)) |
345 | dev_err(dev, "invalid address\n"); | 345 | dev_err(dev, "invalid address\n"); |
346 | else | 346 | else |
347 | release_mem_region(r_mem.start, r_mem.end - r_mem.start + 1); | 347 | release_mem_region(r_mem.start, resource_size(&r_mem)); |
348 | 348 | ||
349 | kfree(drvdata); | 349 | kfree(drvdata); |
350 | 350 | ||
@@ -354,7 +354,7 @@ static int __devexit xps2_of_remove(struct of_device *of_dev) | |||
354 | } | 354 | } |
355 | 355 | ||
356 | /* Match table for of_platform binding */ | 356 | /* Match table for of_platform binding */ |
357 | static struct of_device_id xps2_of_match[] __devinitdata = { | 357 | static const struct of_device_id xps2_of_match[] __devinitconst = { |
358 | { .compatible = "xlnx,xps-ps2-1.00.a", }, | 358 | { .compatible = "xlnx,xps-ps2-1.00.a", }, |
359 | { /* end of list */ }, | 359 | { /* end of list */ }, |
360 | }; | 360 | }; |
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index 3d32d3f4e486..866a9ee1af1a 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c | |||
@@ -92,7 +92,7 @@ Scott Hill shill@gtcocalcomp.com | |||
92 | /* DATA STRUCTURES */ | 92 | /* DATA STRUCTURES */ |
93 | 93 | ||
94 | /* Device table */ | 94 | /* Device table */ |
95 | static struct usb_device_id gtco_usbid_table [] = { | 95 | static const struct usb_device_id gtco_usbid_table[] = { |
96 | { USB_DEVICE(VENDOR_ID_GTCO, PID_400) }, | 96 | { USB_DEVICE(VENDOR_ID_GTCO, PID_400) }, |
97 | { USB_DEVICE(VENDOR_ID_GTCO, PID_401) }, | 97 | { USB_DEVICE(VENDOR_ID_GTCO, PID_401) }, |
98 | { USB_DEVICE(VENDOR_ID_GTCO, PID_1000) }, | 98 | { USB_DEVICE(VENDOR_ID_GTCO, PID_1000) }, |
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index 16310f368dab..8fef1b689c69 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
@@ -85,6 +85,7 @@ | |||
85 | #include <linux/kernel.h> | 85 | #include <linux/kernel.h> |
86 | #include <linux/slab.h> | 86 | #include <linux/slab.h> |
87 | #include <linux/module.h> | 87 | #include <linux/module.h> |
88 | #include <linux/mod_devicetable.h> | ||
88 | #include <linux/init.h> | 89 | #include <linux/init.h> |
89 | #include <linux/usb/input.h> | 90 | #include <linux/usb/input.h> |
90 | #include <asm/unaligned.h> | 91 | #include <asm/unaligned.h> |
@@ -120,6 +121,8 @@ struct wacom_combo { | |||
120 | struct urb *urb; | 121 | struct urb *urb; |
121 | }; | 122 | }; |
122 | 123 | ||
124 | extern const struct usb_device_id wacom_ids[]; | ||
125 | |||
123 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 126 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
124 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); | 127 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); |
125 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); | 128 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); |
@@ -142,7 +145,5 @@ extern void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wa | |||
142 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); | 145 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); |
143 | extern __u16 wacom_le16_to_cpu(unsigned char *data); | 146 | extern __u16 wacom_le16_to_cpu(unsigned char *data); |
144 | extern __u16 wacom_be16_to_cpu(unsigned char *data); | 147 | extern __u16 wacom_be16_to_cpu(unsigned char *data); |
145 | extern struct wacom_features *get_wacom_feature(const struct usb_device_id *id); | ||
146 | extern const struct usb_device_id *get_device_table(void); | ||
147 | 148 | ||
148 | #endif | 149 | #endif |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 072f33b3b2b0..a1770e6feeec 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
@@ -211,7 +211,8 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
211 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 211 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
212 | BIT_MASK(BTN_TOOL_PEN) | BIT_MASK(BTN_STYLUS) | | 212 | BIT_MASK(BTN_TOOL_PEN) | BIT_MASK(BTN_STYLUS) | |
213 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); | 213 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); |
214 | input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0); | 214 | input_set_abs_params(input_dev, ABS_DISTANCE, |
215 | 0, wacom_wac->features.distance_max, 0, 0); | ||
215 | } | 216 | } |
216 | 217 | ||
217 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 218 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
@@ -261,7 +262,8 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
261 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) | | 262 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) | |
262 | BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) | | 263 | BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) | |
263 | BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2); | 264 | BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2); |
264 | input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0); | 265 | input_set_abs_params(input_dev, ABS_DISTANCE, |
266 | 0, wacom_wac->features.distance_max, 0, 0); | ||
265 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); | 267 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); |
266 | input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); | 268 | input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); |
267 | input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); | 269 | input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); |
@@ -282,17 +284,19 @@ void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
282 | 284 | ||
283 | void input_dev_tpc(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 285 | void input_dev_tpc(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
284 | { | 286 | { |
285 | if (wacom_wac->features->device_type == BTN_TOOL_DOUBLETAP || | 287 | struct wacom_features *features = &wacom_wac->features; |
286 | wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) { | 288 | |
287 | input_set_abs_params(input_dev, ABS_RX, 0, wacom_wac->features->x_phy, 0, 0); | 289 | if (features->device_type == BTN_TOOL_DOUBLETAP || |
288 | input_set_abs_params(input_dev, ABS_RY, 0, wacom_wac->features->y_phy, 0, 0); | 290 | features->device_type == BTN_TOOL_TRIPLETAP) { |
289 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); | 291 | input_set_abs_params(input_dev, ABS_RX, 0, features->x_phy, 0, 0); |
292 | input_set_abs_params(input_dev, ABS_RY, 0, features->y_phy, 0, 0); | ||
293 | __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); | ||
290 | } | 294 | } |
291 | } | 295 | } |
292 | 296 | ||
293 | void input_dev_tpc2fg(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 297 | void input_dev_tpc2fg(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
294 | { | 298 | { |
295 | if (wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) { | 299 | if (wacom_wac->features.device_type == BTN_TOOL_TRIPLETAP) { |
296 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_TRIPLETAP); | 300 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_TRIPLETAP); |
297 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); | 301 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); |
298 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 302 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
@@ -532,21 +536,38 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
532 | struct wacom_wac *wacom_wac; | 536 | struct wacom_wac *wacom_wac; |
533 | struct wacom_features *features; | 537 | struct wacom_features *features; |
534 | struct input_dev *input_dev; | 538 | struct input_dev *input_dev; |
535 | int error = -ENOMEM; | 539 | int error; |
540 | |||
541 | if (!id->driver_info) | ||
542 | return -EINVAL; | ||
536 | 543 | ||
537 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 544 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
538 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); | 545 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); |
539 | input_dev = input_allocate_device(); | 546 | input_dev = input_allocate_device(); |
540 | if (!wacom || !input_dev || !wacom_wac) | 547 | if (!wacom || !input_dev || !wacom_wac) { |
548 | error = -ENOMEM; | ||
541 | goto fail1; | 549 | goto fail1; |
550 | } | ||
542 | 551 | ||
543 | wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, GFP_KERNEL, &wacom->data_dma); | 552 | wacom_wac->features = *((struct wacom_features *)id->driver_info); |
544 | if (!wacom_wac->data) | 553 | features = &wacom_wac->features; |
554 | if (features->pktlen > WACOM_PKGLEN_MAX) { | ||
555 | error = -EINVAL; | ||
545 | goto fail1; | 556 | goto fail1; |
557 | } | ||
558 | |||
559 | wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, | ||
560 | GFP_KERNEL, &wacom->data_dma); | ||
561 | if (!wacom_wac->data) { | ||
562 | error = -ENOMEM; | ||
563 | goto fail1; | ||
564 | } | ||
546 | 565 | ||
547 | wacom->irq = usb_alloc_urb(0, GFP_KERNEL); | 566 | wacom->irq = usb_alloc_urb(0, GFP_KERNEL); |
548 | if (!wacom->irq) | 567 | if (!wacom->irq) { |
568 | error = -ENOMEM; | ||
549 | goto fail2; | 569 | goto fail2; |
570 | } | ||
550 | 571 | ||
551 | wacom->usbdev = dev; | 572 | wacom->usbdev = dev; |
552 | wacom->dev = input_dev; | 573 | wacom->dev = input_dev; |
@@ -555,11 +576,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
555 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); | 576 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); |
556 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); | 577 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); |
557 | 578 | ||
558 | wacom_wac->features = features = get_wacom_feature(id); | ||
559 | BUG_ON(features->pktlen > WACOM_PKGLEN_MAX); | ||
560 | |||
561 | input_dev->name = wacom_wac->features->name; | ||
562 | wacom->wacom_wac = wacom_wac; | ||
563 | usb_to_input_id(dev, &input_dev->id); | 579 | usb_to_input_id(dev, &input_dev->id); |
564 | 580 | ||
565 | input_dev->dev.parent = &intf->dev; | 581 | input_dev->dev.parent = &intf->dev; |
@@ -576,6 +592,19 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
576 | if (error) | 592 | if (error) |
577 | goto fail2; | 593 | goto fail2; |
578 | 594 | ||
595 | strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); | ||
596 | |||
597 | if (features->type == TABLETPC || features->type == TABLETPC2FG) { | ||
598 | /* Append the device type to the name */ | ||
599 | strlcat(wacom_wac->name, | ||
600 | features->device_type == BTN_TOOL_PEN ? | ||
601 | " Pen" : " Finger", | ||
602 | sizeof(wacom_wac->name)); | ||
603 | } | ||
604 | |||
605 | input_dev->name = wacom_wac->name; | ||
606 | wacom->wacom_wac = wacom_wac; | ||
607 | |||
579 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | 608 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); |
580 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOUCH); | 609 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOUCH); |
581 | 610 | ||
@@ -640,7 +669,7 @@ static int wacom_suspend(struct usb_interface *intf, pm_message_t message) | |||
640 | static int wacom_resume(struct usb_interface *intf) | 669 | static int wacom_resume(struct usb_interface *intf) |
641 | { | 670 | { |
642 | struct wacom *wacom = usb_get_intfdata(intf); | 671 | struct wacom *wacom = usb_get_intfdata(intf); |
643 | struct wacom_features *features = wacom->wacom_wac->features; | 672 | struct wacom_features *features = &wacom->wacom_wac->features; |
644 | int rv; | 673 | int rv; |
645 | 674 | ||
646 | mutex_lock(&wacom->lock); | 675 | mutex_lock(&wacom->lock); |
@@ -663,6 +692,7 @@ static int wacom_reset_resume(struct usb_interface *intf) | |||
663 | 692 | ||
664 | static struct usb_driver wacom_driver = { | 693 | static struct usb_driver wacom_driver = { |
665 | .name = "wacom", | 694 | .name = "wacom", |
695 | .id_table = wacom_ids, | ||
666 | .probe = wacom_probe, | 696 | .probe = wacom_probe, |
667 | .disconnect = wacom_disconnect, | 697 | .disconnect = wacom_disconnect, |
668 | .suspend = wacom_suspend, | 698 | .suspend = wacom_suspend, |
@@ -674,7 +704,7 @@ static struct usb_driver wacom_driver = { | |||
674 | static int __init wacom_init(void) | 704 | static int __init wacom_init(void) |
675 | { | 705 | { |
676 | int result; | 706 | int result; |
677 | wacom_driver.id_table = get_device_table(); | 707 | |
678 | result = usb_register(&wacom_driver); | 708 | result = usb_register(&wacom_driver); |
679 | if (result == 0) | 709 | if (result == 0) |
680 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | 710 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 1056f149fe31..3d81443e683a 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -55,6 +55,7 @@ static int wacom_penpartner_irq(struct wacom_wac *wacom, void *wcombo) | |||
55 | 55 | ||
56 | static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) | 56 | static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) |
57 | { | 57 | { |
58 | struct wacom_features *features = &wacom->features; | ||
58 | unsigned char *data = wacom->data; | 59 | unsigned char *data = wacom->data; |
59 | int prox, pressure; | 60 | int prox, pressure; |
60 | 61 | ||
@@ -68,9 +69,9 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) | |||
68 | if (prox) { | 69 | if (prox) { |
69 | wacom->id[0] = ERASER_DEVICE_ID; | 70 | wacom->id[0] = ERASER_DEVICE_ID; |
70 | pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); | 71 | pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); |
71 | if (wacom->features->pressure_max > 255) | 72 | if (features->pressure_max > 255) |
72 | pressure = (pressure << 1) | ((data[4] >> 6) & 1); | 73 | pressure = (pressure << 1) | ((data[4] >> 6) & 1); |
73 | pressure += (wacom->features->pressure_max + 1) / 2; | 74 | pressure += (features->pressure_max + 1) / 2; |
74 | 75 | ||
75 | /* | 76 | /* |
76 | * if going from out of proximity into proximity select between the eraser | 77 | * if going from out of proximity into proximity select between the eraser |
@@ -152,6 +153,7 @@ static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) | |||
152 | 153 | ||
153 | static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | 154 | static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) |
154 | { | 155 | { |
156 | struct wacom_features *features = &wacom->features; | ||
155 | unsigned char *data = wacom->data; | 157 | unsigned char *data = wacom->data; |
156 | int x, y, rw; | 158 | int x, y, rw; |
157 | static int penData = 0; | 159 | static int penData = 0; |
@@ -179,8 +181,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
179 | 181 | ||
180 | case 2: /* Mouse with wheel */ | 182 | case 2: /* Mouse with wheel */ |
181 | wacom_report_key(wcombo, BTN_MIDDLE, data[1] & 0x04); | 183 | wacom_report_key(wcombo, BTN_MIDDLE, data[1] & 0x04); |
182 | if (wacom->features->type == WACOM_G4 || | 184 | if (features->type == WACOM_G4 || features->type == WACOM_MO) { |
183 | wacom->features->type == WACOM_MO) { | ||
184 | rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); | 185 | rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); |
185 | wacom_report_rel(wcombo, REL_WHEEL, -rw); | 186 | wacom_report_rel(wcombo, REL_WHEEL, -rw); |
186 | } else | 187 | } else |
@@ -192,8 +193,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
192 | wacom->id[0] = CURSOR_DEVICE_ID; | 193 | wacom->id[0] = CURSOR_DEVICE_ID; |
193 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); | 194 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); |
194 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); | 195 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); |
195 | if (wacom->features->type == WACOM_G4 || | 196 | if (features->type == WACOM_G4 || features->type == WACOM_MO) |
196 | wacom->features->type == WACOM_MO) | ||
197 | wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); | 197 | wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); |
198 | else | 198 | else |
199 | wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); | 199 | wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); |
@@ -230,7 +230,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
230 | } | 230 | } |
231 | 231 | ||
232 | /* send pad data */ | 232 | /* send pad data */ |
233 | switch (wacom->features->type) { | 233 | switch (features->type) { |
234 | case WACOM_G4: | 234 | case WACOM_G4: |
235 | if (data[7] & 0xf8) { | 235 | if (data[7] & 0xf8) { |
236 | if (penData) { | 236 | if (penData) { |
@@ -300,11 +300,12 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
300 | 300 | ||
301 | static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) | 301 | static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) |
302 | { | 302 | { |
303 | struct wacom_features *features = &wacom->features; | ||
303 | unsigned char *data = wacom->data; | 304 | unsigned char *data = wacom->data; |
304 | int idx = 0; | 305 | int idx = 0; |
305 | 306 | ||
306 | /* tool number */ | 307 | /* tool number */ |
307 | if (wacom->features->type == INTUOS) | 308 | if (features->type == INTUOS) |
308 | idx = data[1] & 0x01; | 309 | idx = data[1] & 0x01; |
309 | 310 | ||
310 | /* Enter report */ | 311 | /* Enter report */ |
@@ -402,7 +403,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) | |||
402 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | 403 | wacom_report_key(wcombo, BTN_STYLUS2, 0); |
403 | wacom_report_key(wcombo, BTN_TOUCH, 0); | 404 | wacom_report_key(wcombo, BTN_TOUCH, 0); |
404 | wacom_report_abs(wcombo, ABS_WHEEL, 0); | 405 | wacom_report_abs(wcombo, ABS_WHEEL, 0); |
405 | if (wacom->features->type >= INTUOS3S) | 406 | if (features->type >= INTUOS3S) |
406 | wacom_report_abs(wcombo, ABS_Z, 0); | 407 | wacom_report_abs(wcombo, ABS_Z, 0); |
407 | } | 408 | } |
408 | wacom_report_key(wcombo, wacom->tool[idx], 0); | 409 | wacom_report_key(wcombo, wacom->tool[idx], 0); |
@@ -416,13 +417,14 @@ static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) | |||
416 | 417 | ||
417 | static void wacom_intuos_general(struct wacom_wac *wacom, void *wcombo) | 418 | static void wacom_intuos_general(struct wacom_wac *wacom, void *wcombo) |
418 | { | 419 | { |
420 | struct wacom_features *features = &wacom->features; | ||
419 | unsigned char *data = wacom->data; | 421 | unsigned char *data = wacom->data; |
420 | unsigned int t; | 422 | unsigned int t; |
421 | 423 | ||
422 | /* general pen packet */ | 424 | /* general pen packet */ |
423 | if ((data[1] & 0xb8) == 0xa0) { | 425 | if ((data[1] & 0xb8) == 0xa0) { |
424 | t = (data[6] << 2) | ((data[7] >> 6) & 3); | 426 | t = (data[6] << 2) | ((data[7] >> 6) & 3); |
425 | if (wacom->features->type >= INTUOS4S && wacom->features->type <= INTUOS4L) | 427 | if (features->type >= INTUOS4S && features->type <= INTUOS4L) |
426 | t = (t << 1) | (data[1] & 1); | 428 | t = (t << 1) | (data[1] & 1); |
427 | wacom_report_abs(wcombo, ABS_PRESSURE, t); | 429 | wacom_report_abs(wcombo, ABS_PRESSURE, t); |
428 | wacom_report_abs(wcombo, ABS_TILT_X, | 430 | wacom_report_abs(wcombo, ABS_TILT_X, |
@@ -446,6 +448,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom, void *wcombo) | |||
446 | 448 | ||
447 | static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | 449 | static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) |
448 | { | 450 | { |
451 | struct wacom_features *features = &wacom->features; | ||
449 | unsigned char *data = wacom->data; | 452 | unsigned char *data = wacom->data; |
450 | unsigned int t; | 453 | unsigned int t; |
451 | int idx = 0, result; | 454 | int idx = 0, result; |
@@ -457,7 +460,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
457 | } | 460 | } |
458 | 461 | ||
459 | /* tool number */ | 462 | /* tool number */ |
460 | if (wacom->features->type == INTUOS) | 463 | if (features->type == INTUOS) |
461 | idx = data[1] & 0x01; | 464 | idx = data[1] & 0x01; |
462 | 465 | ||
463 | /* pad packets. Works as a second tool and is always in prox */ | 466 | /* pad packets. Works as a second tool and is always in prox */ |
@@ -466,7 +469,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
466 | if (wacom->tool[1] != BTN_TOOL_FINGER) | 469 | if (wacom->tool[1] != BTN_TOOL_FINGER) |
467 | wacom->tool[1] = BTN_TOOL_FINGER; | 470 | wacom->tool[1] = BTN_TOOL_FINGER; |
468 | 471 | ||
469 | if (wacom->features->type >= INTUOS4S && wacom->features->type <= INTUOS4L) { | 472 | if (features->type >= INTUOS4S && features->type <= INTUOS4L) { |
470 | wacom_report_key(wcombo, BTN_0, (data[2] & 0x01)); | 473 | wacom_report_key(wcombo, BTN_0, (data[2] & 0x01)); |
471 | wacom_report_key(wcombo, BTN_1, (data[3] & 0x01)); | 474 | wacom_report_key(wcombo, BTN_1, (data[3] & 0x01)); |
472 | wacom_report_key(wcombo, BTN_2, (data[3] & 0x02)); | 475 | wacom_report_key(wcombo, BTN_2, (data[3] & 0x02)); |
@@ -480,7 +483,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
480 | /* Out of proximity, clear wheel value. */ | 483 | /* Out of proximity, clear wheel value. */ |
481 | wacom_report_abs(wcombo, ABS_WHEEL, 0); | 484 | wacom_report_abs(wcombo, ABS_WHEEL, 0); |
482 | } | 485 | } |
483 | if (wacom->features->type != INTUOS4S) { | 486 | if (features->type != INTUOS4S) { |
484 | wacom_report_key(wcombo, BTN_7, (data[3] & 0x40)); | 487 | wacom_report_key(wcombo, BTN_7, (data[3] & 0x40)); |
485 | wacom_report_key(wcombo, BTN_8, (data[3] & 0x80)); | 488 | wacom_report_key(wcombo, BTN_8, (data[3] & 0x80)); |
486 | } | 489 | } |
@@ -528,18 +531,20 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
528 | return 0; | 531 | return 0; |
529 | 532 | ||
530 | /* Only large Intuos support Lense Cursor */ | 533 | /* Only large Intuos support Lense Cursor */ |
531 | if ((wacom->tool[idx] == BTN_TOOL_LENS) | 534 | if (wacom->tool[idx] == BTN_TOOL_LENS && |
532 | && ((wacom->features->type == INTUOS3) | 535 | (features->type == INTUOS3 || |
533 | || (wacom->features->type == INTUOS3S) | 536 | features->type == INTUOS3S || |
534 | || (wacom->features->type == INTUOS4) | 537 | features->type == INTUOS4 || |
535 | || (wacom->features->type == INTUOS4S))) | 538 | features->type == INTUOS4S)) { |
539 | |||
536 | return 0; | 540 | return 0; |
541 | } | ||
537 | 542 | ||
538 | /* Cintiq doesn't send data when RDY bit isn't set */ | 543 | /* Cintiq doesn't send data when RDY bit isn't set */ |
539 | if ((wacom->features->type == CINTIQ) && !(data[1] & 0x40)) | 544 | if (features->type == CINTIQ && !(data[1] & 0x40)) |
540 | return 0; | 545 | return 0; |
541 | 546 | ||
542 | if (wacom->features->type >= INTUOS3S) { | 547 | if (features->type >= INTUOS3S) { |
543 | wacom_report_abs(wcombo, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1)); | 548 | wacom_report_abs(wcombo, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1)); |
544 | wacom_report_abs(wcombo, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1)); | 549 | wacom_report_abs(wcombo, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1)); |
545 | wacom_report_abs(wcombo, ABS_DISTANCE, ((data[9] >> 2) & 0x3f)); | 550 | wacom_report_abs(wcombo, ABS_DISTANCE, ((data[9] >> 2) & 0x3f)); |
@@ -557,7 +562,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
557 | 562 | ||
558 | if (data[1] & 0x02) { | 563 | if (data[1] & 0x02) { |
559 | /* Rotation packet */ | 564 | /* Rotation packet */ |
560 | if (wacom->features->type >= INTUOS3S) { | 565 | if (features->type >= INTUOS3S) { |
561 | /* I3 marker pen rotation */ | 566 | /* I3 marker pen rotation */ |
562 | t = (data[6] << 3) | ((data[7] >> 5) & 7); | 567 | t = (data[6] << 3) | ((data[7] >> 5) & 7); |
563 | t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) : | 568 | t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) : |
@@ -570,7 +575,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
570 | ((t - 1) / 2) : -t / 2); | 575 | ((t - 1) / 2) : -t / 2); |
571 | } | 576 | } |
572 | 577 | ||
573 | } else if (!(data[1] & 0x10) && wacom->features->type < INTUOS3S) { | 578 | } else if (!(data[1] & 0x10) && features->type < INTUOS3S) { |
574 | /* 4D mouse packet */ | 579 | /* 4D mouse packet */ |
575 | wacom_report_key(wcombo, BTN_LEFT, data[8] & 0x01); | 580 | wacom_report_key(wcombo, BTN_LEFT, data[8] & 0x01); |
576 | wacom_report_key(wcombo, BTN_MIDDLE, data[8] & 0x02); | 581 | wacom_report_key(wcombo, BTN_MIDDLE, data[8] & 0x02); |
@@ -583,7 +588,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
583 | 588 | ||
584 | } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) { | 589 | } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) { |
585 | /* I4 mouse */ | 590 | /* I4 mouse */ |
586 | if (wacom->features->type >= INTUOS4S && wacom->features->type <= INTUOS4L) { | 591 | if (features->type >= INTUOS4S && features->type <= INTUOS4L) { |
587 | wacom_report_key(wcombo, BTN_LEFT, data[6] & 0x01); | 592 | wacom_report_key(wcombo, BTN_LEFT, data[6] & 0x01); |
588 | wacom_report_key(wcombo, BTN_MIDDLE, data[6] & 0x02); | 593 | wacom_report_key(wcombo, BTN_MIDDLE, data[6] & 0x02); |
589 | wacom_report_key(wcombo, BTN_RIGHT, data[6] & 0x04); | 594 | wacom_report_key(wcombo, BTN_RIGHT, data[6] & 0x04); |
@@ -604,13 +609,13 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
604 | - ((data[8] & 0x02) >> 1)); | 609 | - ((data[8] & 0x02) >> 1)); |
605 | 610 | ||
606 | /* I3 2D mouse side buttons */ | 611 | /* I3 2D mouse side buttons */ |
607 | if (wacom->features->type >= INTUOS3S && wacom->features->type <= INTUOS3L) { | 612 | if (features->type >= INTUOS3S && features->type <= INTUOS3L) { |
608 | wacom_report_key(wcombo, BTN_SIDE, data[8] & 0x40); | 613 | wacom_report_key(wcombo, BTN_SIDE, data[8] & 0x40); |
609 | wacom_report_key(wcombo, BTN_EXTRA, data[8] & 0x20); | 614 | wacom_report_key(wcombo, BTN_EXTRA, data[8] & 0x20); |
610 | } | 615 | } |
611 | } | 616 | } |
612 | } else if ((wacom->features->type < INTUOS3S || wacom->features->type == INTUOS3L || | 617 | } else if ((features->type < INTUOS3S || features->type == INTUOS3L || |
613 | wacom->features->type == INTUOS4L) && | 618 | features->type == INTUOS4L) && |
614 | wacom->tool[idx] == BTN_TOOL_LENS) { | 619 | wacom->tool[idx] == BTN_TOOL_LENS) { |
615 | /* Lens cursor packets */ | 620 | /* Lens cursor packets */ |
616 | wacom_report_key(wcombo, BTN_LEFT, data[8] & 0x01); | 621 | wacom_report_key(wcombo, BTN_LEFT, data[8] & 0x01); |
@@ -718,6 +723,7 @@ static void wacom_tpc_touch_in(struct wacom_wac *wacom, void *wcombo) | |||
718 | 723 | ||
719 | static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | 724 | static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) |
720 | { | 725 | { |
726 | struct wacom_features *features = &wacom->features; | ||
721 | char *data = wacom->data; | 727 | char *data = wacom->data; |
722 | int prox = 0, pressure, idx = -1; | 728 | int prox = 0, pressure, idx = -1; |
723 | static int stylusInProx, touchInProx = 1, touchOut; | 729 | static int stylusInProx, touchInProx = 1, touchOut; |
@@ -791,7 +797,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | |||
791 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | 797 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); |
792 | pressure = ((data[7] & 0x01) << 8) | data[6]; | 798 | pressure = ((data[7] & 0x01) << 8) | data[6]; |
793 | if (pressure < 0) | 799 | if (pressure < 0) |
794 | pressure = wacom->features->pressure_max + pressure + 1; | 800 | pressure = features->pressure_max + pressure + 1; |
795 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | 801 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); |
796 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); | 802 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); |
797 | } else { | 803 | } else { |
@@ -815,7 +821,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | |||
815 | 821 | ||
816 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) | 822 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) |
817 | { | 823 | { |
818 | switch (wacom_wac->features->type) { | 824 | switch (wacom_wac->features.type) { |
819 | case PENPARTNER: | 825 | case PENPARTNER: |
820 | return wacom_penpartner_irq(wacom_wac, wcombo); | 826 | return wacom_penpartner_irq(wacom_wac, wcombo); |
821 | 827 | ||
@@ -853,7 +859,7 @@ int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) | |||
853 | 859 | ||
854 | void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 860 | void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
855 | { | 861 | { |
856 | switch (wacom_wac->features->type) { | 862 | switch (wacom_wac->features.type) { |
857 | case WACOM_MO: | 863 | case WACOM_MO: |
858 | input_dev_mo(input_dev, wacom_wac); | 864 | input_dev_mo(input_dev, wacom_wac); |
859 | case WACOM_G4: | 865 | case WACOM_G4: |
@@ -888,7 +894,7 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w | |||
888 | /* fall through */ | 894 | /* fall through */ |
889 | case TABLETPC: | 895 | case TABLETPC: |
890 | input_dev_tpc(input_dev, wacom_wac); | 896 | input_dev_tpc(input_dev, wacom_wac); |
891 | if (wacom_wac->features->device_type != BTN_TOOL_PEN) | 897 | if (wacom_wac->features.device_type != BTN_TOOL_PEN) |
892 | break; /* no need to process stylus stuff */ | 898 | break; /* no need to process stylus stuff */ |
893 | 899 | ||
894 | /* fall through */ | 900 | /* fall through */ |
@@ -903,153 +909,201 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w | |||
903 | return; | 909 | return; |
904 | } | 910 | } |
905 | 911 | ||
906 | static struct wacom_features wacom_features[] = { | 912 | static const struct wacom_features wacom_features_0x00 = |
907 | { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, 0, PENPARTNER }, | 913 | { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, 0, PENPARTNER }; |
908 | { "Wacom Graphire", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 63, GRAPHIRE }, | 914 | static const struct wacom_features wacom_features_0x10 = |
909 | { "Wacom Graphire2 4x5", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 63, GRAPHIRE }, | 915 | { "Wacom Graphire", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 63, GRAPHIRE }; |
910 | { "Wacom Graphire2 5x7", WACOM_PKGLEN_GRAPHIRE, 13918, 10206, 511, 63, GRAPHIRE }, | 916 | static const struct wacom_features wacom_features_0x11 = |
911 | { "Wacom Graphire3", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 63, GRAPHIRE }, | 917 | { "Wacom Graphire2 4x5", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 63, GRAPHIRE }; |
912 | { "Wacom Graphire3 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, GRAPHIRE }, | 918 | static const struct wacom_features wacom_features_0x12 = |
913 | { "Wacom Graphire4 4x5", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 63, WACOM_G4 }, | 919 | { "Wacom Graphire2 5x7", WACOM_PKGLEN_GRAPHIRE, 13918, 10206, 511, 63, GRAPHIRE }; |
914 | { "Wacom Graphire4 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, WACOM_G4 }, | 920 | static const struct wacom_features wacom_features_0x13 = |
915 | { "Wacom BambooFun 4x5", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO }, | 921 | { "Wacom Graphire3", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 63, GRAPHIRE }; |
916 | { "Wacom BambooFun 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 511, 63, WACOM_MO }, | 922 | static const struct wacom_features wacom_features_0x14 = |
917 | { "Wacom Bamboo1 Medium", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, GRAPHIRE }, | 923 | { "Wacom Graphire3 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, GRAPHIRE }; |
918 | { "Wacom Volito", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }, | 924 | static const struct wacom_features wacom_features_0x15 = |
919 | { "Wacom PenStation2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 255, 63, GRAPHIRE }, | 925 | { "Wacom Graphire4 4x5", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 63, WACOM_G4 }; |
920 | { "Wacom Volito2 4x5", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }, | 926 | static const struct wacom_features wacom_features_0x16 = |
921 | { "Wacom Volito2 2x3", WACOM_PKGLEN_GRAPHIRE, 3248, 2320, 511, 63, GRAPHIRE }, | 927 | { "Wacom Graphire4 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, WACOM_G4 }; |
922 | { "Wacom PenPartner2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 511, 63, GRAPHIRE }, | 928 | static const struct wacom_features wacom_features_0x17 = |
923 | { "Wacom Bamboo", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO }, | 929 | { "Wacom BambooFun 4x5", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO }; |
924 | { "Wacom Bamboo1", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }, | 930 | static const struct wacom_features wacom_features_0x18 = |
925 | { "Wacom Intuos 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 31, INTUOS }, | 931 | { "Wacom BambooFun 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 511, 63, WACOM_MO }; |
926 | { "Wacom Intuos 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }, | 932 | static const struct wacom_features wacom_features_0x19 = |
927 | { "Wacom Intuos 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 31, INTUOS }, | 933 | { "Wacom Bamboo1 Medium", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 63, GRAPHIRE }; |
928 | { "Wacom Intuos 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 31, INTUOS }, | 934 | static const struct wacom_features wacom_features_0x60 = |
929 | { "Wacom Intuos 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 31, INTUOS }, | 935 | { "Wacom Volito", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }; |
930 | { "Wacom PL400", WACOM_PKGLEN_GRAPHIRE, 5408, 4056, 255, 0, PL }, | 936 | static const struct wacom_features wacom_features_0x61 = |
931 | { "Wacom PL500", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 255, 0, PL }, | 937 | { "Wacom PenStation2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 255, 63, GRAPHIRE }; |
932 | { "Wacom PL600", WACOM_PKGLEN_GRAPHIRE, 6126, 4604, 255, 0, PL }, | 938 | static const struct wacom_features wacom_features_0x62 = |
933 | { "Wacom PL600SX", WACOM_PKGLEN_GRAPHIRE, 6260, 5016, 255, 0, PL }, | 939 | { "Wacom Volito2 4x5", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }; |
934 | { "Wacom PL550", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 511, 0, PL }, | 940 | static const struct wacom_features wacom_features_0x63 = |
935 | { "Wacom PL800", WACOM_PKGLEN_GRAPHIRE, 7220, 5780, 511, 0, PL }, | 941 | { "Wacom Volito2 2x3", WACOM_PKGLEN_GRAPHIRE, 3248, 2320, 511, 63, GRAPHIRE }; |
936 | { "Wacom PL700", WACOM_PKGLEN_GRAPHIRE, 6758, 5406, 511, 0, PL }, | 942 | static const struct wacom_features wacom_features_0x64 = |
937 | { "Wacom PL510", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 0, PL }, | 943 | { "Wacom PenPartner2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 511, 63, GRAPHIRE }; |
938 | { "Wacom DTU710", WACOM_PKGLEN_GRAPHIRE, 34080, 27660, 511, 0, PL }, | 944 | static const struct wacom_features wacom_features_0x65 = |
939 | { "Wacom DTF521", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 0, PL }, | 945 | { "Wacom Bamboo", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 63, WACOM_MO }; |
940 | { "Wacom DTF720", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 0, PL }, | 946 | static const struct wacom_features wacom_features_0x69 = |
941 | { "Wacom DTF720a", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 0, PL }, | 947 | { "Wacom Bamboo1", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 63, GRAPHIRE }; |
942 | { "Wacom Cintiq Partner", WACOM_PKGLEN_GRAPHIRE, 20480, 15360, 511, 0, PTU }, | 948 | static const struct wacom_features wacom_features_0x20 = |
943 | { "Wacom Intuos2 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 31, INTUOS }, | 949 | { "Wacom Intuos 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 31, INTUOS }; |
944 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }, | 950 | static const struct wacom_features wacom_features_0x21 = |
945 | { "Wacom Intuos2 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 31, INTUOS }, | 951 | { "Wacom Intuos 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; |
946 | { "Wacom Intuos2 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 31, INTUOS }, | 952 | static const struct wacom_features wacom_features_0x22 = |
947 | { "Wacom Intuos2 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 31, INTUOS }, | 953 | { "Wacom Intuos 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 31, INTUOS }; |
948 | { "Wacom Intuos3 4x5", WACOM_PKGLEN_INTUOS, 25400, 20320, 1023, 63, INTUOS3S }, | 954 | static const struct wacom_features wacom_features_0x23 = |
949 | { "Wacom Intuos3 6x8", WACOM_PKGLEN_INTUOS, 40640, 30480, 1023, 63, INTUOS3 }, | 955 | { "Wacom Intuos 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 31, INTUOS }; |
950 | { "Wacom Intuos3 9x12", WACOM_PKGLEN_INTUOS, 60960, 45720, 1023, 63, INTUOS3 }, | 956 | static const struct wacom_features wacom_features_0x24 = |
951 | { "Wacom Intuos3 12x12", WACOM_PKGLEN_INTUOS, 60960, 60960, 1023, 63, INTUOS3L }, | 957 | { "Wacom Intuos 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 31, INTUOS }; |
952 | { "Wacom Intuos3 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 1023, 63, INTUOS3L }, | 958 | static const struct wacom_features wacom_features_0x30 = |
953 | { "Wacom Intuos3 6x11", WACOM_PKGLEN_INTUOS, 54204, 31750, 1023, 63, INTUOS3 }, | 959 | { "Wacom PL400", WACOM_PKGLEN_GRAPHIRE, 5408, 4056, 255, 0, PL }; |
954 | { "Wacom Intuos3 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 1023, 63, INTUOS3S }, | 960 | static const struct wacom_features wacom_features_0x31 = |
955 | { "Wacom Intuos4 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 63, INTUOS4S }, | 961 | { "Wacom PL500", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 255, 0, PL }; |
956 | { "Wacom Intuos4 6x9", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 63, INTUOS4 }, | 962 | static const struct wacom_features wacom_features_0x32 = |
957 | { "Wacom Intuos4 8x13", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, 63, INTUOS4L }, | 963 | { "Wacom PL600", WACOM_PKGLEN_GRAPHIRE, 6126, 4604, 255, 0, PL }; |
958 | { "Wacom Intuos4 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 2047, 63, INTUOS4L }, | 964 | static const struct wacom_features wacom_features_0x33 = |
959 | { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, 63, CINTIQ }, | 965 | { "Wacom PL600SX", WACOM_PKGLEN_GRAPHIRE, 6260, 5016, 255, 0, PL }; |
960 | { "Wacom Cintiq 20WSX", WACOM_PKGLEN_INTUOS, 86680, 54180, 1023, 63, WACOM_BEE }, | 966 | static const struct wacom_features wacom_features_0x34 = |
961 | { "Wacom Cintiq 12WX", WACOM_PKGLEN_INTUOS, 53020, 33440, 1023, 63, WACOM_BEE }, | 967 | { "Wacom PL550", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 511, 0, PL }; |
962 | { "Wacom DTU1931", WACOM_PKGLEN_GRAPHIRE, 37832, 30305, 511, 0, PL }, | 968 | static const struct wacom_features wacom_features_0x35 = |
963 | { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }, | 969 | { "Wacom PL800", WACOM_PKGLEN_GRAPHIRE, 7220, 5780, 511, 0, PL }; |
964 | { "Wacom ISDv4 93", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }, | 970 | static const struct wacom_features wacom_features_0x37 = |
965 | { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }, | 971 | { "Wacom PL700", WACOM_PKGLEN_GRAPHIRE, 6758, 5406, 511, 0, PL }; |
966 | { "Wacom ISDv4 9F", WACOM_PKGLEN_PENABLED, 26202, 16325, 255, 0, TABLETPC }, | 972 | static const struct wacom_features wacom_features_0x38 = |
967 | { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }, | 973 | { "Wacom PL510", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 0, PL }; |
968 | { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }, | 974 | static const struct wacom_features wacom_features_0x39 = |
969 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }, | 975 | { "Wacom DTU710", WACOM_PKGLEN_GRAPHIRE, 34080, 27660, 511, 0, PL }; |
976 | static const struct wacom_features wacom_features_0xC4 = | ||
977 | { "Wacom DTF521", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 0, PL }; | ||
978 | static const struct wacom_features wacom_features_0xC0 = | ||
979 | { "Wacom DTF720", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 0, PL }; | ||
980 | static const struct wacom_features wacom_features_0xC2 = | ||
981 | { "Wacom DTF720a", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 0, PL }; | ||
982 | static const struct wacom_features wacom_features_0x03 = | ||
983 | { "Wacom Cintiq Partner", WACOM_PKGLEN_GRAPHIRE, 20480, 15360, 511, 0, PTU }; | ||
984 | static const struct wacom_features wacom_features_0x41 = | ||
985 | { "Wacom Intuos2 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 31, INTUOS }; | ||
986 | static const struct wacom_features wacom_features_0x42 = | ||
987 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; | ||
988 | static const struct wacom_features wacom_features_0x43 = | ||
989 | { "Wacom Intuos2 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 31, INTUOS }; | ||
990 | static const struct wacom_features wacom_features_0x44 = | ||
991 | { "Wacom Intuos2 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 31, INTUOS }; | ||
992 | static const struct wacom_features wacom_features_0x45 = | ||
993 | { "Wacom Intuos2 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 31, INTUOS }; | ||
994 | static const struct wacom_features wacom_features_0xB0 = | ||
995 | { "Wacom Intuos3 4x5", WACOM_PKGLEN_INTUOS, 25400, 20320, 1023, 63, INTUOS3S }; | ||
996 | static const struct wacom_features wacom_features_0xB1 = | ||
997 | { "Wacom Intuos3 6x8", WACOM_PKGLEN_INTUOS, 40640, 30480, 1023, 63, INTUOS3 }; | ||
998 | static const struct wacom_features wacom_features_0xB2 = | ||
999 | { "Wacom Intuos3 9x12", WACOM_PKGLEN_INTUOS, 60960, 45720, 1023, 63, INTUOS3 }; | ||
1000 | static const struct wacom_features wacom_features_0xB3 = | ||
1001 | { "Wacom Intuos3 12x12", WACOM_PKGLEN_INTUOS, 60960, 60960, 1023, 63, INTUOS3L }; | ||
1002 | static const struct wacom_features wacom_features_0xB4 = | ||
1003 | { "Wacom Intuos3 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 1023, 63, INTUOS3L }; | ||
1004 | static const struct wacom_features wacom_features_0xB5 = | ||
1005 | { "Wacom Intuos3 6x11", WACOM_PKGLEN_INTUOS, 54204, 31750, 1023, 63, INTUOS3 }; | ||
1006 | static const struct wacom_features wacom_features_0xB7 = | ||
1007 | { "Wacom Intuos3 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 1023, 63, INTUOS3S }; | ||
1008 | static const struct wacom_features wacom_features_0xB8 = | ||
1009 | { "Wacom Intuos4 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 63, INTUOS4S }; | ||
1010 | static const struct wacom_features wacom_features_0xB9 = | ||
1011 | { "Wacom Intuos4 6x9", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 63, INTUOS4 }; | ||
1012 | static const struct wacom_features wacom_features_0xBA = | ||
1013 | { "Wacom Intuos4 8x13", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, 63, INTUOS4L }; | ||
1014 | static const struct wacom_features wacom_features_0xBB = | ||
1015 | { "Wacom Intuos4 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 2047, 63, INTUOS4L }; | ||
1016 | static const struct wacom_features wacom_features_0x3F = | ||
1017 | { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, 63, CINTIQ }; | ||
1018 | static const struct wacom_features wacom_features_0xC5 = | ||
1019 | { "Wacom Cintiq 20WSX", WACOM_PKGLEN_INTUOS, 86680, 54180, 1023, 63, WACOM_BEE }; | ||
1020 | static const struct wacom_features wacom_features_0xC6 = | ||
1021 | { "Wacom Cintiq 12WX", WACOM_PKGLEN_INTUOS, 53020, 33440, 1023, 63, WACOM_BEE }; | ||
1022 | static const struct wacom_features wacom_features_0xC7 = | ||
1023 | { "Wacom DTU1931", WACOM_PKGLEN_GRAPHIRE, 37832, 30305, 511, 0, PL }; | ||
1024 | static const struct wacom_features wacom_features_0x90 = | ||
1025 | { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; | ||
1026 | static const struct wacom_features wacom_features_0x93 = | ||
1027 | { "Wacom ISDv4 93", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; | ||
1028 | static const struct wacom_features wacom_features_0x9A = | ||
1029 | { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; | ||
1030 | static const struct wacom_features wacom_features_0x9F = | ||
1031 | { "Wacom ISDv4 9F", WACOM_PKGLEN_PENABLED, 26202, 16325, 255, 0, TABLETPC }; | ||
1032 | static const struct wacom_features wacom_features_0xE2 = | ||
1033 | { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; | ||
1034 | static const struct wacom_features wacom_features_0xE3 = | ||
1035 | { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; | ||
1036 | static const struct wacom_features wacom_features_0x47 = | ||
1037 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; | ||
1038 | |||
1039 | #define USB_DEVICE_WACOM(prod) \ | ||
1040 | USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ | ||
1041 | .driver_info = (kernel_ulong_t)&wacom_features_##prod | ||
1042 | |||
1043 | const struct usb_device_id wacom_ids[] = { | ||
1044 | { USB_DEVICE_WACOM(0x00) }, | ||
1045 | { USB_DEVICE_WACOM(0x10) }, | ||
1046 | { USB_DEVICE_WACOM(0x11) }, | ||
1047 | { USB_DEVICE_WACOM(0x12) }, | ||
1048 | { USB_DEVICE_WACOM(0x13) }, | ||
1049 | { USB_DEVICE_WACOM(0x14) }, | ||
1050 | { USB_DEVICE_WACOM(0x15) }, | ||
1051 | { USB_DEVICE_WACOM(0x16) }, | ||
1052 | { USB_DEVICE_WACOM(0x17) }, | ||
1053 | { USB_DEVICE_WACOM(0x18) }, | ||
1054 | { USB_DEVICE_WACOM(0x19) }, | ||
1055 | { USB_DEVICE_WACOM(0x60) }, | ||
1056 | { USB_DEVICE_WACOM(0x61) }, | ||
1057 | { USB_DEVICE_WACOM(0x62) }, | ||
1058 | { USB_DEVICE_WACOM(0x63) }, | ||
1059 | { USB_DEVICE_WACOM(0x64) }, | ||
1060 | { USB_DEVICE_WACOM(0x65) }, | ||
1061 | { USB_DEVICE_WACOM(0x69) }, | ||
1062 | { USB_DEVICE_WACOM(0x20) }, | ||
1063 | { USB_DEVICE_WACOM(0x21) }, | ||
1064 | { USB_DEVICE_WACOM(0x22) }, | ||
1065 | { USB_DEVICE_WACOM(0x23) }, | ||
1066 | { USB_DEVICE_WACOM(0x24) }, | ||
1067 | { USB_DEVICE_WACOM(0x30) }, | ||
1068 | { USB_DEVICE_WACOM(0x31) }, | ||
1069 | { USB_DEVICE_WACOM(0x32) }, | ||
1070 | { USB_DEVICE_WACOM(0x33) }, | ||
1071 | { USB_DEVICE_WACOM(0x34) }, | ||
1072 | { USB_DEVICE_WACOM(0x35) }, | ||
1073 | { USB_DEVICE_WACOM(0x37) }, | ||
1074 | { USB_DEVICE_WACOM(0x38) }, | ||
1075 | { USB_DEVICE_WACOM(0x39) }, | ||
1076 | { USB_DEVICE_WACOM(0xC4) }, | ||
1077 | { USB_DEVICE_WACOM(0xC0) }, | ||
1078 | { USB_DEVICE_WACOM(0xC2) }, | ||
1079 | { USB_DEVICE_WACOM(0x03) }, | ||
1080 | { USB_DEVICE_WACOM(0x41) }, | ||
1081 | { USB_DEVICE_WACOM(0x42) }, | ||
1082 | { USB_DEVICE_WACOM(0x43) }, | ||
1083 | { USB_DEVICE_WACOM(0x44) }, | ||
1084 | { USB_DEVICE_WACOM(0x45) }, | ||
1085 | { USB_DEVICE_WACOM(0xB0) }, | ||
1086 | { USB_DEVICE_WACOM(0xB1) }, | ||
1087 | { USB_DEVICE_WACOM(0xB2) }, | ||
1088 | { USB_DEVICE_WACOM(0xB3) }, | ||
1089 | { USB_DEVICE_WACOM(0xB4) }, | ||
1090 | { USB_DEVICE_WACOM(0xB5) }, | ||
1091 | { USB_DEVICE_WACOM(0xB7) }, | ||
1092 | { USB_DEVICE_WACOM(0xB8) }, | ||
1093 | { USB_DEVICE_WACOM(0xB9) }, | ||
1094 | { USB_DEVICE_WACOM(0xBA) }, | ||
1095 | { USB_DEVICE_WACOM(0xBB) }, | ||
1096 | { USB_DEVICE_WACOM(0x3F) }, | ||
1097 | { USB_DEVICE_WACOM(0xC5) }, | ||
1098 | { USB_DEVICE_WACOM(0xC6) }, | ||
1099 | { USB_DEVICE_WACOM(0xC7) }, | ||
1100 | { USB_DEVICE_WACOM(0x90) }, | ||
1101 | { USB_DEVICE_WACOM(0x93) }, | ||
1102 | { USB_DEVICE_WACOM(0x9A) }, | ||
1103 | { USB_DEVICE_WACOM(0x9F) }, | ||
1104 | { USB_DEVICE_WACOM(0xE2) }, | ||
1105 | { USB_DEVICE_WACOM(0xE3) }, | ||
1106 | { USB_DEVICE_WACOM(0x47) }, | ||
970 | { } | 1107 | { } |
971 | }; | 1108 | }; |
972 | |||
973 | static struct usb_device_id wacom_ids[] = { | ||
974 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x00) }, | ||
975 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x10) }, | ||
976 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x11) }, | ||
977 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) }, | ||
978 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) }, | ||
979 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) }, | ||
980 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) }, | ||
981 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, | ||
982 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, | ||
983 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, | ||
984 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x19) }, | ||
985 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, | ||
986 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, | ||
987 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, | ||
988 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) }, | ||
989 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) }, | ||
990 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x65) }, | ||
991 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x69) }, | ||
992 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) }, | ||
993 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) }, | ||
994 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) }, | ||
995 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x23) }, | ||
996 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x24) }, | ||
997 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x30) }, | ||
998 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x31) }, | ||
999 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x32) }, | ||
1000 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) }, | ||
1001 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) }, | ||
1002 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) }, | ||
1003 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) }, | ||
1004 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) }, | ||
1005 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) }, | ||
1006 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC4) }, | ||
1007 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) }, | ||
1008 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC2) }, | ||
1009 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) }, | ||
1010 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) }, | ||
1011 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) }, | ||
1012 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) }, | ||
1013 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) }, | ||
1014 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) }, | ||
1015 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, | ||
1016 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, | ||
1017 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, | ||
1018 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB3) }, | ||
1019 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB4) }, | ||
1020 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) }, | ||
1021 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB7) }, | ||
1022 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB8) }, | ||
1023 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB9) }, | ||
1024 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBA) }, | ||
1025 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBB) }, | ||
1026 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, | ||
1027 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, | ||
1028 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, | ||
1029 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC7) }, | ||
1030 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x90) }, | ||
1031 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x93) }, | ||
1032 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9A) }, | ||
1033 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9F) }, | ||
1034 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xE2) }, | ||
1035 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xE3) }, | ||
1036 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, | ||
1037 | { } | ||
1038 | }; | ||
1039 | |||
1040 | const struct usb_device_id *get_device_table(void) | ||
1041 | { | ||
1042 | const struct usb_device_id *id_table = wacom_ids; | ||
1043 | |||
1044 | return id_table; | ||
1045 | } | ||
1046 | |||
1047 | struct wacom_features * get_wacom_feature(const struct usb_device_id *id) | ||
1048 | { | ||
1049 | int index = id - wacom_ids; | ||
1050 | struct wacom_features *wf = &wacom_features[index]; | ||
1051 | |||
1052 | return wf; | ||
1053 | } | ||
1054 | |||
1055 | MODULE_DEVICE_TABLE(usb, wacom_ids); | 1109 | MODULE_DEVICE_TABLE(usb, wacom_ids); |
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index ee01e1902785..8590b1e8ec37 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
@@ -15,11 +15,11 @@ | |||
15 | /* packet length for individual models */ | 15 | /* packet length for individual models */ |
16 | #define WACOM_PKGLEN_PENPRTN 7 | 16 | #define WACOM_PKGLEN_PENPRTN 7 |
17 | #define WACOM_PKGLEN_GRAPHIRE 8 | 17 | #define WACOM_PKGLEN_GRAPHIRE 8 |
18 | #define WACOM_PKGLEN_BBFUN 9 | 18 | #define WACOM_PKGLEN_BBFUN 9 |
19 | #define WACOM_PKGLEN_INTUOS 10 | 19 | #define WACOM_PKGLEN_INTUOS 10 |
20 | #define WACOM_PKGLEN_PENABLED 8 | 20 | #define WACOM_PKGLEN_PENABLED 8 |
21 | #define WACOM_PKGLEN_TPC1FG 5 | 21 | #define WACOM_PKGLEN_TPC1FG 5 |
22 | #define WACOM_PKGLEN_TPC2FG 14 | 22 | #define WACOM_PKGLEN_TPC2FG 14 |
23 | 23 | ||
24 | /* device IDs */ | 24 | /* device IDs */ |
25 | #define STYLUS_DEVICE_ID 0x02 | 25 | #define STYLUS_DEVICE_ID 0x02 |
@@ -58,7 +58,7 @@ enum { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | struct wacom_features { | 60 | struct wacom_features { |
61 | char *name; | 61 | const char *name; |
62 | int pktlen; | 62 | int pktlen; |
63 | int x_max; | 63 | int x_max; |
64 | int y_max; | 64 | int y_max; |
@@ -73,11 +73,12 @@ struct wacom_features { | |||
73 | }; | 73 | }; |
74 | 74 | ||
75 | struct wacom_wac { | 75 | struct wacom_wac { |
76 | char name[64]; | ||
76 | unsigned char *data; | 77 | unsigned char *data; |
77 | int tool[2]; | 78 | int tool[2]; |
78 | int id[2]; | 79 | int id[2]; |
79 | __u32 serial[2]; | 80 | __u32 serial[2]; |
80 | struct wacom_features *features; | 81 | struct wacom_features features; |
81 | }; | 82 | }; |
82 | 83 | ||
83 | #endif | 84 | #endif |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index dfafc76da4fb..6457e060ae49 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -90,7 +90,6 @@ config TOUCHSCREEN_CORGI | |||
90 | tristate "SharpSL (Corgi and Spitz series) touchscreen driver (DEPRECATED)" | 90 | tristate "SharpSL (Corgi and Spitz series) touchscreen driver (DEPRECATED)" |
91 | depends on PXA_SHARPSL | 91 | depends on PXA_SHARPSL |
92 | select CORGI_SSP_DEPRECATED | 92 | select CORGI_SSP_DEPRECATED |
93 | default y | ||
94 | help | 93 | help |
95 | Say Y here to enable the driver for the touchscreen on the | 94 | Say Y here to enable the driver for the touchscreen on the |
96 | Sharp SL-C7xx and SL-Cxx00 series of PDAs. | 95 | Sharp SL-C7xx and SL-Cxx00 series of PDAs. |
@@ -537,6 +536,11 @@ config TOUCHSCREEN_USB_ETT_TC5UH | |||
537 | bool "ET&T TC5UH touchscreen controler support" if EMBEDDED | 536 | bool "ET&T TC5UH touchscreen controler support" if EMBEDDED |
538 | depends on TOUCHSCREEN_USB_COMPOSITE | 537 | depends on TOUCHSCREEN_USB_COMPOSITE |
539 | 538 | ||
539 | config TOUCHSCREEN_USB_NEXIO | ||
540 | default y | ||
541 | bool "NEXIO/iNexio device support" if EMBEDDED | ||
542 | depends on TOUCHSCREEN_USB_COMPOSITE | ||
543 | |||
540 | config TOUCHSCREEN_TOUCHIT213 | 544 | config TOUCHSCREEN_TOUCHIT213 |
541 | tristate "Sahara TouchIT-213 touchscreen" | 545 | tristate "Sahara TouchIT-213 touchscreen" |
542 | select SERIO | 546 | select SERIO |
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 52d2ca147d8f..8b05d8e97543 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/spi/spi.h> | 28 | #include <linux/spi/spi.h> |
29 | #include <linux/spi/ads7846.h> | 29 | #include <linux/spi/ads7846.h> |
30 | #include <linux/regulator/consumer.h> | ||
30 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
31 | 32 | ||
32 | /* | 33 | /* |
@@ -85,6 +86,7 @@ struct ads7846 { | |||
85 | char name[32]; | 86 | char name[32]; |
86 | 87 | ||
87 | struct spi_device *spi; | 88 | struct spi_device *spi; |
89 | struct regulator *reg; | ||
88 | 90 | ||
89 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) | 91 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) |
90 | struct attribute_group *attr_group; | 92 | struct attribute_group *attr_group; |
@@ -788,6 +790,8 @@ static void ads7846_disable(struct ads7846 *ts) | |||
788 | } | 790 | } |
789 | } | 791 | } |
790 | 792 | ||
793 | regulator_disable(ts->reg); | ||
794 | |||
791 | /* we know the chip's in lowpower mode since we always | 795 | /* we know the chip's in lowpower mode since we always |
792 | * leave it that way after every request | 796 | * leave it that way after every request |
793 | */ | 797 | */ |
@@ -799,6 +803,8 @@ static void ads7846_enable(struct ads7846 *ts) | |||
799 | if (!ts->disabled) | 803 | if (!ts->disabled) |
800 | return; | 804 | return; |
801 | 805 | ||
806 | regulator_enable(ts->reg); | ||
807 | |||
802 | ts->disabled = 0; | 808 | ts->disabled = 0; |
803 | ts->irq_disabled = 0; | 809 | ts->irq_disabled = 0; |
804 | enable_irq(ts->spi->irq); | 810 | enable_irq(ts->spi->irq); |
@@ -1139,6 +1145,19 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1139 | 1145 | ||
1140 | ts->last_msg = m; | 1146 | ts->last_msg = m; |
1141 | 1147 | ||
1148 | ts->reg = regulator_get(&spi->dev, "vcc"); | ||
1149 | if (IS_ERR(ts->reg)) { | ||
1150 | dev_err(&spi->dev, "unable to get regulator: %ld\n", | ||
1151 | PTR_ERR(ts->reg)); | ||
1152 | goto err_free_gpio; | ||
1153 | } | ||
1154 | |||
1155 | err = regulator_enable(ts->reg); | ||
1156 | if (err) { | ||
1157 | dev_err(&spi->dev, "unable to enable regulator: %d\n", err); | ||
1158 | goto err_put_regulator; | ||
1159 | } | ||
1160 | |||
1142 | if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING, | 1161 | if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING, |
1143 | spi->dev.driver->name, ts)) { | 1162 | spi->dev.driver->name, ts)) { |
1144 | dev_info(&spi->dev, | 1163 | dev_info(&spi->dev, |
@@ -1148,7 +1167,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1148 | spi->dev.driver->name, ts); | 1167 | spi->dev.driver->name, ts); |
1149 | if (err) { | 1168 | if (err) { |
1150 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); | 1169 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); |
1151 | goto err_free_gpio; | 1170 | goto err_disable_regulator; |
1152 | } | 1171 | } |
1153 | } | 1172 | } |
1154 | 1173 | ||
@@ -1180,6 +1199,10 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1180 | ads784x_hwmon_unregister(spi, ts); | 1199 | ads784x_hwmon_unregister(spi, ts); |
1181 | err_free_irq: | 1200 | err_free_irq: |
1182 | free_irq(spi->irq, ts); | 1201 | free_irq(spi->irq, ts); |
1202 | err_disable_regulator: | ||
1203 | regulator_disable(ts->reg); | ||
1204 | err_put_regulator: | ||
1205 | regulator_put(ts->reg); | ||
1183 | err_free_gpio: | 1206 | err_free_gpio: |
1184 | if (ts->gpio_pendown != -1) | 1207 | if (ts->gpio_pendown != -1) |
1185 | gpio_free(ts->gpio_pendown); | 1208 | gpio_free(ts->gpio_pendown); |
@@ -1208,6 +1231,9 @@ static int __devexit ads7846_remove(struct spi_device *spi) | |||
1208 | /* suspend left the IRQ disabled */ | 1231 | /* suspend left the IRQ disabled */ |
1209 | enable_irq(ts->spi->irq); | 1232 | enable_irq(ts->spi->irq); |
1210 | 1233 | ||
1234 | regulator_disable(ts->reg); | ||
1235 | regulator_put(ts->reg); | ||
1236 | |||
1211 | if (ts->gpio_pendown != -1) | 1237 | if (ts->gpio_pendown != -1) |
1212 | gpio_free(ts->gpio_pendown); | 1238 | gpio_free(ts->gpio_pendown); |
1213 | 1239 | ||
diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c index 8f38c5e55ce6..486d31ba9c09 100644 --- a/drivers/input/touchscreen/elo.c +++ b/drivers/input/touchscreen/elo.c | |||
@@ -72,45 +72,49 @@ static void elo_process_data_10(struct elo *elo, unsigned char data) | |||
72 | struct input_dev *dev = elo->dev; | 72 | struct input_dev *dev = elo->dev; |
73 | 73 | ||
74 | elo->data[elo->idx] = data; | 74 | elo->data[elo->idx] = data; |
75 | switch (elo->idx++) { | ||
76 | case 0: | ||
77 | elo->csum = 0xaa; | ||
78 | if (data != ELO10_LEAD_BYTE) { | ||
79 | pr_debug("elo: unsynchronized data: 0x%02x\n", data); | ||
80 | elo->idx = 0; | ||
81 | } | ||
82 | break; | ||
83 | 75 | ||
84 | case 9: | 76 | switch (elo->idx++) { |
77 | case 0: | ||
78 | elo->csum = 0xaa; | ||
79 | if (data != ELO10_LEAD_BYTE) { | ||
80 | dev_dbg(&elo->serio->dev, | ||
81 | "unsynchronized data: 0x%02x\n", data); | ||
85 | elo->idx = 0; | 82 | elo->idx = 0; |
86 | if (data != elo->csum) { | 83 | } |
87 | pr_debug("elo: bad checksum: 0x%02x, expected 0x%02x\n", | 84 | break; |
88 | data, elo->csum); | 85 | |
89 | break; | 86 | case 9: |
90 | } | 87 | elo->idx = 0; |
91 | if (elo->data[1] != elo->expected_packet) { | 88 | if (data != elo->csum) { |
92 | if (elo->data[1] != ELO10_TOUCH_PACKET) | 89 | dev_dbg(&elo->serio->dev, |
93 | pr_debug("elo: unexpected packet: 0x%02x\n", | 90 | "bad checksum: 0x%02x, expected 0x%02x\n", |
94 | elo->data[1]); | 91 | data, elo->csum); |
95 | break; | 92 | break; |
96 | } | 93 | } |
97 | if (likely(elo->data[1] == ELO10_TOUCH_PACKET)) { | 94 | if (elo->data[1] != elo->expected_packet) { |
98 | input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]); | 95 | if (elo->data[1] != ELO10_TOUCH_PACKET) |
99 | input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]); | 96 | dev_dbg(&elo->serio->dev, |
100 | if (elo->data[2] & ELO10_PRESSURE) | 97 | "unexpected packet: 0x%02x\n", |
101 | input_report_abs(dev, ABS_PRESSURE, | 98 | elo->data[1]); |
102 | (elo->data[8] << 8) | elo->data[7]); | ||
103 | input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH); | ||
104 | input_sync(dev); | ||
105 | } else if (elo->data[1] == ELO10_ACK_PACKET) { | ||
106 | if (elo->data[2] == '0') | ||
107 | elo->expected_packet = ELO10_TOUCH_PACKET; | ||
108 | complete(&elo->cmd_done); | ||
109 | } else { | ||
110 | memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN); | ||
111 | elo->expected_packet = ELO10_ACK_PACKET; | ||
112 | } | ||
113 | break; | 99 | break; |
100 | } | ||
101 | if (likely(elo->data[1] == ELO10_TOUCH_PACKET)) { | ||
102 | input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]); | ||
103 | input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]); | ||
104 | if (elo->data[2] & ELO10_PRESSURE) | ||
105 | input_report_abs(dev, ABS_PRESSURE, | ||
106 | (elo->data[8] << 8) | elo->data[7]); | ||
107 | input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH); | ||
108 | input_sync(dev); | ||
109 | } else if (elo->data[1] == ELO10_ACK_PACKET) { | ||
110 | if (elo->data[2] == '0') | ||
111 | elo->expected_packet = ELO10_TOUCH_PACKET; | ||
112 | complete(&elo->cmd_done); | ||
113 | } else { | ||
114 | memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN); | ||
115 | elo->expected_packet = ELO10_ACK_PACKET; | ||
116 | } | ||
117 | break; | ||
114 | } | 118 | } |
115 | elo->csum += data; | 119 | elo->csum += data; |
116 | } | 120 | } |
@@ -123,42 +127,53 @@ static void elo_process_data_6(struct elo *elo, unsigned char data) | |||
123 | 127 | ||
124 | switch (elo->idx++) { | 128 | switch (elo->idx++) { |
125 | 129 | ||
126 | case 0: if ((data & 0xc0) != 0xc0) elo->idx = 0; break; | 130 | case 0: |
127 | case 1: if ((data & 0xc0) != 0x80) elo->idx = 0; break; | 131 | if ((data & 0xc0) != 0xc0) |
128 | case 2: if ((data & 0xc0) != 0x40) elo->idx = 0; break; | 132 | elo->idx = 0; |
129 | 133 | break; | |
130 | case 3: | ||
131 | if (data & 0xc0) { | ||
132 | elo->idx = 0; | ||
133 | break; | ||
134 | } | ||
135 | 134 | ||
136 | input_report_abs(dev, ABS_X, ((elo->data[0] & 0x3f) << 6) | (elo->data[1] & 0x3f)); | 135 | case 1: |
137 | input_report_abs(dev, ABS_Y, ((elo->data[2] & 0x3f) << 6) | (elo->data[3] & 0x3f)); | 136 | if ((data & 0xc0) != 0x80) |
137 | elo->idx = 0; | ||
138 | break; | ||
138 | 139 | ||
139 | if (elo->id == 2) { | 140 | case 2: |
140 | input_report_key(dev, BTN_TOUCH, 1); | 141 | if ((data & 0xc0) != 0x40) |
141 | input_sync(dev); | 142 | elo->idx = 0; |
142 | elo->idx = 0; | 143 | break; |
143 | } | ||
144 | 144 | ||
145 | case 3: | ||
146 | if (data & 0xc0) { | ||
147 | elo->idx = 0; | ||
145 | break; | 148 | break; |
149 | } | ||
146 | 150 | ||
147 | case 4: | 151 | input_report_abs(dev, ABS_X, ((elo->data[0] & 0x3f) << 6) | (elo->data[1] & 0x3f)); |
148 | if (data) { | 152 | input_report_abs(dev, ABS_Y, ((elo->data[2] & 0x3f) << 6) | (elo->data[3] & 0x3f)); |
149 | input_sync(dev); | ||
150 | elo->idx = 0; | ||
151 | } | ||
152 | break; | ||
153 | 153 | ||
154 | case 5: | 154 | if (elo->id == 2) { |
155 | if ((data & 0xf0) == 0) { | 155 | input_report_key(dev, BTN_TOUCH, 1); |
156 | input_report_abs(dev, ABS_PRESSURE, elo->data[5]); | ||
157 | input_report_key(dev, BTN_TOUCH, !!elo->data[5]); | ||
158 | } | ||
159 | input_sync(dev); | 156 | input_sync(dev); |
160 | elo->idx = 0; | 157 | elo->idx = 0; |
161 | break; | 158 | } |
159 | |||
160 | break; | ||
161 | |||
162 | case 4: | ||
163 | if (data) { | ||
164 | input_sync(dev); | ||
165 | elo->idx = 0; | ||
166 | } | ||
167 | break; | ||
168 | |||
169 | case 5: | ||
170 | if ((data & 0xf0) == 0) { | ||
171 | input_report_abs(dev, ABS_PRESSURE, elo->data[5]); | ||
172 | input_report_key(dev, BTN_TOUCH, !!elo->data[5]); | ||
173 | } | ||
174 | input_sync(dev); | ||
175 | elo->idx = 0; | ||
176 | break; | ||
162 | } | 177 | } |
163 | } | 178 | } |
164 | 179 | ||
@@ -170,17 +185,17 @@ static void elo_process_data_3(struct elo *elo, unsigned char data) | |||
170 | 185 | ||
171 | switch (elo->idx++) { | 186 | switch (elo->idx++) { |
172 | 187 | ||
173 | case 0: | 188 | case 0: |
174 | if ((data & 0x7f) != 0x01) | 189 | if ((data & 0x7f) != 0x01) |
175 | elo->idx = 0; | ||
176 | break; | ||
177 | case 2: | ||
178 | input_report_key(dev, BTN_TOUCH, !(elo->data[1] & 0x80)); | ||
179 | input_report_abs(dev, ABS_X, elo->data[1]); | ||
180 | input_report_abs(dev, ABS_Y, elo->data[2]); | ||
181 | input_sync(dev); | ||
182 | elo->idx = 0; | 190 | elo->idx = 0; |
183 | break; | 191 | break; |
192 | case 2: | ||
193 | input_report_key(dev, BTN_TOUCH, !(elo->data[1] & 0x80)); | ||
194 | input_report_abs(dev, ABS_X, elo->data[1]); | ||
195 | input_report_abs(dev, ABS_Y, elo->data[2]); | ||
196 | input_sync(dev); | ||
197 | elo->idx = 0; | ||
198 | break; | ||
184 | } | 199 | } |
185 | } | 200 | } |
186 | 201 | ||
@@ -189,19 +204,19 @@ static irqreturn_t elo_interrupt(struct serio *serio, | |||
189 | { | 204 | { |
190 | struct elo *elo = serio_get_drvdata(serio); | 205 | struct elo *elo = serio_get_drvdata(serio); |
191 | 206 | ||
192 | switch(elo->id) { | 207 | switch (elo->id) { |
193 | case 0: | 208 | case 0: |
194 | elo_process_data_10(elo, data); | 209 | elo_process_data_10(elo, data); |
195 | break; | 210 | break; |
196 | 211 | ||
197 | case 1: | 212 | case 1: |
198 | case 2: | 213 | case 2: |
199 | elo_process_data_6(elo, data); | 214 | elo_process_data_6(elo, data); |
200 | break; | 215 | break; |
201 | 216 | ||
202 | case 3: | 217 | case 3: |
203 | elo_process_data_3(elo, data); | 218 | elo_process_data_3(elo, data); |
204 | break; | 219 | break; |
205 | } | 220 | } |
206 | 221 | ||
207 | return IRQ_HANDLED; | 222 | return IRQ_HANDLED; |
@@ -261,10 +276,10 @@ static int elo_setup_10(struct elo *elo) | |||
261 | if (packet[3] & ELO10_PRESSURE) | 276 | if (packet[3] & ELO10_PRESSURE) |
262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); | 277 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); |
263 | 278 | ||
264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " | 279 | dev_info(&elo->serio->dev, |
265 | "features: 0x%02x, controller: 0x%02x\n", | 280 | "%sTouch touchscreen, fw: %02x.%02x, features: 0x%02x, controller: 0x%02x\n", |
266 | elo_types[(packet[1] -'0') & 0x03], | 281 | elo_types[(packet[1] -'0') & 0x03], |
267 | packet[5], packet[4], packet[3], packet[7]); | 282 | packet[5], packet[4], packet[3], packet[7]); |
268 | 283 | ||
269 | return 0; | 284 | return 0; |
270 | } | 285 | } |
@@ -330,24 +345,24 @@ static int elo_connect(struct serio *serio, struct serio_driver *drv) | |||
330 | 345 | ||
331 | switch (elo->id) { | 346 | switch (elo->id) { |
332 | 347 | ||
333 | case 0: /* 10-byte protocol */ | 348 | case 0: /* 10-byte protocol */ |
334 | if (elo_setup_10(elo)) | 349 | if (elo_setup_10(elo)) |
335 | goto fail3; | 350 | goto fail3; |
336 | 351 | ||
337 | break; | 352 | break; |
338 | 353 | ||
339 | case 1: /* 6-byte protocol */ | 354 | case 1: /* 6-byte protocol */ |
340 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); | 355 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); |
341 | 356 | ||
342 | case 2: /* 4-byte protocol */ | 357 | case 2: /* 4-byte protocol */ |
343 | input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); | 358 | input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); |
344 | input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); | 359 | input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); |
345 | break; | 360 | break; |
346 | 361 | ||
347 | case 3: /* 3-byte protocol */ | 362 | case 3: /* 3-byte protocol */ |
348 | input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); | 363 | input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); |
349 | input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); | 364 | input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); |
350 | break; | 365 | break; |
351 | } | 366 | } |
352 | 367 | ||
353 | err = input_register_device(elo->dev); | 368 | err = input_register_device(elo->dev); |
diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c b/drivers/input/touchscreen/mainstone-wm97xx.c index 6cdcf2a6e036..b6b8b1c7ecea 100644 --- a/drivers/input/touchscreen/mainstone-wm97xx.c +++ b/drivers/input/touchscreen/mainstone-wm97xx.c | |||
@@ -153,6 +153,9 @@ static int wm97xx_acc_pen_down(struct wm97xx *wm) | |||
153 | if (pressure) | 153 | if (pressure) |
154 | p = MODR; | 154 | p = MODR; |
155 | 155 | ||
156 | dev_dbg(wm->dev, "Raw coordinates: x=%x, y=%x, p=%x\n", | ||
157 | x, y, p); | ||
158 | |||
156 | /* are samples valid */ | 159 | /* are samples valid */ |
157 | if ((x & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_X || | 160 | if ((x & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_X || |
158 | (y & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_Y || | 161 | (y & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_Y || |
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c index 6386b441ef85..3755a47d053c 100644 --- a/drivers/input/touchscreen/s3c2410_ts.c +++ b/drivers/input/touchscreen/s3c2410_ts.c | |||
@@ -128,27 +128,29 @@ static void touch_timer_fire(unsigned long data) | |||
128 | 128 | ||
129 | down = get_down(data0, data1); | 129 | down = get_down(data0, data1); |
130 | 130 | ||
131 | if (ts.count == (1 << ts.shift)) { | 131 | if (down) { |
132 | ts.xp >>= ts.shift; | 132 | if (ts.count == (1 << ts.shift)) { |
133 | ts.yp >>= ts.shift; | 133 | ts.xp >>= ts.shift; |
134 | ts.yp >>= ts.shift; | ||
134 | 135 | ||
135 | dev_dbg(ts.dev, "%s: X=%lu, Y=%lu, count=%d\n", | 136 | dev_dbg(ts.dev, "%s: X=%lu, Y=%lu, count=%d\n", |
136 | __func__, ts.xp, ts.yp, ts.count); | 137 | __func__, ts.xp, ts.yp, ts.count); |
137 | 138 | ||
138 | input_report_abs(ts.input, ABS_X, ts.xp); | 139 | input_report_abs(ts.input, ABS_X, ts.xp); |
139 | input_report_abs(ts.input, ABS_Y, ts.yp); | 140 | input_report_abs(ts.input, ABS_Y, ts.yp); |
140 | 141 | ||
141 | input_report_key(ts.input, BTN_TOUCH, 1); | 142 | input_report_key(ts.input, BTN_TOUCH, 1); |
142 | input_sync(ts.input); | 143 | input_sync(ts.input); |
143 | 144 | ||
144 | ts.xp = 0; | 145 | ts.xp = 0; |
145 | ts.yp = 0; | 146 | ts.yp = 0; |
146 | ts.count = 0; | 147 | ts.count = 0; |
147 | } | 148 | } |
148 | 149 | ||
149 | if (down) { | ||
150 | s3c_adc_start(ts.client, 0, 1 << ts.shift); | 150 | s3c_adc_start(ts.client, 0, 1 << ts.shift); |
151 | } else { | 151 | } else { |
152 | ts.xp = 0; | ||
153 | ts.yp = 0; | ||
152 | ts.count = 0; | 154 | ts.count = 0; |
153 | 155 | ||
154 | input_report_key(ts.input, BTN_TOUCH, 0); | 156 | input_report_key(ts.input, BTN_TOUCH, 0); |
@@ -401,6 +403,7 @@ static int s3c2410ts_resume(struct device *dev) | |||
401 | struct s3c2410_ts_mach_info *info = pdev->dev.platform_data; | 403 | struct s3c2410_ts_mach_info *info = pdev->dev.platform_data; |
402 | 404 | ||
403 | clk_enable(ts.clock); | 405 | clk_enable(ts.clock); |
406 | enable_irq(ts.irq_tc); | ||
404 | 407 | ||
405 | /* Initialise registers */ | 408 | /* Initialise registers */ |
406 | if ((info->delay & 0xffff) > 0) | 409 | if ((info->delay & 0xffff) > 0) |
diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c index 7ef0d1420d3c..be23780e8a3e 100644 --- a/drivers/input/touchscreen/tsc2007.c +++ b/drivers/input/touchscreen/tsc2007.c | |||
@@ -358,7 +358,7 @@ static int __devexit tsc2007_remove(struct i2c_client *client) | |||
358 | return 0; | 358 | return 0; |
359 | } | 359 | } |
360 | 360 | ||
361 | static struct i2c_device_id tsc2007_idtable[] = { | 361 | static const struct i2c_device_id tsc2007_idtable[] = { |
362 | { "tsc2007", 0 }, | 362 | { "tsc2007", 0 }, |
363 | { } | 363 | { } |
364 | }; | 364 | }; |
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 5256123a5228..99330bbdbac7 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c | |||
@@ -15,6 +15,7 @@ | |||
15 | * - GoTop Super_Q2/GogoPen/PenPower tablets | 15 | * - GoTop Super_Q2/GogoPen/PenPower tablets |
16 | * - JASTEC USB touch controller/DigiTech DTR-02U | 16 | * - JASTEC USB touch controller/DigiTech DTR-02U |
17 | * - Zytronic capacitive touchscreen | 17 | * - Zytronic capacitive touchscreen |
18 | * - NEXIO/iNexio | ||
18 | * | 19 | * |
19 | * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@gmx.ch> | 20 | * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@gmx.ch> |
20 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) | 21 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) |
@@ -95,6 +96,7 @@ struct usbtouch_device_info { | |||
95 | 96 | ||
96 | int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); | 97 | int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); |
97 | int (*init) (struct usbtouch_usb *usbtouch); | 98 | int (*init) (struct usbtouch_usb *usbtouch); |
99 | void (*exit) (struct usbtouch_usb *usbtouch); | ||
98 | }; | 100 | }; |
99 | 101 | ||
100 | /* a usbtouch device */ | 102 | /* a usbtouch device */ |
@@ -104,11 +106,12 @@ struct usbtouch_usb { | |||
104 | unsigned char *buffer; | 106 | unsigned char *buffer; |
105 | int buf_len; | 107 | int buf_len; |
106 | struct urb *irq; | 108 | struct urb *irq; |
107 | struct usb_device *udev; | 109 | struct usb_interface *interface; |
108 | struct input_dev *input; | 110 | struct input_dev *input; |
109 | struct usbtouch_device_info *type; | 111 | struct usbtouch_device_info *type; |
110 | char name[128]; | 112 | char name[128]; |
111 | char phys[64]; | 113 | char phys[64]; |
114 | void *priv; | ||
112 | 115 | ||
113 | int x, y; | 116 | int x, y; |
114 | int touch, press; | 117 | int touch, press; |
@@ -133,6 +136,7 @@ enum { | |||
133 | DEVTYPE_E2I, | 136 | DEVTYPE_E2I, |
134 | DEVTYPE_ZYTRONIC, | 137 | DEVTYPE_ZYTRONIC, |
135 | DEVTYPE_TC5UH, | 138 | DEVTYPE_TC5UH, |
139 | DEVTYPE_NEXIO, | ||
136 | }; | 140 | }; |
137 | 141 | ||
138 | #define USB_DEVICE_HID_CLASS(vend, prod) \ | 142 | #define USB_DEVICE_HID_CLASS(vend, prod) \ |
@@ -144,7 +148,7 @@ enum { | |||
144 | .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ | 148 | .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ |
145 | .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE | 149 | .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE |
146 | 150 | ||
147 | static struct usb_device_id usbtouch_devices[] = { | 151 | static const struct usb_device_id usbtouch_devices[] = { |
148 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX | 152 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX |
149 | /* ignore the HID capable devices, handled by usbhid */ | 153 | /* ignore the HID capable devices, handled by usbhid */ |
150 | {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE}, | 154 | {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE}, |
@@ -222,6 +226,14 @@ static struct usb_device_id usbtouch_devices[] = { | |||
222 | {USB_DEVICE(0x0664, 0x0309), .driver_info = DEVTYPE_TC5UH}, | 226 | {USB_DEVICE(0x0664, 0x0309), .driver_info = DEVTYPE_TC5UH}, |
223 | #endif | 227 | #endif |
224 | 228 | ||
229 | #ifdef CONFIG_TOUCHSCREEN_USB_NEXIO | ||
230 | /* data interface only */ | ||
231 | {USB_DEVICE_AND_INTERFACE_INFO(0x10f0, 0x2002, 0x0a, 0x00, 0x00), | ||
232 | .driver_info = DEVTYPE_NEXIO}, | ||
233 | {USB_DEVICE_AND_INTERFACE_INFO(0x1870, 0x0001, 0x0a, 0x00, 0x00), | ||
234 | .driver_info = DEVTYPE_NEXIO}, | ||
235 | #endif | ||
236 | |||
225 | {} | 237 | {} |
226 | }; | 238 | }; |
227 | 239 | ||
@@ -234,8 +246,9 @@ static struct usb_device_id usbtouch_devices[] = { | |||
234 | static int e2i_init(struct usbtouch_usb *usbtouch) | 246 | static int e2i_init(struct usbtouch_usb *usbtouch) |
235 | { | 247 | { |
236 | int ret; | 248 | int ret; |
249 | struct usb_device *udev = interface_to_usbdev(usbtouch->interface); | ||
237 | 250 | ||
238 | ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), | 251 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
239 | 0x01, 0x02, 0x0000, 0x0081, | 252 | 0x01, 0x02, 0x0000, 0x0081, |
240 | NULL, 0, USB_CTRL_SET_TIMEOUT); | 253 | NULL, 0, USB_CTRL_SET_TIMEOUT); |
241 | 254 | ||
@@ -344,8 +357,9 @@ static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
344 | static int mtouch_init(struct usbtouch_usb *usbtouch) | 357 | static int mtouch_init(struct usbtouch_usb *usbtouch) |
345 | { | 358 | { |
346 | int ret, i; | 359 | int ret, i; |
360 | struct usb_device *udev = interface_to_usbdev(usbtouch->interface); | ||
347 | 361 | ||
348 | ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), | 362 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
349 | MTOUCHUSB_RESET, | 363 | MTOUCHUSB_RESET, |
350 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 364 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
351 | 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | 365 | 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); |
@@ -356,7 +370,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch) | |||
356 | msleep(150); | 370 | msleep(150); |
357 | 371 | ||
358 | for (i = 0; i < 3; i++) { | 372 | for (i = 0; i < 3; i++) { |
359 | ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), | 373 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
360 | MTOUCHUSB_ASYNC_REPORT, | 374 | MTOUCHUSB_ASYNC_REPORT, |
361 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 375 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
362 | 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); | 376 | 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); |
@@ -489,7 +503,7 @@ static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
489 | 503 | ||
490 | static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) | 504 | static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) |
491 | { | 505 | { |
492 | struct usb_device *dev = usbtouch->udev; | 506 | struct usb_device *dev = interface_to_usbdev(usbtouch->interface); |
493 | int ret = -ENOMEM; | 507 | int ret = -ENOMEM; |
494 | unsigned char *buf; | 508 | unsigned char *buf; |
495 | 509 | ||
@@ -690,6 +704,229 @@ static int zytronic_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
690 | #endif | 704 | #endif |
691 | 705 | ||
692 | /***************************************************************************** | 706 | /***************************************************************************** |
707 | * NEXIO Part | ||
708 | */ | ||
709 | #ifdef CONFIG_TOUCHSCREEN_USB_NEXIO | ||
710 | |||
711 | #define NEXIO_TIMEOUT 5000 | ||
712 | #define NEXIO_BUFSIZE 1024 | ||
713 | #define NEXIO_THRESHOLD 50 | ||
714 | |||
715 | struct nexio_priv { | ||
716 | struct urb *ack; | ||
717 | unsigned char *ack_buf; | ||
718 | }; | ||
719 | |||
720 | struct nexio_touch_packet { | ||
721 | u8 flags; /* 0xe1 = touch, 0xe1 = release */ | ||
722 | __be16 data_len; /* total bytes of touch data */ | ||
723 | __be16 x_len; /* bytes for X axis */ | ||
724 | __be16 y_len; /* bytes for Y axis */ | ||
725 | u8 data[]; | ||
726 | } __attribute__ ((packed)); | ||
727 | |||
728 | static unsigned char nexio_ack_pkt[2] = { 0xaa, 0x02 }; | ||
729 | static unsigned char nexio_init_pkt[4] = { 0x82, 0x04, 0x0a, 0x0f }; | ||
730 | |||
731 | static void nexio_ack_complete(struct urb *urb) | ||
732 | { | ||
733 | } | ||
734 | |||
735 | static int nexio_init(struct usbtouch_usb *usbtouch) | ||
736 | { | ||
737 | struct usb_device *dev = interface_to_usbdev(usbtouch->interface); | ||
738 | struct usb_host_interface *interface = usbtouch->interface->cur_altsetting; | ||
739 | struct nexio_priv *priv; | ||
740 | int ret = -ENOMEM; | ||
741 | int actual_len, i; | ||
742 | unsigned char *buf; | ||
743 | char *firmware_ver = NULL, *device_name = NULL; | ||
744 | int input_ep = 0, output_ep = 0; | ||
745 | |||
746 | /* find first input and output endpoint */ | ||
747 | for (i = 0; i < interface->desc.bNumEndpoints; i++) { | ||
748 | if (!input_ep && | ||
749 | usb_endpoint_dir_in(&interface->endpoint[i].desc)) | ||
750 | input_ep = interface->endpoint[i].desc.bEndpointAddress; | ||
751 | if (!output_ep && | ||
752 | usb_endpoint_dir_out(&interface->endpoint[i].desc)) | ||
753 | output_ep = interface->endpoint[i].desc.bEndpointAddress; | ||
754 | } | ||
755 | if (!input_ep || !output_ep) | ||
756 | return -ENXIO; | ||
757 | |||
758 | buf = kmalloc(NEXIO_BUFSIZE, GFP_KERNEL); | ||
759 | if (!buf) | ||
760 | goto out_buf; | ||
761 | |||
762 | /* two empty reads */ | ||
763 | for (i = 0; i < 2; i++) { | ||
764 | ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep), | ||
765 | buf, NEXIO_BUFSIZE, &actual_len, | ||
766 | NEXIO_TIMEOUT); | ||
767 | if (ret < 0) | ||
768 | goto out_buf; | ||
769 | } | ||
770 | |||
771 | /* send init command */ | ||
772 | memcpy(buf, nexio_init_pkt, sizeof(nexio_init_pkt)); | ||
773 | ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, output_ep), | ||
774 | buf, sizeof(nexio_init_pkt), &actual_len, | ||
775 | NEXIO_TIMEOUT); | ||
776 | if (ret < 0) | ||
777 | goto out_buf; | ||
778 | |||
779 | /* read replies */ | ||
780 | for (i = 0; i < 3; i++) { | ||
781 | memset(buf, 0, NEXIO_BUFSIZE); | ||
782 | ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep), | ||
783 | buf, NEXIO_BUFSIZE, &actual_len, | ||
784 | NEXIO_TIMEOUT); | ||
785 | if (ret < 0 || actual_len < 1 || buf[1] != actual_len) | ||
786 | continue; | ||
787 | switch (buf[0]) { | ||
788 | case 0x83: /* firmware version */ | ||
789 | if (!firmware_ver) | ||
790 | firmware_ver = kstrdup(&buf[2], GFP_KERNEL); | ||
791 | break; | ||
792 | case 0x84: /* device name */ | ||
793 | if (!device_name) | ||
794 | device_name = kstrdup(&buf[2], GFP_KERNEL); | ||
795 | break; | ||
796 | } | ||
797 | } | ||
798 | |||
799 | printk(KERN_INFO "Nexio device: %s, firmware version: %s\n", | ||
800 | device_name, firmware_ver); | ||
801 | |||
802 | kfree(firmware_ver); | ||
803 | kfree(device_name); | ||
804 | |||
805 | /* prepare ACK URB */ | ||
806 | ret = -ENOMEM; | ||
807 | |||
808 | usbtouch->priv = kmalloc(sizeof(struct nexio_priv), GFP_KERNEL); | ||
809 | if (!usbtouch->priv) | ||
810 | goto out_buf; | ||
811 | |||
812 | priv = usbtouch->priv; | ||
813 | |||
814 | priv->ack_buf = kmalloc(sizeof(nexio_ack_pkt), GFP_KERNEL); | ||
815 | if (!priv->ack_buf) | ||
816 | goto err_priv; | ||
817 | |||
818 | memcpy(priv->ack_buf, nexio_ack_pkt, sizeof(nexio_ack_pkt)); | ||
819 | |||
820 | priv->ack = usb_alloc_urb(0, GFP_KERNEL); | ||
821 | if (!priv->ack) { | ||
822 | dbg("%s - usb_alloc_urb failed: usbtouch->ack", __func__); | ||
823 | goto err_ack_buf; | ||
824 | } | ||
825 | |||
826 | usb_fill_bulk_urb(priv->ack, dev, usb_sndbulkpipe(dev, output_ep), | ||
827 | priv->ack_buf, sizeof(nexio_ack_pkt), | ||
828 | nexio_ack_complete, usbtouch); | ||
829 | ret = 0; | ||
830 | goto out_buf; | ||
831 | |||
832 | err_ack_buf: | ||
833 | kfree(priv->ack_buf); | ||
834 | err_priv: | ||
835 | kfree(priv); | ||
836 | out_buf: | ||
837 | kfree(buf); | ||
838 | return ret; | ||
839 | } | ||
840 | |||
841 | static void nexio_exit(struct usbtouch_usb *usbtouch) | ||
842 | { | ||
843 | struct nexio_priv *priv = usbtouch->priv; | ||
844 | |||
845 | usb_kill_urb(priv->ack); | ||
846 | usb_free_urb(priv->ack); | ||
847 | kfree(priv->ack_buf); | ||
848 | kfree(priv); | ||
849 | } | ||
850 | |||
851 | static int nexio_read_data(struct usbtouch_usb *usbtouch, unsigned char *pkt) | ||
852 | { | ||
853 | int x, y, begin_x, begin_y, end_x, end_y, w, h, ret; | ||
854 | struct nexio_touch_packet *packet = (void *) pkt; | ||
855 | struct nexio_priv *priv = usbtouch->priv; | ||
856 | |||
857 | /* got touch data? */ | ||
858 | if ((pkt[0] & 0xe0) != 0xe0) | ||
859 | return 0; | ||
860 | |||
861 | /* send ACK */ | ||
862 | ret = usb_submit_urb(priv->ack, GFP_ATOMIC); | ||
863 | |||
864 | if (!usbtouch->type->max_xc) { | ||
865 | usbtouch->type->max_xc = 2 * be16_to_cpu(packet->x_len); | ||
866 | input_set_abs_params(usbtouch->input, ABS_X, 0, | ||
867 | 2 * be16_to_cpu(packet->x_len), 0, 0); | ||
868 | usbtouch->type->max_yc = 2 * be16_to_cpu(packet->y_len); | ||
869 | input_set_abs_params(usbtouch->input, ABS_Y, 0, | ||
870 | 2 * be16_to_cpu(packet->y_len), 0, 0); | ||
871 | } | ||
872 | /* | ||
873 | * The device reports state of IR sensors on X and Y axes. | ||
874 | * Each byte represents "darkness" percentage (0-100) of one element. | ||
875 | * 17" touchscreen reports only 64 x 52 bytes so the resolution is low. | ||
876 | * This also means that there's a limited multi-touch capability but | ||
877 | * it's disabled (and untested) here as there's no X driver for that. | ||
878 | */ | ||
879 | begin_x = end_x = begin_y = end_y = -1; | ||
880 | for (x = 0; x < be16_to_cpu(packet->x_len); x++) { | ||
881 | if (begin_x == -1 && packet->data[x] > NEXIO_THRESHOLD) { | ||
882 | begin_x = x; | ||
883 | continue; | ||
884 | } | ||
885 | if (end_x == -1 && begin_x != -1 && packet->data[x] < NEXIO_THRESHOLD) { | ||
886 | end_x = x - 1; | ||
887 | for (y = be16_to_cpu(packet->x_len); | ||
888 | y < be16_to_cpu(packet->data_len); y++) { | ||
889 | if (begin_y == -1 && packet->data[y] > NEXIO_THRESHOLD) { | ||
890 | begin_y = y - be16_to_cpu(packet->x_len); | ||
891 | continue; | ||
892 | } | ||
893 | if (end_y == -1 && | ||
894 | begin_y != -1 && packet->data[y] < NEXIO_THRESHOLD) { | ||
895 | end_y = y - 1 - be16_to_cpu(packet->x_len); | ||
896 | w = end_x - begin_x; | ||
897 | h = end_y - begin_y; | ||
898 | #if 0 | ||
899 | /* multi-touch */ | ||
900 | input_report_abs(usbtouch->input, | ||
901 | ABS_MT_TOUCH_MAJOR, max(w,h)); | ||
902 | input_report_abs(usbtouch->input, | ||
903 | ABS_MT_TOUCH_MINOR, min(x,h)); | ||
904 | input_report_abs(usbtouch->input, | ||
905 | ABS_MT_POSITION_X, 2*begin_x+w); | ||
906 | input_report_abs(usbtouch->input, | ||
907 | ABS_MT_POSITION_Y, 2*begin_y+h); | ||
908 | input_report_abs(usbtouch->input, | ||
909 | ABS_MT_ORIENTATION, w > h); | ||
910 | input_mt_sync(usbtouch->input); | ||
911 | #endif | ||
912 | /* single touch */ | ||
913 | usbtouch->x = 2 * begin_x + w; | ||
914 | usbtouch->y = 2 * begin_y + h; | ||
915 | usbtouch->touch = packet->flags & 0x01; | ||
916 | begin_y = end_y = -1; | ||
917 | return 1; | ||
918 | } | ||
919 | } | ||
920 | begin_x = end_x = -1; | ||
921 | } | ||
922 | |||
923 | } | ||
924 | return 0; | ||
925 | } | ||
926 | #endif | ||
927 | |||
928 | |||
929 | /***************************************************************************** | ||
693 | * the different device descriptors | 930 | * the different device descriptors |
694 | */ | 931 | */ |
695 | #ifdef MULTI_PACKET | 932 | #ifdef MULTI_PACKET |
@@ -873,6 +1110,16 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
873 | .read_data = tc5uh_read_data, | 1110 | .read_data = tc5uh_read_data, |
874 | }, | 1111 | }, |
875 | #endif | 1112 | #endif |
1113 | |||
1114 | #ifdef CONFIG_TOUCHSCREEN_USB_NEXIO | ||
1115 | [DEVTYPE_NEXIO] = { | ||
1116 | .rept_size = 128, | ||
1117 | .irq_always = true, | ||
1118 | .read_data = nexio_read_data, | ||
1119 | .init = nexio_init, | ||
1120 | .exit = nexio_exit, | ||
1121 | }, | ||
1122 | #endif | ||
876 | }; | 1123 | }; |
877 | 1124 | ||
878 | 1125 | ||
@@ -998,6 +1245,7 @@ static void usbtouch_irq(struct urb *urb) | |||
998 | case -ECONNRESET: | 1245 | case -ECONNRESET: |
999 | case -ENOENT: | 1246 | case -ENOENT: |
1000 | case -ESHUTDOWN: | 1247 | case -ESHUTDOWN: |
1248 | case -EPIPE: | ||
1001 | /* this urb is terminated, clean up */ | 1249 | /* this urb is terminated, clean up */ |
1002 | dbg("%s - urb shutting down with status: %d", | 1250 | dbg("%s - urb shutting down with status: %d", |
1003 | __func__, urb->status); | 1251 | __func__, urb->status); |
@@ -1021,7 +1269,7 @@ static int usbtouch_open(struct input_dev *input) | |||
1021 | { | 1269 | { |
1022 | struct usbtouch_usb *usbtouch = input_get_drvdata(input); | 1270 | struct usbtouch_usb *usbtouch = input_get_drvdata(input); |
1023 | 1271 | ||
1024 | usbtouch->irq->dev = usbtouch->udev; | 1272 | usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface); |
1025 | 1273 | ||
1026 | if (!usbtouch->type->irq_always) { | 1274 | if (!usbtouch->type->irq_always) { |
1027 | if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) | 1275 | if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) |
@@ -1048,13 +1296,23 @@ static void usbtouch_free_buffers(struct usb_device *udev, | |||
1048 | kfree(usbtouch->buffer); | 1296 | kfree(usbtouch->buffer); |
1049 | } | 1297 | } |
1050 | 1298 | ||
1299 | static struct usb_endpoint_descriptor * | ||
1300 | usbtouch_get_input_endpoint(struct usb_host_interface *interface) | ||
1301 | { | ||
1302 | int i; | ||
1303 | |||
1304 | for (i = 0; i < interface->desc.bNumEndpoints; i++) | ||
1305 | if (usb_endpoint_dir_in(&interface->endpoint[i].desc)) | ||
1306 | return &interface->endpoint[i].desc; | ||
1307 | |||
1308 | return NULL; | ||
1309 | } | ||
1051 | 1310 | ||
1052 | static int usbtouch_probe(struct usb_interface *intf, | 1311 | static int usbtouch_probe(struct usb_interface *intf, |
1053 | const struct usb_device_id *id) | 1312 | const struct usb_device_id *id) |
1054 | { | 1313 | { |
1055 | struct usbtouch_usb *usbtouch; | 1314 | struct usbtouch_usb *usbtouch; |
1056 | struct input_dev *input_dev; | 1315 | struct input_dev *input_dev; |
1057 | struct usb_host_interface *interface; | ||
1058 | struct usb_endpoint_descriptor *endpoint; | 1316 | struct usb_endpoint_descriptor *endpoint; |
1059 | struct usb_device *udev = interface_to_usbdev(intf); | 1317 | struct usb_device *udev = interface_to_usbdev(intf); |
1060 | struct usbtouch_device_info *type; | 1318 | struct usbtouch_device_info *type; |
@@ -1064,8 +1322,9 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
1064 | if (id->driver_info == DEVTYPE_IGNORE) | 1322 | if (id->driver_info == DEVTYPE_IGNORE) |
1065 | return -ENODEV; | 1323 | return -ENODEV; |
1066 | 1324 | ||
1067 | interface = intf->cur_altsetting; | 1325 | endpoint = usbtouch_get_input_endpoint(intf->cur_altsetting); |
1068 | endpoint = &interface->endpoint[0].desc; | 1326 | if (!endpoint) |
1327 | return -ENXIO; | ||
1069 | 1328 | ||
1070 | usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); | 1329 | usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); |
1071 | input_dev = input_allocate_device(); | 1330 | input_dev = input_allocate_device(); |
@@ -1094,7 +1353,7 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
1094 | goto out_free_buffers; | 1353 | goto out_free_buffers; |
1095 | } | 1354 | } |
1096 | 1355 | ||
1097 | usbtouch->udev = udev; | 1356 | usbtouch->interface = intf; |
1098 | usbtouch->input = input_dev; | 1357 | usbtouch->input = input_dev; |
1099 | 1358 | ||
1100 | if (udev->manufacturer) | 1359 | if (udev->manufacturer) |
@@ -1133,12 +1392,18 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
1133 | input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, | 1392 | input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, |
1134 | type->max_press, 0, 0); | 1393 | type->max_press, 0, 0); |
1135 | 1394 | ||
1136 | usb_fill_int_urb(usbtouch->irq, usbtouch->udev, | 1395 | if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) |
1137 | usb_rcvintpipe(usbtouch->udev, endpoint->bEndpointAddress), | 1396 | usb_fill_int_urb(usbtouch->irq, udev, |
1397 | usb_rcvintpipe(udev, endpoint->bEndpointAddress), | ||
1138 | usbtouch->data, type->rept_size, | 1398 | usbtouch->data, type->rept_size, |
1139 | usbtouch_irq, usbtouch, endpoint->bInterval); | 1399 | usbtouch_irq, usbtouch, endpoint->bInterval); |
1400 | else | ||
1401 | usb_fill_bulk_urb(usbtouch->irq, udev, | ||
1402 | usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), | ||
1403 | usbtouch->data, type->rept_size, | ||
1404 | usbtouch_irq, usbtouch); | ||
1140 | 1405 | ||
1141 | usbtouch->irq->dev = usbtouch->udev; | 1406 | usbtouch->irq->dev = udev; |
1142 | usbtouch->irq->transfer_dma = usbtouch->data_dma; | 1407 | usbtouch->irq->transfer_dma = usbtouch->data_dma; |
1143 | usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 1408 | usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
1144 | 1409 | ||
@@ -1147,23 +1412,37 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
1147 | err = type->init(usbtouch); | 1412 | err = type->init(usbtouch); |
1148 | if (err) { | 1413 | if (err) { |
1149 | dbg("%s - type->init() failed, err: %d", __func__, err); | 1414 | dbg("%s - type->init() failed, err: %d", __func__, err); |
1150 | goto out_free_buffers; | 1415 | goto out_free_urb; |
1151 | } | 1416 | } |
1152 | } | 1417 | } |
1153 | 1418 | ||
1154 | err = input_register_device(usbtouch->input); | 1419 | err = input_register_device(usbtouch->input); |
1155 | if (err) { | 1420 | if (err) { |
1156 | dbg("%s - input_register_device failed, err: %d", __func__, err); | 1421 | dbg("%s - input_register_device failed, err: %d", __func__, err); |
1157 | goto out_free_buffers; | 1422 | goto out_do_exit; |
1158 | } | 1423 | } |
1159 | 1424 | ||
1160 | usb_set_intfdata(intf, usbtouch); | 1425 | usb_set_intfdata(intf, usbtouch); |
1161 | 1426 | ||
1162 | if (usbtouch->type->irq_always) | 1427 | if (usbtouch->type->irq_always) { |
1163 | usb_submit_urb(usbtouch->irq, GFP_KERNEL); | 1428 | err = usb_submit_urb(usbtouch->irq, GFP_KERNEL); |
1429 | if (err) { | ||
1430 | err("%s - usb_submit_urb failed with result: %d", | ||
1431 | __func__, err); | ||
1432 | goto out_unregister_input; | ||
1433 | } | ||
1434 | } | ||
1164 | 1435 | ||
1165 | return 0; | 1436 | return 0; |
1166 | 1437 | ||
1438 | out_unregister_input: | ||
1439 | input_unregister_device(input_dev); | ||
1440 | input_dev = NULL; | ||
1441 | out_do_exit: | ||
1442 | if (type->exit) | ||
1443 | type->exit(usbtouch); | ||
1444 | out_free_urb: | ||
1445 | usb_free_urb(usbtouch->irq); | ||
1167 | out_free_buffers: | 1446 | out_free_buffers: |
1168 | usbtouch_free_buffers(udev, usbtouch); | 1447 | usbtouch_free_buffers(udev, usbtouch); |
1169 | out_free: | 1448 | out_free: |
@@ -1186,6 +1465,8 @@ static void usbtouch_disconnect(struct usb_interface *intf) | |||
1186 | /* this will stop IO via close */ | 1465 | /* this will stop IO via close */ |
1187 | input_unregister_device(usbtouch->input); | 1466 | input_unregister_device(usbtouch->input); |
1188 | usb_free_urb(usbtouch->irq); | 1467 | usb_free_urb(usbtouch->irq); |
1468 | if (usbtouch->type->exit) | ||
1469 | usbtouch->type->exit(usbtouch); | ||
1189 | usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); | 1470 | usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); |
1190 | kfree(usbtouch); | 1471 | kfree(usbtouch); |
1191 | } | 1472 | } |
diff --git a/drivers/input/touchscreen/zylonite-wm97xx.c b/drivers/input/touchscreen/zylonite-wm97xx.c index eca54dbdf493..048849867643 100644 --- a/drivers/input/touchscreen/zylonite-wm97xx.c +++ b/drivers/input/touchscreen/zylonite-wm97xx.c | |||
@@ -118,6 +118,9 @@ static int wm97xx_acc_pen_down(struct wm97xx *wm) | |||
118 | if (pressure) | 118 | if (pressure) |
119 | p = MODR; | 119 | p = MODR; |
120 | 120 | ||
121 | dev_dbg(wm->dev, "Raw coordinates: x=%x, y=%x, p=%x\n", | ||
122 | x, y, p); | ||
123 | |||
121 | /* are samples valid */ | 124 | /* are samples valid */ |
122 | if ((x & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_X || | 125 | if ((x & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_X || |
123 | (y & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_Y || | 126 | (y & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_Y || |
diff --git a/drivers/input/xen-kbdfront.c b/drivers/input/xen-kbdfront.c index c721c0a23eb8..d30436fee476 100644 --- a/drivers/input/xen-kbdfront.c +++ b/drivers/input/xen-kbdfront.c | |||
@@ -321,7 +321,7 @@ InitWait: | |||
321 | } | 321 | } |
322 | } | 322 | } |
323 | 323 | ||
324 | static struct xenbus_device_id xenkbd_ids[] = { | 324 | static const struct xenbus_device_id xenkbd_ids[] = { |
325 | { "vkbd" }, | 325 | { "vkbd" }, |
326 | { "" } | 326 | { "" } |
327 | }; | 327 | }; |
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index 3d906833948d..fd85bde283a0 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -171,8 +171,8 @@ config INPUT_ADBHID | |||
171 | If unsure, say Y. | 171 | If unsure, say Y. |
172 | 172 | ||
173 | config MAC_EMUMOUSEBTN | 173 | config MAC_EMUMOUSEBTN |
174 | bool "Support for mouse button 2+3 emulation" | 174 | tristate "Support for mouse button 2+3 emulation" |
175 | select INPUT | 175 | depends on SYSCTL && INPUT |
176 | help | 176 | help |
177 | This provides generic support for emulating the 2nd and 3rd mouse | 177 | This provides generic support for emulating the 2nd and 3rd mouse |
178 | button with keypresses. If you say Y here, the emulation is still | 178 | button with keypresses. If you say Y here, the emulation is still |
@@ -184,6 +184,9 @@ config MAC_EMUMOUSEBTN | |||
184 | 184 | ||
185 | If you have an Apple machine with a 1-button mouse, say Y here. | 185 | If you have an Apple machine with a 1-button mouse, say Y here. |
186 | 186 | ||
187 | To compile this driver as a module, choose M here: the | ||
188 | module will be called mac_hid. | ||
189 | |||
187 | config THERM_WINDTUNNEL | 190 | config THERM_WINDTUNNEL |
188 | tristate "Support for thermal management on Windtunnel G4s" | 191 | tristate "Support for thermal management on Windtunnel G4s" |
189 | depends on I2C && I2C_POWERMAC && PPC_PMAC && !PPC_PMAC64 | 192 | depends on I2C && I2C_POWERMAC && PPC_PMAC && !PPC_PMAC64 |
diff --git a/drivers/macintosh/mac_hid.c b/drivers/macintosh/mac_hid.c index 7b4ef5bb556b..e943d2a29253 100644 --- a/drivers/macintosh/mac_hid.c +++ b/drivers/macintosh/mac_hid.c | |||
@@ -13,17 +13,197 @@ | |||
13 | #include <linux/sysctl.h> | 13 | #include <linux/sysctl.h> |
14 | #include <linux/input.h> | 14 | #include <linux/input.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/kbd_kern.h> | ||
17 | 16 | ||
17 | MODULE_LICENSE("GPL"); | ||
18 | 18 | ||
19 | static struct input_dev *emumousebtn; | ||
20 | static int emumousebtn_input_register(void); | ||
21 | static int mouse_emulate_buttons; | 19 | static int mouse_emulate_buttons; |
22 | static int mouse_button2_keycode = KEY_RIGHTCTRL; /* right control key */ | 20 | static int mouse_button2_keycode = KEY_RIGHTCTRL; /* right control key */ |
23 | static int mouse_button3_keycode = KEY_RIGHTALT; /* right option key */ | 21 | static int mouse_button3_keycode = KEY_RIGHTALT; /* right option key */ |
24 | static int mouse_last_keycode; | ||
25 | 22 | ||
26 | #if defined(CONFIG_SYSCTL) | 23 | static struct input_dev *mac_hid_emumouse_dev; |
24 | |||
25 | static int mac_hid_create_emumouse(void) | ||
26 | { | ||
27 | static struct lock_class_key mac_hid_emumouse_dev_event_class; | ||
28 | static struct lock_class_key mac_hid_emumouse_dev_mutex_class; | ||
29 | int err; | ||
30 | |||
31 | mac_hid_emumouse_dev = input_allocate_device(); | ||
32 | if (!mac_hid_emumouse_dev) | ||
33 | return -ENOMEM; | ||
34 | |||
35 | lockdep_set_class(&mac_hid_emumouse_dev->event_lock, | ||
36 | &mac_hid_emumouse_dev_event_class); | ||
37 | lockdep_set_class(&mac_hid_emumouse_dev->mutex, | ||
38 | &mac_hid_emumouse_dev_mutex_class); | ||
39 | |||
40 | mac_hid_emumouse_dev->name = "Macintosh mouse button emulation"; | ||
41 | mac_hid_emumouse_dev->id.bustype = BUS_ADB; | ||
42 | mac_hid_emumouse_dev->id.vendor = 0x0001; | ||
43 | mac_hid_emumouse_dev->id.product = 0x0001; | ||
44 | mac_hid_emumouse_dev->id.version = 0x0100; | ||
45 | |||
46 | mac_hid_emumouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); | ||
47 | mac_hid_emumouse_dev->keybit[BIT_WORD(BTN_MOUSE)] = | ||
48 | BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); | ||
49 | mac_hid_emumouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); | ||
50 | |||
51 | err = input_register_device(mac_hid_emumouse_dev); | ||
52 | if (err) { | ||
53 | input_free_device(mac_hid_emumouse_dev); | ||
54 | mac_hid_emumouse_dev = NULL; | ||
55 | return err; | ||
56 | } | ||
57 | |||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static void mac_hid_destroy_emumouse(void) | ||
62 | { | ||
63 | input_unregister_device(mac_hid_emumouse_dev); | ||
64 | mac_hid_emumouse_dev = NULL; | ||
65 | } | ||
66 | |||
67 | static bool mac_hid_emumouse_filter(struct input_handle *handle, | ||
68 | unsigned int type, unsigned int code, | ||
69 | int value) | ||
70 | { | ||
71 | unsigned int btn; | ||
72 | |||
73 | if (type != EV_KEY) | ||
74 | return false; | ||
75 | |||
76 | if (code == mouse_button2_keycode) | ||
77 | btn = BTN_MIDDLE; | ||
78 | else if (code == mouse_button3_keycode) | ||
79 | btn = BTN_RIGHT; | ||
80 | else | ||
81 | return false; | ||
82 | |||
83 | input_report_key(mac_hid_emumouse_dev, btn, value); | ||
84 | input_sync(mac_hid_emumouse_dev); | ||
85 | |||
86 | return true; | ||
87 | } | ||
88 | |||
89 | static int mac_hid_emumouse_connect(struct input_handler *handler, | ||
90 | struct input_dev *dev, | ||
91 | const struct input_device_id *id) | ||
92 | { | ||
93 | struct input_handle *handle; | ||
94 | int error; | ||
95 | |||
96 | /* Don't bind to ourselves */ | ||
97 | if (dev == mac_hid_emumouse_dev) | ||
98 | return -ENODEV; | ||
99 | |||
100 | handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); | ||
101 | if (!handle) | ||
102 | return -ENOMEM; | ||
103 | |||
104 | handle->dev = dev; | ||
105 | handle->handler = handler; | ||
106 | handle->name = "mac-button-emul"; | ||
107 | |||
108 | error = input_register_handle(handle); | ||
109 | if (error) { | ||
110 | printk(KERN_ERR | ||
111 | "mac_hid: Failed to register button emulation handle, " | ||
112 | "error %d\n", error); | ||
113 | goto err_free; | ||
114 | } | ||
115 | |||
116 | error = input_open_device(handle); | ||
117 | if (error) { | ||
118 | printk(KERN_ERR | ||
119 | "mac_hid: Failed to open input device, error %d\n", | ||
120 | error); | ||
121 | goto err_unregister; | ||
122 | } | ||
123 | |||
124 | return 0; | ||
125 | |||
126 | err_unregister: | ||
127 | input_unregister_handle(handle); | ||
128 | err_free: | ||
129 | kfree(handle); | ||
130 | return error; | ||
131 | } | ||
132 | |||
133 | static void mac_hid_emumouse_disconnect(struct input_handle *handle) | ||
134 | { | ||
135 | input_close_device(handle); | ||
136 | input_unregister_handle(handle); | ||
137 | kfree(handle); | ||
138 | } | ||
139 | |||
140 | static const struct input_device_id mac_hid_emumouse_ids[] = { | ||
141 | { | ||
142 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT, | ||
143 | .evbit = { BIT_MASK(EV_KEY) }, | ||
144 | }, | ||
145 | { }, | ||
146 | }; | ||
147 | |||
148 | MODULE_DEVICE_TABLE(input, mac_hid_emumouse_ids); | ||
149 | |||
150 | static struct input_handler mac_hid_emumouse_handler = { | ||
151 | .filter = mac_hid_emumouse_filter, | ||
152 | .connect = mac_hid_emumouse_connect, | ||
153 | .disconnect = mac_hid_emumouse_disconnect, | ||
154 | .name = "mac-button-emul", | ||
155 | .id_table = mac_hid_emumouse_ids, | ||
156 | }; | ||
157 | |||
158 | static int mac_hid_start_emulation(void) | ||
159 | { | ||
160 | int err; | ||
161 | |||
162 | err = mac_hid_create_emumouse(); | ||
163 | if (err) | ||
164 | return err; | ||
165 | |||
166 | err = input_register_handler(&mac_hid_emumouse_handler); | ||
167 | if (err) { | ||
168 | mac_hid_destroy_emumouse(); | ||
169 | return err; | ||
170 | } | ||
171 | |||
172 | return 0; | ||
173 | } | ||
174 | |||
175 | static void mac_hid_stop_emulation(void) | ||
176 | { | ||
177 | input_unregister_handler(&mac_hid_emumouse_handler); | ||
178 | mac_hid_destroy_emumouse(); | ||
179 | } | ||
180 | |||
181 | static int mac_hid_toggle_emumouse(ctl_table *table, int write, | ||
182 | void __user *buffer, size_t *lenp, | ||
183 | loff_t *ppos) | ||
184 | { | ||
185 | int *valp = table->data; | ||
186 | int old_val = *valp; | ||
187 | int rc; | ||
188 | |||
189 | rc = proc_dointvec(table, write, buffer, lenp, ppos); | ||
190 | |||
191 | if (rc == 0 && write && *valp != old_val) { | ||
192 | if (*valp == 1) | ||
193 | rc = mac_hid_start_emulation(); | ||
194 | else if (*valp == 0) | ||
195 | mac_hid_stop_emulation(); | ||
196 | else | ||
197 | rc = -EINVAL; | ||
198 | } | ||
199 | |||
200 | /* Restore the old value in case of error */ | ||
201 | if (rc) | ||
202 | *valp = old_val; | ||
203 | |||
204 | return rc; | ||
205 | } | ||
206 | |||
27 | /* file(s) in /proc/sys/dev/mac_hid */ | 207 | /* file(s) in /proc/sys/dev/mac_hid */ |
28 | static ctl_table mac_hid_files[] = { | 208 | static ctl_table mac_hid_files[] = { |
29 | { | 209 | { |
@@ -31,7 +211,7 @@ static ctl_table mac_hid_files[] = { | |||
31 | .data = &mouse_emulate_buttons, | 211 | .data = &mouse_emulate_buttons, |
32 | .maxlen = sizeof(int), | 212 | .maxlen = sizeof(int), |
33 | .mode = 0644, | 213 | .mode = 0644, |
34 | .proc_handler = proc_dointvec, | 214 | .proc_handler = mac_hid_toggle_emumouse, |
35 | }, | 215 | }, |
36 | { | 216 | { |
37 | .procname = "mouse_button2_keycode", | 217 | .procname = "mouse_button2_keycode", |
@@ -74,75 +254,21 @@ static ctl_table mac_hid_root_dir[] = { | |||
74 | 254 | ||
75 | static struct ctl_table_header *mac_hid_sysctl_header; | 255 | static struct ctl_table_header *mac_hid_sysctl_header; |
76 | 256 | ||
77 | #endif /* endif CONFIG_SYSCTL */ | 257 | static int __init mac_hid_init(void) |
78 | |||
79 | int mac_hid_mouse_emulate_buttons(int caller, unsigned int keycode, int down) | ||
80 | { | ||
81 | switch (caller) { | ||
82 | case 1: | ||
83 | /* Called from keyboard.c */ | ||
84 | if (mouse_emulate_buttons | ||
85 | && (keycode == mouse_button2_keycode | ||
86 | || keycode == mouse_button3_keycode)) { | ||
87 | if (mouse_emulate_buttons == 1) { | ||
88 | input_report_key(emumousebtn, | ||
89 | keycode == mouse_button2_keycode ? BTN_MIDDLE : BTN_RIGHT, | ||
90 | down); | ||
91 | input_sync(emumousebtn); | ||
92 | return 1; | ||
93 | } | ||
94 | mouse_last_keycode = down ? keycode : 0; | ||
95 | } | ||
96 | break; | ||
97 | } | ||
98 | return 0; | ||
99 | } | ||
100 | |||
101 | static struct lock_class_key emumousebtn_event_class; | ||
102 | static struct lock_class_key emumousebtn_mutex_class; | ||
103 | |||
104 | static int emumousebtn_input_register(void) | ||
105 | { | 258 | { |
106 | int ret; | 259 | mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir); |
107 | 260 | if (!mac_hid_sysctl_header) | |
108 | emumousebtn = input_allocate_device(); | ||
109 | if (!emumousebtn) | ||
110 | return -ENOMEM; | 261 | return -ENOMEM; |
111 | 262 | ||
112 | lockdep_set_class(&emumousebtn->event_lock, &emumousebtn_event_class); | 263 | return 0; |
113 | lockdep_set_class(&emumousebtn->mutex, &emumousebtn_mutex_class); | ||
114 | |||
115 | emumousebtn->name = "Macintosh mouse button emulation"; | ||
116 | emumousebtn->id.bustype = BUS_ADB; | ||
117 | emumousebtn->id.vendor = 0x0001; | ||
118 | emumousebtn->id.product = 0x0001; | ||
119 | emumousebtn->id.version = 0x0100; | ||
120 | |||
121 | emumousebtn->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); | ||
122 | emumousebtn->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | | ||
123 | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); | ||
124 | emumousebtn->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); | ||
125 | |||
126 | ret = input_register_device(emumousebtn); | ||
127 | if (ret) | ||
128 | input_free_device(emumousebtn); | ||
129 | |||
130 | return ret; | ||
131 | } | 264 | } |
265 | module_init(mac_hid_init); | ||
132 | 266 | ||
133 | static int __init mac_hid_init(void) | 267 | static void __exit mac_hid_exit(void) |
134 | { | 268 | { |
135 | int err; | 269 | unregister_sysctl_table(mac_hid_sysctl_header); |
136 | |||
137 | err = emumousebtn_input_register(); | ||
138 | if (err) | ||
139 | return err; | ||
140 | |||
141 | #if defined(CONFIG_SYSCTL) | ||
142 | mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir); | ||
143 | #endif /* CONFIG_SYSCTL */ | ||
144 | 270 | ||
145 | return 0; | 271 | if (mouse_emulate_buttons) |
272 | mac_hid_stop_emulation(); | ||
146 | } | 273 | } |
147 | 274 | module_exit(mac_hid_exit); | |
148 | device_initcall(mac_hid_init); | ||
diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 1bc08541c2b9..48e68da097f6 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h | |||
@@ -46,7 +46,6 @@ struct gameport { | |||
46 | struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ | 46 | struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ |
47 | 47 | ||
48 | struct device dev; | 48 | struct device dev; |
49 | unsigned int registered; /* port has been fully registered with driver core */ | ||
50 | 49 | ||
51 | struct list_head node; | 50 | struct list_head node; |
52 | }; | 51 | }; |
diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index 1289fa7623ca..cd0b3f30f48e 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h | |||
@@ -10,6 +10,7 @@ struct gpio_keys_button { | |||
10 | int type; /* input event type (EV_KEY, EV_SW) */ | 10 | int type; /* input event type (EV_KEY, EV_SW) */ |
11 | int wakeup; /* configure the button as a wake-up source */ | 11 | int wakeup; /* configure the button as a wake-up source */ |
12 | int debounce_interval; /* debounce ticks interval in msecs */ | 12 | int debounce_interval; /* debounce ticks interval in msecs */ |
13 | bool can_disable; | ||
13 | }; | 14 | }; |
14 | 15 | ||
15 | struct gpio_keys_platform_data { | 16 | struct gpio_keys_platform_data { |
diff --git a/include/linux/input.h b/include/linux/input.h index f44ee9114401..dc24effb6d0e 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -378,7 +378,7 @@ struct input_absinfo { | |||
378 | #define KEY_WIMAX 246 | 378 | #define KEY_WIMAX 246 |
379 | #define KEY_RFKILL 247 /* Key that controls all radios */ | 379 | #define KEY_RFKILL 247 /* Key that controls all radios */ |
380 | 380 | ||
381 | /* Range 248 - 255 is reserved for special needs of AT keyboard driver */ | 381 | /* Code 255 is reserved for special needs of AT keyboard driver */ |
382 | 382 | ||
383 | #define BTN_MISC 0x100 | 383 | #define BTN_MISC 0x100 |
384 | #define BTN_0 0x100 | 384 | #define BTN_0 0x100 |
@@ -597,6 +597,7 @@ struct input_absinfo { | |||
597 | #define KEY_NUMERIC_POUND 0x20b | 597 | #define KEY_NUMERIC_POUND 0x20b |
598 | 598 | ||
599 | #define KEY_CAMERA_FOCUS 0x210 | 599 | #define KEY_CAMERA_FOCUS 0x210 |
600 | #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ | ||
600 | 601 | ||
601 | #define BTN_TRIGGER_HAPPY 0x2c0 | 602 | #define BTN_TRIGGER_HAPPY 0x2c0 |
602 | #define BTN_TRIGGER_HAPPY1 0x2c0 | 603 | #define BTN_TRIGGER_HAPPY1 0x2c0 |
@@ -1242,6 +1243,10 @@ struct input_handle; | |||
1242 | * @event: event handler. This method is being called by input core with | 1243 | * @event: event handler. This method is being called by input core with |
1243 | * interrupts disabled and dev->event_lock spinlock held and so | 1244 | * interrupts disabled and dev->event_lock spinlock held and so |
1244 | * it may not sleep | 1245 | * it may not sleep |
1246 | * @filter: similar to @event; separates normal event handlers from | ||
1247 | * "filters". | ||
1248 | * @match: called after comparing device's id with handler's id_table | ||
1249 | * to perform fine-grained matching between device and handler | ||
1245 | * @connect: called when attaching a handler to an input device | 1250 | * @connect: called when attaching a handler to an input device |
1246 | * @disconnect: disconnects a handler from input device | 1251 | * @disconnect: disconnects a handler from input device |
1247 | * @start: starts handler for given handle. This function is called by | 1252 | * @start: starts handler for given handle. This function is called by |
@@ -1253,8 +1258,6 @@ struct input_handle; | |||
1253 | * @name: name of the handler, to be shown in /proc/bus/input/handlers | 1258 | * @name: name of the handler, to be shown in /proc/bus/input/handlers |
1254 | * @id_table: pointer to a table of input_device_ids this driver can | 1259 | * @id_table: pointer to a table of input_device_ids this driver can |
1255 | * handle | 1260 | * handle |
1256 | * @blacklist: pointer to a table of input_device_ids this driver should | ||
1257 | * ignore even if they match @id_table | ||
1258 | * @h_list: list of input handles associated with the handler | 1261 | * @h_list: list of input handles associated with the handler |
1259 | * @node: for placing the driver onto input_handler_list | 1262 | * @node: for placing the driver onto input_handler_list |
1260 | * | 1263 | * |
@@ -1263,6 +1266,11 @@ struct input_handle; | |||
1263 | * same time. All of them will get their copy of input event generated by | 1266 | * same time. All of them will get their copy of input event generated by |
1264 | * the device. | 1267 | * the device. |
1265 | * | 1268 | * |
1269 | * The very same structure is used to implement input filters. Input core | ||
1270 | * allows filters to run first and will not pass event to regular handlers | ||
1271 | * if any of the filters indicate that the event should be filtered (by | ||
1272 | * returning %true from their filter() method). | ||
1273 | * | ||
1266 | * Note that input core serializes calls to connect() and disconnect() | 1274 | * Note that input core serializes calls to connect() and disconnect() |
1267 | * methods. | 1275 | * methods. |
1268 | */ | 1276 | */ |
@@ -1271,6 +1279,8 @@ struct input_handler { | |||
1271 | void *private; | 1279 | void *private; |
1272 | 1280 | ||
1273 | void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); | 1281 | void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); |
1282 | bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value); | ||
1283 | bool (*match)(struct input_handler *handler, struct input_dev *dev); | ||
1274 | int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); | 1284 | int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); |
1275 | void (*disconnect)(struct input_handle *handle); | 1285 | void (*disconnect)(struct input_handle *handle); |
1276 | void (*start)(struct input_handle *handle); | 1286 | void (*start)(struct input_handle *handle); |
@@ -1280,7 +1290,6 @@ struct input_handler { | |||
1280 | const char *name; | 1290 | const char *name; |
1281 | 1291 | ||
1282 | const struct input_device_id *id_table; | 1292 | const struct input_device_id *id_table; |
1283 | const struct input_device_id *blacklist; | ||
1284 | 1293 | ||
1285 | struct list_head h_list; | 1294 | struct list_head h_list; |
1286 | struct list_head node; | 1295 | struct list_head node; |
diff --git a/include/linux/input/sh_keysc.h b/include/linux/input/sh_keysc.h index c211b5cf08e6..649dc7f12925 100644 --- a/include/linux/input/sh_keysc.h +++ b/include/linux/input/sh_keysc.h | |||
@@ -1,14 +1,15 @@ | |||
1 | #ifndef __SH_KEYSC_H__ | 1 | #ifndef __SH_KEYSC_H__ |
2 | #define __SH_KEYSC_H__ | 2 | #define __SH_KEYSC_H__ |
3 | 3 | ||
4 | #define SH_KEYSC_MAXKEYS 30 | 4 | #define SH_KEYSC_MAXKEYS 49 |
5 | 5 | ||
6 | struct sh_keysc_info { | 6 | struct sh_keysc_info { |
7 | enum { SH_KEYSC_MODE_1, SH_KEYSC_MODE_2, SH_KEYSC_MODE_3 } mode; | 7 | enum { SH_KEYSC_MODE_1, SH_KEYSC_MODE_2, SH_KEYSC_MODE_3, |
8 | SH_KEYSC_MODE_4, SH_KEYSC_MODE_5, SH_KEYSC_MODE_6 } mode; | ||
8 | int scan_timing; /* 0 -> 7, see KYCR1, SCN[2:0] */ | 9 | int scan_timing; /* 0 -> 7, see KYCR1, SCN[2:0] */ |
9 | int delay; | 10 | int delay; |
10 | int kycr2_delay; | 11 | int kycr2_delay; |
11 | int keycodes[SH_KEYSC_MAXKEYS]; | 12 | int keycodes[SH_KEYSC_MAXKEYS]; /* KEYIN * KEYOUT */ |
12 | }; | 13 | }; |
13 | 14 | ||
14 | #endif /* __SH_KEYSC_H__ */ | 15 | #endif /* __SH_KEYSC_H__ */ |
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 8bdb16bfe5fb..506ad20c18f8 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h | |||
@@ -161,7 +161,4 @@ static inline void con_schedule_flip(struct tty_struct *t) | |||
161 | schedule_delayed_work(&t->buf.work, 0); | 161 | schedule_delayed_work(&t->buf.work, 0); |
162 | } | 162 | } |
163 | 163 | ||
164 | /* mac_hid.c */ | ||
165 | extern int mac_hid_mouse_emulate_buttons(int, unsigned int, int); | ||
166 | |||
167 | #endif | 164 | #endif |
diff --git a/include/linux/serio.h b/include/linux/serio.h index 813d26c247ec..64b473066b9a 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
@@ -30,7 +30,6 @@ struct serio { | |||
30 | char phys[32]; | 30 | char phys[32]; |
31 | 31 | ||
32 | bool manual_bind; | 32 | bool manual_bind; |
33 | bool registered; /* port has been fully registered with driver core */ | ||
34 | 33 | ||
35 | struct serio_device_id id; | 34 | struct serio_device_id id; |
36 | 35 | ||