diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/gameport/gameport.c | 2 | ||||
-rw-r--r-- | drivers/input/input.c | 8 | ||||
-rw-r--r-- | drivers/input/keyboard/Kconfig | 12 | ||||
-rw-r--r-- | drivers/input/keyboard/jornada680_kbd.c | 40 | ||||
-rw-r--r-- | drivers/input/keyboard/spitzkbd.c | 1 | ||||
-rw-r--r-- | drivers/input/mouse/alps.c | 2 | ||||
-rw-r--r-- | drivers/input/mouse/lifebook.c | 7 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 2 | ||||
-rw-r--r-- | drivers/input/mousedev.c | 9 | ||||
-rw-r--r-- | drivers/input/touchscreen/Kconfig | 8 | ||||
-rw-r--r-- | drivers/input/touchscreen/usbtouchscreen.c | 55 |
11 files changed, 89 insertions, 57 deletions
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index bfc6061f1554..1dc2ac9f3d1c 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -38,8 +38,6 @@ EXPORT_SYMBOL(gameport_unregister_driver); | |||
38 | EXPORT_SYMBOL(gameport_open); | 38 | EXPORT_SYMBOL(gameport_open); |
39 | EXPORT_SYMBOL(gameport_close); | 39 | EXPORT_SYMBOL(gameport_close); |
40 | EXPORT_SYMBOL(gameport_rescan); | 40 | EXPORT_SYMBOL(gameport_rescan); |
41 | EXPORT_SYMBOL(gameport_cooked_read); | ||
42 | EXPORT_SYMBOL(gameport_set_name); | ||
43 | EXPORT_SYMBOL(gameport_set_phys); | 41 | EXPORT_SYMBOL(gameport_set_phys); |
44 | EXPORT_SYMBOL(gameport_start_polling); | 42 | EXPORT_SYMBOL(gameport_start_polling); |
45 | EXPORT_SYMBOL(gameport_stop_polling); | 43 | EXPORT_SYMBOL(gameport_stop_polling); |
diff --git a/drivers/input/input.c b/drivers/input/input.c index 307c7b5c2b33..a0be978501ff 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -235,6 +235,10 @@ static void input_handle_event(struct input_dev *dev, | |||
235 | if (value >= 0) | 235 | if (value >= 0) |
236 | disposition = INPUT_PASS_TO_ALL; | 236 | disposition = INPUT_PASS_TO_ALL; |
237 | break; | 237 | break; |
238 | |||
239 | case EV_PWR: | ||
240 | disposition = INPUT_PASS_TO_ALL; | ||
241 | break; | ||
238 | } | 242 | } |
239 | 243 | ||
240 | if (type != EV_SYN) | 244 | if (type != EV_SYN) |
@@ -1266,6 +1270,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int | |||
1266 | __set_bit(code, dev->ffbit); | 1270 | __set_bit(code, dev->ffbit); |
1267 | break; | 1271 | break; |
1268 | 1272 | ||
1273 | case EV_PWR: | ||
1274 | /* do nothing */ | ||
1275 | break; | ||
1276 | |||
1269 | default: | 1277 | default: |
1270 | printk(KERN_ERR | 1278 | printk(KERN_ERR |
1271 | "input_set_capability: unknown type %u (code %u)\n", | 1279 | "input_set_capability: unknown type %u (code %u)\n", |
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index dfa6592c10f6..086d58c0ccbe 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig | |||
@@ -209,22 +209,22 @@ config KEYBOARD_HIL | |||
209 | to your machine, so normally you should say Y here. | 209 | to your machine, so normally you should say Y here. |
210 | 210 | ||
211 | config KEYBOARD_HP6XX | 211 | config KEYBOARD_HP6XX |
212 | tristate "HP Jornada 6XX Keyboard support" | 212 | tristate "HP Jornada 6xx keyboard" |
213 | depends on SH_HP6XX | 213 | depends on SH_HP6XX |
214 | select INPUT_POLLDEV | 214 | select INPUT_POLLDEV |
215 | help | 215 | help |
216 | This adds support for the onboard keyboard found on | 216 | Say Y here if you have a HP Jornada 620/660/680/690 and want to |
217 | HP Jornada 620/660/680/690. | 217 | support the built-in keyboard. |
218 | 218 | ||
219 | To compile this driver as a module, choose M here: the | 219 | To compile this driver as a module, choose M here: the |
220 | module will be called jornada680_kbd. | 220 | module will be called jornada680_kbd. |
221 | 221 | ||
222 | config KEYBOARD_HP7XX | 222 | config KEYBOARD_HP7XX |
223 | tristate "HP Jornada 7XX Keyboard Driver" | 223 | tristate "HP Jornada 7xx keyboard" |
224 | depends on SA1100_JORNADA720_SSP && SA1100_SSP | 224 | depends on SA1100_JORNADA720_SSP && SA1100_SSP |
225 | help | 225 | help |
226 | Say Y here to add support for the HP Jornada 7xx (710/720/728) | 226 | Say Y here if you have a HP Jornada 710/720/728 and want to |
227 | onboard keyboard. | 227 | support the built-in keyboard. |
228 | 228 | ||
229 | To compile this driver as a module, choose M here: the | 229 | To compile this driver as a module, choose M here: the |
230 | module will be called jornada720_kbd. | 230 | module will be called jornada720_kbd. |
diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c index bec1cf483723..a23633a2e1b4 100644 --- a/drivers/input/keyboard/jornada680_kbd.c +++ b/drivers/input/keyboard/jornada680_kbd.c | |||
@@ -16,14 +16,14 @@ | |||
16 | * published by the Free Software Foundation. | 16 | * published by the Free Software Foundation. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/input.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/input.h> | ||
23 | #include <linux/input-polldev.h> | 21 | #include <linux/input-polldev.h> |
22 | #include <linux/interrupt.h> | ||
24 | #include <linux/jiffies.h> | 23 | #include <linux/jiffies.h> |
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
25 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
26 | #include <linux/interrupt.h> | ||
27 | 27 | ||
28 | #include <asm/delay.h> | 28 | #include <asm/delay.h> |
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
@@ -43,22 +43,22 @@ | |||
43 | #define PLDR 0xa4000134 | 43 | #define PLDR 0xa4000134 |
44 | 44 | ||
45 | static const unsigned short jornada_scancodes[] = { | 45 | static const unsigned short jornada_scancodes[] = { |
46 | /* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, 0, 0, 0, /* 1 -> 8 */ | 46 | /* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, KEY_KP5, 0, 0, /* 1 -> 8 */ |
47 | KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F2, KEY_F4, KEY_F5, /* 9 -> 16 */ | 47 | KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F6, KEY_F4, KEY_F5, /* 9 -> 16 */ |
48 | /* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */ | 48 | /* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */ |
49 | KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */ | 49 | KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */ |
50 | /* PTD7 */ KEY_KP2, KEY_KP6, 0, 0, 0, 0, 0, 0, /* 33 -> 40 */ | 50 | /* PTD7 */ KEY_KP2, KEY_KP6, KEY_KP3, 0, 0, 0, 0, 0, /* 33 -> 40 */ |
51 | 0, 0, 0, KEY_KP4, 0, 0, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */ | 51 | KEY_F10, KEY_RO, KEY_F9, KEY_KP4, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */ |
52 | /* PTE0 */ 0, 0, 0, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */ | 52 | /* PTE0 */ KEY_KATAKANA, KEY_KP0, KEY_GRAVE, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */ |
53 | KEY_LEFTCTRL, 0, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */ | 53 | KEY_KPMINUS, KEY_HIRAGANA, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */ |
54 | /* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0,/* 65 -> 72 */ | 54 | /* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0, /* 65 -> 72 */ |
55 | KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */ | 55 | KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */ |
56 | /* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0,0, /* 81 -> 88 */ | 56 | /* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0, 0, /* 81 -> 88 */ |
57 | 0, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 89 -> 96 */ | 57 | 0, KEY_LEFTSHIFT, KEY_KP7, KEY_KP9, KEY_KP1, KEY_F11, KEY_KPPLUS, KEY_KPASTERISK, /* 89 -> 96 */ |
58 | /* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */ | 58 | /* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */ |
59 | KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_R, /* 105 -> 112 */ | 59 | KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_Y, /* 105 -> 112 */ |
60 | /* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */ | 60 | /* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */ |
61 | KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */ | 61 | KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */ |
62 | /* **** */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 62 | /* **** */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
63 | 0, 0, 0, 0, 0 | 63 | 0, 0, 0, 0, 0 |
64 | }; | 64 | }; |
diff --git a/drivers/input/keyboard/spitzkbd.c b/drivers/input/keyboard/spitzkbd.c index 410d78a774d0..1d59a2dc3c17 100644 --- a/drivers/input/keyboard/spitzkbd.c +++ b/drivers/input/keyboard/spitzkbd.c | |||
@@ -391,6 +391,7 @@ static int __init spitzkbd_probe(struct platform_device *dev) | |||
391 | for (i = 0; i < ARRAY_SIZE(spitzkbd_keycode); i++) | 391 | for (i = 0; i < ARRAY_SIZE(spitzkbd_keycode); i++) |
392 | set_bit(spitzkbd->keycode[i], input_dev->keybit); | 392 | set_bit(spitzkbd->keycode[i], input_dev->keybit); |
393 | clear_bit(0, input_dev->keybit); | 393 | clear_bit(0, input_dev->keybit); |
394 | set_bit(KEY_SUSPEND, input_dev->keybit); | ||
394 | set_bit(SW_LID, input_dev->swbit); | 395 | set_bit(SW_LID, input_dev->swbit); |
395 | set_bit(SW_TABLET_MODE, input_dev->swbit); | 396 | set_bit(SW_TABLET_MODE, input_dev->swbit); |
396 | set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); | 397 | set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 2b5ed119c9a9..b346a3b418ea 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -54,7 +54,7 @@ static const struct alps_model_info alps_model_data[] = { | |||
54 | { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */ | 54 | { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */ |
55 | { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, | 55 | { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, |
56 | { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */ | 56 | { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */ |
57 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xff, ALPS_FW_BK_1 } /* Dell Vostro 1400 */ | 57 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 } /* Dell Vostro 1400 */ |
58 | }; | 58 | }; |
59 | 59 | ||
60 | /* | 60 | /* |
diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c index 9ec57d80186e..df81b0aaa9f8 100644 --- a/drivers/input/mouse/lifebook.c +++ b/drivers/input/mouse/lifebook.c | |||
@@ -225,8 +225,13 @@ static void lifebook_set_resolution(struct psmouse *psmouse, unsigned int resolu | |||
225 | 225 | ||
226 | static void lifebook_disconnect(struct psmouse *psmouse) | 226 | static void lifebook_disconnect(struct psmouse *psmouse) |
227 | { | 227 | { |
228 | struct lifebook_data *priv = psmouse->private; | ||
229 | |||
228 | psmouse_reset(psmouse); | 230 | psmouse_reset(psmouse); |
229 | kfree(psmouse->private); | 231 | if (priv) { |
232 | input_unregister_device(priv->dev2); | ||
233 | kfree(priv); | ||
234 | } | ||
230 | psmouse->private = NULL; | 235 | psmouse->private = NULL; |
231 | } | 236 | } |
232 | 237 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 21a9c0b69a1f..b8628252e10c 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -1247,6 +1247,8 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
1247 | err_pt_deactivate: | 1247 | err_pt_deactivate: |
1248 | if (parent && parent->pt_deactivate) | 1248 | if (parent && parent->pt_deactivate) |
1249 | parent->pt_deactivate(parent); | 1249 | parent->pt_deactivate(parent); |
1250 | input_unregister_device(psmouse->dev); | ||
1251 | input_dev = NULL; /* so we don't try to free it below */ | ||
1250 | err_protocol_disconnect: | 1252 | err_protocol_disconnect: |
1251 | if (psmouse->disconnect) | 1253 | if (psmouse->disconnect) |
1252 | psmouse->disconnect(psmouse); | 1254 | psmouse->disconnect(psmouse); |
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index 78c3ea75da2a..be83516c776c 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c | |||
@@ -1029,6 +1029,15 @@ static const struct input_device_id mousedev_ids[] = { | |||
1029 | BIT_MASK(ABS_PRESSURE) | | 1029 | BIT_MASK(ABS_PRESSURE) | |
1030 | BIT_MASK(ABS_TOOL_WIDTH) }, | 1030 | BIT_MASK(ABS_TOOL_WIDTH) }, |
1031 | }, /* A touchpad */ | 1031 | }, /* A touchpad */ |
1032 | { | ||
1033 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT | | ||
1034 | INPUT_DEVICE_ID_MATCH_KEYBIT | | ||
1035 | INPUT_DEVICE_ID_MATCH_ABSBIT, | ||
1036 | .evbit = { BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_SYN) }, | ||
1037 | .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) }, | ||
1038 | .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) }, | ||
1039 | }, /* Mouse-like device with absolute X and Y but ordinary | ||
1040 | clicks, like hp ILO2 High Performance mouse */ | ||
1032 | 1041 | ||
1033 | { }, /* Terminating entry */ | 1042 | { }, /* Terminating entry */ |
1034 | }; | 1043 | }; |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index fa8442b6241c..90e8e92dfe47 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -115,19 +115,17 @@ config TOUCHSCREEN_MK712 | |||
115 | module will be called mk712. | 115 | module will be called mk712. |
116 | 116 | ||
117 | config TOUCHSCREEN_HP600 | 117 | config TOUCHSCREEN_HP600 |
118 | tristate "HP Jornada 680/690 touchscreen" | 118 | tristate "HP Jornada 6xx touchscreen" |
119 | depends on SH_HP6XX && SH_ADC | 119 | depends on SH_HP6XX && SH_ADC |
120 | help | 120 | help |
121 | Say Y here if you have a HP Jornada 680 or 690 and want to | 121 | Say Y here if you have a HP Jornada 620/660/680/690 and want to |
122 | support the built-in touchscreen. | 122 | support the built-in touchscreen. |
123 | 123 | ||
124 | If unsure, say N. | ||
125 | |||
126 | To compile this driver as a module, choose M here: the | 124 | To compile this driver as a module, choose M here: the |
127 | module will be called hp680_ts_input. | 125 | module will be called hp680_ts_input. |
128 | 126 | ||
129 | config TOUCHSCREEN_HP7XX | 127 | config TOUCHSCREEN_HP7XX |
130 | tristate "HP Jornada 710/720/728 touchscreen" | 128 | tristate "HP Jornada 7xx touchscreen" |
131 | depends on SA1100_JORNADA720_SSP | 129 | depends on SA1100_JORNADA720_SSP |
132 | help | 130 | help |
133 | Say Y here if you have a HP Jornada 710/720/728 and want | 131 | Say Y here if you have a HP Jornada 710/720/728 and want |
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 19055e7381f8..63f9664a066f 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * - DMC TSC-10/25 | 11 | * - DMC TSC-10/25 |
12 | * - IRTOUCHSYSTEMS/UNITOP | 12 | * - IRTOUCHSYSTEMS/UNITOP |
13 | * - IdealTEK URTC1000 | 13 | * - IdealTEK URTC1000 |
14 | * - General Touch | ||
14 | * - GoTop Super_Q2/GogoPen/PenPower tablets | 15 | * - GoTop Super_Q2/GogoPen/PenPower tablets |
15 | * | 16 | * |
16 | * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@gmx.ch> | 17 | * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@gmx.ch> |
@@ -50,7 +51,7 @@ | |||
50 | #include <linux/usb/input.h> | 51 | #include <linux/usb/input.h> |
51 | 52 | ||
52 | 53 | ||
53 | #define DRIVER_VERSION "v0.5" | 54 | #define DRIVER_VERSION "v0.6" |
54 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" | 55 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" |
55 | #define DRIVER_DESC "USB Touchscreen Driver" | 56 | #define DRIVER_DESC "USB Touchscreen Driver" |
56 | 57 | ||
@@ -65,17 +66,21 @@ struct usbtouch_device_info { | |||
65 | int min_yc, max_yc; | 66 | int min_yc, max_yc; |
66 | int min_press, max_press; | 67 | int min_press, max_press; |
67 | int rept_size; | 68 | int rept_size; |
68 | int flags; | ||
69 | 69 | ||
70 | void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); | 70 | void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); |
71 | |||
72 | /* | ||
73 | * used to get the packet len. possible return values: | ||
74 | * > 0: packet len | ||
75 | * = 0: skip one byte | ||
76 | * < 0: -return value more bytes needed | ||
77 | */ | ||
71 | int (*get_pkt_len) (unsigned char *pkt, int len); | 78 | int (*get_pkt_len) (unsigned char *pkt, int len); |
79 | |||
72 | int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); | 80 | int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); |
73 | int (*init) (struct usbtouch_usb *usbtouch); | 81 | int (*init) (struct usbtouch_usb *usbtouch); |
74 | }; | 82 | }; |
75 | 83 | ||
76 | #define USBTOUCH_FLG_BUFFER 0x01 | ||
77 | |||
78 | |||
79 | /* a usbtouch device */ | 84 | /* a usbtouch device */ |
80 | struct usbtouch_usb { | 85 | struct usbtouch_usb { |
81 | unsigned char *data; | 86 | unsigned char *data; |
@@ -94,15 +99,6 @@ struct usbtouch_usb { | |||
94 | }; | 99 | }; |
95 | 100 | ||
96 | 101 | ||
97 | #if defined(CONFIG_TOUCHSCREEN_USB_EGALAX) || defined(CONFIG_TOUCHSCREEN_USB_ETURBO) || defined(CONFIG_TOUCHSCREEN_USB_IDEALTEK) | ||
98 | #define MULTI_PACKET | ||
99 | #endif | ||
100 | |||
101 | #ifdef MULTI_PACKET | ||
102 | static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, | ||
103 | unsigned char *pkt, int len); | ||
104 | #endif | ||
105 | |||
106 | /* device types */ | 102 | /* device types */ |
107 | enum { | 103 | enum { |
108 | DEVTPYE_DUMMY = -1, | 104 | DEVTPYE_DUMMY = -1, |
@@ -186,6 +182,10 @@ static struct usb_device_id usbtouch_devices[] = { | |||
186 | 182 | ||
187 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX | 183 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX |
188 | 184 | ||
185 | #ifndef MULTI_PACKET | ||
186 | #define MULTI_PACKET | ||
187 | #endif | ||
188 | |||
189 | #define EGALAX_PKT_TYPE_MASK 0xFE | 189 | #define EGALAX_PKT_TYPE_MASK 0xFE |
190 | #define EGALAX_PKT_TYPE_REPT 0x80 | 190 | #define EGALAX_PKT_TYPE_REPT 0x80 |
191 | #define EGALAX_PKT_TYPE_DIAG 0x0A | 191 | #define EGALAX_PKT_TYPE_DIAG 0x0A |
@@ -323,6 +323,9 @@ static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
323 | * eTurboTouch part | 323 | * eTurboTouch part |
324 | */ | 324 | */ |
325 | #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO | 325 | #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO |
326 | #ifndef MULTI_PACKET | ||
327 | #define MULTI_PACKET | ||
328 | #endif | ||
326 | static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | 329 | static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
327 | { | 330 | { |
328 | unsigned int shift; | 331 | unsigned int shift; |
@@ -461,6 +464,9 @@ static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
461 | * IdealTEK URTC1000 Part | 464 | * IdealTEK URTC1000 Part |
462 | */ | 465 | */ |
463 | #ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK | 466 | #ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK |
467 | #ifndef MULTI_PACKET | ||
468 | #define MULTI_PACKET | ||
469 | #endif | ||
464 | static int idealtek_get_pkt_len(unsigned char *buf, int len) | 470 | static int idealtek_get_pkt_len(unsigned char *buf, int len) |
465 | { | 471 | { |
466 | if (buf[0] & 0x80) | 472 | if (buf[0] & 0x80) |
@@ -525,6 +531,11 @@ static int gotop_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
525 | /***************************************************************************** | 531 | /***************************************************************************** |
526 | * the different device descriptors | 532 | * the different device descriptors |
527 | */ | 533 | */ |
534 | #ifdef MULTI_PACKET | ||
535 | static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, | ||
536 | unsigned char *pkt, int len); | ||
537 | #endif | ||
538 | |||
528 | static struct usbtouch_device_info usbtouch_dev_info[] = { | 539 | static struct usbtouch_device_info usbtouch_dev_info[] = { |
529 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX | 540 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX |
530 | [DEVTYPE_EGALAX] = { | 541 | [DEVTYPE_EGALAX] = { |
@@ -533,7 +544,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
533 | .min_yc = 0x0, | 544 | .min_yc = 0x0, |
534 | .max_yc = 0x07ff, | 545 | .max_yc = 0x07ff, |
535 | .rept_size = 16, | 546 | .rept_size = 16, |
536 | .flags = USBTOUCH_FLG_BUFFER, | ||
537 | .process_pkt = usbtouch_process_multi, | 547 | .process_pkt = usbtouch_process_multi, |
538 | .get_pkt_len = egalax_get_pkt_len, | 548 | .get_pkt_len = egalax_get_pkt_len, |
539 | .read_data = egalax_read_data, | 549 | .read_data = egalax_read_data, |
@@ -582,7 +592,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
582 | .min_yc = 0x0, | 592 | .min_yc = 0x0, |
583 | .max_yc = 0x07ff, | 593 | .max_yc = 0x07ff, |
584 | .rept_size = 8, | 594 | .rept_size = 8, |
585 | .flags = USBTOUCH_FLG_BUFFER, | ||
586 | .process_pkt = usbtouch_process_multi, | 595 | .process_pkt = usbtouch_process_multi, |
587 | .get_pkt_len = eturbo_get_pkt_len, | 596 | .get_pkt_len = eturbo_get_pkt_len, |
588 | .read_data = eturbo_read_data, | 597 | .read_data = eturbo_read_data, |
@@ -630,7 +639,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
630 | .min_yc = 0x0, | 639 | .min_yc = 0x0, |
631 | .max_yc = 0x0fff, | 640 | .max_yc = 0x0fff, |
632 | .rept_size = 8, | 641 | .rept_size = 8, |
633 | .flags = USBTOUCH_FLG_BUFFER, | ||
634 | .process_pkt = usbtouch_process_multi, | 642 | .process_pkt = usbtouch_process_multi, |
635 | .get_pkt_len = idealtek_get_pkt_len, | 643 | .get_pkt_len = idealtek_get_pkt_len, |
636 | .read_data = idealtek_read_data, | 644 | .read_data = idealtek_read_data, |
@@ -738,11 +746,14 @@ static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, | |||
738 | pos = 0; | 746 | pos = 0; |
739 | while (pos < buf_len) { | 747 | while (pos < buf_len) { |
740 | /* get packet len */ | 748 | /* get packet len */ |
741 | pkt_len = usbtouch->type->get_pkt_len(buffer + pos, len); | 749 | pkt_len = usbtouch->type->get_pkt_len(buffer + pos, |
750 | buf_len - pos); | ||
742 | 751 | ||
743 | /* unknown packet: drop everything */ | 752 | /* unknown packet: skip one byte */ |
744 | if (unlikely(!pkt_len)) | 753 | if (unlikely(!pkt_len)) { |
745 | goto out_flush_buf; | 754 | pos++; |
755 | continue; | ||
756 | } | ||
746 | 757 | ||
747 | /* full packet: process */ | 758 | /* full packet: process */ |
748 | if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) { | 759 | if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) { |
@@ -857,7 +868,7 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
857 | if (!usbtouch->data) | 868 | if (!usbtouch->data) |
858 | goto out_free; | 869 | goto out_free; |
859 | 870 | ||
860 | if (type->flags & USBTOUCH_FLG_BUFFER) { | 871 | if (type->get_pkt_len) { |
861 | usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); | 872 | usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); |
862 | if (!usbtouch->buffer) | 873 | if (!usbtouch->buffer) |
863 | goto out_free_buffers; | 874 | goto out_free_buffers; |