diff options
Diffstat (limited to 'drivers/input')
24 files changed, 301 insertions, 198 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index dee6706038a..258c639571b 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -59,7 +59,8 @@ static void evdev_pass_event(struct evdev_client *client, | |||
59 | client->head &= EVDEV_BUFFER_SIZE - 1; | 59 | client->head &= EVDEV_BUFFER_SIZE - 1; |
60 | spin_unlock(&client->buffer_lock); | 60 | spin_unlock(&client->buffer_lock); |
61 | 61 | ||
62 | kill_fasync(&client->fasync, SIGIO, POLL_IN); | 62 | if (event->type == EV_SYN) |
63 | kill_fasync(&client->fasync, SIGIO, POLL_IN); | ||
63 | } | 64 | } |
64 | 65 | ||
65 | /* | 66 | /* |
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index b483b2995fa..f967008f332 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c | |||
@@ -221,11 +221,27 @@ static int get_compatible_type(struct ff_device *ff, int effect_type) | |||
221 | } | 221 | } |
222 | 222 | ||
223 | /* | 223 | /* |
224 | * Only left/right direction should be used (under/over 0x8000) for | ||
225 | * forward/reverse motor direction (to keep calculation fast & simple). | ||
226 | */ | ||
227 | static u16 ml_calculate_direction(u16 direction, u16 force, | ||
228 | u16 new_direction, u16 new_force) | ||
229 | { | ||
230 | if (!force) | ||
231 | return new_direction; | ||
232 | if (!new_force) | ||
233 | return direction; | ||
234 | return (((u32)(direction >> 1) * force + | ||
235 | (new_direction >> 1) * new_force) / | ||
236 | (force + new_force)) << 1; | ||
237 | } | ||
238 | |||
239 | /* | ||
224 | * Combine two effects and apply gain. | 240 | * Combine two effects and apply gain. |
225 | */ | 241 | */ |
226 | static void ml_combine_effects(struct ff_effect *effect, | 242 | static void ml_combine_effects(struct ff_effect *effect, |
227 | struct ml_effect_state *state, | 243 | struct ml_effect_state *state, |
228 | unsigned int gain) | 244 | int gain) |
229 | { | 245 | { |
230 | struct ff_effect *new = state->effect; | 246 | struct ff_effect *new = state->effect; |
231 | unsigned int strong, weak, i; | 247 | unsigned int strong, weak, i; |
@@ -252,8 +268,21 @@ static void ml_combine_effects(struct ff_effect *effect, | |||
252 | break; | 268 | break; |
253 | 269 | ||
254 | case FF_RUMBLE: | 270 | case FF_RUMBLE: |
255 | strong = new->u.rumble.strong_magnitude * gain / 0xffff; | 271 | strong = (u32)new->u.rumble.strong_magnitude * gain / 0xffff; |
256 | weak = new->u.rumble.weak_magnitude * gain / 0xffff; | 272 | weak = (u32)new->u.rumble.weak_magnitude * gain / 0xffff; |
273 | |||
274 | if (effect->u.rumble.strong_magnitude + strong) | ||
275 | effect->direction = ml_calculate_direction( | ||
276 | effect->direction, | ||
277 | effect->u.rumble.strong_magnitude, | ||
278 | new->direction, strong); | ||
279 | else if (effect->u.rumble.weak_magnitude + weak) | ||
280 | effect->direction = ml_calculate_direction( | ||
281 | effect->direction, | ||
282 | effect->u.rumble.weak_magnitude, | ||
283 | new->direction, weak); | ||
284 | else | ||
285 | effect->direction = 0; | ||
257 | effect->u.rumble.strong_magnitude = | 286 | effect->u.rumble.strong_magnitude = |
258 | min(strong + effect->u.rumble.strong_magnitude, | 287 | min(strong + effect->u.rumble.strong_magnitude, |
259 | 0xffffU); | 288 | 0xffffU); |
@@ -268,6 +297,13 @@ static void ml_combine_effects(struct ff_effect *effect, | |||
268 | /* here we also scale it 0x7fff => 0xffff */ | 297 | /* here we also scale it 0x7fff => 0xffff */ |
269 | i = i * gain / 0x7fff; | 298 | i = i * gain / 0x7fff; |
270 | 299 | ||
300 | if (effect->u.rumble.strong_magnitude + i) | ||
301 | effect->direction = ml_calculate_direction( | ||
302 | effect->direction, | ||
303 | effect->u.rumble.strong_magnitude, | ||
304 | new->direction, i); | ||
305 | else | ||
306 | effect->direction = 0; | ||
271 | effect->u.rumble.strong_magnitude = | 307 | effect->u.rumble.strong_magnitude = |
272 | min(i + effect->u.rumble.strong_magnitude, 0xffffU); | 308 | min(i + effect->u.rumble.strong_magnitude, 0xffffU); |
273 | effect->u.rumble.weak_magnitude = | 309 | effect->u.rumble.weak_magnitude = |
@@ -411,8 +447,6 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
411 | msecs_to_jiffies(state->effect->replay.length); | 447 | msecs_to_jiffies(state->effect->replay.length); |
412 | state->adj_at = state->play_at; | 448 | state->adj_at = state->play_at; |
413 | 449 | ||
414 | ml_schedule_timer(ml); | ||
415 | |||
416 | } else { | 450 | } else { |
417 | debug("initiated stop"); | 451 | debug("initiated stop"); |
418 | 452 | ||
@@ -420,10 +454,10 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
420 | __set_bit(FF_EFFECT_ABORTING, &state->flags); | 454 | __set_bit(FF_EFFECT_ABORTING, &state->flags); |
421 | else | 455 | else |
422 | __clear_bit(FF_EFFECT_STARTED, &state->flags); | 456 | __clear_bit(FF_EFFECT_STARTED, &state->flags); |
423 | |||
424 | ml_play_effects(ml); | ||
425 | } | 457 | } |
426 | 458 | ||
459 | ml_play_effects(ml); | ||
460 | |||
427 | return 0; | 461 | return 0; |
428 | } | 462 | } |
429 | 463 | ||
diff --git a/drivers/input/input.c b/drivers/input/input.c index ab060710688..30b503b8d67 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/mutex.h> | 24 | #include <linux/mutex.h> |
25 | #include <linux/rcupdate.h> | 25 | #include <linux/rcupdate.h> |
26 | #include <linux/smp_lock.h> | 26 | #include <linux/smp_lock.h> |
27 | #include "input-compat.h" | ||
27 | 28 | ||
28 | MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); | 29 | MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); |
29 | MODULE_DESCRIPTION("Input core"); | 30 | MODULE_DESCRIPTION("Input core"); |
@@ -764,6 +765,40 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han | |||
764 | return error; | 765 | return error; |
765 | } | 766 | } |
766 | 767 | ||
768 | #ifdef CONFIG_COMPAT | ||
769 | |||
770 | static int input_bits_to_string(char *buf, int buf_size, | ||
771 | unsigned long bits, bool skip_empty) | ||
772 | { | ||
773 | int len = 0; | ||
774 | |||
775 | if (INPUT_COMPAT_TEST) { | ||
776 | u32 dword = bits >> 32; | ||
777 | if (dword || !skip_empty) | ||
778 | len += snprintf(buf, buf_size, "%x ", dword); | ||
779 | |||
780 | dword = bits & 0xffffffffUL; | ||
781 | if (dword || !skip_empty || len) | ||
782 | len += snprintf(buf + len, max(buf_size - len, 0), | ||
783 | "%x", dword); | ||
784 | } else { | ||
785 | if (bits || !skip_empty) | ||
786 | len += snprintf(buf, buf_size, "%lx", bits); | ||
787 | } | ||
788 | |||
789 | return len; | ||
790 | } | ||
791 | |||
792 | #else /* !CONFIG_COMPAT */ | ||
793 | |||
794 | static int input_bits_to_string(char *buf, int buf_size, | ||
795 | unsigned long bits, bool skip_empty) | ||
796 | { | ||
797 | return bits || !skip_empty ? | ||
798 | snprintf(buf, buf_size, "%lx", bits) : 0; | ||
799 | } | ||
800 | |||
801 | #endif | ||
767 | 802 | ||
768 | #ifdef CONFIG_PROC_FS | 803 | #ifdef CONFIG_PROC_FS |
769 | 804 | ||
@@ -832,14 +867,25 @@ static void input_seq_print_bitmap(struct seq_file *seq, const char *name, | |||
832 | unsigned long *bitmap, int max) | 867 | unsigned long *bitmap, int max) |
833 | { | 868 | { |
834 | int i; | 869 | int i; |
835 | 870 | bool skip_empty = true; | |
836 | for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) | 871 | char buf[18]; |
837 | if (bitmap[i]) | ||
838 | break; | ||
839 | 872 | ||
840 | seq_printf(seq, "B: %s=", name); | 873 | seq_printf(seq, "B: %s=", name); |
841 | for (; i >= 0; i--) | 874 | |
842 | seq_printf(seq, "%lx%s", bitmap[i], i > 0 ? " " : ""); | 875 | for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { |
876 | if (input_bits_to_string(buf, sizeof(buf), | ||
877 | bitmap[i], skip_empty)) { | ||
878 | skip_empty = false; | ||
879 | seq_printf(seq, "%s%s", buf, i > 0 ? " " : ""); | ||
880 | } | ||
881 | } | ||
882 | |||
883 | /* | ||
884 | * If no output was produced print a single 0. | ||
885 | */ | ||
886 | if (skip_empty) | ||
887 | seq_puts(seq, "0"); | ||
888 | |||
843 | seq_putc(seq, '\n'); | 889 | seq_putc(seq, '\n'); |
844 | } | 890 | } |
845 | 891 | ||
@@ -1128,14 +1174,23 @@ static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap, | |||
1128 | { | 1174 | { |
1129 | int i; | 1175 | int i; |
1130 | int len = 0; | 1176 | int len = 0; |
1177 | bool skip_empty = true; | ||
1178 | |||
1179 | for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { | ||
1180 | len += input_bits_to_string(buf + len, max(buf_size - len, 0), | ||
1181 | bitmap[i], skip_empty); | ||
1182 | if (len) { | ||
1183 | skip_empty = false; | ||
1184 | if (i > 0) | ||
1185 | len += snprintf(buf + len, max(buf_size - len, 0), " "); | ||
1186 | } | ||
1187 | } | ||
1131 | 1188 | ||
1132 | for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) | 1189 | /* |
1133 | if (bitmap[i]) | 1190 | * If no output was produced print a single 0. |
1134 | break; | 1191 | */ |
1135 | 1192 | if (len == 0) | |
1136 | for (; i >= 0; i--) | 1193 | len = snprintf(buf, buf_size, "%d", 0); |
1137 | len += snprintf(buf + len, max(buf_size - len, 0), | ||
1138 | "%lx%s", bitmap[i], i > 0 ? " " : ""); | ||
1139 | 1194 | ||
1140 | if (add_cr) | 1195 | if (add_cr) |
1141 | len += snprintf(buf + len, max(buf_size - len, 0), "\n"); | 1196 | len += snprintf(buf + len, max(buf_size - len, 0), "\n"); |
@@ -1150,7 +1205,8 @@ static ssize_t input_dev_show_cap_##bm(struct device *dev, \ | |||
1150 | { \ | 1205 | { \ |
1151 | struct input_dev *input_dev = to_input_dev(dev); \ | 1206 | struct input_dev *input_dev = to_input_dev(dev); \ |
1152 | int len = input_print_bitmap(buf, PAGE_SIZE, \ | 1207 | int len = input_print_bitmap(buf, PAGE_SIZE, \ |
1153 | input_dev->bm##bit, ev##_MAX, 1); \ | 1208 | input_dev->bm##bit, ev##_MAX, \ |
1209 | true); \ | ||
1154 | return min_t(int, len, PAGE_SIZE); \ | 1210 | return min_t(int, len, PAGE_SIZE); \ |
1155 | } \ | 1211 | } \ |
1156 | static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) | 1212 | static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) |
@@ -1214,7 +1270,7 @@ static int input_add_uevent_bm_var(struct kobj_uevent_env *env, | |||
1214 | 1270 | ||
1215 | len = input_print_bitmap(&env->buf[env->buflen - 1], | 1271 | len = input_print_bitmap(&env->buf[env->buflen - 1], |
1216 | sizeof(env->buf) - env->buflen, | 1272 | sizeof(env->buf) - env->buflen, |
1217 | bitmap, max, 0); | 1273 | bitmap, max, false); |
1218 | if (len >= (sizeof(env->buf) - env->buflen)) | 1274 | if (len >= (sizeof(env->buf) - env->buflen)) |
1219 | return -ENOMEM; | 1275 | return -ENOMEM; |
1220 | 1276 | ||
diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c index 67c207f5b1a..45ac70eae0a 100644 --- a/drivers/input/joystick/gf2k.c +++ b/drivers/input/joystick/gf2k.c | |||
@@ -277,7 +277,7 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
277 | } | 277 | } |
278 | 278 | ||
279 | #ifdef RESET_WORKS | 279 | #ifdef RESET_WORKS |
280 | if ((gf2k->id != (GB(19,2,0) | GB(15,3,2) | GB(12,3,5))) || | 280 | if ((gf2k->id != (GB(19,2,0) | GB(15,3,2) | GB(12,3,5))) && |
281 | (gf2k->id != (GB(31,2,0) | GB(27,3,2) | GB(24,3,5)))) { | 281 | (gf2k->id != (GB(31,2,0) | GB(27,3,2) | GB(24,3,5)))) { |
282 | err = -ENODEV; | 282 | err = -ENODEV; |
283 | goto fail2; | 283 | goto fail2; |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index f6c688cae33..b1edd778639 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -210,7 +210,7 @@ static int iforce_open(struct input_dev *dev) | |||
210 | return 0; | 210 | return 0; |
211 | } | 211 | } |
212 | 212 | ||
213 | static void iforce_release(struct input_dev *dev) | 213 | static void iforce_close(struct input_dev *dev) |
214 | { | 214 | { |
215 | struct iforce *iforce = input_get_drvdata(dev); | 215 | struct iforce *iforce = input_get_drvdata(dev); |
216 | int i; | 216 | int i; |
@@ -228,30 +228,17 @@ static void iforce_release(struct input_dev *dev) | |||
228 | 228 | ||
229 | /* Disable force feedback playback */ | 229 | /* Disable force feedback playback */ |
230 | iforce_send_packet(iforce, FF_CMD_ENABLE, "\001"); | 230 | iforce_send_packet(iforce, FF_CMD_ENABLE, "\001"); |
231 | /* Wait for the command to complete */ | ||
232 | wait_event_interruptible(iforce->wait, | ||
233 | !test_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)); | ||
231 | } | 234 | } |
232 | 235 | ||
233 | switch (iforce->bus) { | 236 | switch (iforce->bus) { |
234 | #ifdef CONFIG_JOYSTICK_IFORCE_USB | 237 | #ifdef CONFIG_JOYSTICK_IFORCE_USB |
235 | case IFORCE_USB: | ||
236 | usb_kill_urb(iforce->irq); | ||
237 | |||
238 | /* The device was unplugged before the file | ||
239 | * was released */ | ||
240 | if (iforce->usbdev == NULL) { | ||
241 | iforce_delete_device(iforce); | ||
242 | kfree(iforce); | ||
243 | } | ||
244 | break; | ||
245 | #endif | ||
246 | } | ||
247 | } | ||
248 | |||
249 | void iforce_delete_device(struct iforce *iforce) | ||
250 | { | ||
251 | switch (iforce->bus) { | ||
252 | #ifdef CONFIG_JOYSTICK_IFORCE_USB | ||
253 | case IFORCE_USB: | 238 | case IFORCE_USB: |
254 | iforce_usb_delete(iforce); | 239 | usb_kill_urb(iforce->irq); |
240 | usb_kill_urb(iforce->out); | ||
241 | usb_kill_urb(iforce->ctrl); | ||
255 | break; | 242 | break; |
256 | #endif | 243 | #endif |
257 | #ifdef CONFIG_JOYSTICK_IFORCE_232 | 244 | #ifdef CONFIG_JOYSTICK_IFORCE_232 |
@@ -303,7 +290,7 @@ int iforce_init_device(struct iforce *iforce) | |||
303 | 290 | ||
304 | input_dev->name = "Unknown I-Force device"; | 291 | input_dev->name = "Unknown I-Force device"; |
305 | input_dev->open = iforce_open; | 292 | input_dev->open = iforce_open; |
306 | input_dev->close = iforce_release; | 293 | input_dev->close = iforce_close; |
307 | 294 | ||
308 | /* | 295 | /* |
309 | * On-device memory allocation. | 296 | * On-device memory allocation. |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index 9f289d8f52c..b41303d3ec5 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
@@ -109,6 +109,7 @@ static void iforce_usb_out(struct urb *urb) | |||
109 | struct iforce *iforce = urb->context; | 109 | struct iforce *iforce = urb->context; |
110 | 110 | ||
111 | if (urb->status) { | 111 | if (urb->status) { |
112 | clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); | ||
112 | dbg("urb->status %d, exiting", urb->status); | 113 | dbg("urb->status %d, exiting", urb->status); |
113 | return; | 114 | return; |
114 | } | 115 | } |
@@ -186,33 +187,19 @@ fail: | |||
186 | return err; | 187 | return err; |
187 | } | 188 | } |
188 | 189 | ||
189 | /* Called by iforce_delete() */ | ||
190 | void iforce_usb_delete(struct iforce* iforce) | ||
191 | { | ||
192 | usb_kill_urb(iforce->irq); | ||
193 | usb_kill_urb(iforce->out); | ||
194 | usb_kill_urb(iforce->ctrl); | ||
195 | |||
196 | usb_free_urb(iforce->irq); | ||
197 | usb_free_urb(iforce->out); | ||
198 | usb_free_urb(iforce->ctrl); | ||
199 | } | ||
200 | |||
201 | static void iforce_usb_disconnect(struct usb_interface *intf) | 190 | static void iforce_usb_disconnect(struct usb_interface *intf) |
202 | { | 191 | { |
203 | struct iforce *iforce = usb_get_intfdata(intf); | 192 | struct iforce *iforce = usb_get_intfdata(intf); |
204 | int open = 0; /* FIXME! iforce->dev.handle->open; */ | ||
205 | 193 | ||
206 | usb_set_intfdata(intf, NULL); | 194 | usb_set_intfdata(intf, NULL); |
207 | if (iforce) { | ||
208 | iforce->usbdev = NULL; | ||
209 | input_unregister_device(iforce->dev); | ||
210 | 195 | ||
211 | if (!open) { | 196 | input_unregister_device(iforce->dev); |
212 | iforce_delete_device(iforce); | 197 | |
213 | kfree(iforce); | 198 | usb_free_urb(iforce->irq); |
214 | } | 199 | usb_free_urb(iforce->out); |
215 | } | 200 | usb_free_urb(iforce->ctrl); |
201 | |||
202 | kfree(iforce); | ||
216 | } | 203 | } |
217 | 204 | ||
218 | static struct usb_device_id iforce_usb_ids [] = { | 205 | static struct usb_device_id iforce_usb_ids [] = { |
diff --git a/drivers/input/joystick/iforce/iforce.h b/drivers/input/joystick/iforce/iforce.h index f2d91f4028c..9f494b75848 100644 --- a/drivers/input/joystick/iforce/iforce.h +++ b/drivers/input/joystick/iforce/iforce.h | |||
@@ -150,11 +150,9 @@ void iforce_serial_xmit(struct iforce *iforce); | |||
150 | 150 | ||
151 | /* iforce-usb.c */ | 151 | /* iforce-usb.c */ |
152 | void iforce_usb_xmit(struct iforce *iforce); | 152 | void iforce_usb_xmit(struct iforce *iforce); |
153 | void iforce_usb_delete(struct iforce *iforce); | ||
154 | 153 | ||
155 | /* iforce-main.c */ | 154 | /* iforce-main.c */ |
156 | int iforce_init_device(struct iforce *iforce); | 155 | int iforce_init_device(struct iforce *iforce); |
157 | void iforce_delete_device(struct iforce *iforce); | ||
158 | 156 | ||
159 | /* iforce-packets.c */ | 157 | /* iforce-packets.c */ |
160 | int iforce_control_playback(struct iforce*, u16 id, unsigned int); | 158 | int iforce_control_playback(struct iforce*, u16 id, unsigned int); |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 482cb1204e4..8a28fb7846d 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -446,7 +446,7 @@ static void xpad_irq_in(struct urb *urb) | |||
446 | } | 446 | } |
447 | 447 | ||
448 | exit: | 448 | exit: |
449 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 449 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
450 | if (retval) | 450 | if (retval) |
451 | err ("%s - usb_submit_urb failed with result %d", | 451 | err ("%s - usb_submit_urb failed with result %d", |
452 | __func__, retval); | 452 | __func__, retval); |
@@ -571,7 +571,7 @@ static int xpad_play_effect(struct input_dev *dev, void *data, | |||
571 | xpad->odata[6] = 0x00; | 571 | xpad->odata[6] = 0x00; |
572 | xpad->odata[7] = 0x00; | 572 | xpad->odata[7] = 0x00; |
573 | xpad->irq_out->transfer_buffer_length = 8; | 573 | xpad->irq_out->transfer_buffer_length = 8; |
574 | usb_submit_urb(xpad->irq_out, GFP_KERNEL); | 574 | usb_submit_urb(xpad->irq_out, GFP_ATOMIC); |
575 | } | 575 | } |
576 | 576 | ||
577 | return 0; | 577 | return 0; |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index a3573570c52..7b4056292ea 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -134,7 +134,8 @@ static const unsigned short atkbd_unxlate_table[128] = { | |||
134 | #define ATKBD_CMD_GETID 0x02f2 | 134 | #define ATKBD_CMD_GETID 0x02f2 |
135 | #define ATKBD_CMD_SETREP 0x10f3 | 135 | #define ATKBD_CMD_SETREP 0x10f3 |
136 | #define ATKBD_CMD_ENABLE 0x00f4 | 136 | #define ATKBD_CMD_ENABLE 0x00f4 |
137 | #define ATKBD_CMD_RESET_DIS 0x00f5 | 137 | #define ATKBD_CMD_RESET_DIS 0x00f5 /* Reset to defaults and disable */ |
138 | #define ATKBD_CMD_RESET_DEF 0x00f6 /* Reset to defaults */ | ||
138 | #define ATKBD_CMD_SETALL_MBR 0x00fa | 139 | #define ATKBD_CMD_SETALL_MBR 0x00fa |
139 | #define ATKBD_CMD_RESET_BAT 0x02ff | 140 | #define ATKBD_CMD_RESET_BAT 0x02ff |
140 | #define ATKBD_CMD_RESEND 0x00fe | 141 | #define ATKBD_CMD_RESEND 0x00fe |
@@ -224,8 +225,10 @@ struct atkbd { | |||
224 | 225 | ||
225 | struct delayed_work event_work; | 226 | struct delayed_work event_work; |
226 | unsigned long event_jiffies; | 227 | unsigned long event_jiffies; |
227 | struct mutex event_mutex; | ||
228 | unsigned long event_mask; | 228 | unsigned long event_mask; |
229 | |||
230 | /* Serializes reconnect(), attr->set() and event work */ | ||
231 | struct mutex mutex; | ||
229 | }; | 232 | }; |
230 | 233 | ||
231 | /* | 234 | /* |
@@ -576,7 +579,7 @@ static void atkbd_event_work(struct work_struct *work) | |||
576 | { | 579 | { |
577 | struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); | 580 | struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); |
578 | 581 | ||
579 | mutex_lock(&atkbd->event_mutex); | 582 | mutex_lock(&atkbd->mutex); |
580 | 583 | ||
581 | if (!atkbd->enabled) { | 584 | if (!atkbd->enabled) { |
582 | /* | 585 | /* |
@@ -595,7 +598,7 @@ static void atkbd_event_work(struct work_struct *work) | |||
595 | atkbd_set_repeat_rate(atkbd); | 598 | atkbd_set_repeat_rate(atkbd); |
596 | } | 599 | } |
597 | 600 | ||
598 | mutex_unlock(&atkbd->event_mutex); | 601 | mutex_unlock(&atkbd->mutex); |
599 | } | 602 | } |
600 | 603 | ||
601 | /* | 604 | /* |
@@ -611,7 +614,7 @@ static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit) | |||
611 | 614 | ||
612 | atkbd->event_jiffies = jiffies; | 615 | atkbd->event_jiffies = jiffies; |
613 | set_bit(event_bit, &atkbd->event_mask); | 616 | set_bit(event_bit, &atkbd->event_mask); |
614 | wmb(); | 617 | mb(); |
615 | schedule_delayed_work(&atkbd->event_work, delay); | 618 | schedule_delayed_work(&atkbd->event_work, delay); |
616 | } | 619 | } |
617 | 620 | ||
@@ -836,7 +839,7 @@ static void atkbd_cleanup(struct serio *serio) | |||
836 | struct atkbd *atkbd = serio_get_drvdata(serio); | 839 | struct atkbd *atkbd = serio_get_drvdata(serio); |
837 | 840 | ||
838 | atkbd_disable(atkbd); | 841 | atkbd_disable(atkbd); |
839 | ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT); | 842 | ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF); |
840 | } | 843 | } |
841 | 844 | ||
842 | 845 | ||
@@ -848,13 +851,20 @@ static void atkbd_disconnect(struct serio *serio) | |||
848 | { | 851 | { |
849 | struct atkbd *atkbd = serio_get_drvdata(serio); | 852 | struct atkbd *atkbd = serio_get_drvdata(serio); |
850 | 853 | ||
854 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); | ||
855 | |||
851 | atkbd_disable(atkbd); | 856 | atkbd_disable(atkbd); |
852 | 857 | ||
853 | /* make sure we don't have a command in flight */ | 858 | input_unregister_device(atkbd->dev); |
859 | |||
860 | /* | ||
861 | * Make sure we don't have a command in flight. | ||
862 | * Note that since atkbd->enabled is false event work will keep | ||
863 | * rescheduling itself until it gets canceled and will not try | ||
864 | * accessing freed input device or serio port. | ||
865 | */ | ||
854 | cancel_delayed_work_sync(&atkbd->event_work); | 866 | cancel_delayed_work_sync(&atkbd->event_work); |
855 | 867 | ||
856 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); | ||
857 | input_unregister_device(atkbd->dev); | ||
858 | serio_close(serio); | 868 | serio_close(serio); |
859 | serio_set_drvdata(serio, NULL); | 869 | serio_set_drvdata(serio, NULL); |
860 | kfree(atkbd); | 870 | kfree(atkbd); |
@@ -1086,7 +1096,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) | |||
1086 | atkbd->dev = dev; | 1096 | atkbd->dev = dev; |
1087 | ps2_init(&atkbd->ps2dev, serio); | 1097 | ps2_init(&atkbd->ps2dev, serio); |
1088 | INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); | 1098 | INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); |
1089 | mutex_init(&atkbd->event_mutex); | 1099 | mutex_init(&atkbd->mutex); |
1090 | 1100 | ||
1091 | switch (serio->id.type) { | 1101 | switch (serio->id.type) { |
1092 | 1102 | ||
@@ -1159,19 +1169,23 @@ static int atkbd_reconnect(struct serio *serio) | |||
1159 | { | 1169 | { |
1160 | struct atkbd *atkbd = serio_get_drvdata(serio); | 1170 | struct atkbd *atkbd = serio_get_drvdata(serio); |
1161 | struct serio_driver *drv = serio->drv; | 1171 | struct serio_driver *drv = serio->drv; |
1172 | int retval = -1; | ||
1162 | 1173 | ||
1163 | if (!atkbd || !drv) { | 1174 | if (!atkbd || !drv) { |
1164 | printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); | 1175 | printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); |
1165 | return -1; | 1176 | return -1; |
1166 | } | 1177 | } |
1167 | 1178 | ||
1179 | mutex_lock(&atkbd->mutex); | ||
1180 | |||
1168 | atkbd_disable(atkbd); | 1181 | atkbd_disable(atkbd); |
1169 | 1182 | ||
1170 | if (atkbd->write) { | 1183 | if (atkbd->write) { |
1171 | if (atkbd_probe(atkbd)) | 1184 | if (atkbd_probe(atkbd)) |
1172 | return -1; | 1185 | goto out; |
1186 | |||
1173 | if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) | 1187 | if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) |
1174 | return -1; | 1188 | goto out; |
1175 | 1189 | ||
1176 | atkbd_activate(atkbd); | 1190 | atkbd_activate(atkbd); |
1177 | 1191 | ||
@@ -1189,8 +1203,11 @@ static int atkbd_reconnect(struct serio *serio) | |||
1189 | } | 1203 | } |
1190 | 1204 | ||
1191 | atkbd_enable(atkbd); | 1205 | atkbd_enable(atkbd); |
1206 | retval = 0; | ||
1192 | 1207 | ||
1193 | return 0; | 1208 | out: |
1209 | mutex_unlock(&atkbd->mutex); | ||
1210 | return retval; | ||
1194 | } | 1211 | } |
1195 | 1212 | ||
1196 | static struct serio_device_id atkbd_serio_ids[] = { | 1213 | static struct serio_device_id atkbd_serio_ids[] = { |
@@ -1234,47 +1251,28 @@ static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, | |||
1234 | ssize_t (*handler)(struct atkbd *, char *)) | 1251 | ssize_t (*handler)(struct atkbd *, char *)) |
1235 | { | 1252 | { |
1236 | struct serio *serio = to_serio_port(dev); | 1253 | struct serio *serio = to_serio_port(dev); |
1237 | int retval; | 1254 | struct atkbd *atkbd = serio_get_drvdata(serio); |
1238 | |||
1239 | retval = serio_pin_driver(serio); | ||
1240 | if (retval) | ||
1241 | return retval; | ||
1242 | |||
1243 | if (serio->drv != &atkbd_drv) { | ||
1244 | retval = -ENODEV; | ||
1245 | goto out; | ||
1246 | } | ||
1247 | |||
1248 | retval = handler((struct atkbd *)serio_get_drvdata(serio), buf); | ||
1249 | 1255 | ||
1250 | out: | 1256 | return handler(atkbd, buf); |
1251 | serio_unpin_driver(serio); | ||
1252 | return retval; | ||
1253 | } | 1257 | } |
1254 | 1258 | ||
1255 | static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, | 1259 | static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, |
1256 | ssize_t (*handler)(struct atkbd *, const char *, size_t)) | 1260 | ssize_t (*handler)(struct atkbd *, const char *, size_t)) |
1257 | { | 1261 | { |
1258 | struct serio *serio = to_serio_port(dev); | 1262 | struct serio *serio = to_serio_port(dev); |
1259 | struct atkbd *atkbd; | 1263 | struct atkbd *atkbd = serio_get_drvdata(serio); |
1260 | int retval; | 1264 | int retval; |
1261 | 1265 | ||
1262 | retval = serio_pin_driver(serio); | 1266 | retval = mutex_lock_interruptible(&atkbd->mutex); |
1263 | if (retval) | 1267 | if (retval) |
1264 | return retval; | 1268 | return retval; |
1265 | 1269 | ||
1266 | if (serio->drv != &atkbd_drv) { | ||
1267 | retval = -ENODEV; | ||
1268 | goto out; | ||
1269 | } | ||
1270 | |||
1271 | atkbd = serio_get_drvdata(serio); | ||
1272 | atkbd_disable(atkbd); | 1270 | atkbd_disable(atkbd); |
1273 | retval = handler(atkbd, buf, count); | 1271 | retval = handler(atkbd, buf, count); |
1274 | atkbd_enable(atkbd); | 1272 | atkbd_enable(atkbd); |
1275 | 1273 | ||
1276 | out: | 1274 | mutex_unlock(&atkbd->mutex); |
1277 | serio_unpin_driver(serio); | 1275 | |
1278 | return retval; | 1276 | return retval; |
1279 | } | 1277 | } |
1280 | 1278 | ||
diff --git a/drivers/input/keyboard/davinci_keyscan.c b/drivers/input/keyboard/davinci_keyscan.c index 6e52d855f63..d410d7a52f1 100644 --- a/drivers/input/keyboard/davinci_keyscan.c +++ b/drivers/input/keyboard/davinci_keyscan.c | |||
@@ -174,6 +174,14 @@ static int __init davinci_ks_probe(struct platform_device *pdev) | |||
174 | struct davinci_ks_platform_data *pdata = pdev->dev.platform_data; | 174 | struct davinci_ks_platform_data *pdata = pdev->dev.platform_data; |
175 | int error, i; | 175 | int error, i; |
176 | 176 | ||
177 | if (pdata->device_enable) { | ||
178 | error = pdata->device_enable(dev); | ||
179 | if (error < 0) { | ||
180 | dev_dbg(dev, "device enable function failed\n"); | ||
181 | return error; | ||
182 | } | ||
183 | } | ||
184 | |||
177 | if (!pdata->keymap) { | 185 | if (!pdata->keymap) { |
178 | dev_dbg(dev, "no keymap from pdata\n"); | 186 | dev_dbg(dev, "no keymap from pdata\n"); |
179 | return -EINVAL; | 187 | return -EINVAL; |
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c index 34f4a29d497..d3c8b61a941 100644 --- a/drivers/input/keyboard/matrix_keypad.c +++ b/drivers/input/keyboard/matrix_keypad.c | |||
@@ -29,11 +29,13 @@ struct matrix_keypad { | |||
29 | unsigned short *keycodes; | 29 | unsigned short *keycodes; |
30 | unsigned int row_shift; | 30 | unsigned int row_shift; |
31 | 31 | ||
32 | DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); | ||
33 | |||
32 | uint32_t last_key_state[MATRIX_MAX_COLS]; | 34 | uint32_t last_key_state[MATRIX_MAX_COLS]; |
33 | struct delayed_work work; | 35 | struct delayed_work work; |
36 | spinlock_t lock; | ||
34 | bool scan_pending; | 37 | bool scan_pending; |
35 | bool stopped; | 38 | bool stopped; |
36 | spinlock_t lock; | ||
37 | }; | 39 | }; |
38 | 40 | ||
39 | /* | 41 | /* |
@@ -222,9 +224,16 @@ static int matrix_keypad_suspend(struct device *dev) | |||
222 | 224 | ||
223 | matrix_keypad_stop(keypad->input_dev); | 225 | matrix_keypad_stop(keypad->input_dev); |
224 | 226 | ||
225 | if (device_may_wakeup(&pdev->dev)) | 227 | if (device_may_wakeup(&pdev->dev)) { |
226 | for (i = 0; i < pdata->num_row_gpios; i++) | 228 | for (i = 0; i < pdata->num_row_gpios; i++) { |
227 | enable_irq_wake(gpio_to_irq(pdata->row_gpios[i])); | 229 | if (!test_bit(i, keypad->disabled_gpios)) { |
230 | unsigned int gpio = pdata->row_gpios[i]; | ||
231 | |||
232 | if (enable_irq_wake(gpio_to_irq(gpio)) == 0) | ||
233 | __set_bit(i, keypad->disabled_gpios); | ||
234 | } | ||
235 | } | ||
236 | } | ||
228 | 237 | ||
229 | return 0; | 238 | return 0; |
230 | } | 239 | } |
@@ -236,9 +245,15 @@ static int matrix_keypad_resume(struct device *dev) | |||
236 | const struct matrix_keypad_platform_data *pdata = keypad->pdata; | 245 | const struct matrix_keypad_platform_data *pdata = keypad->pdata; |
237 | int i; | 246 | int i; |
238 | 247 | ||
239 | if (device_may_wakeup(&pdev->dev)) | 248 | if (device_may_wakeup(&pdev->dev)) { |
240 | for (i = 0; i < pdata->num_row_gpios; i++) | 249 | for (i = 0; i < pdata->num_row_gpios; i++) { |
241 | disable_irq_wake(gpio_to_irq(pdata->row_gpios[i])); | 250 | if (test_and_clear_bit(i, keypad->disabled_gpios)) { |
251 | unsigned int gpio = pdata->row_gpios[i]; | ||
252 | |||
253 | disable_irq_wake(gpio_to_irq(gpio)); | ||
254 | } | ||
255 | } | ||
256 | } | ||
242 | 257 | ||
243 | matrix_keypad_start(keypad->input_dev); | 258 | matrix_keypad_start(keypad->input_dev); |
244 | 259 | ||
diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c index eeaa7acb9cf..21d6184efa9 100644 --- a/drivers/input/keyboard/twl4030_keypad.c +++ b/drivers/input/keyboard/twl4030_keypad.c | |||
@@ -253,14 +253,6 @@ static irqreturn_t do_kp_irq(int irq, void *_kp) | |||
253 | u8 reg; | 253 | u8 reg; |
254 | int ret; | 254 | int ret; |
255 | 255 | ||
256 | #ifdef CONFIG_LOCKDEP | ||
257 | /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which | ||
258 | * we don't want and can't tolerate. Although it might be | ||
259 | * friendlier not to borrow this thread context... | ||
260 | */ | ||
261 | local_irq_enable(); | ||
262 | #endif | ||
263 | |||
264 | /* Read & Clear TWL4030 pending interrupt */ | 256 | /* Read & Clear TWL4030 pending interrupt */ |
265 | ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); | 257 | ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); |
266 | 258 | ||
@@ -403,7 +395,8 @@ static int __devinit twl4030_kp_probe(struct platform_device *pdev) | |||
403 | * | 395 | * |
404 | * NOTE: we assume this host is wired to TWL4040 INT1, not INT2 ... | 396 | * NOTE: we assume this host is wired to TWL4040 INT1, not INT2 ... |
405 | */ | 397 | */ |
406 | error = request_irq(kp->irq, do_kp_irq, 0, pdev->name, kp); | 398 | error = request_threaded_irq(kp->irq, NULL, do_kp_irq, |
399 | 0, pdev->name, kp); | ||
407 | if (error) { | 400 | if (error) { |
408 | dev_info(kp->dbg_dev, "request_irq failed for irq no=%d\n", | 401 | dev_info(kp->dbg_dev, "request_irq failed for irq no=%d\n", |
409 | kp->irq); | 402 | kp->irq); |
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c index bdde5c88903..e9069b87fde 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c | |||
@@ -39,18 +39,8 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr) | |||
39 | int err; | 39 | int err; |
40 | u8 value; | 40 | u8 value; |
41 | 41 | ||
42 | #ifdef CONFIG_LOCKDEP | ||
43 | /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which | ||
44 | * we don't want and can't tolerate since this is a threaded | ||
45 | * IRQ and can sleep due to the i2c reads it has to issue. | ||
46 | * Although it might be friendlier not to borrow this thread | ||
47 | * context... | ||
48 | */ | ||
49 | local_irq_enable(); | ||
50 | #endif | ||
51 | |||
52 | err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value, | 42 | err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value, |
53 | STS_HW_CONDITIONS); | 43 | STS_HW_CONDITIONS); |
54 | if (!err) { | 44 | if (!err) { |
55 | input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); | 45 | input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); |
56 | input_sync(pwr); | 46 | input_sync(pwr); |
@@ -80,7 +70,7 @@ static int __devinit twl4030_pwrbutton_probe(struct platform_device *pdev) | |||
80 | pwr->phys = "twl4030_pwrbutton/input0"; | 70 | pwr->phys = "twl4030_pwrbutton/input0"; |
81 | pwr->dev.parent = &pdev->dev; | 71 | pwr->dev.parent = &pdev->dev; |
82 | 72 | ||
83 | err = request_irq(irq, powerbutton_irq, | 73 | err = request_threaded_irq(irq, NULL, powerbutton_irq, |
84 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | 74 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, |
85 | "twl4030_pwrbutton", pwr); | 75 | "twl4030_pwrbutton", pwr); |
86 | if (err < 0) { | 76 | if (err < 0) { |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 38da6ab0438..c0afb71a3a6 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -1328,7 +1328,7 @@ static struct platform_driver wistron_driver = { | |||
1328 | .driver = { | 1328 | .driver = { |
1329 | .name = "wistron-bios", | 1329 | .name = "wistron-bios", |
1330 | .owner = THIS_MODULE, | 1330 | .owner = THIS_MODULE, |
1331 | #if CONFIG_PM | 1331 | #ifdef CONFIG_PM |
1332 | .pm = &wistron_pm_ops, | 1332 | .pm = &wistron_pm_ops, |
1333 | #endif | 1333 | #endif |
1334 | }, | 1334 | }, |
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index 3feeb3af8ab..c714ca2407f 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig | |||
@@ -70,7 +70,7 @@ config MOUSE_PS2_SYNAPTICS | |||
70 | config MOUSE_PS2_LIFEBOOK | 70 | config MOUSE_PS2_LIFEBOOK |
71 | bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EMBEDDED | 71 | bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EMBEDDED |
72 | default y | 72 | default y |
73 | depends on MOUSE_PS2 && X86 | 73 | depends on MOUSE_PS2 && X86 && DMI |
74 | help | 74 | help |
75 | Say Y here if you have a Fujitsu B-series Lifebook PS/2 | 75 | Say Y here if you have a Fujitsu B-series Lifebook PS/2 |
76 | TouchScreen connected to your system. | 76 | TouchScreen connected to your system. |
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c index 0d1d33468b4..4f8fe0886b2 100644 --- a/drivers/input/mouse/bcm5974.c +++ b/drivers/input/mouse/bcm5974.c | |||
@@ -139,6 +139,7 @@ struct tp_finger { | |||
139 | /* trackpad finger data size, empirically at least ten fingers */ | 139 | /* trackpad finger data size, empirically at least ten fingers */ |
140 | #define SIZEOF_FINGER sizeof(struct tp_finger) | 140 | #define SIZEOF_FINGER sizeof(struct tp_finger) |
141 | #define SIZEOF_ALL_FINGERS (16 * SIZEOF_FINGER) | 141 | #define SIZEOF_ALL_FINGERS (16 * SIZEOF_FINGER) |
142 | #define MAX_FINGER_ORIENTATION 16384 | ||
142 | 143 | ||
143 | /* device-specific parameters */ | 144 | /* device-specific parameters */ |
144 | struct bcm5974_param { | 145 | struct bcm5974_param { |
@@ -284,6 +285,26 @@ static void setup_events_to_report(struct input_dev *input_dev, | |||
284 | input_set_abs_params(input_dev, ABS_Y, | 285 | input_set_abs_params(input_dev, ABS_Y, |
285 | 0, cfg->y.dim, cfg->y.fuzz, 0); | 286 | 0, cfg->y.dim, cfg->y.fuzz, 0); |
286 | 287 | ||
288 | /* finger touch area */ | ||
289 | input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, | ||
290 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
291 | input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, | ||
292 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
293 | /* finger approach area */ | ||
294 | input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, | ||
295 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
296 | input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, | ||
297 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
298 | /* finger orientation */ | ||
299 | input_set_abs_params(input_dev, ABS_MT_ORIENTATION, | ||
300 | -MAX_FINGER_ORIENTATION, | ||
301 | MAX_FINGER_ORIENTATION, 0, 0); | ||
302 | /* finger position */ | ||
303 | input_set_abs_params(input_dev, ABS_MT_POSITION_X, | ||
304 | cfg->x.devmin, cfg->x.devmax, 0, 0); | ||
305 | input_set_abs_params(input_dev, ABS_MT_POSITION_Y, | ||
306 | cfg->y.devmin, cfg->y.devmax, 0, 0); | ||
307 | |||
287 | __set_bit(EV_KEY, input_dev->evbit); | 308 | __set_bit(EV_KEY, input_dev->evbit); |
288 | __set_bit(BTN_TOUCH, input_dev->keybit); | 309 | __set_bit(BTN_TOUCH, input_dev->keybit); |
289 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); | 310 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); |
@@ -310,13 +331,29 @@ static int report_bt_state(struct bcm5974 *dev, int size) | |||
310 | return 0; | 331 | return 0; |
311 | } | 332 | } |
312 | 333 | ||
334 | static void report_finger_data(struct input_dev *input, | ||
335 | const struct bcm5974_config *cfg, | ||
336 | const struct tp_finger *f) | ||
337 | { | ||
338 | input_report_abs(input, ABS_MT_TOUCH_MAJOR, raw2int(f->force_major)); | ||
339 | input_report_abs(input, ABS_MT_TOUCH_MINOR, raw2int(f->force_minor)); | ||
340 | input_report_abs(input, ABS_MT_WIDTH_MAJOR, raw2int(f->size_major)); | ||
341 | input_report_abs(input, ABS_MT_WIDTH_MINOR, raw2int(f->size_minor)); | ||
342 | input_report_abs(input, ABS_MT_ORIENTATION, | ||
343 | MAX_FINGER_ORIENTATION - raw2int(f->orientation)); | ||
344 | input_report_abs(input, ABS_MT_POSITION_X, raw2int(f->abs_x)); | ||
345 | input_report_abs(input, ABS_MT_POSITION_Y, | ||
346 | cfg->y.devmin + cfg->y.devmax - raw2int(f->abs_y)); | ||
347 | input_mt_sync(input); | ||
348 | } | ||
349 | |||
313 | /* report trackpad data as logical trackpad state */ | 350 | /* report trackpad data as logical trackpad state */ |
314 | static int report_tp_state(struct bcm5974 *dev, int size) | 351 | static int report_tp_state(struct bcm5974 *dev, int size) |
315 | { | 352 | { |
316 | const struct bcm5974_config *c = &dev->cfg; | 353 | const struct bcm5974_config *c = &dev->cfg; |
317 | const struct tp_finger *f; | 354 | const struct tp_finger *f; |
318 | struct input_dev *input = dev->input; | 355 | struct input_dev *input = dev->input; |
319 | int raw_p, raw_w, raw_x, raw_y, raw_n; | 356 | int raw_p, raw_w, raw_x, raw_y, raw_n, i; |
320 | int ptest, origin, ibt = 0, nmin = 0, nmax = 0; | 357 | int ptest, origin, ibt = 0, nmin = 0, nmax = 0; |
321 | int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0; | 358 | int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0; |
322 | 359 | ||
@@ -329,6 +366,11 @@ static int report_tp_state(struct bcm5974 *dev, int size) | |||
329 | 366 | ||
330 | /* always track the first finger; when detached, start over */ | 367 | /* always track the first finger; when detached, start over */ |
331 | if (raw_n) { | 368 | if (raw_n) { |
369 | |||
370 | /* report raw trackpad data */ | ||
371 | for (i = 0; i < raw_n; i++) | ||
372 | report_finger_data(input, c, &f[i]); | ||
373 | |||
332 | raw_p = raw2int(f->force_major); | 374 | raw_p = raw2int(f->force_major); |
333 | raw_w = raw2int(f->size_major); | 375 | raw_w = raw2int(f->size_major); |
334 | raw_x = raw2int(f->abs_x); | 376 | raw_x = raw2int(f->abs_x); |
diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index b146237266d..90be30e9355 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c | |||
@@ -427,7 +427,6 @@ static void hgpk_recalib_work(struct work_struct *work) | |||
427 | 427 | ||
428 | static int hgpk_register(struct psmouse *psmouse) | 428 | static int hgpk_register(struct psmouse *psmouse) |
429 | { | 429 | { |
430 | struct input_dev *dev = psmouse->dev; | ||
431 | int err; | 430 | int err; |
432 | 431 | ||
433 | /* register handlers */ | 432 | /* register handlers */ |
diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c index 2e6bdfea016..6d7aa10d10f 100644 --- a/drivers/input/mouse/lifebook.c +++ b/drivers/input/mouse/lifebook.c | |||
@@ -44,7 +44,6 @@ static int lifebook_set_6byte_proto(const struct dmi_system_id *d) | |||
44 | } | 44 | } |
45 | 45 | ||
46 | static const struct dmi_system_id __initconst lifebook_dmi_table[] = { | 46 | static const struct dmi_system_id __initconst lifebook_dmi_table[] = { |
47 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
48 | { | 47 | { |
49 | /* FLORA-ie 55mi */ | 48 | /* FLORA-ie 55mi */ |
50 | .matches = { | 49 | .matches = { |
@@ -118,7 +117,6 @@ static const struct dmi_system_id __initconst lifebook_dmi_table[] = { | |||
118 | }, | 117 | }, |
119 | }, | 118 | }, |
120 | { } | 119 | { } |
121 | #endif | ||
122 | }; | 120 | }; |
123 | 121 | ||
124 | void __init lifebook_module_init(void) | 122 | void __init lifebook_module_init(void) |
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index fd0bc094616..9774bdfaa48 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -627,8 +627,15 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
627 | synaptics_hardware = true; | 627 | synaptics_hardware = true; |
628 | 628 | ||
629 | if (max_proto > PSMOUSE_IMEX) { | 629 | if (max_proto > PSMOUSE_IMEX) { |
630 | if (!set_properties || synaptics_init(psmouse) == 0) | 630 | /* |
631 | * Try activating protocol, but check if support is enabled first, since | ||
632 | * we try detecting Synaptics even when protocol is disabled. | ||
633 | */ | ||
634 | if (synaptics_supported() && | ||
635 | (!set_properties || synaptics_init(psmouse) == 0)) { | ||
631 | return PSMOUSE_SYNAPTICS; | 636 | return PSMOUSE_SYNAPTICS; |
637 | } | ||
638 | |||
632 | /* | 639 | /* |
633 | * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). | 640 | * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). |
634 | * Unfortunately Logitech/Genius probes confuse some firmware versions so | 641 | * Unfortunately Logitech/Genius probes confuse some firmware versions so |
@@ -683,19 +690,6 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
683 | max_proto = PSMOUSE_IMEX; | 690 | max_proto = PSMOUSE_IMEX; |
684 | } | 691 | } |
685 | 692 | ||
686 | /* | ||
687 | * Try Finger Sensing Pad | ||
688 | */ | ||
689 | if (max_proto > PSMOUSE_IMEX) { | ||
690 | if (fsp_detect(psmouse, set_properties) == 0) { | ||
691 | if (!set_properties || fsp_init(psmouse) == 0) | ||
692 | return PSMOUSE_FSP; | ||
693 | /* | ||
694 | * Init failed, try basic relative protocols | ||
695 | */ | ||
696 | max_proto = PSMOUSE_IMEX; | ||
697 | } | ||
698 | } | ||
699 | 693 | ||
700 | if (max_proto > PSMOUSE_IMEX) { | 694 | if (max_proto > PSMOUSE_IMEX) { |
701 | if (genius_detect(psmouse, set_properties) == 0) | 695 | if (genius_detect(psmouse, set_properties) == 0) |
@@ -712,6 +706,21 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
712 | } | 706 | } |
713 | 707 | ||
714 | /* | 708 | /* |
709 | * Try Finger Sensing Pad. We do it here because its probe upsets | ||
710 | * Trackpoint devices (causing TP_READ_ID command to time out). | ||
711 | */ | ||
712 | if (max_proto > PSMOUSE_IMEX) { | ||
713 | if (fsp_detect(psmouse, set_properties) == 0) { | ||
714 | if (!set_properties || fsp_init(psmouse) == 0) | ||
715 | return PSMOUSE_FSP; | ||
716 | /* | ||
717 | * Init failed, try basic relative protocols | ||
718 | */ | ||
719 | max_proto = PSMOUSE_IMEX; | ||
720 | } | ||
721 | } | ||
722 | |||
723 | /* | ||
715 | * Reset to defaults in case the device got confused by extended | 724 | * Reset to defaults in case the device got confused by extended |
716 | * protocol probes. Note that we follow up with full reset because | 725 | * protocol probes. Note that we follow up with full reset because |
717 | * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. | 726 | * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. |
@@ -1137,7 +1146,10 @@ static void psmouse_cleanup(struct serio *serio) | |||
1137 | if (psmouse->cleanup) | 1146 | if (psmouse->cleanup) |
1138 | psmouse->cleanup(psmouse); | 1147 | psmouse->cleanup(psmouse); |
1139 | 1148 | ||
1140 | psmouse_reset(psmouse); | 1149 | /* |
1150 | * Reset the mouse to defaults (bare PS/2 protocol). | ||
1151 | */ | ||
1152 | ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); | ||
1141 | 1153 | ||
1142 | /* | 1154 | /* |
1143 | * Some boxes, such as HP nx7400, get terribly confused if mouse | 1155 | * Some boxes, such as HP nx7400, get terribly confused if mouse |
@@ -1447,24 +1459,10 @@ ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *de | |||
1447 | struct serio *serio = to_serio_port(dev); | 1459 | struct serio *serio = to_serio_port(dev); |
1448 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); | 1460 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); |
1449 | struct psmouse *psmouse; | 1461 | struct psmouse *psmouse; |
1450 | int retval; | ||
1451 | |||
1452 | retval = serio_pin_driver(serio); | ||
1453 | if (retval) | ||
1454 | return retval; | ||
1455 | |||
1456 | if (serio->drv != &psmouse_drv) { | ||
1457 | retval = -ENODEV; | ||
1458 | goto out; | ||
1459 | } | ||
1460 | 1462 | ||
1461 | psmouse = serio_get_drvdata(serio); | 1463 | psmouse = serio_get_drvdata(serio); |
1462 | 1464 | ||
1463 | retval = attr->show(psmouse, attr->data, buf); | 1465 | return attr->show(psmouse, attr->data, buf); |
1464 | |||
1465 | out: | ||
1466 | serio_unpin_driver(serio); | ||
1467 | return retval; | ||
1468 | } | 1466 | } |
1469 | 1467 | ||
1470 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, | 1468 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, |
@@ -1475,18 +1473,9 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev | |||
1475 | struct psmouse *psmouse, *parent = NULL; | 1473 | struct psmouse *psmouse, *parent = NULL; |
1476 | int retval; | 1474 | int retval; |
1477 | 1475 | ||
1478 | retval = serio_pin_driver(serio); | ||
1479 | if (retval) | ||
1480 | return retval; | ||
1481 | |||
1482 | if (serio->drv != &psmouse_drv) { | ||
1483 | retval = -ENODEV; | ||
1484 | goto out_unpin; | ||
1485 | } | ||
1486 | |||
1487 | retval = mutex_lock_interruptible(&psmouse_mutex); | 1476 | retval = mutex_lock_interruptible(&psmouse_mutex); |
1488 | if (retval) | 1477 | if (retval) |
1489 | goto out_unpin; | 1478 | goto out; |
1490 | 1479 | ||
1491 | psmouse = serio_get_drvdata(serio); | 1480 | psmouse = serio_get_drvdata(serio); |
1492 | 1481 | ||
@@ -1516,8 +1505,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev | |||
1516 | 1505 | ||
1517 | out_unlock: | 1506 | out_unlock: |
1518 | mutex_unlock(&psmouse_mutex); | 1507 | mutex_unlock(&psmouse_mutex); |
1519 | out_unpin: | 1508 | out: |
1520 | serio_unpin_driver(serio); | ||
1521 | return retval; | 1509 | return retval; |
1522 | } | 1510 | } |
1523 | 1511 | ||
@@ -1579,9 +1567,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1579 | } | 1567 | } |
1580 | 1568 | ||
1581 | mutex_unlock(&psmouse_mutex); | 1569 | mutex_unlock(&psmouse_mutex); |
1582 | serio_unpin_driver(serio); | ||
1583 | serio_unregister_child_port(serio); | 1570 | serio_unregister_child_port(serio); |
1584 | serio_pin_driver_uninterruptible(serio); | ||
1585 | mutex_lock(&psmouse_mutex); | 1571 | mutex_lock(&psmouse_mutex); |
1586 | 1572 | ||
1587 | if (serio->drv != &psmouse_drv) { | 1573 | if (serio->drv != &psmouse_drv) { |
diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index 77b9fd0b3fb..81a6b81cb2f 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Finger Sensing Pad PS/2 mouse driver. | 2 | * Finger Sensing Pad PS/2 mouse driver. |
3 | * | 3 | * |
4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. | 4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. |
5 | * Copyright (C) 2005-2009 Tai-hwa Liang, Sentelic Corporation. | 5 | * Copyright (C) 2005-2010 Tai-hwa Liang, Sentelic Corporation. |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
@@ -658,9 +658,9 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse) | |||
658 | if (packet[3] & BIT(1)) | 658 | if (packet[3] & BIT(1)) |
659 | button_status |= 0x0f; /* wheel up */ | 659 | button_status |= 0x0f; /* wheel up */ |
660 | if (packet[3] & BIT(2)) | 660 | if (packet[3] & BIT(2)) |
661 | button_status |= BIT(5);/* horizontal left */ | 661 | button_status |= BIT(4);/* horizontal left */ |
662 | if (packet[3] & BIT(3)) | 662 | if (packet[3] & BIT(3)) |
663 | button_status |= BIT(4);/* horizontal right */ | 663 | button_status |= BIT(5);/* horizontal right */ |
664 | /* push back to packet queue */ | 664 | /* push back to packet queue */ |
665 | if (button_status != 0) | 665 | if (button_status != 0) |
666 | packet[3] = button_status; | 666 | packet[3] = button_status; |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 05689e73219..d3f5243fa09 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -743,6 +743,11 @@ int synaptics_init(struct psmouse *psmouse) | |||
743 | return -1; | 743 | return -1; |
744 | } | 744 | } |
745 | 745 | ||
746 | bool synaptics_supported(void) | ||
747 | { | ||
748 | return true; | ||
749 | } | ||
750 | |||
746 | #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ | 751 | #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ |
747 | 752 | ||
748 | void __init synaptics_module_init(void) | 753 | void __init synaptics_module_init(void) |
@@ -754,5 +759,10 @@ int synaptics_init(struct psmouse *psmouse) | |||
754 | return -ENOSYS; | 759 | return -ENOSYS; |
755 | } | 760 | } |
756 | 761 | ||
762 | bool synaptics_supported(void) | ||
763 | { | ||
764 | return false; | ||
765 | } | ||
766 | |||
757 | #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */ | 767 | #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */ |
758 | 768 | ||
diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h index 838e7f2c9b3..f0f40a331dc 100644 --- a/drivers/input/mouse/synaptics.h +++ b/drivers/input/mouse/synaptics.h | |||
@@ -109,5 +109,6 @@ void synaptics_module_init(void); | |||
109 | int synaptics_detect(struct psmouse *psmouse, bool set_properties); | 109 | int synaptics_detect(struct psmouse *psmouse, bool set_properties); |
110 | int synaptics_init(struct psmouse *psmouse); | 110 | int synaptics_init(struct psmouse *psmouse); |
111 | void synaptics_reset(struct psmouse *psmouse); | 111 | void synaptics_reset(struct psmouse *psmouse); |
112 | bool synaptics_supported(void); | ||
112 | 113 | ||
113 | #endif /* _SYNAPTICS_H */ | 114 | #endif /* _SYNAPTICS_H */ |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 64b688daf48..2a5982e532f 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -524,6 +524,13 @@ static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = { | |||
524 | */ | 524 | */ |
525 | static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { | 525 | static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { |
526 | { | 526 | { |
527 | /* Acer Aspire 5610 */ | ||
528 | .matches = { | ||
529 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
530 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), | ||
531 | }, | ||
532 | }, | ||
533 | { | ||
527 | /* Acer Aspire 5630 */ | 534 | /* Acer Aspire 5630 */ |
528 | .matches = { | 535 | .matches = { |
529 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 536 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 0236f0d5fd9..e0f30186d51 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -284,13 +284,7 @@ static void serio_handle_event(void) | |||
284 | 284 | ||
285 | mutex_lock(&serio_mutex); | 285 | mutex_lock(&serio_mutex); |
286 | 286 | ||
287 | /* | 287 | while ((event = serio_get_event())) { |
288 | * Note that we handle only one event here to give swsusp | ||
289 | * a chance to freeze kseriod thread. Serio events should | ||
290 | * be pretty rare so we are not concerned about taking | ||
291 | * performance hit. | ||
292 | */ | ||
293 | if ((event = serio_get_event())) { | ||
294 | 288 | ||
295 | switch (event->type) { | 289 | switch (event->type) { |
296 | case SERIO_REGISTER_PORT: | 290 | case SERIO_REGISTER_PORT: |
@@ -380,10 +374,9 @@ static struct serio *serio_get_pending_child(struct serio *parent) | |||
380 | 374 | ||
381 | static int serio_thread(void *nothing) | 375 | static int serio_thread(void *nothing) |
382 | { | 376 | { |
383 | set_freezable(); | ||
384 | do { | 377 | do { |
385 | serio_handle_event(); | 378 | serio_handle_event(); |
386 | wait_event_freezable(serio_wait, | 379 | wait_event_interruptible(serio_wait, |
387 | kthread_should_stop() || !list_empty(&serio_event_list)); | 380 | kthread_should_stop() || !list_empty(&serio_event_list)); |
388 | } while (!kthread_should_stop()); | 381 | } while (!kthread_should_stop()); |
389 | 382 | ||