diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-21 13:27:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-21 13:27:31 -0400 |
commit | 519f0141f1c42e2b8b59c7dea005cbf6095358e8 (patch) | |
tree | 980e39f30a8b8677916a9bddee675ed0d0123d81 /drivers | |
parent | f8b71a3a92d69cb1c9c2162f9235d3dd550e4aa0 (diff) | |
parent | 908cf4b925e419bc74f3297b2f0e51d6f8a81da2 (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: (48 commits)
Input: add switch for dock events
Input: add microphone insert switch definition
Input: i8042 - add Arima-Rioworks HDAMB board to noloop list
Input: sgi_btns - add support for SGI Indy volume buttons
Input: add option to disable HP SDC driver
Input: serio - trivial documentation fix
Input: add new serio driver for Xilinx XPS PS2 IP
Input: add driver for Tabletkiosk Sahara TouchIT-213 touchscreen
Input: new driver for SGI O2 volume buttons
Input: yealink - reliably kill urbs
Input: q40kbd - make q40kbd_lock static
Input: gtco - eliminate early return
Input: i8042 - add Dritek quirk for Acer Aspire 5720
Input: usbtouchscreen - ignore eGalax screens supporting HID protocol
Input: i8042 - add Medion NAM 2070 to noloop blacklist
Input: i8042 - add Gericom Bellagio to nomux blacklist
Input: i8042 - add Acer Aspire 1360 to nomux blacklist
Input: hp_sdc_mlc.c - make a struct static
Input: hil_mlc.c - make code static
Input: wistron - generate normal key event if bluetooth or wifi not present
...
Diffstat (limited to 'drivers')
88 files changed, 2269 insertions, 533 deletions
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index d9a0a53c842d..7b3a212c86b1 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -46,6 +46,8 @@ | |||
46 | 46 | ||
47 | extern void ctrl_alt_del(void); | 47 | extern void ctrl_alt_del(void); |
48 | 48 | ||
49 | #define to_handle_h(n) container_of(n, struct input_handle, h_node) | ||
50 | |||
49 | /* | 51 | /* |
50 | * Exported functions/variables | 52 | * Exported functions/variables |
51 | */ | 53 | */ |
diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c index 50f22690d611..a4d92d246d52 100644 --- a/drivers/hwmon/hdaps.c +++ b/drivers/hwmon/hdaps.c | |||
@@ -581,6 +581,8 @@ static int __init hdaps_init(void) | |||
581 | /* initialize the input class */ | 581 | /* initialize the input class */ |
582 | idev = hdaps_idev->input; | 582 | idev = hdaps_idev->input; |
583 | idev->name = "hdaps"; | 583 | idev->name = "hdaps"; |
584 | idev->phys = "isa1600/input0"; | ||
585 | idev->id.bustype = BUS_ISA; | ||
584 | idev->dev.parent = &pdev->dev; | 586 | idev->dev.parent = &pdev->dev; |
585 | idev->evbit[0] = BIT_MASK(EV_ABS); | 587 | idev->evbit[0] = BIT_MASK(EV_ABS); |
586 | input_set_abs_params(idev, ABS_X, | 588 | input_set_abs_params(idev, ABS_X, |
diff --git a/drivers/input/evbug.c b/drivers/input/evbug.c index c21f2f127234..0353601ac3b5 100644 --- a/drivers/input/evbug.c +++ b/drivers/input/evbug.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: evbug.c,v 1.10 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
@@ -41,7 +39,7 @@ MODULE_LICENSE("GPL"); | |||
41 | static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) | 39 | static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) |
42 | { | 40 | { |
43 | printk(KERN_DEBUG "evbug.c: Event. Dev: %s, Type: %d, Code: %d, Value: %d\n", | 41 | printk(KERN_DEBUG "evbug.c: Event. Dev: %s, Type: %d, Code: %d, Value: %d\n", |
44 | handle->dev->phys, type, code, value); | 42 | handle->dev->dev.bus_id, type, code, value); |
45 | } | 43 | } |
46 | 44 | ||
47 | static int evbug_connect(struct input_handler *handler, struct input_dev *dev, | 45 | static int evbug_connect(struct input_handler *handler, struct input_dev *dev, |
@@ -66,7 +64,10 @@ static int evbug_connect(struct input_handler *handler, struct input_dev *dev, | |||
66 | if (error) | 64 | if (error) |
67 | goto err_unregister_handle; | 65 | goto err_unregister_handle; |
68 | 66 | ||
69 | printk(KERN_DEBUG "evbug.c: Connected device: \"%s\", %s\n", dev->name, dev->phys); | 67 | printk(KERN_DEBUG "evbug.c: Connected device: %s (%s at %s)\n", |
68 | dev->dev.bus_id, | ||
69 | dev->name ?: "unknown", | ||
70 | dev->phys ?: "unknown"); | ||
70 | 71 | ||
71 | return 0; | 72 | return 0; |
72 | 73 | ||
@@ -79,7 +80,8 @@ static int evbug_connect(struct input_handler *handler, struct input_dev *dev, | |||
79 | 80 | ||
80 | static void evbug_disconnect(struct input_handle *handle) | 81 | static void evbug_disconnect(struct input_handle *handle) |
81 | { | 82 | { |
82 | printk(KERN_DEBUG "evbug.c: Disconnected device: %s\n", handle->dev->phys); | 83 | printk(KERN_DEBUG "evbug.c: Disconnected device: %s\n", |
84 | handle->dev->dev.bus_id); | ||
83 | 85 | ||
84 | input_close_device(handle); | 86 | input_close_device(handle); |
85 | input_unregister_handle(handle); | 87 | input_unregister_handle(handle); |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index b32984bc516f..2d65411f6763 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -300,6 +300,35 @@ struct input_event_compat { | |||
300 | __s32 value; | 300 | __s32 value; |
301 | }; | 301 | }; |
302 | 302 | ||
303 | struct ff_periodic_effect_compat { | ||
304 | __u16 waveform; | ||
305 | __u16 period; | ||
306 | __s16 magnitude; | ||
307 | __s16 offset; | ||
308 | __u16 phase; | ||
309 | |||
310 | struct ff_envelope envelope; | ||
311 | |||
312 | __u32 custom_len; | ||
313 | compat_uptr_t custom_data; | ||
314 | }; | ||
315 | |||
316 | struct ff_effect_compat { | ||
317 | __u16 type; | ||
318 | __s16 id; | ||
319 | __u16 direction; | ||
320 | struct ff_trigger trigger; | ||
321 | struct ff_replay replay; | ||
322 | |||
323 | union { | ||
324 | struct ff_constant_effect constant; | ||
325 | struct ff_ramp_effect ramp; | ||
326 | struct ff_periodic_effect_compat periodic; | ||
327 | struct ff_condition_effect condition[2]; /* One for each axis */ | ||
328 | struct ff_rumble_effect rumble; | ||
329 | } u; | ||
330 | }; | ||
331 | |||
303 | /* Note to the author of this code: did it ever occur to | 332 | /* Note to the author of this code: did it ever occur to |
304 | you why the ifdefs are needed? Think about it again. -AK */ | 333 | you why the ifdefs are needed? Think about it again. -AK */ |
305 | #ifdef CONFIG_X86_64 | 334 | #ifdef CONFIG_X86_64 |
@@ -368,6 +397,42 @@ static int evdev_event_to_user(char __user *buffer, | |||
368 | return 0; | 397 | return 0; |
369 | } | 398 | } |
370 | 399 | ||
400 | static int evdev_ff_effect_from_user(const char __user *buffer, size_t size, | ||
401 | struct ff_effect *effect) | ||
402 | { | ||
403 | if (COMPAT_TEST) { | ||
404 | struct ff_effect_compat *compat_effect; | ||
405 | |||
406 | if (size != sizeof(struct ff_effect_compat)) | ||
407 | return -EINVAL; | ||
408 | |||
409 | /* | ||
410 | * It so happens that the pointer which needs to be changed | ||
411 | * is the last field in the structure, so we can copy the | ||
412 | * whole thing and replace just the pointer. | ||
413 | */ | ||
414 | |||
415 | compat_effect = (struct ff_effect_compat *)effect; | ||
416 | |||
417 | if (copy_from_user(compat_effect, buffer, | ||
418 | sizeof(struct ff_effect_compat))) | ||
419 | return -EFAULT; | ||
420 | |||
421 | if (compat_effect->type == FF_PERIODIC && | ||
422 | compat_effect->u.periodic.waveform == FF_CUSTOM) | ||
423 | effect->u.periodic.custom_data = | ||
424 | compat_ptr(compat_effect->u.periodic.custom_data); | ||
425 | } else { | ||
426 | if (size != sizeof(struct ff_effect)) | ||
427 | return -EINVAL; | ||
428 | |||
429 | if (copy_from_user(effect, buffer, sizeof(struct ff_effect))) | ||
430 | return -EFAULT; | ||
431 | } | ||
432 | |||
433 | return 0; | ||
434 | } | ||
435 | |||
371 | #else | 436 | #else |
372 | 437 | ||
373 | static inline size_t evdev_event_size(void) | 438 | static inline size_t evdev_event_size(void) |
@@ -393,6 +458,18 @@ static int evdev_event_to_user(char __user *buffer, | |||
393 | return 0; | 458 | return 0; |
394 | } | 459 | } |
395 | 460 | ||
461 | static int evdev_ff_effect_from_user(const char __user *buffer, size_t size, | ||
462 | struct ff_effect *effect) | ||
463 | { | ||
464 | if (size != sizeof(struct ff_effect)) | ||
465 | return -EINVAL; | ||
466 | |||
467 | if (copy_from_user(effect, buffer, sizeof(struct ff_effect))) | ||
468 | return -EFAULT; | ||
469 | |||
470 | return 0; | ||
471 | } | ||
472 | |||
396 | #endif /* CONFIG_COMPAT */ | 473 | #endif /* CONFIG_COMPAT */ |
397 | 474 | ||
398 | static ssize_t evdev_write(struct file *file, const char __user *buffer, | 475 | static ssize_t evdev_write(struct file *file, const char __user *buffer, |
@@ -633,17 +710,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
633 | 710 | ||
634 | return input_set_keycode(dev, t, v); | 711 | return input_set_keycode(dev, t, v); |
635 | 712 | ||
636 | case EVIOCSFF: | ||
637 | if (copy_from_user(&effect, p, sizeof(effect))) | ||
638 | return -EFAULT; | ||
639 | |||
640 | error = input_ff_upload(dev, &effect, file); | ||
641 | |||
642 | if (put_user(effect.id, &(((struct ff_effect __user *)p)->id))) | ||
643 | return -EFAULT; | ||
644 | |||
645 | return error; | ||
646 | |||
647 | case EVIOCRMFF: | 713 | case EVIOCRMFF: |
648 | return input_ff_erase(dev, (int)(unsigned long) p, file); | 714 | return input_ff_erase(dev, (int)(unsigned long) p, file); |
649 | 715 | ||
@@ -733,6 +799,19 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
733 | 799 | ||
734 | if (_IOC_DIR(cmd) == _IOC_WRITE) { | 800 | if (_IOC_DIR(cmd) == _IOC_WRITE) { |
735 | 801 | ||
802 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCSFF)) { | ||
803 | |||
804 | if (evdev_ff_effect_from_user(p, _IOC_SIZE(cmd), &effect)) | ||
805 | return -EFAULT; | ||
806 | |||
807 | error = input_ff_upload(dev, &effect, file); | ||
808 | |||
809 | if (put_user(effect.id, &(((struct ff_effect __user *)p)->id))) | ||
810 | return -EFAULT; | ||
811 | |||
812 | return error; | ||
813 | } | ||
814 | |||
736 | if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) { | 815 | if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) { |
737 | 816 | ||
738 | t = _IOC_NR(cmd) & ABS_MAX; | 817 | t = _IOC_NR(cmd) & ABS_MAX; |
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index d226d935b0dc..6790e975a98c 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c | |||
@@ -247,9 +247,9 @@ static void ml_combine_effects(struct ff_effect *effect, | |||
247 | * in s8, this should be changed to something more generic | 247 | * in s8, this should be changed to something more generic |
248 | */ | 248 | */ |
249 | effect->u.ramp.start_level = | 249 | effect->u.ramp.start_level = |
250 | max(min(effect->u.ramp.start_level + x, 0x7f), -0x80); | 250 | clamp_val(effect->u.ramp.start_level + x, -0x80, 0x7f); |
251 | effect->u.ramp.end_level = | 251 | effect->u.ramp.end_level = |
252 | max(min(effect->u.ramp.end_level + y, 0x7f), -0x80); | 252 | clamp_val(effect->u.ramp.end_level + y, -0x80, 0x7f); |
253 | break; | 253 | break; |
254 | 254 | ||
255 | case FF_RUMBLE: | 255 | case FF_RUMBLE: |
diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c index 9793ac36d17f..b04930f7ea7d 100644 --- a/drivers/input/gameport/emu10k1-gp.c +++ b/drivers/input/gameport/emu10k1-gp.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: emu10k1-gp.c,v 1.8 2002/01/22 20:40:46 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2001 Vojtech Pavlik | 2 | * Copyright (c) 2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index c5600ac5feb3..078e4eed0894 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -36,7 +36,6 @@ EXPORT_SYMBOL(__gameport_register_driver); | |||
36 | EXPORT_SYMBOL(gameport_unregister_driver); | 36 | EXPORT_SYMBOL(gameport_unregister_driver); |
37 | EXPORT_SYMBOL(gameport_open); | 37 | EXPORT_SYMBOL(gameport_open); |
38 | EXPORT_SYMBOL(gameport_close); | 38 | EXPORT_SYMBOL(gameport_close); |
39 | EXPORT_SYMBOL(gameport_rescan); | ||
40 | EXPORT_SYMBOL(gameport_set_phys); | 39 | EXPORT_SYMBOL(gameport_set_phys); |
41 | EXPORT_SYMBOL(gameport_start_polling); | 40 | EXPORT_SYMBOL(gameport_start_polling); |
42 | EXPORT_SYMBOL(gameport_stop_polling); | 41 | EXPORT_SYMBOL(gameport_stop_polling); |
@@ -230,8 +229,6 @@ static void gameport_find_driver(struct gameport *gameport) | |||
230 | */ | 229 | */ |
231 | 230 | ||
232 | enum gameport_event_type { | 231 | enum gameport_event_type { |
233 | GAMEPORT_RESCAN, | ||
234 | GAMEPORT_RECONNECT, | ||
235 | GAMEPORT_REGISTER_PORT, | 232 | GAMEPORT_REGISTER_PORT, |
236 | GAMEPORT_REGISTER_DRIVER, | 233 | GAMEPORT_REGISTER_DRIVER, |
237 | }; | 234 | }; |
@@ -365,15 +362,6 @@ static void gameport_handle_event(void) | |||
365 | gameport_add_port(event->object); | 362 | gameport_add_port(event->object); |
366 | break; | 363 | break; |
367 | 364 | ||
368 | case GAMEPORT_RECONNECT: | ||
369 | gameport_reconnect_port(event->object); | ||
370 | break; | ||
371 | |||
372 | case GAMEPORT_RESCAN: | ||
373 | gameport_disconnect_port(event->object); | ||
374 | gameport_find_driver(event->object); | ||
375 | break; | ||
376 | |||
377 | case GAMEPORT_REGISTER_DRIVER: | 365 | case GAMEPORT_REGISTER_DRIVER: |
378 | gameport_add_driver(event->object); | 366 | gameport_add_driver(event->object); |
379 | break; | 367 | break; |
@@ -651,16 +639,6 @@ static void gameport_disconnect_port(struct gameport *gameport) | |||
651 | device_release_driver(&gameport->dev); | 639 | device_release_driver(&gameport->dev); |
652 | } | 640 | } |
653 | 641 | ||
654 | void gameport_rescan(struct gameport *gameport) | ||
655 | { | ||
656 | gameport_queue_event(gameport, NULL, GAMEPORT_RESCAN); | ||
657 | } | ||
658 | |||
659 | void gameport_reconnect(struct gameport *gameport) | ||
660 | { | ||
661 | gameport_queue_event(gameport, NULL, GAMEPORT_RECONNECT); | ||
662 | } | ||
663 | |||
664 | /* | 642 | /* |
665 | * Submits register request to kgameportd for subsequent execution. | 643 | * Submits register request to kgameportd for subsequent execution. |
666 | * Note that port registration is always asynchronous. | 644 | * Note that port registration is always asynchronous. |
diff --git a/drivers/input/gameport/lightning.c b/drivers/input/gameport/lightning.c index 6b4d4561d465..06ad36ed3483 100644 --- a/drivers/input/gameport/lightning.c +++ b/drivers/input/gameport/lightning.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: lightning.c,v 1.20 2002/01/22 20:41:31 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c index 7b7a546323cf..2b282cde4b89 100644 --- a/drivers/input/gameport/ns558.c +++ b/drivers/input/gameport/ns558.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ns558.c,v 1.43 2002/01/24 19:23:21 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * Copyright (c) 1999 Brian Gerst | 3 | * Copyright (c) 1999 Brian Gerst |
6 | */ | 4 | */ |
diff --git a/drivers/input/input.c b/drivers/input/input.c index 408df0bd6be5..c13ced3e0d3d 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -242,7 +242,7 @@ static void input_handle_event(struct input_dev *dev, | |||
242 | break; | 242 | break; |
243 | } | 243 | } |
244 | 244 | ||
245 | if (type != EV_SYN) | 245 | if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN) |
246 | dev->sync = 0; | 246 | dev->sync = 0; |
247 | 247 | ||
248 | if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) | 248 | if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) |
diff --git a/drivers/input/joystick/a3d.c b/drivers/input/joystick/a3d.c index 52ba16f487c7..92498d470b1f 100644 --- a/drivers/input/joystick/a3d.c +++ b/drivers/input/joystick/a3d.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: a3d.c,v 1.21 2002/01/22 20:11:50 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/amijoy.c b/drivers/input/joystick/amijoy.c index deb9f825f92c..05022f07ec77 100644 --- a/drivers/input/joystick/amijoy.c +++ b/drivers/input/joystick/amijoy.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: amijoy.c,v 1.13 2002/01/22 20:26:32 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c index 55646a6d89f5..639b975a8ed7 100644 --- a/drivers/input/joystick/cobra.c +++ b/drivers/input/joystick/cobra.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: cobra.c,v 1.19 2002/01/22 20:26:52 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index 960e501c60c8..523959484753 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: db9.c,v 1.13 2002/04/07 20:13:37 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c index 1f6302c0eb3f..cb6eef1f2d99 100644 --- a/drivers/input/joystick/gf2k.c +++ b/drivers/input/joystick/gf2k.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: gf2k.c,v 1.19 2002/01/22 20:27:43 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c index fd3853ab1aad..684e07cfccc8 100644 --- a/drivers/input/joystick/grip.c +++ b/drivers/input/joystick/grip.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: grip.c,v 1.21 2002/01/22 20:27:57 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c index c57e21d68c00..8279481b16e7 100644 --- a/drivers/input/joystick/grip_mp.c +++ b/drivers/input/joystick/grip_mp.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: grip_mp.c,v 1.9 2002/07/20 19:28:45 bonnland Exp $ | ||
3 | * | ||
4 | * Driver for the Gravis Grip Multiport, a gamepad "hub" that | 2 | * Driver for the Gravis Grip Multiport, a gamepad "hub" that |
5 | * connects up to four 9-pin digital gamepads/joysticks. | 3 | * connects up to four 9-pin digital gamepads/joysticks. |
6 | * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5. | 4 | * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5. |
diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c index aa6bfb3fb8cd..25ec3fad9f27 100644 --- a/drivers/input/joystick/guillemot.c +++ b/drivers/input/joystick/guillemot.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: guillemot.c,v 1.10 2002/01/22 20:28:12 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2001 Vojtech Pavlik | 2 | * Copyright (c) 2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/iforce/iforce-ff.c b/drivers/input/joystick/iforce/iforce-ff.c index f2a4381d0ab8..7839b7b6fa96 100644 --- a/drivers/input/joystick/iforce/iforce-ff.c +++ b/drivers/input/joystick/iforce/iforce-ff.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce-ff.c,v 1.9 2002/02/02 19:28:35 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index a2517fa72eb8..61ee6e38739d 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce-main.c,v 1.19 2002/07/07 10:22:50 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c index 45c4939ced75..015b50aa76fc 100644 --- a/drivers/input/joystick/iforce/iforce-packets.c +++ b/drivers/input/joystick/iforce/iforce-packets.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce-packets.c,v 1.16 2002/07/07 10:22:50 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c index 7b4bc19cef27..46d5041d2d9d 100644 --- a/drivers/input/joystick/iforce/iforce-serio.c +++ b/drivers/input/joystick/iforce/iforce-serio.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce-serio.c,v 1.4 2002/01/28 22:45:00 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index 7fb3cf81cfbf..851cc4087c2f 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce-usb.c,v 1.16 2002/06/09 11:08:04 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
@@ -89,10 +87,10 @@ static void iforce_usb_irq(struct urb *urb) | |||
89 | case -ESHUTDOWN: | 87 | case -ESHUTDOWN: |
90 | /* this urb is terminated, clean up */ | 88 | /* this urb is terminated, clean up */ |
91 | dbg("%s - urb shutting down with status: %d", | 89 | dbg("%s - urb shutting down with status: %d", |
92 | __FUNCTION__, urb->status); | 90 | __func__, urb->status); |
93 | return; | 91 | return; |
94 | default: | 92 | default: |
95 | dbg("%s - urb has status of: %d", __FUNCTION__, urb->status); | 93 | dbg("%s - urb has status of: %d", __func__, urb->status); |
96 | goto exit; | 94 | goto exit; |
97 | } | 95 | } |
98 | 96 | ||
@@ -103,7 +101,7 @@ exit: | |||
103 | status = usb_submit_urb (urb, GFP_ATOMIC); | 101 | status = usb_submit_urb (urb, GFP_ATOMIC); |
104 | if (status) | 102 | if (status) |
105 | err ("%s - usb_submit_urb failed with result %d", | 103 | err ("%s - usb_submit_urb failed with result %d", |
106 | __FUNCTION__, status); | 104 | __func__, status); |
107 | } | 105 | } |
108 | 106 | ||
109 | static void iforce_usb_out(struct urb *urb) | 107 | static void iforce_usb_out(struct urb *urb) |
diff --git a/drivers/input/joystick/iforce/iforce.h b/drivers/input/joystick/iforce/iforce.h index a964a7cfd210..f2d91f4028ca 100644 --- a/drivers/input/joystick/iforce/iforce.h +++ b/drivers/input/joystick/iforce/iforce.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iforce.h,v 1.13 2002/07/07 10:22:50 jdeneux Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> | 2 | * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> |
5 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> | 3 | * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> |
6 | * | 4 | * |
diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c index bc8ea95dfd0e..8c3290b68205 100644 --- a/drivers/input/joystick/interact.c +++ b/drivers/input/joystick/interact.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: interact.c,v 1.16 2002/01/22 20:28:25 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2001 Vojtech Pavlik | 2 | * Copyright (c) 2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/joydump.c b/drivers/input/joystick/joydump.c index 88ec5a918f2e..2a1b82c8b31c 100644 --- a/drivers/input/joystick/joydump.c +++ b/drivers/input/joystick/joydump.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: joydump.c,v 1.1 2002/01/23 06:56:16 jsimmons Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1996-2001 Vojtech Pavlik | 2 | * Copyright (c) 1996-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c index 54e676948ebb..40e40780747d 100644 --- a/drivers/input/joystick/magellan.c +++ b/drivers/input/joystick/magellan.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: magellan.c,v 1.16 2002/01/22 20:28:39 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index d4087fd49656..0cd9b29356a8 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: spaceball.c,v 1.17 2002/01/22 20:29:03 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c index f7ce4004f4ba..a694bf8e557b 100644 --- a/drivers/input/joystick/spaceorb.c +++ b/drivers/input/joystick/spaceorb.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: spaceorb.c,v 1.15 2002/01/22 20:29:19 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c index baa10b2f7ba1..e0db9f5e4b41 100644 --- a/drivers/input/joystick/stinger.c +++ b/drivers/input/joystick/stinger.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: stinger.c,v 1.10 2002/01/22 20:29:31 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | * Copyright (c) 2000 Mark Fletcher | 3 | * Copyright (c) 2000 Mark Fletcher |
6 | */ | 4 | */ |
diff --git a/drivers/input/joystick/tmdc.c b/drivers/input/joystick/tmdc.c index 0feeb8acb532..60c37bcb938d 100644 --- a/drivers/input/joystick/tmdc.c +++ b/drivers/input/joystick/tmdc.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: tmdc.c,v 1.31 2002/01/22 20:29:52 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 989483f53160..b6f859869540 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: turbografx.c,v 1.14 2002/01/22 20:30:39 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1998-2001 Vojtech Pavlik | 2 | * Copyright (c) 1998-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c index 1085c841fec4..3f4ec73c9553 100644 --- a/drivers/input/joystick/twidjoy.c +++ b/drivers/input/joystick/twidjoy.c | |||
@@ -1,8 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: twidjoy.c,v 1.5 2002/01/22 20:31:53 vojtech Exp $ | ||
3 | * | ||
4 | * derived from CVS-ID "stinger.c,v 1.5 2001/05/29 12:57:18 vojtech Exp" | ||
5 | * | ||
6 | * Copyright (c) 2001 Arndt Schoenewald | 2 | * Copyright (c) 2001 Arndt Schoenewald |
7 | * Copyright (c) 2000-2001 Vojtech Pavlik | 3 | * Copyright (c) 2000-2001 Vojtech Pavlik |
8 | * Copyright (c) 2000 Mark Fletcher | 4 | * Copyright (c) 2000 Mark Fletcher |
diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c index e928b6e3724a..f72c83e15e60 100644 --- a/drivers/input/joystick/warrior.c +++ b/drivers/input/joystick/warrior.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: warrior.c,v 1.14 2002/01/22 20:32:10 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index b29e3affb805..87d3e7eabffd 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -418,11 +418,11 @@ static void xpad_irq_in(struct urb *urb) | |||
418 | case -ESHUTDOWN: | 418 | case -ESHUTDOWN: |
419 | /* this urb is terminated, clean up */ | 419 | /* this urb is terminated, clean up */ |
420 | dbg("%s - urb shutting down with status: %d", | 420 | dbg("%s - urb shutting down with status: %d", |
421 | __FUNCTION__, status); | 421 | __func__, status); |
422 | return; | 422 | return; |
423 | default: | 423 | default: |
424 | dbg("%s - nonzero urb status received: %d", | 424 | dbg("%s - nonzero urb status received: %d", |
425 | __FUNCTION__, status); | 425 | __func__, status); |
426 | goto exit; | 426 | goto exit; |
427 | } | 427 | } |
428 | 428 | ||
@@ -441,7 +441,7 @@ exit: | |||
441 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 441 | retval = usb_submit_urb (urb, GFP_ATOMIC); |
442 | if (retval) | 442 | if (retval) |
443 | err ("%s - usb_submit_urb failed with result %d", | 443 | err ("%s - usb_submit_urb failed with result %d", |
444 | __FUNCTION__, retval); | 444 | __func__, retval); |
445 | } | 445 | } |
446 | 446 | ||
447 | static void xpad_bulk_out(struct urb *urb) | 447 | static void xpad_bulk_out(struct urb *urb) |
@@ -477,11 +477,11 @@ static void xpad_irq_out(struct urb *urb) | |||
477 | case -ESHUTDOWN: | 477 | case -ESHUTDOWN: |
478 | /* this urb is terminated, clean up */ | 478 | /* this urb is terminated, clean up */ |
479 | dbg("%s - urb shutting down with status: %d", | 479 | dbg("%s - urb shutting down with status: %d", |
480 | __FUNCTION__, status); | 480 | __func__, status); |
481 | return; | 481 | return; |
482 | default: | 482 | default: |
483 | dbg("%s - nonzero urb status received: %d", | 483 | dbg("%s - nonzero urb status received: %d", |
484 | __FUNCTION__, status); | 484 | __func__, status); |
485 | goto exit; | 485 | goto exit; |
486 | } | 486 | } |
487 | 487 | ||
@@ -489,7 +489,7 @@ exit: | |||
489 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 489 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
490 | if (retval) | 490 | if (retval) |
491 | err("%s - usb_submit_urb failed with result %d", | 491 | err("%s - usb_submit_urb failed with result %d", |
492 | __FUNCTION__, retval); | 492 | __func__, retval); |
493 | } | 493 | } |
494 | 494 | ||
495 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) | 495 | static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) |
diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c index 81bf7562aca0..35149ec455a9 100644 --- a/drivers/input/keyboard/amikbd.c +++ b/drivers/input/keyboard/amikbd.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: amikbd.c,v 1.13 2002/02/01 16:02:24 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index af58a6f1e898..b1ce10f50bcf 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -68,7 +68,7 @@ MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and | |||
68 | * are loadable via an userland utility. | 68 | * are loadable via an userland utility. |
69 | */ | 69 | */ |
70 | 70 | ||
71 | static unsigned char atkbd_set2_keycode[512] = { | 71 | static const unsigned short atkbd_set2_keycode[512] = { |
72 | 72 | ||
73 | #ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES | 73 | #ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES |
74 | 74 | ||
@@ -99,7 +99,7 @@ static unsigned char atkbd_set2_keycode[512] = { | |||
99 | #endif | 99 | #endif |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static unsigned char atkbd_set3_keycode[512] = { | 102 | static const unsigned short atkbd_set3_keycode[512] = { |
103 | 103 | ||
104 | 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60, | 104 | 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60, |
105 | 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62, | 105 | 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62, |
@@ -115,7 +115,7 @@ static unsigned char atkbd_set3_keycode[512] = { | |||
115 | 148,149,147,140 | 115 | 148,149,147,140 |
116 | }; | 116 | }; |
117 | 117 | ||
118 | static unsigned char atkbd_unxlate_table[128] = { | 118 | static const unsigned short atkbd_unxlate_table[128] = { |
119 | 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13, | 119 | 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13, |
120 | 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27, | 120 | 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27, |
121 | 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42, | 121 | 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42, |
@@ -161,7 +161,7 @@ static unsigned char atkbd_unxlate_table[128] = { | |||
161 | #define ATKBD_SCR_LEFT 249 | 161 | #define ATKBD_SCR_LEFT 249 |
162 | #define ATKBD_SCR_RIGHT 248 | 162 | #define ATKBD_SCR_RIGHT 248 |
163 | 163 | ||
164 | #define ATKBD_SPECIAL 248 | 164 | #define ATKBD_SPECIAL ATKBD_SCR_RIGHT |
165 | 165 | ||
166 | #define ATKBD_LED_EVENT_BIT 0 | 166 | #define ATKBD_LED_EVENT_BIT 0 |
167 | #define ATKBD_REP_EVENT_BIT 1 | 167 | #define ATKBD_REP_EVENT_BIT 1 |
@@ -173,7 +173,7 @@ static unsigned char atkbd_unxlate_table[128] = { | |||
173 | #define ATKBD_XL_HANGEUL 0x10 | 173 | #define ATKBD_XL_HANGEUL 0x10 |
174 | #define ATKBD_XL_HANJA 0x20 | 174 | #define ATKBD_XL_HANJA 0x20 |
175 | 175 | ||
176 | static struct { | 176 | static const struct { |
177 | unsigned char keycode; | 177 | unsigned char keycode; |
178 | unsigned char set2; | 178 | unsigned char set2; |
179 | } atkbd_scroll_keys[] = { | 179 | } atkbd_scroll_keys[] = { |
@@ -200,7 +200,7 @@ struct atkbd { | |||
200 | char phys[32]; | 200 | char phys[32]; |
201 | 201 | ||
202 | unsigned short id; | 202 | unsigned short id; |
203 | unsigned char keycode[512]; | 203 | unsigned short keycode[512]; |
204 | DECLARE_BITMAP(force_release_mask, 512); | 204 | DECLARE_BITMAP(force_release_mask, 512); |
205 | unsigned char set; | 205 | unsigned char set; |
206 | unsigned char translated; | 206 | unsigned char translated; |
@@ -357,7 +357,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
357 | unsigned int code = data; | 357 | unsigned int code = data; |
358 | int scroll = 0, hscroll = 0, click = -1; | 358 | int scroll = 0, hscroll = 0, click = -1; |
359 | int value; | 359 | int value; |
360 | unsigned char keycode; | 360 | unsigned short keycode; |
361 | 361 | ||
362 | #ifdef ATKBD_DEBUG | 362 | #ifdef ATKBD_DEBUG |
363 | printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); | 363 | printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); |
@@ -851,6 +851,23 @@ static void atkbd_latitude_keymap_fixup(struct atkbd *atkbd) | |||
851 | } | 851 | } |
852 | 852 | ||
853 | /* | 853 | /* |
854 | * Perform fixup for HP system that doesn't generate release | ||
855 | * for its video switch | ||
856 | */ | ||
857 | static void atkbd_hp_keymap_fixup(struct atkbd *atkbd) | ||
858 | { | ||
859 | const unsigned int forced_release_keys[] = { | ||
860 | 0x94, | ||
861 | }; | ||
862 | int i; | ||
863 | |||
864 | if (atkbd->set == 2) | ||
865 | for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) | ||
866 | __set_bit(forced_release_keys[i], | ||
867 | atkbd->force_release_mask); | ||
868 | } | ||
869 | |||
870 | /* | ||
854 | * atkbd_set_keycode_table() initializes keyboard's keycode table | 871 | * atkbd_set_keycode_table() initializes keyboard's keycode table |
855 | * according to the selected scancode set | 872 | * according to the selected scancode set |
856 | */ | 873 | */ |
@@ -961,16 +978,16 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd) | |||
961 | input_dev->evbit[0] |= BIT_MASK(EV_REL); | 978 | input_dev->evbit[0] |= BIT_MASK(EV_REL); |
962 | input_dev->relbit[0] = BIT_MASK(REL_WHEEL) | | 979 | input_dev->relbit[0] = BIT_MASK(REL_WHEEL) | |
963 | BIT_MASK(REL_HWHEEL); | 980 | BIT_MASK(REL_HWHEEL); |
964 | set_bit(BTN_MIDDLE, input_dev->keybit); | 981 | __set_bit(BTN_MIDDLE, input_dev->keybit); |
965 | } | 982 | } |
966 | 983 | ||
967 | input_dev->keycode = atkbd->keycode; | 984 | input_dev->keycode = atkbd->keycode; |
968 | input_dev->keycodesize = sizeof(unsigned char); | 985 | input_dev->keycodesize = sizeof(unsigned short); |
969 | input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); | 986 | input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); |
970 | 987 | ||
971 | for (i = 0; i < 512; i++) | 988 | for (i = 0; i < 512; i++) |
972 | if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL) | 989 | if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL) |
973 | set_bit(atkbd->keycode[i], input_dev->keybit); | 990 | __set_bit(atkbd->keycode[i], input_dev->keybit); |
974 | } | 991 | } |
975 | 992 | ||
976 | /* | 993 | /* |
@@ -1452,6 +1469,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1452 | .callback = atkbd_setup_fixup, | 1469 | .callback = atkbd_setup_fixup, |
1453 | .driver_data = atkbd_latitude_keymap_fixup, | 1470 | .driver_data = atkbd_latitude_keymap_fixup, |
1454 | }, | 1471 | }, |
1472 | { | ||
1473 | .ident = "HP 2133", | ||
1474 | .matches = { | ||
1475 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1476 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"), | ||
1477 | }, | ||
1478 | .callback = atkbd_setup_fixup, | ||
1479 | .driver_data = atkbd_hp_keymap_fixup, | ||
1480 | }, | ||
1455 | { } | 1481 | { } |
1456 | }; | 1482 | }; |
1457 | 1483 | ||
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index bbd00c3fe98c..be58730e636a 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -26,23 +26,54 @@ | |||
26 | 26 | ||
27 | #include <asm/gpio.h> | 27 | #include <asm/gpio.h> |
28 | 28 | ||
29 | struct gpio_button_data { | ||
30 | struct gpio_keys_button *button; | ||
31 | struct input_dev *input; | ||
32 | struct timer_list timer; | ||
33 | }; | ||
34 | |||
35 | struct gpio_keys_drvdata { | ||
36 | struct input_dev *input; | ||
37 | struct gpio_button_data data[0]; | ||
38 | }; | ||
39 | |||
40 | static void gpio_keys_report_event(struct gpio_keys_button *button, | ||
41 | struct input_dev *input) | ||
42 | { | ||
43 | unsigned int type = button->type ?: EV_KEY; | ||
44 | int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low; | ||
45 | |||
46 | input_event(input, type, button->code, !!state); | ||
47 | input_sync(input); | ||
48 | } | ||
49 | |||
50 | static void gpio_check_button(unsigned long _data) | ||
51 | { | ||
52 | struct gpio_button_data *data = (struct gpio_button_data *)_data; | ||
53 | |||
54 | gpio_keys_report_event(data->button, data->input); | ||
55 | } | ||
56 | |||
29 | static irqreturn_t gpio_keys_isr(int irq, void *dev_id) | 57 | static irqreturn_t gpio_keys_isr(int irq, void *dev_id) |
30 | { | 58 | { |
31 | int i; | ||
32 | struct platform_device *pdev = dev_id; | 59 | struct platform_device *pdev = dev_id; |
33 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | 60 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; |
34 | struct input_dev *input = platform_get_drvdata(pdev); | 61 | struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); |
62 | int i; | ||
35 | 63 | ||
36 | for (i = 0; i < pdata->nbuttons; i++) { | 64 | for (i = 0; i < pdata->nbuttons; i++) { |
37 | struct gpio_keys_button *button = &pdata->buttons[i]; | 65 | struct gpio_keys_button *button = &pdata->buttons[i]; |
38 | int gpio = button->gpio; | ||
39 | 66 | ||
40 | if (irq == gpio_to_irq(gpio)) { | 67 | if (irq == gpio_to_irq(button->gpio)) { |
41 | unsigned int type = button->type ?: EV_KEY; | 68 | struct gpio_button_data *bdata = &ddata->data[i]; |
42 | int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low; | 69 | |
70 | if (button->debounce_interval) | ||
71 | mod_timer(&bdata->timer, | ||
72 | jiffies + | ||
73 | msecs_to_jiffies(button->debounce_interval)); | ||
74 | else | ||
75 | gpio_keys_report_event(button, bdata->input); | ||
43 | 76 | ||
44 | input_event(input, type, button->code, !!state); | ||
45 | input_sync(input); | ||
46 | return IRQ_HANDLED; | 77 | return IRQ_HANDLED; |
47 | } | 78 | } |
48 | } | 79 | } |
@@ -53,17 +84,21 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id) | |||
53 | static int __devinit gpio_keys_probe(struct platform_device *pdev) | 84 | static int __devinit gpio_keys_probe(struct platform_device *pdev) |
54 | { | 85 | { |
55 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | 86 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; |
87 | struct gpio_keys_drvdata *ddata; | ||
56 | struct input_dev *input; | 88 | struct input_dev *input; |
57 | int i, error; | 89 | int i, error; |
58 | int wakeup = 0; | 90 | int wakeup = 0; |
59 | 91 | ||
92 | ddata = kzalloc(sizeof(struct gpio_keys_drvdata) + | ||
93 | pdata->nbuttons * sizeof(struct gpio_button_data), | ||
94 | GFP_KERNEL); | ||
60 | input = input_allocate_device(); | 95 | input = input_allocate_device(); |
61 | if (!input) | 96 | if (!ddata || !input) { |
62 | return -ENOMEM; | 97 | error = -ENOMEM; |
63 | 98 | goto fail1; | |
64 | platform_set_drvdata(pdev, input); | 99 | } |
65 | 100 | ||
66 | input->evbit[0] = BIT_MASK(EV_KEY); | 101 | platform_set_drvdata(pdev, ddata); |
67 | 102 | ||
68 | input->name = pdev->name; | 103 | input->name = pdev->name; |
69 | input->phys = "gpio-keys/input0"; | 104 | input->phys = "gpio-keys/input0"; |
@@ -74,16 +109,23 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
74 | input->id.product = 0x0001; | 109 | input->id.product = 0x0001; |
75 | input->id.version = 0x0100; | 110 | input->id.version = 0x0100; |
76 | 111 | ||
112 | ddata->input = input; | ||
113 | |||
77 | for (i = 0; i < pdata->nbuttons; i++) { | 114 | for (i = 0; i < pdata->nbuttons; i++) { |
78 | struct gpio_keys_button *button = &pdata->buttons[i]; | 115 | struct gpio_keys_button *button = &pdata->buttons[i]; |
116 | struct gpio_button_data *bdata = &ddata->data[i]; | ||
79 | int irq; | 117 | int irq; |
80 | unsigned int type = button->type ?: EV_KEY; | 118 | unsigned int type = button->type ?: EV_KEY; |
81 | 119 | ||
120 | bdata->input = input; | ||
121 | setup_timer(&bdata->timer, | ||
122 | gpio_check_button, (unsigned long)bdata); | ||
123 | |||
82 | error = gpio_request(button->gpio, button->desc ?: "gpio_keys"); | 124 | error = gpio_request(button->gpio, button->desc ?: "gpio_keys"); |
83 | if (error < 0) { | 125 | if (error < 0) { |
84 | pr_err("gpio-keys: failed to request GPIO %d," | 126 | pr_err("gpio-keys: failed to request GPIO %d," |
85 | " error %d\n", button->gpio, error); | 127 | " error %d\n", button->gpio, error); |
86 | goto fail; | 128 | goto fail2; |
87 | } | 129 | } |
88 | 130 | ||
89 | error = gpio_direction_input(button->gpio); | 131 | error = gpio_direction_input(button->gpio); |
@@ -92,7 +134,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
92 | " direction for GPIO %d, error %d\n", | 134 | " direction for GPIO %d, error %d\n", |
93 | button->gpio, error); | 135 | button->gpio, error); |
94 | gpio_free(button->gpio); | 136 | gpio_free(button->gpio); |
95 | goto fail; | 137 | goto fail2; |
96 | } | 138 | } |
97 | 139 | ||
98 | irq = gpio_to_irq(button->gpio); | 140 | irq = gpio_to_irq(button->gpio); |
@@ -102,7 +144,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
102 | " for GPIO %d, error %d\n", | 144 | " for GPIO %d, error %d\n", |
103 | button->gpio, error); | 145 | button->gpio, error); |
104 | gpio_free(button->gpio); | 146 | gpio_free(button->gpio); |
105 | goto fail; | 147 | goto fail2; |
106 | } | 148 | } |
107 | 149 | ||
108 | error = request_irq(irq, gpio_keys_isr, | 150 | error = request_irq(irq, gpio_keys_isr, |
@@ -114,7 +156,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
114 | pr_err("gpio-keys: Unable to claim irq %d; error %d\n", | 156 | pr_err("gpio-keys: Unable to claim irq %d; error %d\n", |
115 | irq, error); | 157 | irq, error); |
116 | gpio_free(button->gpio); | 158 | gpio_free(button->gpio); |
117 | goto fail; | 159 | goto fail2; |
118 | } | 160 | } |
119 | 161 | ||
120 | if (button->wakeup) | 162 | if (button->wakeup) |
@@ -127,21 +169,25 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
127 | if (error) { | 169 | if (error) { |
128 | pr_err("gpio-keys: Unable to register input device, " | 170 | pr_err("gpio-keys: Unable to register input device, " |
129 | "error: %d\n", error); | 171 | "error: %d\n", error); |
130 | goto fail; | 172 | goto fail2; |
131 | } | 173 | } |
132 | 174 | ||
133 | device_init_wakeup(&pdev->dev, wakeup); | 175 | device_init_wakeup(&pdev->dev, wakeup); |
134 | 176 | ||
135 | return 0; | 177 | return 0; |
136 | 178 | ||
137 | fail: | 179 | fail2: |
138 | while (--i >= 0) { | 180 | while (--i >= 0) { |
139 | free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev); | 181 | free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev); |
182 | if (pdata->buttons[i].debounce_interval) | ||
183 | del_timer_sync(&ddata->data[i].timer); | ||
140 | gpio_free(pdata->buttons[i].gpio); | 184 | gpio_free(pdata->buttons[i].gpio); |
141 | } | 185 | } |
142 | 186 | ||
143 | platform_set_drvdata(pdev, NULL); | 187 | platform_set_drvdata(pdev, NULL); |
188 | fail1: | ||
144 | input_free_device(input); | 189 | input_free_device(input); |
190 | kfree(ddata); | ||
145 | 191 | ||
146 | return error; | 192 | return error; |
147 | } | 193 | } |
@@ -149,7 +195,8 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
149 | static int __devexit gpio_keys_remove(struct platform_device *pdev) | 195 | static int __devexit gpio_keys_remove(struct platform_device *pdev) |
150 | { | 196 | { |
151 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | 197 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; |
152 | struct input_dev *input = platform_get_drvdata(pdev); | 198 | struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); |
199 | struct input_dev *input = ddata->input; | ||
153 | int i; | 200 | int i; |
154 | 201 | ||
155 | device_init_wakeup(&pdev->dev, 0); | 202 | device_init_wakeup(&pdev->dev, 0); |
@@ -157,6 +204,8 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev) | |||
157 | for (i = 0; i < pdata->nbuttons; i++) { | 204 | for (i = 0; i < pdata->nbuttons; i++) { |
158 | int irq = gpio_to_irq(pdata->buttons[i].gpio); | 205 | int irq = gpio_to_irq(pdata->buttons[i].gpio); |
159 | free_irq(irq, pdev); | 206 | free_irq(irq, pdev); |
207 | if (pdata->buttons[i].debounce_interval) | ||
208 | del_timer_sync(&ddata->data[i].timer); | ||
160 | gpio_free(pdata->buttons[i].gpio); | 209 | gpio_free(pdata->buttons[i].gpio); |
161 | } | 210 | } |
162 | 211 | ||
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 32e2c2605d95..4730ef35c732 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c | |||
@@ -538,11 +538,11 @@ lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code, | |||
538 | switch (code) { | 538 | switch (code) { |
539 | case SND_CLICK: | 539 | case SND_CLICK: |
540 | if (value == 0) { | 540 | if (value == 0) { |
541 | DBG ("%s: Deactivating key clicks\n", __FUNCTION__); | 541 | DBG ("%s: Deactivating key clicks\n", __func__); |
542 | lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK); | 542 | lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK); |
543 | lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK); | 543 | lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK); |
544 | } else { | 544 | } else { |
545 | DBG ("%s: Activating key clicks\n", __FUNCTION__); | 545 | DBG ("%s: Activating key clicks\n", __func__); |
546 | lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); | 546 | lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); |
547 | lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); | 547 | lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); |
548 | lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); | 548 | lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); |
@@ -560,7 +560,7 @@ lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code, | |||
560 | 560 | ||
561 | default: | 561 | default: |
562 | printk (KERN_ERR "%s (): Got unknown type %d, code %d, value %d\n", | 562 | printk (KERN_ERR "%s (): Got unknown type %d, code %d, value %d\n", |
563 | __FUNCTION__, type, code, value); | 563 | __func__, type, code, value); |
564 | } | 564 | } |
565 | 565 | ||
566 | return -1; | 566 | return -1; |
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index 45767e73f071..6f1516f50750 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c | |||
@@ -105,6 +105,8 @@ struct pxa27x_keypad { | |||
105 | struct input_dev *input_dev; | 105 | struct input_dev *input_dev; |
106 | void __iomem *mmio_base; | 106 | void __iomem *mmio_base; |
107 | 107 | ||
108 | int irq; | ||
109 | |||
108 | /* matrix key code map */ | 110 | /* matrix key code map */ |
109 | unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM]; | 111 | unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM]; |
110 | 112 | ||
@@ -392,6 +394,10 @@ static int pxa27x_keypad_suspend(struct platform_device *pdev, pm_message_t stat | |||
392 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | 394 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); |
393 | 395 | ||
394 | clk_disable(keypad->clk); | 396 | clk_disable(keypad->clk); |
397 | |||
398 | if (device_may_wakeup(&pdev->dev)) | ||
399 | enable_irq_wake(keypad->irq); | ||
400 | |||
395 | return 0; | 401 | return 0; |
396 | } | 402 | } |
397 | 403 | ||
@@ -400,6 +406,9 @@ static int pxa27x_keypad_resume(struct platform_device *pdev) | |||
400 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | 406 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); |
401 | struct input_dev *input_dev = keypad->input_dev; | 407 | struct input_dev *input_dev = keypad->input_dev; |
402 | 408 | ||
409 | if (device_may_wakeup(&pdev->dev)) | ||
410 | disable_irq_wake(keypad->irq); | ||
411 | |||
403 | mutex_lock(&input_dev->mutex); | 412 | mutex_lock(&input_dev->mutex); |
404 | 413 | ||
405 | if (input_dev->users) { | 414 | if (input_dev->users) { |
@@ -509,6 +518,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) | |||
509 | goto failed_free_dev; | 518 | goto failed_free_dev; |
510 | } | 519 | } |
511 | 520 | ||
521 | keypad->irq = irq; | ||
522 | |||
512 | /* Register the input device */ | 523 | /* Register the input device */ |
513 | error = input_register_device(input_dev); | 524 | error = input_register_device(input_dev); |
514 | if (error) { | 525 | if (error) { |
@@ -516,6 +527,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) | |||
516 | goto failed_free_irq; | 527 | goto failed_free_irq; |
517 | } | 528 | } |
518 | 529 | ||
530 | device_init_wakeup(&pdev->dev, 1); | ||
531 | |||
519 | return 0; | 532 | return 0; |
520 | 533 | ||
521 | failed_free_irq: | 534 | failed_free_irq: |
@@ -539,7 +552,7 @@ static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) | |||
539 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | 552 | struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); |
540 | struct resource *res; | 553 | struct resource *res; |
541 | 554 | ||
542 | free_irq(platform_get_irq(pdev, 0), pdev); | 555 | free_irq(keypad->irq, pdev); |
543 | 556 | ||
544 | clk_disable(keypad->clk); | 557 | clk_disable(keypad->clk); |
545 | clk_put(keypad->clk); | 558 | clk_put(keypad->clk); |
diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c index be0f5d19d023..9fce6d1e29b2 100644 --- a/drivers/input/keyboard/sunkbd.c +++ b/drivers/input/keyboard/sunkbd.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: sunkbd.c,v 1.14 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c index 152a2c070508..37b01d777a4a 100644 --- a/drivers/input/keyboard/xtkbd.c +++ b/drivers/input/keyboard/xtkbd.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: xtkbd.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 432699d61c58..e99b7882f382 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -189,6 +189,16 @@ config INPUT_UINPUT | |||
189 | To compile this driver as a module, choose M here: the | 189 | To compile this driver as a module, choose M here: the |
190 | module will be called uinput. | 190 | module will be called uinput. |
191 | 191 | ||
192 | config INPUT_SGI_BTNS | ||
193 | tristate "SGI Indy/O2 volume button interface" | ||
194 | depends on SGI_IP22 || SGI_IP32 | ||
195 | select INPUT_POLLDEV | ||
196 | help | ||
197 | Say Y here if you want to support SGI Indy/O2 volume button interface. | ||
198 | |||
199 | To compile this driver as a module, choose M here: the | ||
200 | module will be called sgi_btns. | ||
201 | |||
192 | config HP_SDC_RTC | 202 | config HP_SDC_RTC |
193 | tristate "HP SDC Real Time Clock" | 203 | tristate "HP SDC Real Time Clock" |
194 | depends on GSC || HP300 | 204 | depends on GSC || HP300 |
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index ebd39f291d25..f48009b52226 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile | |||
@@ -19,3 +19,4 @@ obj-$(CONFIG_INPUT_YEALINK) += yealink.o | |||
19 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o | 19 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o |
20 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o | 20 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o |
21 | obj-$(CONFIG_INPUT_APANEL) += apanel.o | 21 | obj-$(CONFIG_INPUT_APANEL) += apanel.o |
22 | obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o | ||
diff --git a/drivers/input/misc/ati_remote.c b/drivers/input/misc/ati_remote.c index f3b86c2b0797..debfc1af9d95 100644 --- a/drivers/input/misc/ati_remote.c +++ b/drivers/input/misc/ati_remote.c | |||
@@ -330,7 +330,7 @@ static int ati_remote_open(struct input_dev *inputdev) | |||
330 | ati_remote->irq_urb->dev = ati_remote->udev; | 330 | ati_remote->irq_urb->dev = ati_remote->udev; |
331 | if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) { | 331 | if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) { |
332 | dev_err(&ati_remote->interface->dev, | 332 | dev_err(&ati_remote->interface->dev, |
333 | "%s: usb_submit_urb failed!\n", __FUNCTION__); | 333 | "%s: usb_submit_urb failed!\n", __func__); |
334 | return -EIO; | 334 | return -EIO; |
335 | } | 335 | } |
336 | 336 | ||
@@ -356,7 +356,7 @@ static void ati_remote_irq_out(struct urb *urb) | |||
356 | 356 | ||
357 | if (urb->status) { | 357 | if (urb->status) { |
358 | dev_dbg(&ati_remote->interface->dev, "%s: status %d\n", | 358 | dev_dbg(&ati_remote->interface->dev, "%s: status %d\n", |
359 | __FUNCTION__, urb->status); | 359 | __func__, urb->status); |
360 | return; | 360 | return; |
361 | } | 361 | } |
362 | 362 | ||
@@ -601,17 +601,17 @@ static void ati_remote_irq_in(struct urb *urb) | |||
601 | case -ENOENT: | 601 | case -ENOENT: |
602 | case -ESHUTDOWN: | 602 | case -ESHUTDOWN: |
603 | dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n", | 603 | dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n", |
604 | __FUNCTION__); | 604 | __func__); |
605 | return; | 605 | return; |
606 | default: /* error */ | 606 | default: /* error */ |
607 | dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n", | 607 | dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n", |
608 | __FUNCTION__, urb->status); | 608 | __func__, urb->status); |
609 | } | 609 | } |
610 | 610 | ||
611 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 611 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
612 | if (retval) | 612 | if (retval) |
613 | dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n", | 613 | dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n", |
614 | __FUNCTION__, retval); | 614 | __func__, retval); |
615 | } | 615 | } |
616 | 616 | ||
617 | /* | 617 | /* |
@@ -734,7 +734,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de | |||
734 | int err = -ENOMEM; | 734 | int err = -ENOMEM; |
735 | 735 | ||
736 | if (iface_host->desc.bNumEndpoints != 2) { | 736 | if (iface_host->desc.bNumEndpoints != 2) { |
737 | err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__); | 737 | err("%s: Unexpected desc.bNumEndpoints\n", __func__); |
738 | return -ENODEV; | 738 | return -ENODEV; |
739 | } | 739 | } |
740 | 740 | ||
@@ -742,11 +742,11 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de | |||
742 | endpoint_out = &iface_host->endpoint[1].desc; | 742 | endpoint_out = &iface_host->endpoint[1].desc; |
743 | 743 | ||
744 | if (!usb_endpoint_is_int_in(endpoint_in)) { | 744 | if (!usb_endpoint_is_int_in(endpoint_in)) { |
745 | err("%s: Unexpected endpoint_in\n", __FUNCTION__); | 745 | err("%s: Unexpected endpoint_in\n", __func__); |
746 | return -ENODEV; | 746 | return -ENODEV; |
747 | } | 747 | } |
748 | if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) { | 748 | if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) { |
749 | err("%s: endpoint_in message size==0? \n", __FUNCTION__); | 749 | err("%s: endpoint_in message size==0? \n", __func__); |
750 | return -ENODEV; | 750 | return -ENODEV; |
751 | } | 751 | } |
752 | 752 | ||
@@ -814,7 +814,7 @@ static void ati_remote_disconnect(struct usb_interface *interface) | |||
814 | ati_remote = usb_get_intfdata(interface); | 814 | ati_remote = usb_get_intfdata(interface); |
815 | usb_set_intfdata(interface, NULL); | 815 | usb_set_intfdata(interface, NULL); |
816 | if (!ati_remote) { | 816 | if (!ati_remote) { |
817 | warn("%s - null device?\n", __FUNCTION__); | 817 | warn("%s - null device?\n", __func__); |
818 | return; | 818 | return; |
819 | } | 819 | } |
820 | 820 | ||
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index f2709b82485c..a7fabafbd94c 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c | |||
@@ -137,14 +137,14 @@ static int ati_remote2_open(struct input_dev *idev) | |||
137 | r = usb_submit_urb(ar2->urb[0], GFP_KERNEL); | 137 | r = usb_submit_urb(ar2->urb[0], GFP_KERNEL); |
138 | if (r) { | 138 | if (r) { |
139 | dev_err(&ar2->intf[0]->dev, | 139 | dev_err(&ar2->intf[0]->dev, |
140 | "%s: usb_submit_urb() = %d\n", __FUNCTION__, r); | 140 | "%s: usb_submit_urb() = %d\n", __func__, r); |
141 | return r; | 141 | return r; |
142 | } | 142 | } |
143 | r = usb_submit_urb(ar2->urb[1], GFP_KERNEL); | 143 | r = usb_submit_urb(ar2->urb[1], GFP_KERNEL); |
144 | if (r) { | 144 | if (r) { |
145 | usb_kill_urb(ar2->urb[0]); | 145 | usb_kill_urb(ar2->urb[0]); |
146 | dev_err(&ar2->intf[1]->dev, | 146 | dev_err(&ar2->intf[1]->dev, |
147 | "%s: usb_submit_urb() = %d\n", __FUNCTION__, r); | 147 | "%s: usb_submit_urb() = %d\n", __func__, r); |
148 | return r; | 148 | return r; |
149 | } | 149 | } |
150 | 150 | ||
@@ -294,17 +294,17 @@ static void ati_remote2_complete_mouse(struct urb *urb) | |||
294 | case -ECONNRESET: | 294 | case -ECONNRESET: |
295 | case -ESHUTDOWN: | 295 | case -ESHUTDOWN: |
296 | dev_dbg(&ar2->intf[0]->dev, | 296 | dev_dbg(&ar2->intf[0]->dev, |
297 | "%s(): urb status = %d\n", __FUNCTION__, urb->status); | 297 | "%s(): urb status = %d\n", __func__, urb->status); |
298 | return; | 298 | return; |
299 | default: | 299 | default: |
300 | dev_err(&ar2->intf[0]->dev, | 300 | dev_err(&ar2->intf[0]->dev, |
301 | "%s(): urb status = %d\n", __FUNCTION__, urb->status); | 301 | "%s(): urb status = %d\n", __func__, urb->status); |
302 | } | 302 | } |
303 | 303 | ||
304 | r = usb_submit_urb(urb, GFP_ATOMIC); | 304 | r = usb_submit_urb(urb, GFP_ATOMIC); |
305 | if (r) | 305 | if (r) |
306 | dev_err(&ar2->intf[0]->dev, | 306 | dev_err(&ar2->intf[0]->dev, |
307 | "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r); | 307 | "%s(): usb_submit_urb() = %d\n", __func__, r); |
308 | } | 308 | } |
309 | 309 | ||
310 | static void ati_remote2_complete_key(struct urb *urb) | 310 | static void ati_remote2_complete_key(struct urb *urb) |
@@ -321,17 +321,17 @@ static void ati_remote2_complete_key(struct urb *urb) | |||
321 | case -ECONNRESET: | 321 | case -ECONNRESET: |
322 | case -ESHUTDOWN: | 322 | case -ESHUTDOWN: |
323 | dev_dbg(&ar2->intf[1]->dev, | 323 | dev_dbg(&ar2->intf[1]->dev, |
324 | "%s(): urb status = %d\n", __FUNCTION__, urb->status); | 324 | "%s(): urb status = %d\n", __func__, urb->status); |
325 | return; | 325 | return; |
326 | default: | 326 | default: |
327 | dev_err(&ar2->intf[1]->dev, | 327 | dev_err(&ar2->intf[1]->dev, |
328 | "%s(): urb status = %d\n", __FUNCTION__, urb->status); | 328 | "%s(): urb status = %d\n", __func__, urb->status); |
329 | } | 329 | } |
330 | 330 | ||
331 | r = usb_submit_urb(urb, GFP_ATOMIC); | 331 | r = usb_submit_urb(urb, GFP_ATOMIC); |
332 | if (r) | 332 | if (r) |
333 | dev_err(&ar2->intf[1]->dev, | 333 | dev_err(&ar2->intf[1]->dev, |
334 | "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r); | 334 | "%s(): usb_submit_urb() = %d\n", __func__, r); |
335 | } | 335 | } |
336 | 336 | ||
337 | static int ati_remote2_input_init(struct ati_remote2 *ar2) | 337 | static int ati_remote2_input_init(struct ati_remote2 *ar2) |
@@ -438,7 +438,7 @@ static int ati_remote2_setup(struct ati_remote2 *ar2) | |||
438 | channel, 0x0, NULL, 0, USB_CTRL_SET_TIMEOUT); | 438 | channel, 0x0, NULL, 0, USB_CTRL_SET_TIMEOUT); |
439 | if (r) { | 439 | if (r) { |
440 | dev_err(&ar2->udev->dev, "%s - failed to set channel due to error: %d\n", | 440 | dev_err(&ar2->udev->dev, "%s - failed to set channel due to error: %d\n", |
441 | __FUNCTION__, r); | 441 | __func__, r); |
442 | return r; | 442 | return r; |
443 | } | 443 | } |
444 | 444 | ||
diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c index 952938a8e991..86afdd1fdf9d 100644 --- a/drivers/input/misc/keyspan_remote.c +++ b/drivers/input/misc/keyspan_remote.c | |||
@@ -159,7 +159,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) | |||
159 | if (dev->data.pos >= dev->data.len) { | 159 | if (dev->data.pos >= dev->data.len) { |
160 | dev_dbg(&dev->udev->dev, | 160 | dev_dbg(&dev->udev->dev, |
161 | "%s - Error ran out of data. pos: %d, len: %d\n", | 161 | "%s - Error ran out of data. pos: %d, len: %d\n", |
162 | __FUNCTION__, dev->data.pos, dev->data.len); | 162 | __func__, dev->data.pos, dev->data.len); |
163 | return -1; | 163 | return -1; |
164 | } | 164 | } |
165 | 165 | ||
@@ -267,7 +267,7 @@ static void keyspan_check_data(struct usb_keyspan *remote) | |||
267 | remote->data.tester = remote->data.tester >> 6; | 267 | remote->data.tester = remote->data.tester >> 6; |
268 | remote->data.bits_left -= 6; | 268 | remote->data.bits_left -= 6; |
269 | } else { | 269 | } else { |
270 | err("%s - Unknown sequence found in system data.\n", __FUNCTION__); | 270 | err("%s - Unknown sequence found in system data.\n", __func__); |
271 | remote->stage = 0; | 271 | remote->stage = 0; |
272 | return; | 272 | return; |
273 | } | 273 | } |
@@ -286,7 +286,7 @@ static void keyspan_check_data(struct usb_keyspan *remote) | |||
286 | remote->data.tester = remote->data.tester >> 6; | 286 | remote->data.tester = remote->data.tester >> 6; |
287 | remote->data.bits_left -= 6; | 287 | remote->data.bits_left -= 6; |
288 | } else { | 288 | } else { |
289 | err("%s - Unknown sequence found in button data.\n", __FUNCTION__); | 289 | err("%s - Unknown sequence found in button data.\n", __func__); |
290 | remote->stage = 0; | 290 | remote->stage = 0; |
291 | return; | 291 | return; |
292 | } | 292 | } |
@@ -302,7 +302,7 @@ static void keyspan_check_data(struct usb_keyspan *remote) | |||
302 | remote->data.tester = remote->data.tester >> 6; | 302 | remote->data.tester = remote->data.tester >> 6; |
303 | remote->data.bits_left -= 6; | 303 | remote->data.bits_left -= 6; |
304 | } else { | 304 | } else { |
305 | err("%s - Error in message, invalid toggle.\n", __FUNCTION__); | 305 | err("%s - Error in message, invalid toggle.\n", __func__); |
306 | remote->stage = 0; | 306 | remote->stage = 0; |
307 | return; | 307 | return; |
308 | } | 308 | } |
@@ -317,7 +317,7 @@ static void keyspan_check_data(struct usb_keyspan *remote) | |||
317 | 317 | ||
318 | dev_dbg(&remote->udev->dev, | 318 | dev_dbg(&remote->udev->dev, |
319 | "%s found valid message: system: %d, button: %d, toggle: %d\n", | 319 | "%s found valid message: system: %d, button: %d, toggle: %d\n", |
320 | __FUNCTION__, message.system, message.button, message.toggle); | 320 | __func__, message.system, message.button, message.toggle); |
321 | 321 | ||
322 | if (message.toggle != remote->toggle) { | 322 | if (message.toggle != remote->toggle) { |
323 | keyspan_report_button(remote, message.button, 1); | 323 | keyspan_report_button(remote, message.button, 1); |
@@ -341,7 +341,7 @@ static int keyspan_setup(struct usb_device* dev) | |||
341 | 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); | 341 | 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); |
342 | if (retval) { | 342 | if (retval) { |
343 | dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", | 343 | dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", |
344 | __FUNCTION__, retval); | 344 | __func__, retval); |
345 | return(retval); | 345 | return(retval); |
346 | } | 346 | } |
347 | 347 | ||
@@ -349,7 +349,7 @@ static int keyspan_setup(struct usb_device* dev) | |||
349 | 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); | 349 | 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); |
350 | if (retval) { | 350 | if (retval) { |
351 | dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", | 351 | dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", |
352 | __FUNCTION__, retval); | 352 | __func__, retval); |
353 | return(retval); | 353 | return(retval); |
354 | } | 354 | } |
355 | 355 | ||
@@ -357,11 +357,11 @@ static int keyspan_setup(struct usb_device* dev) | |||
357 | 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); | 357 | 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); |
358 | if (retval) { | 358 | if (retval) { |
359 | dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", | 359 | dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", |
360 | __FUNCTION__, retval); | 360 | __func__, retval); |
361 | return(retval); | 361 | return(retval); |
362 | } | 362 | } |
363 | 363 | ||
364 | dev_dbg(&dev->dev, "%s - Setup complete.\n", __FUNCTION__); | 364 | dev_dbg(&dev->dev, "%s - Setup complete.\n", __func__); |
365 | return(retval); | 365 | return(retval); |
366 | } | 366 | } |
367 | 367 | ||
@@ -397,7 +397,7 @@ static void keyspan_irq_recv(struct urb *urb) | |||
397 | resubmit: | 397 | resubmit: |
398 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 398 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
399 | if (retval) | 399 | if (retval) |
400 | err ("%s - usb_submit_urb failed with result: %d", __FUNCTION__, retval); | 400 | err ("%s - usb_submit_urb failed with result: %d", __func__, retval); |
401 | } | 401 | } |
402 | 402 | ||
403 | static int keyspan_open(struct input_dev *dev) | 403 | static int keyspan_open(struct input_dev *dev) |
diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c index 7a7b8c7b9633..a53c4885fbad 100644 --- a/drivers/input/misc/powermate.c +++ b/drivers/input/misc/powermate.c | |||
@@ -96,10 +96,10 @@ static void powermate_irq(struct urb *urb) | |||
96 | case -ENOENT: | 96 | case -ENOENT: |
97 | case -ESHUTDOWN: | 97 | case -ESHUTDOWN: |
98 | /* this urb is terminated, clean up */ | 98 | /* this urb is terminated, clean up */ |
99 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 99 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
100 | return; | 100 | return; |
101 | default: | 101 | default: |
102 | dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); | 102 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
103 | goto exit; | 103 | goto exit; |
104 | } | 104 | } |
105 | 105 | ||
@@ -112,7 +112,7 @@ exit: | |||
112 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 112 | retval = usb_submit_urb (urb, GFP_ATOMIC); |
113 | if (retval) | 113 | if (retval) |
114 | err ("%s - usb_submit_urb failed with result %d", | 114 | err ("%s - usb_submit_urb failed with result %d", |
115 | __FUNCTION__, retval); | 115 | __func__, retval); |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */ | 118 | /* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */ |
diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c new file mode 100644 index 000000000000..ce238f59b3c8 --- /dev/null +++ b/drivers/input/misc/sgi_btns.c | |||
@@ -0,0 +1,178 @@ | |||
1 | /* | ||
2 | * SGI Volume Button interface driver | ||
3 | * | ||
4 | * Copyright (C) 2008 Thomas Bogendoerfer <tsbogend@alpha.franken.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/input-polldev.h> | ||
22 | #include <linux/ioport.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | |||
26 | #ifdef CONFIG_SGI_IP22 | ||
27 | #include <asm/sgi/ioc.h> | ||
28 | |||
29 | static inline u8 button_status(void) | ||
30 | { | ||
31 | u8 status; | ||
32 | |||
33 | status = readb(&sgioc->panel) ^ 0xa0; | ||
34 | return ((status & 0x80) >> 6) | ((status & 0x20) >> 5); | ||
35 | } | ||
36 | #endif | ||
37 | |||
38 | #ifdef CONFIG_SGI_IP32 | ||
39 | #include <asm/ip32/mace.h> | ||
40 | |||
41 | static inline u8 button_status(void) | ||
42 | { | ||
43 | u64 status; | ||
44 | |||
45 | status = readq(&mace->perif.audio.control); | ||
46 | writeq(status & ~(3U << 23), &mace->perif.audio.control); | ||
47 | |||
48 | return (status >> 23) & 3; | ||
49 | } | ||
50 | #endif | ||
51 | |||
52 | #define BUTTONS_POLL_INTERVAL 30 /* msec */ | ||
53 | #define BUTTONS_COUNT_THRESHOLD 3 | ||
54 | |||
55 | static const unsigned short sgi_map[] = { | ||
56 | KEY_VOLUMEDOWN, | ||
57 | KEY_VOLUMEUP | ||
58 | }; | ||
59 | |||
60 | struct buttons_dev { | ||
61 | struct input_polled_dev *poll_dev; | ||
62 | unsigned short keymap[ARRAY_SIZE(sgi_map)]; | ||
63 | int count[ARRAY_SIZE(sgi_map)]; | ||
64 | }; | ||
65 | |||
66 | static void handle_buttons(struct input_polled_dev *dev) | ||
67 | { | ||
68 | struct buttons_dev *bdev = dev->private; | ||
69 | struct input_dev *input = dev->input; | ||
70 | u8 status; | ||
71 | int i; | ||
72 | |||
73 | status = button_status(); | ||
74 | |||
75 | for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) { | ||
76 | if (status & (1U << i)) { | ||
77 | if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) { | ||
78 | input_event(input, EV_MSC, MSC_SCAN, i); | ||
79 | input_report_key(input, bdev->keymap[i], 1); | ||
80 | input_sync(input); | ||
81 | } | ||
82 | } else { | ||
83 | if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) { | ||
84 | input_event(input, EV_MSC, MSC_SCAN, i); | ||
85 | input_report_key(input, bdev->keymap[i], 0); | ||
86 | input_sync(input); | ||
87 | } | ||
88 | bdev->count[i] = 0; | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | |||
93 | static int __devinit sgi_buttons_probe(struct platform_device *pdev) | ||
94 | { | ||
95 | struct buttons_dev *bdev; | ||
96 | struct input_polled_dev *poll_dev; | ||
97 | struct input_dev *input; | ||
98 | int error, i; | ||
99 | |||
100 | bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL); | ||
101 | poll_dev = input_allocate_polled_device(); | ||
102 | if (!bdev || !poll_dev) { | ||
103 | error = -ENOMEM; | ||
104 | goto err_free_mem; | ||
105 | } | ||
106 | |||
107 | memcpy(bdev->keymap, sgi_map, sizeof(bdev->keymap)); | ||
108 | |||
109 | poll_dev->private = bdev; | ||
110 | poll_dev->poll = handle_buttons; | ||
111 | poll_dev->poll_interval = BUTTONS_POLL_INTERVAL; | ||
112 | |||
113 | input = poll_dev->input; | ||
114 | input->name = "SGI buttons"; | ||
115 | input->phys = "sgi/input0"; | ||
116 | input->id.bustype = BUS_HOST; | ||
117 | input->dev.parent = &pdev->dev; | ||
118 | |||
119 | input->keycode = bdev->keymap; | ||
120 | input->keycodemax = ARRAY_SIZE(bdev->keymap); | ||
121 | input->keycodesize = sizeof(unsigned short); | ||
122 | |||
123 | input_set_capability(input, EV_MSC, MSC_SCAN); | ||
124 | __set_bit(EV_KEY, input->evbit); | ||
125 | for (i = 0; i < ARRAY_SIZE(sgi_map); i++) | ||
126 | __set_bit(bdev->keymap[i], input->keybit); | ||
127 | __clear_bit(KEY_RESERVED, input->keybit); | ||
128 | |||
129 | bdev->poll_dev = poll_dev; | ||
130 | dev_set_drvdata(&pdev->dev, bdev); | ||
131 | |||
132 | error = input_register_polled_device(poll_dev); | ||
133 | if (error) | ||
134 | goto err_free_mem; | ||
135 | |||
136 | return 0; | ||
137 | |||
138 | err_free_mem: | ||
139 | input_free_polled_device(poll_dev); | ||
140 | kfree(bdev); | ||
141 | dev_set_drvdata(&pdev->dev, NULL); | ||
142 | return error; | ||
143 | } | ||
144 | |||
145 | static int __devexit sgi_buttons_remove(struct platform_device *pdev) | ||
146 | { | ||
147 | struct device *dev = &pdev->dev; | ||
148 | struct buttons_dev *bdev = dev_get_drvdata(dev); | ||
149 | |||
150 | input_unregister_polled_device(bdev->poll_dev); | ||
151 | input_free_polled_device(bdev->poll_dev); | ||
152 | kfree(bdev); | ||
153 | dev_set_drvdata(dev, NULL); | ||
154 | |||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | static struct platform_driver sgi_buttons_driver = { | ||
159 | .probe = sgi_buttons_probe, | ||
160 | .remove = __devexit_p(sgi_buttons_remove), | ||
161 | .driver = { | ||
162 | .name = "sgibtns", | ||
163 | .owner = THIS_MODULE, | ||
164 | }, | ||
165 | }; | ||
166 | |||
167 | static int __init sgi_buttons_init(void) | ||
168 | { | ||
169 | return platform_driver_register(&sgi_buttons_driver); | ||
170 | } | ||
171 | |||
172 | static void __exit sgi_buttons_exit(void) | ||
173 | { | ||
174 | platform_driver_unregister(&sgi_buttons_driver); | ||
175 | } | ||
176 | |||
177 | module_init(sgi_buttons_init); | ||
178 | module_exit(sgi_buttons_exit); | ||
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 72176f3d49cb..fe268be3293b 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -1186,7 +1186,7 @@ static int wistron_setkeycode(struct input_dev *dev, int scancode, int keycode) | |||
1186 | 1186 | ||
1187 | static int __devinit setup_input_dev(void) | 1187 | static int __devinit setup_input_dev(void) |
1188 | { | 1188 | { |
1189 | const struct key_entry *key; | 1189 | struct key_entry *key; |
1190 | struct input_dev *input_dev; | 1190 | struct input_dev *input_dev; |
1191 | int error; | 1191 | int error; |
1192 | 1192 | ||
@@ -1219,6 +1219,23 @@ static int __devinit setup_input_dev(void) | |||
1219 | set_bit(key->sw.code, input_dev->swbit); | 1219 | set_bit(key->sw.code, input_dev->swbit); |
1220 | break; | 1220 | break; |
1221 | 1221 | ||
1222 | /* if wifi or bluetooth are not available, create normal keys */ | ||
1223 | case KE_WIFI: | ||
1224 | if (!have_wifi) { | ||
1225 | key->type = KE_KEY; | ||
1226 | key->keycode = KEY_WLAN; | ||
1227 | key--; | ||
1228 | } | ||
1229 | break; | ||
1230 | |||
1231 | case KE_BLUETOOTH: | ||
1232 | if (!have_bluetooth) { | ||
1233 | key->type = KE_KEY; | ||
1234 | key->keycode = KEY_BLUETOOTH; | ||
1235 | key--; | ||
1236 | } | ||
1237 | break; | ||
1238 | |||
1222 | default: | 1239 | default: |
1223 | break; | 1240 | break; |
1224 | } | 1241 | } |
diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c index 46279ef2b649..facefd3dba29 100644 --- a/drivers/input/misc/yealink.c +++ b/drivers/input/misc/yealink.c | |||
@@ -119,6 +119,8 @@ struct yealink_dev { | |||
119 | u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */ | 119 | u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */ |
120 | int key_code; /* last reported key */ | 120 | int key_code; /* last reported key */ |
121 | 121 | ||
122 | unsigned int shutdown:1; | ||
123 | |||
122 | int stat_ix; | 124 | int stat_ix; |
123 | union { | 125 | union { |
124 | struct yld_status s; | 126 | struct yld_status s; |
@@ -424,10 +426,10 @@ send_update: | |||
424 | static void urb_irq_callback(struct urb *urb) | 426 | static void urb_irq_callback(struct urb *urb) |
425 | { | 427 | { |
426 | struct yealink_dev *yld = urb->context; | 428 | struct yealink_dev *yld = urb->context; |
427 | int ret; | 429 | int ret, status = urb->status; |
428 | 430 | ||
429 | if (urb->status) | 431 | if (status) |
430 | err("%s - urb status %d", __FUNCTION__, urb->status); | 432 | err("%s - urb status %d", __func__, status); |
431 | 433 | ||
432 | switch (yld->irq_data->cmd) { | 434 | switch (yld->irq_data->cmd) { |
433 | case CMD_KEYPRESS: | 435 | case CMD_KEYPRESS: |
@@ -447,33 +449,38 @@ static void urb_irq_callback(struct urb *urb) | |||
447 | 449 | ||
448 | yealink_do_idle_tasks(yld); | 450 | yealink_do_idle_tasks(yld); |
449 | 451 | ||
450 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); | 452 | if (!yld->shutdown) { |
451 | if (ret) | 453 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); |
452 | err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); | 454 | if (ret && ret != -EPERM) |
455 | err("%s - usb_submit_urb failed %d", __func__, ret); | ||
456 | } | ||
453 | } | 457 | } |
454 | 458 | ||
455 | static void urb_ctl_callback(struct urb *urb) | 459 | static void urb_ctl_callback(struct urb *urb) |
456 | { | 460 | { |
457 | struct yealink_dev *yld = urb->context; | 461 | struct yealink_dev *yld = urb->context; |
458 | int ret; | 462 | int ret = 0, status = urb->status; |
459 | 463 | ||
460 | if (urb->status) | 464 | if (status) |
461 | err("%s - urb status %d", __FUNCTION__, urb->status); | 465 | err("%s - urb status %d", __func__, status); |
462 | 466 | ||
463 | switch (yld->ctl_data->cmd) { | 467 | switch (yld->ctl_data->cmd) { |
464 | case CMD_KEYPRESS: | 468 | case CMD_KEYPRESS: |
465 | case CMD_SCANCODE: | 469 | case CMD_SCANCODE: |
466 | /* ask for a response */ | 470 | /* ask for a response */ |
467 | ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC); | 471 | if (!yld->shutdown) |
472 | ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC); | ||
468 | break; | 473 | break; |
469 | default: | 474 | default: |
470 | /* send new command */ | 475 | /* send new command */ |
471 | yealink_do_idle_tasks(yld); | 476 | yealink_do_idle_tasks(yld); |
472 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); | 477 | if (!yld->shutdown) |
478 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); | ||
479 | break; | ||
473 | } | 480 | } |
474 | 481 | ||
475 | if (ret) | 482 | if (ret && ret != -EPERM) |
476 | err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); | 483 | err("%s - usb_submit_urb failed %d", __func__, ret); |
477 | } | 484 | } |
478 | 485 | ||
479 | /******************************************************************************* | 486 | /******************************************************************************* |
@@ -505,7 +512,7 @@ static int input_open(struct input_dev *dev) | |||
505 | struct yealink_dev *yld = input_get_drvdata(dev); | 512 | struct yealink_dev *yld = input_get_drvdata(dev); |
506 | int i, ret; | 513 | int i, ret; |
507 | 514 | ||
508 | dbg("%s", __FUNCTION__); | 515 | dbg("%s", __func__); |
509 | 516 | ||
510 | /* force updates to device */ | 517 | /* force updates to device */ |
511 | for (i = 0; i<sizeof(yld->master); i++) | 518 | for (i = 0; i<sizeof(yld->master); i++) |
@@ -521,7 +528,7 @@ static int input_open(struct input_dev *dev) | |||
521 | yld->ctl_data->sum = 0x100-CMD_INIT-10; | 528 | yld->ctl_data->sum = 0x100-CMD_INIT-10; |
522 | if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) { | 529 | if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) { |
523 | dbg("%s - usb_submit_urb failed with result %d", | 530 | dbg("%s - usb_submit_urb failed with result %d", |
524 | __FUNCTION__, ret); | 531 | __func__, ret); |
525 | return ret; | 532 | return ret; |
526 | } | 533 | } |
527 | return 0; | 534 | return 0; |
@@ -531,8 +538,18 @@ static void input_close(struct input_dev *dev) | |||
531 | { | 538 | { |
532 | struct yealink_dev *yld = input_get_drvdata(dev); | 539 | struct yealink_dev *yld = input_get_drvdata(dev); |
533 | 540 | ||
541 | yld->shutdown = 1; | ||
542 | /* | ||
543 | * Make sure the flag is seen by other CPUs before we start | ||
544 | * killing URBs so new URBs won't be submitted | ||
545 | */ | ||
546 | smp_wmb(); | ||
547 | |||
534 | usb_kill_urb(yld->urb_ctl); | 548 | usb_kill_urb(yld->urb_ctl); |
535 | usb_kill_urb(yld->urb_irq); | 549 | usb_kill_urb(yld->urb_irq); |
550 | |||
551 | yld->shutdown = 0; | ||
552 | smp_wmb(); | ||
536 | } | 553 | } |
537 | 554 | ||
538 | /******************************************************************************* | 555 | /******************************************************************************* |
@@ -809,9 +826,6 @@ static int usb_cleanup(struct yealink_dev *yld, int err) | |||
809 | if (yld == NULL) | 826 | if (yld == NULL) |
810 | return err; | 827 | return err; |
811 | 828 | ||
812 | usb_kill_urb(yld->urb_irq); /* parameter validation in core/urb */ | ||
813 | usb_kill_urb(yld->urb_ctl); /* parameter validation in core/urb */ | ||
814 | |||
815 | if (yld->idev) { | 829 | if (yld->idev) { |
816 | if (err) | 830 | if (err) |
817 | input_free_device(yld->idev); | 831 | input_free_device(yld->idev); |
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index ce6fdec19e14..1f41ae94f26b 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c | |||
@@ -2,12 +2,13 @@ | |||
2 | * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver | 2 | * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver |
3 | * | 3 | * |
4 | * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) | 4 | * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) |
5 | * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) | 5 | * Copyright (C) 2005-2008 Johannes Berg (johannes@sipsolutions.net) |
6 | * Copyright (C) 2005 Stelian Pop (stelian@popies.net) | 6 | * Copyright (C) 2005 Stelian Pop (stelian@popies.net) |
7 | * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) | 7 | * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) |
8 | * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) | 8 | * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) |
9 | * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) | 9 | * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) |
10 | * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) | 10 | * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) |
11 | * Copyright (C) 2007-2008 Sven Anders (anders@anduras.de) | ||
11 | * | 12 | * |
12 | * Thanks to Alex Harper <basilisk@foobox.net> for his inputs. | 13 | * Thanks to Alex Harper <basilisk@foobox.net> for his inputs. |
13 | * | 14 | * |
@@ -34,77 +35,64 @@ | |||
34 | #include <linux/module.h> | 35 | #include <linux/module.h> |
35 | #include <linux/usb/input.h> | 36 | #include <linux/usb/input.h> |
36 | 37 | ||
37 | /* Apple has powerbooks which have the keyboard with different Product IDs */ | 38 | /* Type of touchpad */ |
38 | #define APPLE_VENDOR_ID 0x05AC | 39 | enum atp_touchpad_type { |
39 | 40 | ATP_FOUNTAIN, | |
40 | /* These names come from Info.plist in AppleUSBTrackpad.kext */ | 41 | ATP_GEYSER1, |
41 | #define FOUNTAIN_ANSI_PRODUCT_ID 0x020E | 42 | ATP_GEYSER2, |
42 | #define FOUNTAIN_ISO_PRODUCT_ID 0x020F | 43 | ATP_GEYSER3, |
43 | 44 | ATP_GEYSER4 | |
44 | #define FOUNTAIN_TP_ONLY_PRODUCT_ID 0x030A | 45 | }; |
45 | |||
46 | #define GEYSER1_TP_ONLY_PRODUCT_ID 0x030B | ||
47 | |||
48 | #define GEYSER_ANSI_PRODUCT_ID 0x0214 | ||
49 | #define GEYSER_ISO_PRODUCT_ID 0x0215 | ||
50 | #define GEYSER_JIS_PRODUCT_ID 0x0216 | ||
51 | |||
52 | /* MacBook devices */ | ||
53 | #define GEYSER3_ANSI_PRODUCT_ID 0x0217 | ||
54 | #define GEYSER3_ISO_PRODUCT_ID 0x0218 | ||
55 | #define GEYSER3_JIS_PRODUCT_ID 0x0219 | ||
56 | |||
57 | /* | ||
58 | * Geyser IV: same as Geyser III according to Info.plist in AppleUSBTrackpad.kext | ||
59 | * -> same IOClass (AppleUSBGrIIITrackpad), same acceleration tables | ||
60 | */ | ||
61 | #define GEYSER4_ANSI_PRODUCT_ID 0x021A | ||
62 | #define GEYSER4_ISO_PRODUCT_ID 0x021B | ||
63 | #define GEYSER4_JIS_PRODUCT_ID 0x021C | ||
64 | |||
65 | #define GEYSER4_HF_ANSI_PRODUCT_ID 0x0229 | ||
66 | #define GEYSER4_HF_ISO_PRODUCT_ID 0x022A | ||
67 | #define GEYSER4_HF_JIS_PRODUCT_ID 0x022B | ||
68 | 46 | ||
69 | #define ATP_DEVICE(prod) \ | 47 | #define ATP_DEVICE(prod, type) \ |
48 | { \ | ||
70 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 49 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ |
71 | USB_DEVICE_ID_MATCH_INT_CLASS | \ | 50 | USB_DEVICE_ID_MATCH_INT_CLASS | \ |
72 | USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ | 51 | USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ |
73 | .idVendor = APPLE_VENDOR_ID, \ | 52 | .idVendor = 0x05ac, /* Apple */ \ |
74 | .idProduct = (prod), \ | 53 | .idProduct = (prod), \ |
75 | .bInterfaceClass = 0x03, \ | 54 | .bInterfaceClass = 0x03, \ |
76 | .bInterfaceProtocol = 0x02 | 55 | .bInterfaceProtocol = 0x02, \ |
56 | .driver_info = ATP_ ## type, \ | ||
57 | } | ||
58 | |||
59 | /* | ||
60 | * Table of devices (Product IDs) that work with this driver. | ||
61 | * (The names come from Info.plist in AppleUSBTrackpad.kext, | ||
62 | * According to Info.plist Geyser IV is the same as Geyser III.) | ||
63 | */ | ||
77 | 64 | ||
78 | /* table of devices that work with this driver */ | ||
79 | static struct usb_device_id atp_table [] = { | 65 | static struct usb_device_id atp_table [] = { |
80 | { ATP_DEVICE(FOUNTAIN_ANSI_PRODUCT_ID) }, | 66 | /* PowerBooks Feb 2005, iBooks G4 */ |
81 | { ATP_DEVICE(FOUNTAIN_ISO_PRODUCT_ID) }, | 67 | ATP_DEVICE(0x020e, FOUNTAIN), /* FOUNTAIN ANSI */ |
82 | { ATP_DEVICE(FOUNTAIN_TP_ONLY_PRODUCT_ID) }, | 68 | ATP_DEVICE(0x020f, FOUNTAIN), /* FOUNTAIN ISO */ |
83 | { ATP_DEVICE(GEYSER1_TP_ONLY_PRODUCT_ID) }, | 69 | ATP_DEVICE(0x030a, FOUNTAIN), /* FOUNTAIN TP ONLY */ |
70 | ATP_DEVICE(0x030b, GEYSER1), /* GEYSER 1 TP ONLY */ | ||
84 | 71 | ||
85 | /* PowerBooks Oct 2005 */ | 72 | /* PowerBooks Oct 2005 */ |
86 | { ATP_DEVICE(GEYSER_ANSI_PRODUCT_ID) }, | 73 | ATP_DEVICE(0x0214, GEYSER2), /* GEYSER 2 ANSI */ |
87 | { ATP_DEVICE(GEYSER_ISO_PRODUCT_ID) }, | 74 | ATP_DEVICE(0x0215, GEYSER2), /* GEYSER 2 ISO */ |
88 | { ATP_DEVICE(GEYSER_JIS_PRODUCT_ID) }, | 75 | ATP_DEVICE(0x0216, GEYSER2), /* GEYSER 2 JIS */ |
89 | 76 | ||
90 | /* Core Duo MacBook & MacBook Pro */ | 77 | /* Core Duo MacBook & MacBook Pro */ |
91 | { ATP_DEVICE(GEYSER3_ANSI_PRODUCT_ID) }, | 78 | ATP_DEVICE(0x0217, GEYSER3), /* GEYSER 3 ANSI */ |
92 | { ATP_DEVICE(GEYSER3_ISO_PRODUCT_ID) }, | 79 | ATP_DEVICE(0x0218, GEYSER3), /* GEYSER 3 ISO */ |
93 | { ATP_DEVICE(GEYSER3_JIS_PRODUCT_ID) }, | 80 | ATP_DEVICE(0x0219, GEYSER3), /* GEYSER 3 JIS */ |
94 | 81 | ||
95 | /* Core2 Duo MacBook & MacBook Pro */ | 82 | /* Core2 Duo MacBook & MacBook Pro */ |
96 | { ATP_DEVICE(GEYSER4_ANSI_PRODUCT_ID) }, | 83 | ATP_DEVICE(0x021a, GEYSER4), /* GEYSER 4 ANSI */ |
97 | { ATP_DEVICE(GEYSER4_ISO_PRODUCT_ID) }, | 84 | ATP_DEVICE(0x021b, GEYSER4), /* GEYSER 4 ISO */ |
98 | { ATP_DEVICE(GEYSER4_JIS_PRODUCT_ID) }, | 85 | ATP_DEVICE(0x021c, GEYSER4), /* GEYSER 4 JIS */ |
99 | 86 | ||
100 | { ATP_DEVICE(GEYSER4_HF_ANSI_PRODUCT_ID) }, | 87 | /* Core2 Duo MacBook3,1 */ |
101 | { ATP_DEVICE(GEYSER4_HF_ISO_PRODUCT_ID) }, | 88 | ATP_DEVICE(0x0229, GEYSER4), /* GEYSER 4 HF ANSI */ |
102 | { ATP_DEVICE(GEYSER4_HF_JIS_PRODUCT_ID) }, | 89 | ATP_DEVICE(0x022a, GEYSER4), /* GEYSER 4 HF ISO */ |
90 | ATP_DEVICE(0x022b, GEYSER4), /* GEYSER 4 HF JIS */ | ||
103 | 91 | ||
104 | /* Terminating entry */ | 92 | /* Terminating entry */ |
105 | { } | 93 | { } |
106 | }; | 94 | }; |
107 | MODULE_DEVICE_TABLE (usb, atp_table); | 95 | MODULE_DEVICE_TABLE(usb, atp_table); |
108 | 96 | ||
109 | /* | 97 | /* |
110 | * number of sensors. Note that only 16 instead of 26 X (horizontal) | 98 | * number of sensors. Note that only 16 instead of 26 X (horizontal) |
@@ -124,9 +112,13 @@ MODULE_DEVICE_TABLE (usb, atp_table); | |||
124 | * We try to keep the touchpad aspect ratio while still doing only simple | 112 | * We try to keep the touchpad aspect ratio while still doing only simple |
125 | * arithmetics. | 113 | * arithmetics. |
126 | * The factors below give coordinates like: | 114 | * The factors below give coordinates like: |
127 | * 0 <= x < 960 on 12" and 15" Powerbooks | 115 | * |
128 | * 0 <= x < 1600 on 17" Powerbooks | 116 | * 0 <= x < 960 on 12" and 15" Powerbooks |
129 | * 0 <= y < 646 | 117 | * 0 <= x < 1600 on 17" Powerbooks and 17" MacBook Pro |
118 | * 0 <= x < 1216 on MacBooks and 15" MacBook Pro | ||
119 | * | ||
120 | * 0 <= y < 646 on all Powerbooks | ||
121 | * 0 <= y < 774 on all MacBooks | ||
130 | */ | 122 | */ |
131 | #define ATP_XFACT 64 | 123 | #define ATP_XFACT 64 |
132 | #define ATP_YFACT 43 | 124 | #define ATP_YFACT 43 |
@@ -147,43 +139,46 @@ MODULE_DEVICE_TABLE (usb, atp_table); | |||
147 | /* Structure to hold all of our device specific stuff */ | 139 | /* Structure to hold all of our device specific stuff */ |
148 | struct atp { | 140 | struct atp { |
149 | char phys[64]; | 141 | char phys[64]; |
150 | struct usb_device * udev; /* usb device */ | 142 | struct usb_device *udev; /* usb device */ |
151 | struct urb * urb; /* usb request block */ | 143 | struct urb *urb; /* usb request block */ |
152 | signed char * data; /* transferred data */ | 144 | signed char *data; /* transferred data */ |
153 | struct input_dev * input; /* input dev */ | 145 | struct input_dev *input; /* input dev */ |
154 | unsigned char open; /* non-zero if opened */ | 146 | enum atp_touchpad_type type; /* type of touchpad */ |
155 | unsigned char valid; /* are the sensors valid ? */ | 147 | bool open; |
156 | unsigned char size_detect_done; | 148 | bool valid; /* are the samples valid? */ |
157 | unsigned char overflowwarn; /* overflow warning printed? */ | 149 | bool size_detect_done; |
150 | bool overflow_warned; | ||
158 | int x_old; /* last reported x/y, */ | 151 | int x_old; /* last reported x/y, */ |
159 | int y_old; /* used for smoothing */ | 152 | int y_old; /* used for smoothing */ |
160 | /* current value of the sensors */ | ||
161 | signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; | 153 | signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; |
162 | /* last value of the sensors */ | ||
163 | signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; | 154 | signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; |
164 | /* accumulated sensors */ | ||
165 | int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; | 155 | int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; |
166 | int datalen; /* size of an USB urb transfer */ | 156 | int datalen; /* size of USB transfer */ |
167 | int idlecount; /* number of empty packets */ | 157 | int idlecount; /* number of empty packets */ |
168 | struct work_struct work; | 158 | struct work_struct work; |
169 | }; | 159 | }; |
170 | 160 | ||
171 | #define dbg_dump(msg, tab) \ | 161 | #define dbg_dump(msg, tab) \ |
172 | if (debug > 1) { \ | 162 | if (debug > 1) { \ |
173 | int i; \ | 163 | int __i; \ |
174 | printk("appletouch: %s %lld", msg, (long long)jiffies); \ | 164 | printk(KERN_DEBUG "appletouch: %s", msg); \ |
175 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \ | 165 | for (__i = 0; __i < ATP_XSENSORS + ATP_YSENSORS; __i++) \ |
176 | printk(" %02x", tab[i]); \ | 166 | printk(" %02x", tab[__i]); \ |
177 | printk("\n"); \ | 167 | printk("\n"); \ |
178 | } | 168 | } |
179 | 169 | ||
180 | #define dprintk(format, a...) \ | 170 | #define dprintk(format, a...) \ |
181 | do { \ | 171 | do { \ |
182 | if (debug) printk(KERN_DEBUG format, ##a); \ | 172 | if (debug) \ |
173 | printk(KERN_DEBUG format, ##a); \ | ||
183 | } while (0) | 174 | } while (0) |
184 | 175 | ||
185 | MODULE_AUTHOR("Johannes Berg, Stelian Pop, Frank Arnold, Michael Hanselmann"); | 176 | MODULE_AUTHOR("Johannes Berg"); |
186 | MODULE_DESCRIPTION("Apple PowerBooks USB touchpad driver"); | 177 | MODULE_AUTHOR("Stelian Pop"); |
178 | MODULE_AUTHOR("Frank Arnold"); | ||
179 | MODULE_AUTHOR("Michael Hanselmann"); | ||
180 | MODULE_AUTHOR("Sven Anders"); | ||
181 | MODULE_DESCRIPTION("Apple PowerBook and MacBook USB touchpad driver"); | ||
187 | MODULE_LICENSE("GPL"); | 182 | MODULE_LICENSE("GPL"); |
188 | 183 | ||
189 | /* | 184 | /* |
@@ -191,46 +186,14 @@ MODULE_LICENSE("GPL"); | |||
191 | */ | 186 | */ |
192 | static int threshold = ATP_THRESHOLD; | 187 | static int threshold = ATP_THRESHOLD; |
193 | module_param(threshold, int, 0644); | 188 | module_param(threshold, int, 0644); |
194 | MODULE_PARM_DESC(threshold, "Discards any change in data from a sensor (trackpad has hundreds of these sensors) less than this value"); | 189 | MODULE_PARM_DESC(threshold, "Discard any change in data from a sensor" |
190 | " (the trackpad has many of these sensors)" | ||
191 | " less than this value."); | ||
195 | 192 | ||
196 | static int debug = 1; | 193 | static int debug; |
197 | module_param(debug, int, 0644); | 194 | module_param(debug, int, 0644); |
198 | MODULE_PARM_DESC(debug, "Activate debugging output"); | 195 | MODULE_PARM_DESC(debug, "Activate debugging output"); |
199 | 196 | ||
200 | static inline int atp_is_fountain(struct atp *dev) | ||
201 | { | ||
202 | u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct); | ||
203 | |||
204 | return productId == FOUNTAIN_ANSI_PRODUCT_ID || | ||
205 | productId == FOUNTAIN_ISO_PRODUCT_ID || | ||
206 | productId == FOUNTAIN_TP_ONLY_PRODUCT_ID; | ||
207 | } | ||
208 | |||
209 | /* Checks if the device a Geyser 2 (ANSI, ISO, JIS) */ | ||
210 | static inline int atp_is_geyser_2(struct atp *dev) | ||
211 | { | ||
212 | u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct); | ||
213 | |||
214 | return (productId == GEYSER_ANSI_PRODUCT_ID) || | ||
215 | (productId == GEYSER_ISO_PRODUCT_ID) || | ||
216 | (productId == GEYSER_JIS_PRODUCT_ID); | ||
217 | } | ||
218 | |||
219 | static inline int atp_is_geyser_3(struct atp *dev) | ||
220 | { | ||
221 | u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct); | ||
222 | |||
223 | return (productId == GEYSER3_ANSI_PRODUCT_ID) || | ||
224 | (productId == GEYSER3_ISO_PRODUCT_ID) || | ||
225 | (productId == GEYSER3_JIS_PRODUCT_ID) || | ||
226 | (productId == GEYSER4_ANSI_PRODUCT_ID) || | ||
227 | (productId == GEYSER4_ISO_PRODUCT_ID) || | ||
228 | (productId == GEYSER4_JIS_PRODUCT_ID) || | ||
229 | (productId == GEYSER4_HF_ANSI_PRODUCT_ID) || | ||
230 | (productId == GEYSER4_HF_ISO_PRODUCT_ID) || | ||
231 | (productId == GEYSER4_HF_JIS_PRODUCT_ID); | ||
232 | } | ||
233 | |||
234 | /* | 197 | /* |
235 | * By default newer Geyser devices send standard USB HID mouse | 198 | * By default newer Geyser devices send standard USB HID mouse |
236 | * packets (Report ID 2). This code changes device mode, so it | 199 | * packets (Report ID 2). This code changes device mode, so it |
@@ -240,6 +203,7 @@ static int atp_geyser_init(struct usb_device *udev) | |||
240 | { | 203 | { |
241 | char data[8]; | 204 | char data[8]; |
242 | int size; | 205 | int size; |
206 | int i; | ||
243 | 207 | ||
244 | size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 208 | size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
245 | ATP_GEYSER_MODE_READ_REQUEST_ID, | 209 | ATP_GEYSER_MODE_READ_REQUEST_ID, |
@@ -248,8 +212,11 @@ static int atp_geyser_init(struct usb_device *udev) | |||
248 | ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); | 212 | ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); |
249 | 213 | ||
250 | if (size != 8) { | 214 | if (size != 8) { |
251 | err("Could not do mode read request from device" | 215 | dprintk("atp_geyser_init: read error\n"); |
252 | " (Geyser Raw mode)"); | 216 | for (i = 0; i < 8; i++) |
217 | dprintk("appletouch[%d]: %d\n", i, data[i]); | ||
218 | |||
219 | err("Failed to read mode from device."); | ||
253 | return -EIO; | 220 | return -EIO; |
254 | } | 221 | } |
255 | 222 | ||
@@ -263,8 +230,11 @@ static int atp_geyser_init(struct usb_device *udev) | |||
263 | ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); | 230 | ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); |
264 | 231 | ||
265 | if (size != 8) { | 232 | if (size != 8) { |
266 | err("Could not do mode write request to device" | 233 | dprintk("atp_geyser_init: write error\n"); |
267 | " (Geyser Raw mode)"); | 234 | for (i = 0; i < 8; i++) |
235 | dprintk("appletouch[%d]: %d\n", i, data[i]); | ||
236 | |||
237 | err("Failed to request geyser raw mode"); | ||
268 | return -EIO; | 238 | return -EIO; |
269 | } | 239 | } |
270 | return 0; | 240 | return 0; |
@@ -280,15 +250,15 @@ static void atp_reinit(struct work_struct *work) | |||
280 | struct usb_device *udev = dev->udev; | 250 | struct usb_device *udev = dev->udev; |
281 | int retval; | 251 | int retval; |
282 | 252 | ||
253 | dprintk("appletouch: putting appletouch to sleep (reinit)\n"); | ||
283 | dev->idlecount = 0; | 254 | dev->idlecount = 0; |
284 | 255 | ||
285 | atp_geyser_init(udev); | 256 | atp_geyser_init(udev); |
286 | 257 | ||
287 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); | 258 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); |
288 | if (retval) { | 259 | if (retval) |
289 | err("%s - usb_submit_urb failed with result %d", | 260 | err("atp_reinit: usb_submit_urb failed with error %d", |
290 | __FUNCTION__, retval); | 261 | retval); |
291 | } | ||
292 | } | 262 | } |
293 | 263 | ||
294 | static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, | 264 | static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, |
@@ -323,7 +293,8 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, | |||
323 | * | 293 | * |
324 | * - Jason Parekh <jasonparekh@gmail.com> | 294 | * - Jason Parekh <jasonparekh@gmail.com> |
325 | */ | 295 | */ |
326 | if (i < 1 || (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) { | 296 | if (i < 1 || |
297 | (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) { | ||
327 | (*fingers)++; | 298 | (*fingers)++; |
328 | is_increasing = 1; | 299 | is_increasing = 1; |
329 | } else if (i > 0 && xy_sensors[i - 1] >= xy_sensors[i]) { | 300 | } else if (i > 0 && xy_sensors[i - 1] >= xy_sensors[i]) { |
@@ -331,11 +302,11 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, | |||
331 | } | 302 | } |
332 | 303 | ||
333 | /* | 304 | /* |
334 | * Subtracts threshold so a high sensor that just passes the threshold | 305 | * Subtracts threshold so a high sensor that just passes the |
335 | * won't skew the calculated absolute coordinate. Fixes an issue | 306 | * threshold won't skew the calculated absolute coordinate. |
336 | * where slowly moving the mouse would occassionaly jump a number of | 307 | * Fixes an issue where slowly moving the mouse would |
337 | * pixels (let me restate--slowly moving the mouse makes this issue | 308 | * occasionally jump a number of pixels (slowly moving the |
338 | * most apparent). | 309 | * finger makes this issue most apparent.) |
339 | */ | 310 | */ |
340 | pcum += (xy_sensors[i] - threshold) * i; | 311 | pcum += (xy_sensors[i] - threshold) * i; |
341 | psum += (xy_sensors[i] - threshold); | 312 | psum += (xy_sensors[i] - threshold); |
@@ -356,7 +327,7 @@ static inline void atp_report_fingers(struct input_dev *input, int fingers) | |||
356 | input_report_key(input, BTN_TOOL_TRIPLETAP, fingers > 2); | 327 | input_report_key(input, BTN_TOOL_TRIPLETAP, fingers > 2); |
357 | } | 328 | } |
358 | 329 | ||
359 | static void atp_complete(struct urb* urb) | 330 | static void atp_complete(struct urb *urb) |
360 | { | 331 | { |
361 | int x, y, x_z, y_z, x_f, y_f; | 332 | int x, y, x_z, y_z, x_f, y_f; |
362 | int retval, i, j; | 333 | int retval, i, j; |
@@ -368,22 +339,22 @@ static void atp_complete(struct urb* urb) | |||
368 | /* success */ | 339 | /* success */ |
369 | break; | 340 | break; |
370 | case -EOVERFLOW: | 341 | case -EOVERFLOW: |
371 | if(!dev->overflowwarn) { | 342 | if (!dev->overflow_warned) { |
372 | printk(KERN_WARNING "appletouch: OVERFLOW with data " | 343 | printk(KERN_WARNING "appletouch: OVERFLOW with data " |
373 | "length %d, actual length is %d\n", | 344 | "length %d, actual length is %d\n", |
374 | dev->datalen, dev->urb->actual_length); | 345 | dev->datalen, dev->urb->actual_length); |
375 | dev->overflowwarn = 1; | 346 | dev->overflow_warned = true; |
376 | } | 347 | } |
377 | case -ECONNRESET: | 348 | case -ECONNRESET: |
378 | case -ENOENT: | 349 | case -ENOENT: |
379 | case -ESHUTDOWN: | 350 | case -ESHUTDOWN: |
380 | /* This urb is terminated, clean up */ | 351 | /* This urb is terminated, clean up */ |
381 | dbg("%s - urb shutting down with status: %d", | 352 | dbg("atp_complete: urb shutting down with status: %d", |
382 | __FUNCTION__, urb->status); | 353 | urb->status); |
383 | return; | 354 | return; |
384 | default: | 355 | default: |
385 | dbg("%s - nonzero urb status received: %d", | 356 | dbg("atp_complete: nonzero urb status received: %d", |
386 | __FUNCTION__, urb->status); | 357 | urb->status); |
387 | goto exit; | 358 | goto exit; |
388 | } | 359 | } |
389 | 360 | ||
@@ -396,7 +367,7 @@ static void atp_complete(struct urb* urb) | |||
396 | } | 367 | } |
397 | 368 | ||
398 | /* reorder the sensors values */ | 369 | /* reorder the sensors values */ |
399 | if (atp_is_geyser_3(dev)) { | 370 | if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) { |
400 | memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); | 371 | memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); |
401 | 372 | ||
402 | /* | 373 | /* |
@@ -415,7 +386,7 @@ static void atp_complete(struct urb* urb) | |||
415 | dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1]; | 386 | dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1]; |
416 | dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2]; | 387 | dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2]; |
417 | } | 388 | } |
418 | } else if (atp_is_geyser_2(dev)) { | 389 | } else if (dev->type == ATP_GEYSER2) { |
419 | memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); | 390 | memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); |
420 | 391 | ||
421 | /* | 392 | /* |
@@ -438,7 +409,7 @@ static void atp_complete(struct urb* urb) | |||
438 | } else { | 409 | } else { |
439 | for (i = 0; i < 8; i++) { | 410 | for (i = 0; i < 8; i++) { |
440 | /* X values */ | 411 | /* X values */ |
441 | dev->xy_cur[i ] = dev->data[5 * i + 2]; | 412 | dev->xy_cur[i + 0] = dev->data[5 * i + 2]; |
442 | dev->xy_cur[i + 8] = dev->data[5 * i + 4]; | 413 | dev->xy_cur[i + 8] = dev->data[5 * i + 4]; |
443 | dev->xy_cur[i + 16] = dev->data[5 * i + 42]; | 414 | dev->xy_cur[i + 16] = dev->data[5 * i + 42]; |
444 | if (i < 2) | 415 | if (i < 2) |
@@ -454,21 +425,22 @@ static void atp_complete(struct urb* urb) | |||
454 | 425 | ||
455 | if (!dev->valid) { | 426 | if (!dev->valid) { |
456 | /* first sample */ | 427 | /* first sample */ |
457 | dev->valid = 1; | 428 | dev->valid = true; |
458 | dev->x_old = dev->y_old = -1; | 429 | dev->x_old = dev->y_old = -1; |
459 | memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); | 430 | memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); |
460 | 431 | ||
461 | if (dev->size_detect_done || | 432 | if (dev->size_detect_done || |
462 | atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */ | 433 | dev->type == ATP_GEYSER3) /* No 17" Macbooks (yet) */ |
463 | goto exit; | 434 | goto exit; |
464 | 435 | ||
465 | /* 17" Powerbooks have extra X sensors */ | 436 | /* 17" Powerbooks have extra X sensors */ |
466 | for (i = (atp_is_geyser_2(dev) ? 15 : 16); i < ATP_XSENSORS; i++) { | 437 | for (i = (dev->type == ATP_GEYSER2 ? 15 : 16); |
438 | i < ATP_XSENSORS; i++) { | ||
467 | if (!dev->xy_cur[i]) | 439 | if (!dev->xy_cur[i]) |
468 | continue; | 440 | continue; |
469 | 441 | ||
470 | printk(KERN_INFO "appletouch: 17\" model detected.\n"); | 442 | printk(KERN_INFO "appletouch: 17\" model detected.\n"); |
471 | if (atp_is_geyser_2(dev)) | 443 | if (dev->type == ATP_GEYSER2) |
472 | input_set_abs_params(dev->input, ABS_X, 0, | 444 | input_set_abs_params(dev->input, ABS_X, 0, |
473 | (20 - 1) * | 445 | (20 - 1) * |
474 | ATP_XFACT - 1, | 446 | ATP_XFACT - 1, |
@@ -548,11 +520,15 @@ static void atp_complete(struct urb* urb) | |||
548 | * several hundred times a second. Re-initialization does not | 520 | * several hundred times a second. Re-initialization does not |
549 | * work on Fountain touchpads. | 521 | * work on Fountain touchpads. |
550 | */ | 522 | */ |
551 | if (!atp_is_fountain(dev)) { | 523 | if (dev->type != ATP_FOUNTAIN) { |
524 | /* | ||
525 | * Button must not be pressed when entering suspend, | ||
526 | * otherwise we will never release the button. | ||
527 | */ | ||
552 | if (!x && !y && !key) { | 528 | if (!x && !y && !key) { |
553 | dev->idlecount++; | 529 | dev->idlecount++; |
554 | if (dev->idlecount == 10) { | 530 | if (dev->idlecount == 10) { |
555 | dev->valid = 0; | 531 | dev->valid = false; |
556 | schedule_work(&dev->work); | 532 | schedule_work(&dev->work); |
557 | /* Don't resubmit urb here, wait for reinit */ | 533 | /* Don't resubmit urb here, wait for reinit */ |
558 | return; | 534 | return; |
@@ -561,12 +537,11 @@ static void atp_complete(struct urb* urb) | |||
561 | dev->idlecount = 0; | 537 | dev->idlecount = 0; |
562 | } | 538 | } |
563 | 539 | ||
564 | exit: | 540 | exit: |
565 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); | 541 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); |
566 | if (retval) { | 542 | if (retval) |
567 | err("%s - usb_submit_urb failed with result %d", | 543 | err("atp_complete: usb_submit_urb failed with result %d", |
568 | __FUNCTION__, retval); | 544 | retval); |
569 | } | ||
570 | } | 545 | } |
571 | 546 | ||
572 | static int atp_open(struct input_dev *input) | 547 | static int atp_open(struct input_dev *input) |
@@ -593,7 +568,7 @@ static int atp_handle_geyser(struct atp *dev) | |||
593 | { | 568 | { |
594 | struct usb_device *udev = dev->udev; | 569 | struct usb_device *udev = dev->udev; |
595 | 570 | ||
596 | if (!atp_is_fountain(dev)) { | 571 | if (dev->type != ATP_FOUNTAIN) { |
597 | /* switch to raw sensor mode */ | 572 | /* switch to raw sensor mode */ |
598 | if (atp_geyser_init(udev)) | 573 | if (atp_geyser_init(udev)) |
599 | return -EIO; | 574 | return -EIO; |
@@ -604,7 +579,8 @@ static int atp_handle_geyser(struct atp *dev) | |||
604 | return 0; | 579 | return 0; |
605 | } | 580 | } |
606 | 581 | ||
607 | static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) | 582 | static int atp_probe(struct usb_interface *iface, |
583 | const struct usb_device_id *id) | ||
608 | { | 584 | { |
609 | struct atp *dev; | 585 | struct atp *dev; |
610 | struct input_dev *input_dev; | 586 | struct input_dev *input_dev; |
@@ -640,13 +616,12 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
640 | 616 | ||
641 | dev->udev = udev; | 617 | dev->udev = udev; |
642 | dev->input = input_dev; | 618 | dev->input = input_dev; |
643 | dev->overflowwarn = 0; | 619 | dev->type = id->driver_info; |
644 | if (atp_is_geyser_3(dev)) | 620 | dev->overflow_warned = false; |
645 | dev->datalen = 64; | 621 | if (dev->type == ATP_FOUNTAIN || dev->type == ATP_GEYSER1) |
646 | else if (atp_is_geyser_2(dev)) | ||
647 | dev->datalen = 64; | ||
648 | else | ||
649 | dev->datalen = 81; | 622 | dev->datalen = 81; |
623 | else | ||
624 | dev->datalen = 64; | ||
650 | 625 | ||
651 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); | 626 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); |
652 | if (!dev->urb) | 627 | if (!dev->urb) |
@@ -680,7 +655,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
680 | 655 | ||
681 | set_bit(EV_ABS, input_dev->evbit); | 656 | set_bit(EV_ABS, input_dev->evbit); |
682 | 657 | ||
683 | if (atp_is_geyser_3(dev)) { | 658 | if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) { |
684 | /* | 659 | /* |
685 | * MacBook have 20 X sensors, 10 Y sensors | 660 | * MacBook have 20 X sensors, 10 Y sensors |
686 | */ | 661 | */ |
@@ -688,7 +663,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
688 | ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0); | 663 | ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0); |
689 | input_set_abs_params(input_dev, ABS_Y, 0, | 664 | input_set_abs_params(input_dev, ABS_Y, 0, |
690 | ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0); | 665 | ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0); |
691 | } else if (atp_is_geyser_2(dev)) { | 666 | } else if (dev->type == ATP_GEYSER2) { |
692 | /* | 667 | /* |
693 | * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected | 668 | * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected |
694 | * later. | 669 | * later. |
@@ -703,9 +678,11 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
703 | * 17" models are detected later. | 678 | * 17" models are detected later. |
704 | */ | 679 | */ |
705 | input_set_abs_params(input_dev, ABS_X, 0, | 680 | input_set_abs_params(input_dev, ABS_X, 0, |
706 | (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0); | 681 | (16 - 1) * ATP_XFACT - 1, |
682 | ATP_FUZZ, 0); | ||
707 | input_set_abs_params(input_dev, ABS_Y, 0, | 683 | input_set_abs_params(input_dev, ABS_Y, 0, |
708 | (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0); | 684 | (ATP_YSENSORS - 1) * ATP_YFACT - 1, |
685 | ATP_FUZZ, 0); | ||
709 | } | 686 | } |
710 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); | 687 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); |
711 | 688 | ||
@@ -774,7 +751,7 @@ static int atp_suspend(struct usb_interface *iface, pm_message_t message) | |||
774 | struct atp *dev = usb_get_intfdata(iface); | 751 | struct atp *dev = usb_get_intfdata(iface); |
775 | 752 | ||
776 | usb_kill_urb(dev->urb); | 753 | usb_kill_urb(dev->urb); |
777 | dev->valid = 0; | 754 | dev->valid = false; |
778 | 755 | ||
779 | return 0; | 756 | return 0; |
780 | } | 757 | } |
diff --git a/drivers/input/mouse/atarimouse.c b/drivers/input/mouse/atarimouse.c index 98a3561d4b05..adf45b3040e9 100644 --- a/drivers/input/mouse/atarimouse.c +++ b/drivers/input/mouse/atarimouse.c | |||
@@ -57,15 +57,12 @@ MODULE_AUTHOR("Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>"); | |||
57 | MODULE_DESCRIPTION("Atari mouse driver"); | 57 | MODULE_DESCRIPTION("Atari mouse driver"); |
58 | MODULE_LICENSE("GPL"); | 58 | MODULE_LICENSE("GPL"); |
59 | 59 | ||
60 | static int mouse_threshold[2] = {2,2}; | 60 | static int mouse_threshold[2] = {2, 2}; |
61 | module_param_array(mouse_threshold, int, NULL, 0); | ||
61 | 62 | ||
62 | #ifdef __MODULE__ | ||
63 | MODULE_PARM(mouse_threshold, "2i"); | ||
64 | #endif | ||
65 | #ifdef FIXED_ATARI_JOYSTICK | 63 | #ifdef FIXED_ATARI_JOYSTICK |
66 | extern int atari_mouse_buttons; | 64 | extern int atari_mouse_buttons; |
67 | #endif | 65 | #endif |
68 | static int atamouse_used = 0; | ||
69 | 66 | ||
70 | static struct input_dev *atamouse_dev; | 67 | static struct input_dev *atamouse_dev; |
71 | 68 | ||
@@ -97,9 +94,6 @@ static void atamouse_interrupt(char *buf) | |||
97 | 94 | ||
98 | static int atamouse_open(struct input_dev *dev) | 95 | static int atamouse_open(struct input_dev *dev) |
99 | { | 96 | { |
100 | if (atamouse_used++) | ||
101 | return 0; | ||
102 | |||
103 | #ifdef FIXED_ATARI_JOYSTICK | 97 | #ifdef FIXED_ATARI_JOYSTICK |
104 | atari_mouse_buttons = 0; | 98 | atari_mouse_buttons = 0; |
105 | #endif | 99 | #endif |
@@ -107,23 +101,24 @@ static int atamouse_open(struct input_dev *dev) | |||
107 | ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]); | 101 | ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]); |
108 | ikbd_mouse_rel_pos(); | 102 | ikbd_mouse_rel_pos(); |
109 | atari_input_mouse_interrupt_hook = atamouse_interrupt; | 103 | atari_input_mouse_interrupt_hook = atamouse_interrupt; |
104 | |||
110 | return 0; | 105 | return 0; |
111 | } | 106 | } |
112 | 107 | ||
113 | static void atamouse_close(struct input_dev *dev) | 108 | static void atamouse_close(struct input_dev *dev) |
114 | { | 109 | { |
115 | if (!--atamouse_used) { | 110 | ikbd_mouse_disable(); |
116 | ikbd_mouse_disable(); | 111 | atari_mouse_interrupt_hook = NULL; |
117 | atari_mouse_interrupt_hook = NULL; | ||
118 | } | ||
119 | } | 112 | } |
120 | 113 | ||
121 | static int __init atamouse_init(void) | 114 | static int __init atamouse_init(void) |
122 | { | 115 | { |
116 | int error; | ||
117 | |||
123 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) | 118 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) |
124 | return -ENODEV; | 119 | return -ENODEV; |
125 | 120 | ||
126 | if (!(atari_keyb_init())) | 121 | if (!atari_keyb_init()) |
127 | return -ENODEV; | 122 | return -ENODEV; |
128 | 123 | ||
129 | atamouse_dev = input_allocate_device(); | 124 | atamouse_dev = input_allocate_device(); |
@@ -141,12 +136,14 @@ static int __init atamouse_init(void) | |||
141 | atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); | 136 | atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); |
142 | atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | | 137 | atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | |
143 | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); | 138 | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); |
139 | |||
144 | atamouse_dev->open = atamouse_open; | 140 | atamouse_dev->open = atamouse_open; |
145 | atamouse_dev->close = atamouse_close; | 141 | atamouse_dev->close = atamouse_close; |
146 | 142 | ||
147 | if (input_register_device(atamouse_dev)) { | 143 | error = input_register_device(atamouse_dev); |
144 | if (error) { | ||
148 | input_free_device(atamouse_dev); | 145 | input_free_device(atamouse_dev); |
149 | return -ENOMEM; | 146 | return error; |
150 | } | 147 | } |
151 | 148 | ||
152 | return 0; | 149 | return 0; |
diff --git a/drivers/input/mouse/hil_ptr.c b/drivers/input/mouse/hil_ptr.c index 27f88fbb7136..e532c48410ea 100644 --- a/drivers/input/mouse/hil_ptr.c +++ b/drivers/input/mouse/hil_ptr.c | |||
@@ -247,19 +247,24 @@ static void hil_ptr_disconnect(struct serio *serio) | |||
247 | 247 | ||
248 | static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) | 248 | static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) |
249 | { | 249 | { |
250 | struct hil_ptr *ptr; | 250 | struct hil_ptr *ptr; |
251 | const char *txt; | 251 | const char *txt; |
252 | unsigned int i, naxsets, btntype; | 252 | unsigned int i, naxsets, btntype; |
253 | uint8_t did, *idd; | 253 | uint8_t did, *idd; |
254 | 254 | int error; | |
255 | if (!(ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL))) | 255 | |
256 | ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL); | ||
257 | if (!ptr) | ||
256 | return -ENOMEM; | 258 | return -ENOMEM; |
257 | 259 | ||
258 | ptr->dev = input_allocate_device(); | 260 | ptr->dev = input_allocate_device(); |
259 | if (!ptr->dev) | 261 | if (!ptr->dev) { |
262 | error = -ENOMEM; | ||
260 | goto bail0; | 263 | goto bail0; |
264 | } | ||
261 | 265 | ||
262 | if (serio_open(serio, driver)) | 266 | error = serio_open(serio, driver); |
267 | if (error) | ||
263 | goto bail1; | 268 | goto bail1; |
264 | 269 | ||
265 | serio_set_drvdata(serio, ptr); | 270 | serio_set_drvdata(serio, ptr); |
@@ -297,6 +302,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) | |||
297 | did = ptr->idd[0]; | 302 | did = ptr->idd[0]; |
298 | idd = ptr->idd + 1; | 303 | idd = ptr->idd + 1; |
299 | txt = "unknown"; | 304 | txt = "unknown"; |
305 | |||
300 | if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { | 306 | if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { |
301 | ptr->dev->evbit[0] = BIT_MASK(EV_REL); | 307 | ptr->dev->evbit[0] = BIT_MASK(EV_REL); |
302 | txt = "relative"; | 308 | txt = "relative"; |
@@ -306,8 +312,11 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) | |||
306 | ptr->dev->evbit[0] = BIT_MASK(EV_ABS); | 312 | ptr->dev->evbit[0] = BIT_MASK(EV_ABS); |
307 | txt = "absolute"; | 313 | txt = "absolute"; |
308 | } | 314 | } |
309 | if (!ptr->dev->evbit[0]) | 315 | |
316 | if (!ptr->dev->evbit[0]) { | ||
317 | error = -ENODEV; | ||
310 | goto bail2; | 318 | goto bail2; |
319 | } | ||
311 | 320 | ||
312 | ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); | 321 | ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); |
313 | if (ptr->nbtn) | 322 | if (ptr->nbtn) |
@@ -380,13 +389,19 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) | |||
380 | ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */ | 389 | ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */ |
381 | ptr->dev->dev.parent = &serio->dev; | 390 | ptr->dev->dev.parent = &serio->dev; |
382 | 391 | ||
383 | input_register_device(ptr->dev); | 392 | error = input_register_device(ptr->dev); |
393 | if (error) { | ||
394 | printk(KERN_INFO PREFIX "Unable to register input device\n"); | ||
395 | goto bail2; | ||
396 | } | ||
397 | |||
384 | printk(KERN_INFO "input: %s (%s), ID: %d\n", | 398 | printk(KERN_INFO "input: %s (%s), ID: %d\n", |
385 | ptr->dev->name, | 399 | ptr->dev->name, |
386 | (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", | 400 | (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", |
387 | did); | 401 | did); |
388 | 402 | ||
389 | return 0; | 403 | return 0; |
404 | |||
390 | bail2: | 405 | bail2: |
391 | serio_close(serio); | 406 | serio_close(serio); |
392 | bail1: | 407 | bail1: |
@@ -394,7 +409,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) | |||
394 | bail0: | 409 | bail0: |
395 | kfree(ptr); | 410 | kfree(ptr); |
396 | serio_set_drvdata(serio, NULL); | 411 | serio_set_drvdata(serio, NULL); |
397 | return -ENODEV; | 412 | return error; |
398 | } | 413 | } |
399 | 414 | ||
400 | static struct serio_device_id hil_ptr_ids[] = { | 415 | static struct serio_device_id hil_ptr_ids[] = { |
diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c index 06c35fc553c0..3827a22362de 100644 --- a/drivers/input/mouse/inport.c +++ b/drivers/input/mouse/inport.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: inport.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c index 9ea895593b27..e2413113df22 100644 --- a/drivers/input/mouse/logibm.c +++ b/drivers/input/mouse/logibm.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: logibm.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c index 61cff8374e6c..fd09c8df81f2 100644 --- a/drivers/input/mouse/pc110pad.c +++ b/drivers/input/mouse/pc110pad.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: pc110pad.c,v 1.12 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c index ed917bfd086a..17ff137b9bd5 100644 --- a/drivers/input/mouse/sermouse.c +++ b/drivers/input/mouse/sermouse.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: sermouse.c,v 1.17 2002/03/13 10:03:43 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index ec4b6610f730..27d70d326ff3 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig | |||
@@ -190,4 +190,14 @@ config SERIO_RAW | |||
190 | To compile this driver as a module, choose M here: the | 190 | To compile this driver as a module, choose M here: the |
191 | module will be called serio_raw. | 191 | module will be called serio_raw. |
192 | 192 | ||
193 | config SERIO_XILINX_XPS_PS2 | ||
194 | tristate "Xilinx XPS PS/2 Controller Support" | ||
195 | depends on PPC | ||
196 | help | ||
197 | This driver supports XPS PS/2 IP from the Xilinx EDK on | ||
198 | PowerPC platform. | ||
199 | |||
200 | To compile this driver as a module, choose M here: the | ||
201 | module will be called xilinx_ps2. | ||
202 | |||
193 | endif | 203 | endif |
diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile index 38b886887cbc..9b6c8135955f 100644 --- a/drivers/input/serio/Makefile +++ b/drivers/input/serio/Makefile | |||
@@ -21,3 +21,4 @@ obj-$(CONFIG_SERIO_PCIPS2) += pcips2.o | |||
21 | obj-$(CONFIG_SERIO_MACEPS2) += maceps2.o | 21 | obj-$(CONFIG_SERIO_MACEPS2) += maceps2.o |
22 | obj-$(CONFIG_SERIO_LIBPS2) += libps2.o | 22 | obj-$(CONFIG_SERIO_LIBPS2) += libps2.o |
23 | obj-$(CONFIG_SERIO_RAW) += serio_raw.o | 23 | obj-$(CONFIG_SERIO_RAW) += serio_raw.o |
24 | obj-$(CONFIG_SERIO_XILINX_XPS_PS2) += xilinx_ps2.o | ||
diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c index 0d35018c23a9..d1380fc72cc6 100644 --- a/drivers/input/serio/ct82c710.c +++ b/drivers/input/serio/ct82c710.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ct82c710.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c index 93a1a6ba216a..37586a68d345 100644 --- a/drivers/input/serio/hil_mlc.c +++ b/drivers/input/serio/hil_mlc.c | |||
@@ -76,7 +76,7 @@ static struct timer_list hil_mlcs_kicker; | |||
76 | static int hil_mlcs_probe; | 76 | static int hil_mlcs_probe; |
77 | 77 | ||
78 | static void hil_mlcs_process(unsigned long unused); | 78 | static void hil_mlcs_process(unsigned long unused); |
79 | DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0); | 79 | static DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0); |
80 | 80 | ||
81 | 81 | ||
82 | /* #define HIL_MLC_DEBUG */ | 82 | /* #define HIL_MLC_DEBUG */ |
@@ -459,7 +459,7 @@ static int hilse_operate(hil_mlc *mlc, int repoll) | |||
459 | #define OUT_LAST(pack) \ | 459 | #define OUT_LAST(pack) \ |
460 | { HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, | 460 | { HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, |
461 | 461 | ||
462 | const struct hilse_node hil_mlc_se[HILSEN_END] = { | 462 | static const struct hilse_node hil_mlc_se[HILSEN_END] = { |
463 | 463 | ||
464 | /* 0 HILSEN_START */ | 464 | /* 0 HILSEN_START */ |
465 | FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) | 465 | FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) |
@@ -784,7 +784,7 @@ static void hil_mlcs_process(unsigned long unused) | |||
784 | 784 | ||
785 | /************************* Keepalive timer task *********************/ | 785 | /************************* Keepalive timer task *********************/ |
786 | 786 | ||
787 | void hil_mlcs_timer(unsigned long data) | 787 | static void hil_mlcs_timer(unsigned long data) |
788 | { | 788 | { |
789 | hil_mlcs_probe = 1; | 789 | hil_mlcs_probe = 1; |
790 | tasklet_schedule(&hil_mlcs_tasklet); | 790 | tasklet_schedule(&hil_mlcs_tasklet); |
diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c index edfedd9a166c..7b233a492ad5 100644 --- a/drivers/input/serio/hp_sdc.c +++ b/drivers/input/serio/hp_sdc.c | |||
@@ -105,6 +105,10 @@ EXPORT_SYMBOL(__hp_sdc_enqueue_transaction); | |||
105 | EXPORT_SYMBOL(hp_sdc_enqueue_transaction); | 105 | EXPORT_SYMBOL(hp_sdc_enqueue_transaction); |
106 | EXPORT_SYMBOL(hp_sdc_dequeue_transaction); | 106 | EXPORT_SYMBOL(hp_sdc_dequeue_transaction); |
107 | 107 | ||
108 | static unsigned int hp_sdc_disabled; | ||
109 | module_param_named(no_hpsdc, hp_sdc_disabled, bool, 0); | ||
110 | MODULE_PARM_DESC(no_hpsdc, "Do not enable HP SDC driver."); | ||
111 | |||
108 | static hp_i8042_sdc hp_sdc; /* All driver state is kept in here. */ | 112 | static hp_i8042_sdc hp_sdc; /* All driver state is kept in here. */ |
109 | 113 | ||
110 | /*************** primitives for use in any context *********************/ | 114 | /*************** primitives for use in any context *********************/ |
@@ -980,6 +984,11 @@ static int __init hp_sdc_register(void) | |||
980 | unsigned char i; | 984 | unsigned char i; |
981 | #endif | 985 | #endif |
982 | 986 | ||
987 | if (hp_sdc_disabled) { | ||
988 | printk(KERN_WARNING PREFIX "HP SDC driver disabled by no_hpsdc=1.\n"); | ||
989 | return -ENODEV; | ||
990 | } | ||
991 | |||
983 | hp_sdc.dev = NULL; | 992 | hp_sdc.dev = NULL; |
984 | hp_sdc.dev_err = 0; | 993 | hp_sdc.dev_err = 0; |
985 | #if defined(__hppa__) | 994 | #if defined(__hppa__) |
diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c index 587398f5c9df..b587e2d576ac 100644 --- a/drivers/input/serio/hp_sdc_mlc.c +++ b/drivers/input/serio/hp_sdc_mlc.c | |||
@@ -50,7 +50,7 @@ MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>"); | |||
50 | MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines"); | 50 | MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines"); |
51 | MODULE_LICENSE("Dual BSD/GPL"); | 51 | MODULE_LICENSE("Dual BSD/GPL"); |
52 | 52 | ||
53 | struct hp_sdc_mlc_priv_s { | 53 | static struct hp_sdc_mlc_priv_s { |
54 | int emtestmode; | 54 | int emtestmode; |
55 | hp_sdc_transaction trans; | 55 | hp_sdc_transaction trans; |
56 | u8 tseq[16]; | 56 | u8 tseq[16]; |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 78eb7841174c..fe732a574ec2 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -63,13 +63,22 @@ static inline void i8042_write_command(int val) | |||
63 | outb(val, I8042_COMMAND_REG); | 63 | outb(val, I8042_COMMAND_REG); |
64 | } | 64 | } |
65 | 65 | ||
66 | #if defined(__i386__) || defined(__x86_64__) | 66 | #ifdef CONFIG_X86 |
67 | 67 | ||
68 | #include <linux/dmi.h> | 68 | #include <linux/dmi.h> |
69 | 69 | ||
70 | static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { | 70 | static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { |
71 | { | 71 | { |
72 | /* AUX LOOP command does not raise AUX IRQ */ | 72 | /* AUX LOOP command does not raise AUX IRQ */ |
73 | .ident = "Arima-Rioworks HDAMB", | ||
74 | .matches = { | ||
75 | DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"), | ||
76 | DMI_MATCH(DMI_BOARD_NAME, "HDAMB"), | ||
77 | DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), | ||
78 | }, | ||
79 | }, | ||
80 | { | ||
81 | /* AUX LOOP command does not raise AUX IRQ */ | ||
73 | .ident = "ASUS P65UP5", | 82 | .ident = "ASUS P65UP5", |
74 | .matches = { | 83 | .matches = { |
75 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | 84 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
@@ -118,6 +127,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { | |||
118 | DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), | 127 | DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), |
119 | }, | 128 | }, |
120 | }, | 129 | }, |
130 | { | ||
131 | .ident = "Medion MAM 2070", | ||
132 | .matches = { | ||
133 | DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), | ||
134 | DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), | ||
135 | DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), | ||
136 | }, | ||
137 | }, | ||
121 | { } | 138 | { } |
122 | }; | 139 | }; |
123 | 140 | ||
@@ -291,17 +308,36 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
291 | DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), | 308 | DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), |
292 | }, | 309 | }, |
293 | }, | 310 | }, |
311 | { | ||
312 | .ident = "Acer Aspire 1360", | ||
313 | .matches = { | ||
314 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
315 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), | ||
316 | }, | ||
317 | }, | ||
318 | { | ||
319 | .ident = "Gericom Bellagio", | ||
320 | .matches = { | ||
321 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | ||
322 | DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), | ||
323 | }, | ||
324 | }, | ||
294 | { } | 325 | { } |
295 | }; | 326 | }; |
296 | 327 | ||
297 | 328 | #ifdef CONFIG_PNP | |
298 | 329 | static struct dmi_system_id __initdata i8042_dmi_nopnp_table[] = { | |
330 | { | ||
331 | .ident = "Intel MBO Desktop D845PESV", | ||
332 | .matches = { | ||
333 | DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), | ||
334 | DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), | ||
335 | }, | ||
336 | }, | ||
337 | { } | ||
338 | }; | ||
299 | #endif | 339 | #endif |
300 | 340 | ||
301 | #ifdef CONFIG_X86 | ||
302 | |||
303 | #include <linux/dmi.h> | ||
304 | |||
305 | /* | 341 | /* |
306 | * Some Wistron based laptops need us to explicitly enable the 'Dritek | 342 | * Some Wistron based laptops need us to explicitly enable the 'Dritek |
307 | * keyboard extension' to make their extra keys start generating scancodes. | 343 | * keyboard extension' to make their extra keys start generating scancodes. |
@@ -331,6 +367,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | |||
331 | }, | 367 | }, |
332 | }, | 368 | }, |
333 | { | 369 | { |
370 | .ident = "Acer Aspire 5720", | ||
371 | .matches = { | ||
372 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
373 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), | ||
374 | }, | ||
375 | }, | ||
376 | { | ||
334 | .ident = "Acer Aspire 9110", | 377 | .ident = "Acer Aspire 9110", |
335 | .matches = { | 378 | .matches = { |
336 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 379 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
@@ -356,7 +399,6 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | |||
356 | 399 | ||
357 | #endif /* CONFIG_X86 */ | 400 | #endif /* CONFIG_X86 */ |
358 | 401 | ||
359 | |||
360 | #ifdef CONFIG_PNP | 402 | #ifdef CONFIG_PNP |
361 | #include <linux/pnp.h> | 403 | #include <linux/pnp.h> |
362 | 404 | ||
@@ -466,6 +508,11 @@ static int __init i8042_pnp_init(void) | |||
466 | int pnp_data_busted = 0; | 508 | int pnp_data_busted = 0; |
467 | int err; | 509 | int err; |
468 | 510 | ||
511 | #ifdef CONFIG_X86 | ||
512 | if (dmi_check_system(i8042_dmi_nopnp_table)) | ||
513 | i8042_nopnp = 1; | ||
514 | #endif | ||
515 | |||
469 | if (i8042_nopnp) { | 516 | if (i8042_nopnp) { |
470 | printk(KERN_INFO "i8042: PNP detection disabled\n"); | 517 | printk(KERN_INFO "i8042: PNP detection disabled\n"); |
471 | return 0; | 518 | return 0; |
@@ -591,15 +638,13 @@ static int __init i8042_platform_init(void) | |||
591 | i8042_reset = 1; | 638 | i8042_reset = 1; |
592 | #endif | 639 | #endif |
593 | 640 | ||
594 | #if defined(__i386__) || defined(__x86_64__) | 641 | #ifdef CONFIG_X86 |
595 | if (dmi_check_system(i8042_dmi_noloop_table)) | 642 | if (dmi_check_system(i8042_dmi_noloop_table)) |
596 | i8042_noloop = 1; | 643 | i8042_noloop = 1; |
597 | 644 | ||
598 | if (dmi_check_system(i8042_dmi_nomux_table)) | 645 | if (dmi_check_system(i8042_dmi_nomux_table)) |
599 | i8042_nomux = 1; | 646 | i8042_nomux = 1; |
600 | #endif | ||
601 | 647 | ||
602 | #ifdef CONFIG_X86 | ||
603 | if (dmi_check_system(i8042_dmi_dritek_table)) | 648 | if (dmi_check_system(i8042_dmi_dritek_table)) |
604 | i8042_dritek = 1; | 649 | i8042_dritek = 1; |
605 | #endif /* CONFIG_X86 */ | 650 | #endif /* CONFIG_X86 */ |
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index b819239d74dc..2b304c22c200 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c | |||
@@ -26,15 +26,6 @@ MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); | |||
26 | MODULE_DESCRIPTION("PS/2 driver library"); | 26 | MODULE_DESCRIPTION("PS/2 driver library"); |
27 | MODULE_LICENSE("GPL"); | 27 | MODULE_LICENSE("GPL"); |
28 | 28 | ||
29 | /* Work structure to schedule execution of a command */ | ||
30 | struct ps2work { | ||
31 | struct work_struct work; | ||
32 | struct ps2dev *ps2dev; | ||
33 | int command; | ||
34 | unsigned char param[0]; | ||
35 | }; | ||
36 | |||
37 | |||
38 | /* | 29 | /* |
39 | * ps2_sendbyte() sends a byte to the device and waits for acknowledge. | 30 | * ps2_sendbyte() sends a byte to the device and waits for acknowledge. |
40 | * It doesn't handle retransmission, though it could - because if there | 31 | * It doesn't handle retransmission, though it could - because if there |
@@ -246,49 +237,6 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
246 | EXPORT_SYMBOL(ps2_command); | 237 | EXPORT_SYMBOL(ps2_command); |
247 | 238 | ||
248 | /* | 239 | /* |
249 | * ps2_execute_scheduled_command() sends a command, previously scheduled by | ||
250 | * ps2_schedule_command(), to a PS/2 device (keyboard, mouse, etc.) | ||
251 | */ | ||
252 | |||
253 | static void ps2_execute_scheduled_command(struct work_struct *work) | ||
254 | { | ||
255 | struct ps2work *ps2work = container_of(work, struct ps2work, work); | ||
256 | |||
257 | ps2_command(ps2work->ps2dev, ps2work->param, ps2work->command); | ||
258 | kfree(ps2work); | ||
259 | } | ||
260 | |||
261 | /* | ||
262 | * ps2_schedule_command() allows to schedule delayed execution of a PS/2 | ||
263 | * command and can be used to issue a command from an interrupt or softirq | ||
264 | * context. | ||
265 | */ | ||
266 | |||
267 | int ps2_schedule_command(struct ps2dev *ps2dev, unsigned char *param, int command) | ||
268 | { | ||
269 | struct ps2work *ps2work; | ||
270 | int send = (command >> 12) & 0xf; | ||
271 | int receive = (command >> 8) & 0xf; | ||
272 | |||
273 | if (!(ps2work = kmalloc(sizeof(struct ps2work) + max(send, receive), GFP_ATOMIC))) | ||
274 | return -1; | ||
275 | |||
276 | memset(ps2work, 0, sizeof(struct ps2work)); | ||
277 | ps2work->ps2dev = ps2dev; | ||
278 | ps2work->command = command; | ||
279 | memcpy(ps2work->param, param, send); | ||
280 | INIT_WORK(&ps2work->work, ps2_execute_scheduled_command); | ||
281 | |||
282 | if (!schedule_work(&ps2work->work)) { | ||
283 | kfree(ps2work); | ||
284 | return -1; | ||
285 | } | ||
286 | |||
287 | return 0; | ||
288 | } | ||
289 | EXPORT_SYMBOL(ps2_schedule_command); | ||
290 | |||
291 | /* | ||
292 | * ps2_init() initializes ps2dev structure | 240 | * ps2_init() initializes ps2dev structure |
293 | */ | 241 | */ |
294 | 242 | ||
diff --git a/drivers/input/serio/q40kbd.c b/drivers/input/serio/q40kbd.c index d962a8d78b14..e36a0901646c 100644 --- a/drivers/input/serio/q40kbd.c +++ b/drivers/input/serio/q40kbd.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: q40kbd.c,v 1.12 2002/02/02 22:26:44 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | * | 3 | * |
6 | * Based on the work of: | 4 | * Based on the work of: |
@@ -49,7 +47,7 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); | |||
49 | MODULE_DESCRIPTION("Q40 PS/2 keyboard controller driver"); | 47 | MODULE_DESCRIPTION("Q40 PS/2 keyboard controller driver"); |
50 | MODULE_LICENSE("GPL"); | 48 | MODULE_LICENSE("GPL"); |
51 | 49 | ||
52 | DEFINE_SPINLOCK(q40kbd_lock); | 50 | static DEFINE_SPINLOCK(q40kbd_lock); |
53 | static struct serio *q40kbd_port; | 51 | static struct serio *q40kbd_port; |
54 | static struct platform_device *q40kbd_device; | 52 | static struct platform_device *q40kbd_device; |
55 | 53 | ||
diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c index 34c59d9c6205..1567b7782478 100644 --- a/drivers/input/serio/rpckbd.c +++ b/drivers/input/serio/rpckbd.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: rpckbd.c,v 1.7 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | * Copyright (c) 2002 Russell King | 3 | * Copyright (c) 2002 Russell King |
6 | */ | 4 | */ |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 7f5293828fbf..78f2abb5c11b 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -331,9 +331,10 @@ static void serio_handle_event(void) | |||
331 | } | 331 | } |
332 | 332 | ||
333 | /* | 333 | /* |
334 | * Remove all events that have been submitted for a given serio port. | 334 | * Remove all events that have been submitted for a given |
335 | * object, be it serio port or driver. | ||
335 | */ | 336 | */ |
336 | static void serio_remove_pending_events(struct serio *serio) | 337 | static void serio_remove_pending_events(void *object) |
337 | { | 338 | { |
338 | struct list_head *node, *next; | 339 | struct list_head *node, *next; |
339 | struct serio_event *event; | 340 | struct serio_event *event; |
@@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio) | |||
343 | 344 | ||
344 | list_for_each_safe(node, next, &serio_event_list) { | 345 | list_for_each_safe(node, next, &serio_event_list) { |
345 | event = list_entry(node, struct serio_event, node); | 346 | event = list_entry(node, struct serio_event, node); |
346 | if (event->object == serio) { | 347 | if (event->object == object) { |
347 | list_del_init(node); | 348 | list_del_init(node); |
348 | serio_free_event(event); | 349 | serio_free_event(event); |
349 | } | 350 | } |
@@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv) | |||
837 | struct serio *serio; | 838 | struct serio *serio; |
838 | 839 | ||
839 | mutex_lock(&serio_mutex); | 840 | mutex_lock(&serio_mutex); |
841 | |||
840 | drv->manual_bind = 1; /* so serio_find_driver ignores it */ | 842 | drv->manual_bind = 1; /* so serio_find_driver ignores it */ |
843 | serio_remove_pending_events(drv); | ||
841 | 844 | ||
842 | start_over: | 845 | start_over: |
843 | list_for_each_entry(serio, &serio_list, node) { | 846 | list_for_each_entry(serio, &serio_list, node) { |
diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c new file mode 100644 index 000000000000..0ed044d5e685 --- /dev/null +++ b/drivers/input/serio/xilinx_ps2.c | |||
@@ -0,0 +1,380 @@ | |||
1 | /* | ||
2 | * Xilinx XPS PS/2 device driver | ||
3 | * | ||
4 | * (c) 2005 MontaVista Software, Inc. | ||
5 | * (c) 2008 Xilinx, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * You should have received a copy of the GNU General Public License along | ||
13 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
14 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
15 | */ | ||
16 | |||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/serio.h> | ||
20 | #include <linux/interrupt.h> | ||
21 | #include <linux/errno.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/list.h> | ||
24 | #include <linux/io.h> | ||
25 | |||
26 | #include <linux/of_device.h> | ||
27 | #include <linux/of_platform.h> | ||
28 | |||
29 | #define DRIVER_NAME "xilinx_ps2" | ||
30 | |||
31 | /* Register offsets for the xps2 device */ | ||
32 | #define XPS2_SRST_OFFSET 0x00000000 /* Software Reset register */ | ||
33 | #define XPS2_STATUS_OFFSET 0x00000004 /* Status register */ | ||
34 | #define XPS2_RX_DATA_OFFSET 0x00000008 /* Receive Data register */ | ||
35 | #define XPS2_TX_DATA_OFFSET 0x0000000C /* Transmit Data register */ | ||
36 | #define XPS2_GIER_OFFSET 0x0000002C /* Global Interrupt Enable reg */ | ||
37 | #define XPS2_IPISR_OFFSET 0x00000030 /* Interrupt Status register */ | ||
38 | #define XPS2_IPIER_OFFSET 0x00000038 /* Interrupt Enable register */ | ||
39 | |||
40 | /* Reset Register Bit Definitions */ | ||
41 | #define XPS2_SRST_RESET 0x0000000A /* Software Reset */ | ||
42 | |||
43 | /* Status Register Bit Positions */ | ||
44 | #define XPS2_STATUS_RX_FULL 0x00000001 /* Receive Full */ | ||
45 | #define XPS2_STATUS_TX_FULL 0x00000002 /* Transmit Full */ | ||
46 | |||
47 | /* Bit definitions for ISR/IER registers. Both the registers have the same bit | ||
48 | * definitions and are only defined once. */ | ||
49 | #define XPS2_IPIXR_WDT_TOUT 0x00000001 /* Watchdog Timeout Interrupt */ | ||
50 | #define XPS2_IPIXR_TX_NOACK 0x00000002 /* Transmit No ACK Interrupt */ | ||
51 | #define XPS2_IPIXR_TX_ACK 0x00000004 /* Transmit ACK (Data) Interrupt */ | ||
52 | #define XPS2_IPIXR_RX_OVF 0x00000008 /* Receive Overflow Interrupt */ | ||
53 | #define XPS2_IPIXR_RX_ERR 0x00000010 /* Receive Error Interrupt */ | ||
54 | #define XPS2_IPIXR_RX_FULL 0x00000020 /* Receive Data Interrupt */ | ||
55 | |||
56 | /* Mask for all the Transmit Interrupts */ | ||
57 | #define XPS2_IPIXR_TX_ALL (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_TX_ACK) | ||
58 | |||
59 | /* Mask for all the Receive Interrupts */ | ||
60 | #define XPS2_IPIXR_RX_ALL (XPS2_IPIXR_RX_OVF | XPS2_IPIXR_RX_ERR | \ | ||
61 | XPS2_IPIXR_RX_FULL) | ||
62 | |||
63 | /* Mask for all the Interrupts */ | ||
64 | #define XPS2_IPIXR_ALL (XPS2_IPIXR_TX_ALL | XPS2_IPIXR_RX_ALL | \ | ||
65 | XPS2_IPIXR_WDT_TOUT) | ||
66 | |||
67 | /* Global Interrupt Enable mask */ | ||
68 | #define XPS2_GIER_GIE_MASK 0x80000000 | ||
69 | |||
70 | struct xps2data { | ||
71 | int irq; | ||
72 | u32 phys_addr; | ||
73 | u32 remap_size; | ||
74 | spinlock_t lock; | ||
75 | u8 rxb; /* Rx buffer */ | ||
76 | void __iomem *base_address; /* virt. address of control registers */ | ||
77 | unsigned int dfl; | ||
78 | struct serio serio; /* serio */ | ||
79 | }; | ||
80 | |||
81 | /************************************/ | ||
82 | /* XPS PS/2 data transmission calls */ | ||
83 | /************************************/ | ||
84 | |||
85 | /* | ||
86 | * xps2_recv() will attempt to receive a byte of data from the PS/2 port. | ||
87 | */ | ||
88 | static int xps2_recv(struct xps2data *drvdata, u8 *byte) | ||
89 | { | ||
90 | u32 sr; | ||
91 | int status = -1; | ||
92 | |||
93 | /* If there is data available in the PS/2 receiver, read it */ | ||
94 | sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET); | ||
95 | if (sr & XPS2_STATUS_RX_FULL) { | ||
96 | *byte = in_be32(drvdata->base_address + XPS2_RX_DATA_OFFSET); | ||
97 | status = 0; | ||
98 | } | ||
99 | |||
100 | return status; | ||
101 | } | ||
102 | |||
103 | /*********************/ | ||
104 | /* Interrupt handler */ | ||
105 | /*********************/ | ||
106 | static irqreturn_t xps2_interrupt(int irq, void *dev_id) | ||
107 | { | ||
108 | struct xps2data *drvdata = dev_id; | ||
109 | u32 intr_sr; | ||
110 | u8 c; | ||
111 | int status; | ||
112 | |||
113 | /* Get the PS/2 interrupts and clear them */ | ||
114 | intr_sr = in_be32(drvdata->base_address + XPS2_IPISR_OFFSET); | ||
115 | out_be32(drvdata->base_address + XPS2_IPISR_OFFSET, intr_sr); | ||
116 | |||
117 | /* Check which interrupt is active */ | ||
118 | if (intr_sr & XPS2_IPIXR_RX_OVF) | ||
119 | printk(KERN_WARNING "%s: receive overrun error\n", | ||
120 | drvdata->serio.name); | ||
121 | |||
122 | if (intr_sr & XPS2_IPIXR_RX_ERR) | ||
123 | drvdata->dfl |= SERIO_PARITY; | ||
124 | |||
125 | if (intr_sr & (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_WDT_TOUT)) | ||
126 | drvdata->dfl |= SERIO_TIMEOUT; | ||
127 | |||
128 | if (intr_sr & XPS2_IPIXR_RX_FULL) { | ||
129 | status = xps2_recv(drvdata, &drvdata->rxb); | ||
130 | |||
131 | /* Error, if a byte is not received */ | ||
132 | if (status) { | ||
133 | printk(KERN_ERR | ||
134 | "%s: wrong rcvd byte count (%d)\n", | ||
135 | drvdata->serio.name, status); | ||
136 | } else { | ||
137 | c = drvdata->rxb; | ||
138 | serio_interrupt(&drvdata->serio, c, drvdata->dfl); | ||
139 | drvdata->dfl = 0; | ||
140 | } | ||
141 | } | ||
142 | |||
143 | if (intr_sr & XPS2_IPIXR_TX_ACK) | ||
144 | drvdata->dfl = 0; | ||
145 | |||
146 | return IRQ_HANDLED; | ||
147 | } | ||
148 | |||
149 | /*******************/ | ||
150 | /* serio callbacks */ | ||
151 | /*******************/ | ||
152 | |||
153 | /* | ||
154 | * sxps2_write() sends a byte out through the PS/2 interface. | ||
155 | */ | ||
156 | static int sxps2_write(struct serio *pserio, unsigned char c) | ||
157 | { | ||
158 | struct xps2data *drvdata = pserio->port_data; | ||
159 | unsigned long flags; | ||
160 | u32 sr; | ||
161 | int status = -1; | ||
162 | |||
163 | spin_lock_irqsave(&drvdata->lock, flags); | ||
164 | |||
165 | /* If the PS/2 transmitter is empty send a byte of data */ | ||
166 | sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET); | ||
167 | if (!(sr & XPS2_STATUS_TX_FULL)) { | ||
168 | out_be32(drvdata->base_address + XPS2_TX_DATA_OFFSET, c); | ||
169 | status = 0; | ||
170 | } | ||
171 | |||
172 | spin_unlock_irqrestore(&drvdata->lock, flags); | ||
173 | |||
174 | return status; | ||
175 | } | ||
176 | |||
177 | /* | ||
178 | * sxps2_open() is called when a port is open by the higher layer. | ||
179 | */ | ||
180 | static int sxps2_open(struct serio *pserio) | ||
181 | { | ||
182 | struct xps2data *drvdata = pserio->port_data; | ||
183 | int retval; | ||
184 | |||
185 | retval = request_irq(drvdata->irq, &xps2_interrupt, 0, | ||
186 | DRIVER_NAME, drvdata); | ||
187 | if (retval) { | ||
188 | printk(KERN_ERR | ||
189 | "%s: Couldn't allocate interrupt %d\n", | ||
190 | drvdata->serio.name, drvdata->irq); | ||
191 | return retval; | ||
192 | } | ||
193 | |||
194 | /* start reception by enabling the interrupts */ | ||
195 | out_be32(drvdata->base_address + XPS2_GIER_OFFSET, XPS2_GIER_GIE_MASK); | ||
196 | out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, XPS2_IPIXR_RX_ALL); | ||
197 | (void)xps2_recv(drvdata, &drvdata->rxb); | ||
198 | |||
199 | return 0; /* success */ | ||
200 | } | ||
201 | |||
202 | /* | ||
203 | * sxps2_close() frees the interrupt. | ||
204 | */ | ||
205 | static void sxps2_close(struct serio *pserio) | ||
206 | { | ||
207 | struct xps2data *drvdata = pserio->port_data; | ||
208 | |||
209 | /* Disable the PS2 interrupts */ | ||
210 | out_be32(drvdata->base_address + XPS2_GIER_OFFSET, 0x00); | ||
211 | out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0x00); | ||
212 | free_irq(drvdata->irq, drvdata); | ||
213 | } | ||
214 | |||
215 | /*********************/ | ||
216 | /* Device setup code */ | ||
217 | /*********************/ | ||
218 | |||
219 | static int xps2_setup(struct device *dev, struct resource *regs_res, | ||
220 | struct resource *irq_res) | ||
221 | { | ||
222 | struct xps2data *drvdata; | ||
223 | struct serio *serio; | ||
224 | unsigned long remap_size; | ||
225 | int retval; | ||
226 | |||
227 | if (!dev) | ||
228 | return -EINVAL; | ||
229 | |||
230 | if (!regs_res || !irq_res) { | ||
231 | dev_err(dev, "IO resource(s) not found\n"); | ||
232 | return -EINVAL; | ||
233 | } | ||
234 | |||
235 | drvdata = kzalloc(sizeof(struct xps2data), GFP_KERNEL); | ||
236 | if (!drvdata) { | ||
237 | dev_err(dev, "Couldn't allocate device private record\n"); | ||
238 | return -ENOMEM; | ||
239 | } | ||
240 | |||
241 | dev_set_drvdata(dev, drvdata); | ||
242 | |||
243 | spin_lock_init(&drvdata->lock); | ||
244 | drvdata->irq = irq_res->start; | ||
245 | |||
246 | remap_size = regs_res->end - regs_res->start + 1; | ||
247 | if (!request_mem_region(regs_res->start, remap_size, DRIVER_NAME)) { | ||
248 | dev_err(dev, "Couldn't lock memory region at 0x%08X\n", | ||
249 | (unsigned int)regs_res->start); | ||
250 | retval = -EBUSY; | ||
251 | goto failed1; | ||
252 | } | ||
253 | |||
254 | /* Fill in configuration data and add them to the list */ | ||
255 | drvdata->phys_addr = regs_res->start; | ||
256 | drvdata->remap_size = remap_size; | ||
257 | drvdata->base_address = ioremap(regs_res->start, remap_size); | ||
258 | if (drvdata->base_address == NULL) { | ||
259 | dev_err(dev, "Couldn't ioremap memory at 0x%08X\n", | ||
260 | (unsigned int)regs_res->start); | ||
261 | retval = -EFAULT; | ||
262 | goto failed2; | ||
263 | } | ||
264 | |||
265 | /* Disable all the interrupts, just in case */ | ||
266 | out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0); | ||
267 | |||
268 | /* Reset the PS2 device and abort any current transaction, to make sure | ||
269 | * we have the PS2 in a good state */ | ||
270 | out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); | ||
271 | |||
272 | dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%08X, irq=%d\n", | ||
273 | drvdata->phys_addr, (u32)drvdata->base_address, drvdata->irq); | ||
274 | |||
275 | serio = &drvdata->serio; | ||
276 | serio->id.type = SERIO_8042; | ||
277 | serio->write = sxps2_write; | ||
278 | serio->open = sxps2_open; | ||
279 | serio->close = sxps2_close; | ||
280 | serio->port_data = drvdata; | ||
281 | serio->dev.parent = dev; | ||
282 | snprintf(serio->name, sizeof(serio->name), | ||
283 | "Xilinx XPS PS/2 at %08X", drvdata->phys_addr); | ||
284 | snprintf(serio->phys, sizeof(serio->phys), | ||
285 | "xilinxps2/serio at %08X", drvdata->phys_addr); | ||
286 | serio_register_port(serio); | ||
287 | |||
288 | return 0; /* success */ | ||
289 | |||
290 | failed2: | ||
291 | release_mem_region(regs_res->start, remap_size); | ||
292 | failed1: | ||
293 | kfree(drvdata); | ||
294 | dev_set_drvdata(dev, NULL); | ||
295 | |||
296 | return retval; | ||
297 | } | ||
298 | |||
299 | /***************************/ | ||
300 | /* OF Platform Bus Support */ | ||
301 | /***************************/ | ||
302 | |||
303 | static int __devinit xps2_of_probe(struct of_device *ofdev, const struct | ||
304 | of_device_id * match) | ||
305 | { | ||
306 | struct resource r_irq; /* Interrupt resources */ | ||
307 | struct resource r_mem; /* IO mem resources */ | ||
308 | int rc = 0; | ||
309 | |||
310 | printk(KERN_INFO "Device Tree Probing \'%s\'\n", | ||
311 | ofdev->node->name); | ||
312 | |||
313 | /* Get iospace for the device */ | ||
314 | rc = of_address_to_resource(ofdev->node, 0, &r_mem); | ||
315 | if (rc) { | ||
316 | dev_err(&ofdev->dev, "invalid address\n"); | ||
317 | return rc; | ||
318 | } | ||
319 | |||
320 | /* Get IRQ for the device */ | ||
321 | rc = of_irq_to_resource(ofdev->node, 0, &r_irq); | ||
322 | if (rc == NO_IRQ) { | ||
323 | dev_err(&ofdev->dev, "no IRQ found\n"); | ||
324 | return rc; | ||
325 | } | ||
326 | |||
327 | return xps2_setup(&ofdev->dev, &r_mem, &r_irq); | ||
328 | } | ||
329 | |||
330 | static int __devexit xps2_of_remove(struct of_device *of_dev) | ||
331 | { | ||
332 | struct device *dev = &of_dev->dev; | ||
333 | struct xps2data *drvdata; | ||
334 | |||
335 | if (!dev) | ||
336 | return -EINVAL; | ||
337 | |||
338 | drvdata = dev_get_drvdata(dev); | ||
339 | |||
340 | serio_unregister_port(&drvdata->serio); | ||
341 | iounmap(drvdata->base_address); | ||
342 | release_mem_region(drvdata->phys_addr, drvdata->remap_size); | ||
343 | kfree(drvdata); | ||
344 | |||
345 | dev_set_drvdata(dev, NULL); | ||
346 | |||
347 | return 0; /* success */ | ||
348 | } | ||
349 | |||
350 | /* Match table for of_platform binding */ | ||
351 | static struct of_device_id xps2_of_match[] __devinitdata = { | ||
352 | { .compatible = "xlnx,xps-ps2-1.00.a", }, | ||
353 | { /* end of list */ }, | ||
354 | }; | ||
355 | MODULE_DEVICE_TABLE(of, xps2_of_match); | ||
356 | |||
357 | static struct of_platform_driver xps2_of_driver = { | ||
358 | .name = DRIVER_NAME, | ||
359 | .match_table = xps2_of_match, | ||
360 | .probe = xps2_of_probe, | ||
361 | .remove = __devexit_p(xps2_of_remove), | ||
362 | }; | ||
363 | |||
364 | static int __init xps2_init(void) | ||
365 | { | ||
366 | return of_register_platform_driver(&xps2_of_driver); | ||
367 | } | ||
368 | |||
369 | static void __exit xps2_cleanup(void) | ||
370 | { | ||
371 | of_unregister_platform_driver(&xps2_of_driver); | ||
372 | } | ||
373 | |||
374 | module_init(xps2_init); | ||
375 | module_exit(xps2_cleanup); | ||
376 | |||
377 | MODULE_AUTHOR("Xilinx, Inc."); | ||
378 | MODULE_DESCRIPTION("Xilinx XPS PS/2 driver"); | ||
379 | MODULE_LICENSE("GPL"); | ||
380 | |||
diff --git a/drivers/input/tablet/acecad.c b/drivers/input/tablet/acecad.c index b973d0ef6d16..570e0e83ac46 100644 --- a/drivers/input/tablet/acecad.c +++ b/drivers/input/tablet/acecad.c | |||
@@ -73,10 +73,10 @@ static void usb_acecad_irq(struct urb *urb) | |||
73 | case -ENOENT: | 73 | case -ENOENT: |
74 | case -ESHUTDOWN: | 74 | case -ESHUTDOWN: |
75 | /* this urb is terminated, clean up */ | 75 | /* this urb is terminated, clean up */ |
76 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 76 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
77 | return; | 77 | return; |
78 | default: | 78 | default: |
79 | dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); | 79 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
80 | goto resubmit; | 80 | goto resubmit; |
81 | } | 81 | } |
82 | 82 | ||
diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c index 55c1134d6137..8f037a1d44a6 100644 --- a/drivers/input/tablet/aiptek.c +++ b/drivers/input/tablet/aiptek.c | |||
@@ -449,12 +449,12 @@ static void aiptek_irq(struct urb *urb) | |||
449 | case -ESHUTDOWN: | 449 | case -ESHUTDOWN: |
450 | /* This urb is terminated, clean up */ | 450 | /* This urb is terminated, clean up */ |
451 | dbg("%s - urb shutting down with status: %d", | 451 | dbg("%s - urb shutting down with status: %d", |
452 | __FUNCTION__, urb->status); | 452 | __func__, urb->status); |
453 | return; | 453 | return; |
454 | 454 | ||
455 | default: | 455 | default: |
456 | dbg("%s - nonzero urb status received: %d", | 456 | dbg("%s - nonzero urb status received: %d", |
457 | __FUNCTION__, urb->status); | 457 | __func__, urb->status); |
458 | goto exit; | 458 | goto exit; |
459 | } | 459 | } |
460 | 460 | ||
@@ -813,7 +813,7 @@ exit: | |||
813 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 813 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
814 | if (retval != 0) { | 814 | if (retval != 0) { |
815 | err("%s - usb_submit_urb failed with result %d", | 815 | err("%s - usb_submit_urb failed with result %d", |
816 | __FUNCTION__, retval); | 816 | __func__, retval); |
817 | } | 817 | } |
818 | } | 818 | } |
819 | 819 | ||
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index 1e748e46d12e..b9b7a98bc5a5 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c | |||
@@ -863,7 +863,7 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||
863 | gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL); | 863 | gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL); |
864 | if (!gtco->urbinfo) { | 864 | if (!gtco->urbinfo) { |
865 | err("Failed to allocate URB"); | 865 | err("Failed to allocate URB"); |
866 | return -ENOMEM; | 866 | error = -ENOMEM; |
867 | goto err_free_buf; | 867 | goto err_free_buf; |
868 | } | 868 | } |
869 | 869 | ||
diff --git a/drivers/input/tablet/kbtab.c b/drivers/input/tablet/kbtab.c index f23f5a97fb38..d89112fa6e6b 100644 --- a/drivers/input/tablet/kbtab.c +++ b/drivers/input/tablet/kbtab.c | |||
@@ -56,10 +56,10 @@ static void kbtab_irq(struct urb *urb) | |||
56 | case -ENOENT: | 56 | case -ENOENT: |
57 | case -ESHUTDOWN: | 57 | case -ESHUTDOWN: |
58 | /* this urb is terminated, clean up */ | 58 | /* this urb is terminated, clean up */ |
59 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 59 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
60 | return; | 60 | return; |
61 | default: | 61 | default: |
62 | dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); | 62 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
63 | goto exit; | 63 | goto exit; |
64 | } | 64 | } |
65 | 65 | ||
@@ -88,7 +88,7 @@ static void kbtab_irq(struct urb *urb) | |||
88 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 88 | retval = usb_submit_urb (urb, GFP_ATOMIC); |
89 | if (retval) | 89 | if (retval) |
90 | err ("%s - usb_submit_urb failed with result %d", | 90 | err ("%s - usb_submit_urb failed with result %d", |
91 | __FUNCTION__, retval); | 91 | __func__, retval); |
92 | } | 92 | } |
93 | 93 | ||
94 | static struct usb_device_id kbtab_ids[] = { | 94 | static struct usb_device_id kbtab_ids[] = { |
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index 706619d06f71..ca62ec639f8f 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
@@ -105,7 +105,7 @@ struct wacom { | |||
105 | struct urb *irq; | 105 | struct urb *irq; |
106 | struct wacom_wac * wacom_wac; | 106 | struct wacom_wac * wacom_wac; |
107 | struct mutex lock; | 107 | struct mutex lock; |
108 | int open:1; | 108 | unsigned int open:1; |
109 | char phys[32]; | 109 | char phys[32]; |
110 | }; | 110 | }; |
111 | 111 | ||
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 71cc0c140790..5fbc463baf5a 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
@@ -56,10 +56,10 @@ static void wacom_sys_irq(struct urb *urb) | |||
56 | case -ENOENT: | 56 | case -ENOENT: |
57 | case -ESHUTDOWN: | 57 | case -ESHUTDOWN: |
58 | /* this urb is terminated, clean up */ | 58 | /* this urb is terminated, clean up */ |
59 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 59 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
60 | return; | 60 | return; |
61 | default: | 61 | default: |
62 | dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); | 62 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
63 | goto exit; | 63 | goto exit; |
64 | } | 64 | } |
65 | 65 | ||
@@ -74,7 +74,7 @@ static void wacom_sys_irq(struct urb *urb) | |||
74 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 74 | retval = usb_submit_urb (urb, GFP_ATOMIC); |
75 | if (retval) | 75 | if (retval) |
76 | err ("%s - usb_submit_urb failed with result %d", | 76 | err ("%s - usb_submit_urb failed with result %d", |
77 | __FUNCTION__, retval); | 77 | __func__, retval); |
78 | } | 78 | } |
79 | 79 | ||
80 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) | 80 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 192513e1f04c..bf3d9a8b2c1b 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -56,7 +56,7 @@ static int wacom_penpartner_irq(struct wacom_wac *wacom, void *wcombo) | |||
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 | unsigned char *data = wacom->data; | 58 | unsigned char *data = wacom->data; |
59 | int prox, id, pressure; | 59 | int prox, pressure; |
60 | 60 | ||
61 | if (data[0] != 2) { | 61 | if (data[0] != 2) { |
62 | dbg("wacom_pl_irq: received unknown report #%d", data[0]); | 62 | dbg("wacom_pl_irq: received unknown report #%d", data[0]); |
@@ -65,7 +65,7 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) | |||
65 | 65 | ||
66 | prox = data[1] & 0x40; | 66 | prox = data[1] & 0x40; |
67 | 67 | ||
68 | id = ERASER_DEVICE_ID; | 68 | wacom->id[0] = ERASER_DEVICE_ID; |
69 | if (prox) { | 69 | if (prox) { |
70 | 70 | ||
71 | pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); | 71 | pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); |
@@ -99,10 +99,10 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) | |||
99 | if (wacom->tool[1] != BTN_TOOL_RUBBER) { | 99 | if (wacom->tool[1] != BTN_TOOL_RUBBER) { |
100 | /* Unknown tool selected default to pen tool */ | 100 | /* Unknown tool selected default to pen tool */ |
101 | wacom->tool[1] = BTN_TOOL_PEN; | 101 | wacom->tool[1] = BTN_TOOL_PEN; |
102 | id = STYLUS_DEVICE_ID; | 102 | wacom->id[0] = STYLUS_DEVICE_ID; |
103 | } | 103 | } |
104 | wacom_report_key(wcombo, wacom->tool[1], prox); /* report in proximity for tool */ | 104 | wacom_report_key(wcombo, wacom->tool[1], prox); /* report in proximity for tool */ |
105 | wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ | 105 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ |
106 | wacom_report_abs(wcombo, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); | 106 | wacom_report_abs(wcombo, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); |
107 | wacom_report_abs(wcombo, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); | 107 | wacom_report_abs(wcombo, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); |
108 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | 108 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); |
@@ -127,7 +127,6 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) | |||
127 | static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) | 127 | static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) |
128 | { | 128 | { |
129 | unsigned char *data = wacom->data; | 129 | unsigned char *data = wacom->data; |
130 | int id; | ||
131 | 130 | ||
132 | if (data[0] != 2) { | 131 | if (data[0] != 2) { |
133 | printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]); | 132 | printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]); |
@@ -137,13 +136,13 @@ static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) | |||
137 | if (data[1] & 0x04) { | 136 | if (data[1] & 0x04) { |
138 | wacom_report_key(wcombo, BTN_TOOL_RUBBER, data[1] & 0x20); | 137 | wacom_report_key(wcombo, BTN_TOOL_RUBBER, data[1] & 0x20); |
139 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x08); | 138 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x08); |
140 | id = ERASER_DEVICE_ID; | 139 | wacom->id[0] = ERASER_DEVICE_ID; |
141 | } else { | 140 | } else { |
142 | wacom_report_key(wcombo, BTN_TOOL_PEN, data[1] & 0x20); | 141 | wacom_report_key(wcombo, BTN_TOOL_PEN, data[1] & 0x20); |
143 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); | 142 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); |
144 | id = STYLUS_DEVICE_ID; | 143 | wacom->id[0] = STYLUS_DEVICE_ID; |
145 | } | 144 | } |
146 | wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ | 145 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ |
147 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | 146 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); |
148 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | 147 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); |
149 | wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); | 148 | wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); |
@@ -155,27 +154,26 @@ static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) | |||
155 | static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | 154 | static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) |
156 | { | 155 | { |
157 | unsigned char *data = wacom->data; | 156 | unsigned char *data = wacom->data; |
158 | int x, y, id, rw; | 157 | int x, y, rw; |
159 | 158 | ||
160 | if (data[0] != 2) { | 159 | if (data[0] != 2) { |
161 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); | 160 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); |
162 | return 0; | 161 | return 0; |
163 | } | 162 | } |
164 | 163 | ||
165 | id = STYLUS_DEVICE_ID; | 164 | if (data[1] & 0x80) { |
166 | if ((data[1] & 0x80) && ((data[1] & 0x07) || data[2] || data[3] || data[4] | ||
167 | || data[5] || data[6] || (data[7] & 0x07))) { | ||
168 | /* in prox and not a pad data */ | 165 | /* in prox and not a pad data */ |
169 | 166 | ||
170 | switch ((data[1] >> 5) & 3) { | 167 | switch ((data[1] >> 5) & 3) { |
171 | 168 | ||
172 | case 0: /* Pen */ | 169 | case 0: /* Pen */ |
173 | wacom->tool[0] = BTN_TOOL_PEN; | 170 | wacom->tool[0] = BTN_TOOL_PEN; |
171 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
174 | break; | 172 | break; |
175 | 173 | ||
176 | case 1: /* Rubber */ | 174 | case 1: /* Rubber */ |
177 | wacom->tool[0] = BTN_TOOL_RUBBER; | 175 | wacom->tool[0] = BTN_TOOL_RUBBER; |
178 | id = ERASER_DEVICE_ID; | 176 | wacom->id[0] = ERASER_DEVICE_ID; |
179 | break; | 177 | break; |
180 | 178 | ||
181 | case 2: /* Mouse with wheel */ | 179 | case 2: /* Mouse with wheel */ |
@@ -190,7 +188,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
190 | 188 | ||
191 | case 3: /* Mouse without wheel */ | 189 | case 3: /* Mouse without wheel */ |
192 | wacom->tool[0] = BTN_TOOL_MOUSE; | 190 | wacom->tool[0] = BTN_TOOL_MOUSE; |
193 | id = CURSOR_DEVICE_ID; | 191 | wacom->id[0] = CURSOR_DEVICE_ID; |
194 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); | 192 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); |
195 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); | 193 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); |
196 | if (wacom->features->type == WACOM_G4 || | 194 | if (wacom->features->type == WACOM_G4 || |
@@ -210,9 +208,9 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
210 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | 208 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); |
211 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); | 209 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); |
212 | } | 210 | } |
213 | wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ | 211 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ |
214 | wacom_report_key(wcombo, wacom->tool[0], 1); | 212 | wacom_report_key(wcombo, wacom->tool[0], 1); |
215 | } else if (!(data[1] & 0x90)) { | 213 | } else if (wacom->id[0]) { |
216 | wacom_report_abs(wcombo, ABS_X, 0); | 214 | wacom_report_abs(wcombo, ABS_X, 0); |
217 | wacom_report_abs(wcombo, ABS_Y, 0); | 215 | wacom_report_abs(wcombo, ABS_Y, 0); |
218 | if (wacom->tool[0] == BTN_TOOL_MOUSE) { | 216 | if (wacom->tool[0] == BTN_TOOL_MOUSE) { |
@@ -225,6 +223,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
225 | wacom_report_key(wcombo, BTN_STYLUS, 0); | 223 | wacom_report_key(wcombo, BTN_STYLUS, 0); |
226 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | 224 | wacom_report_key(wcombo, BTN_STYLUS2, 0); |
227 | } | 225 | } |
226 | wacom->id[0] = 0; | ||
228 | wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */ | 227 | wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */ |
229 | wacom_report_key(wcombo, wacom->tool[0], 0); | 228 | wacom_report_key(wcombo, wacom->tool[0], 0); |
230 | } | 229 | } |
@@ -234,13 +233,13 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
234 | case WACOM_G4: | 233 | case WACOM_G4: |
235 | if (data[7] & 0xf8) { | 234 | if (data[7] & 0xf8) { |
236 | wacom_input_sync(wcombo); /* sync last event */ | 235 | wacom_input_sync(wcombo); /* sync last event */ |
237 | wacom->id[1] = 1; | 236 | wacom->id[1] = PAD_DEVICE_ID; |
238 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); | 237 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); |
239 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); | 238 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); |
240 | rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); | 239 | rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); |
241 | wacom_report_rel(wcombo, REL_WHEEL, rw); | 240 | wacom_report_rel(wcombo, REL_WHEEL, rw); |
242 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); | 241 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); |
243 | wacom_report_abs(wcombo, ABS_MISC, PAD_DEVICE_ID); | 242 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); |
244 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | 243 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); |
245 | } else if (wacom->id[1]) { | 244 | } else if (wacom->id[1]) { |
246 | wacom_input_sync(wcombo); /* sync last event */ | 245 | wacom_input_sync(wcombo); /* sync last event */ |
@@ -255,14 +254,14 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
255 | case WACOM_MO: | 254 | case WACOM_MO: |
256 | if ((data[7] & 0xf8) || (data[8] & 0xff)) { | 255 | if ((data[7] & 0xf8) || (data[8] & 0xff)) { |
257 | wacom_input_sync(wcombo); /* sync last event */ | 256 | wacom_input_sync(wcombo); /* sync last event */ |
258 | wacom->id[1] = 1; | 257 | wacom->id[1] = PAD_DEVICE_ID; |
259 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); | 258 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); |
260 | wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); | 259 | wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); |
261 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x10)); | 260 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x10)); |
262 | wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); | 261 | wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); |
263 | wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); | 262 | wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); |
264 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); | 263 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); |
265 | wacom_report_abs(wcombo, ABS_MISC, PAD_DEVICE_ID); | 264 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); |
266 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | 265 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); |
267 | } else if (wacom->id[1]) { | 266 | } else if (wacom->id[1]) { |
268 | wacom_input_sync(wcombo); /* sync last event */ | 267 | wacom_input_sync(wcombo); /* sync last event */ |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 565ec711c2ee..e57366521572 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -103,6 +103,18 @@ config TOUCHSCREEN_MTOUCH | |||
103 | To compile this driver as a module, choose M here: the | 103 | To compile this driver as a module, choose M here: the |
104 | module will be called mtouch. | 104 | module will be called mtouch. |
105 | 105 | ||
106 | config TOUCHSCREEN_INEXIO | ||
107 | tristate "iNexio serial touchscreens" | ||
108 | select SERIO | ||
109 | help | ||
110 | Say Y here if you have an iNexio serial touchscreen connected to | ||
111 | your system. | ||
112 | |||
113 | If unsure, say N. | ||
114 | |||
115 | To compile this driver as a module, choose M here: the | ||
116 | module will be called inexio. | ||
117 | |||
106 | config TOUCHSCREEN_MK712 | 118 | config TOUCHSCREEN_MK712 |
107 | tristate "ICS MicroClock MK712 touchscreen" | 119 | tristate "ICS MicroClock MK712 touchscreen" |
108 | help | 120 | help |
@@ -134,6 +146,18 @@ config TOUCHSCREEN_HP7XX | |||
134 | To compile this driver as a module, choose M here: the | 146 | To compile this driver as a module, choose M here: the |
135 | module will be called jornada720_ts. | 147 | module will be called jornada720_ts. |
136 | 148 | ||
149 | config TOUCHSCREEN_HTCPEN | ||
150 | tristate "HTC Shift X9500 touchscreen" | ||
151 | depends on ISA | ||
152 | help | ||
153 | Say Y here if you have an HTC Shift UMPC also known as HTC X9500 | ||
154 | Clio / Shangrila and want to support the built-in touchscreen. | ||
155 | |||
156 | If unsure, say N. | ||
157 | |||
158 | To compile this driver as a module, choose M here: the | ||
159 | module will be called htcpen. | ||
160 | |||
137 | config TOUCHSCREEN_PENMOUNT | 161 | config TOUCHSCREEN_PENMOUNT |
138 | tristate "Penmount serial touchscreen" | 162 | tristate "Penmount serial touchscreen" |
139 | select SERIO | 163 | select SERIO |
@@ -146,6 +170,17 @@ config TOUCHSCREEN_PENMOUNT | |||
146 | To compile this driver as a module, choose M here: the | 170 | To compile this driver as a module, choose M here: the |
147 | module will be called penmount. | 171 | module will be called penmount. |
148 | 172 | ||
173 | config TOUCHSCREEN_MIGOR | ||
174 | tristate "Renesas MIGO-R touchscreen" | ||
175 | depends on SH_MIGOR && I2C | ||
176 | help | ||
177 | Say Y here to enable MIGO-R touchscreen support. | ||
178 | |||
179 | If unsure, say N. | ||
180 | |||
181 | To compile this driver as a module, choose M here: the | ||
182 | module will be called migor_ts. | ||
183 | |||
149 | config TOUCHSCREEN_TOUCHRIGHT | 184 | config TOUCHSCREEN_TOUCHRIGHT |
150 | tristate "Touchright serial touchscreen" | 185 | tristate "Touchright serial touchscreen" |
151 | select SERIO | 186 | select SERIO |
@@ -316,4 +351,15 @@ config TOUCHSCREEN_USB_GOTOP | |||
316 | bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EMBEDDED | 351 | bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EMBEDDED |
317 | depends on TOUCHSCREEN_USB_COMPOSITE | 352 | depends on TOUCHSCREEN_USB_COMPOSITE |
318 | 353 | ||
354 | config TOUCHSCREEN_TOUCHIT213 | ||
355 | tristate "Sahara TouchIT-213 touchscreen" | ||
356 | select SERIO | ||
357 | help | ||
358 | Say Y here if you have a Sahara TouchIT-213 Tablet PC. | ||
359 | |||
360 | If unsure, say N. | ||
361 | |||
362 | To compile this driver as a module, choose M here: the | ||
363 | module will be called touchit213. | ||
364 | |||
319 | endif | 365 | endif |
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 3c096d75651d..39a804cd80f1 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile | |||
@@ -12,12 +12,16 @@ obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o | |||
12 | obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o | 12 | obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o |
13 | obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o | 13 | obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o |
14 | obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o | 14 | obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o |
15 | obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o | ||
16 | obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o | ||
15 | obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o | 17 | obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o |
16 | obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o | 18 | obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o |
17 | obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o | 19 | obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o |
18 | obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o | 20 | obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o |
21 | obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o | ||
19 | obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o | 22 | obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o |
20 | obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o | 23 | obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o |
24 | obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o | ||
21 | obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o | 25 | obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o |
22 | obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o | 26 | obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o |
23 | obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o | 27 | obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o |
diff --git a/drivers/input/touchscreen/gunze.c b/drivers/input/touchscreen/gunze.c index a48a15868c4a..a54f90e02ab6 100644 --- a/drivers/input/touchscreen/gunze.c +++ b/drivers/input/touchscreen/gunze.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: gunze.c,v 1.12 2001/09/25 10:12:07 vojtech Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2000-2001 Vojtech Pavlik | 2 | * Copyright (c) 2000-2001 Vojtech Pavlik |
5 | */ | 3 | */ |
6 | 4 | ||
diff --git a/drivers/input/touchscreen/h3600_ts_input.c b/drivers/input/touchscreen/h3600_ts_input.c index 28ae15ed12c5..4f86081dc7fc 100644 --- a/drivers/input/touchscreen/h3600_ts_input.c +++ b/drivers/input/touchscreen/h3600_ts_input.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: h3600_ts_input.c,v 1.4 2002/01/23 06:39:37 jsimmons Exp $ | ||
3 | * | ||
4 | * Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com | 2 | * Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com |
5 | * | 3 | * |
6 | * Sponsored by Transvirtual Technology. | 4 | * Sponsored by Transvirtual Technology. |
diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c new file mode 100644 index 000000000000..62811de6f18f --- /dev/null +++ b/drivers/input/touchscreen/htcpen.c | |||
@@ -0,0 +1,255 @@ | |||
1 | /* | ||
2 | * HTC Shift touchscreen driver | ||
3 | * | ||
4 | * Copyright (C) 2008 Pau Oliva Fora <pof@eslack.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/errno.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/input.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/irq.h> | ||
19 | #include <linux/isa.h> | ||
20 | #include <linux/ioport.h> | ||
21 | #include <linux/dmi.h> | ||
22 | |||
23 | MODULE_AUTHOR("Pau Oliva Fora <pau@eslack.org>"); | ||
24 | MODULE_DESCRIPTION("HTC Shift touchscreen driver"); | ||
25 | MODULE_LICENSE("GPL"); | ||
26 | |||
27 | #define HTCPEN_PORT_IRQ_CLEAR 0x068 | ||
28 | #define HTCPEN_PORT_INIT 0x06c | ||
29 | #define HTCPEN_PORT_INDEX 0x0250 | ||
30 | #define HTCPEN_PORT_DATA 0x0251 | ||
31 | #define HTCPEN_IRQ 3 | ||
32 | |||
33 | #define DEVICE_ENABLE 0xa2 | ||
34 | #define DEVICE_DISABLE 0xa3 | ||
35 | |||
36 | #define X_INDEX 3 | ||
37 | #define Y_INDEX 5 | ||
38 | #define TOUCH_INDEX 0xb | ||
39 | #define LSB_XY_INDEX 0xc | ||
40 | #define X_AXIS_MAX 2040 | ||
41 | #define Y_AXIS_MAX 2040 | ||
42 | |||
43 | static int invert_x; | ||
44 | module_param(invert_x, bool, 0644); | ||
45 | MODULE_PARM_DESC(invert_x, "If set, X axis is inverted"); | ||
46 | static int invert_y; | ||
47 | module_param(invert_y, bool, 0644); | ||
48 | MODULE_PARM_DESC(invert_y, "If set, Y axis is inverted"); | ||
49 | |||
50 | static struct pnp_device_id pnp_ids[] = { | ||
51 | { .id = "PNP0cc0" }, | ||
52 | { .id = "" } | ||
53 | }; | ||
54 | MODULE_DEVICE_TABLE(pnp, pnp_ids); | ||
55 | |||
56 | static irqreturn_t htcpen_interrupt(int irq, void *handle) | ||
57 | { | ||
58 | struct input_dev *htcpen_dev = handle; | ||
59 | unsigned short x, y, xy; | ||
60 | |||
61 | /* 0 = press; 1 = release */ | ||
62 | outb_p(TOUCH_INDEX, HTCPEN_PORT_INDEX); | ||
63 | |||
64 | if (inb_p(HTCPEN_PORT_DATA)) { | ||
65 | input_report_key(htcpen_dev, BTN_TOUCH, 0); | ||
66 | } else { | ||
67 | outb_p(X_INDEX, HTCPEN_PORT_INDEX); | ||
68 | x = inb_p(HTCPEN_PORT_DATA); | ||
69 | |||
70 | outb_p(Y_INDEX, HTCPEN_PORT_INDEX); | ||
71 | y = inb_p(HTCPEN_PORT_DATA); | ||
72 | |||
73 | outb_p(LSB_XY_INDEX, HTCPEN_PORT_INDEX); | ||
74 | xy = inb_p(HTCPEN_PORT_DATA); | ||
75 | |||
76 | /* get high resolution value of X and Y using LSB */ | ||
77 | x = X_AXIS_MAX - ((x * 8) + ((xy >> 4) & 0xf)); | ||
78 | y = (y * 8) + (xy & 0xf); | ||
79 | if (invert_x) | ||
80 | x = X_AXIS_MAX - x; | ||
81 | if (invert_y) | ||
82 | y = Y_AXIS_MAX - y; | ||
83 | |||
84 | if (x != X_AXIS_MAX && x != 0) { | ||
85 | input_report_key(htcpen_dev, BTN_TOUCH, 1); | ||
86 | input_report_abs(htcpen_dev, ABS_X, x); | ||
87 | input_report_abs(htcpen_dev, ABS_Y, y); | ||
88 | } | ||
89 | } | ||
90 | |||
91 | input_sync(htcpen_dev); | ||
92 | |||
93 | inb_p(HTCPEN_PORT_IRQ_CLEAR); | ||
94 | |||
95 | return IRQ_HANDLED; | ||
96 | } | ||
97 | |||
98 | static int htcpen_open(struct input_dev *dev) | ||
99 | { | ||
100 | outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT); | ||
101 | |||
102 | return 0; | ||
103 | } | ||
104 | |||
105 | static void htcpen_close(struct input_dev *dev) | ||
106 | { | ||
107 | outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT); | ||
108 | synchronize_irq(HTCPEN_IRQ); | ||
109 | } | ||
110 | |||
111 | static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id) | ||
112 | { | ||
113 | struct input_dev *htcpen_dev; | ||
114 | int err = -EBUSY; | ||
115 | |||
116 | if (!request_region(HTCPEN_PORT_IRQ_CLEAR, 1, "htcpen")) { | ||
117 | printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", | ||
118 | HTCPEN_PORT_IRQ_CLEAR); | ||
119 | goto request_region1_failed; | ||
120 | } | ||
121 | |||
122 | if (!request_region(HTCPEN_PORT_INIT, 1, "htcpen")) { | ||
123 | printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", | ||
124 | HTCPEN_PORT_INIT); | ||
125 | goto request_region2_failed; | ||
126 | } | ||
127 | |||
128 | if (!request_region(HTCPEN_PORT_INDEX, 2, "htcpen")) { | ||
129 | printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", | ||
130 | HTCPEN_PORT_INDEX); | ||
131 | goto request_region3_failed; | ||
132 | } | ||
133 | |||
134 | htcpen_dev = input_allocate_device(); | ||
135 | if (!htcpen_dev) { | ||
136 | printk(KERN_ERR "htcpen: can't allocate device\n"); | ||
137 | err = -ENOMEM; | ||
138 | goto input_alloc_failed; | ||
139 | } | ||
140 | |||
141 | htcpen_dev->name = "HTC Shift EC TouchScreen"; | ||
142 | htcpen_dev->id.bustype = BUS_ISA; | ||
143 | |||
144 | htcpen_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); | ||
145 | htcpen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); | ||
146 | input_set_abs_params(htcpen_dev, ABS_X, 0, X_AXIS_MAX, 0, 0); | ||
147 | input_set_abs_params(htcpen_dev, ABS_Y, 0, Y_AXIS_MAX, 0, 0); | ||
148 | |||
149 | htcpen_dev->open = htcpen_open; | ||
150 | htcpen_dev->close = htcpen_close; | ||
151 | |||
152 | err = request_irq(HTCPEN_IRQ, htcpen_interrupt, 0, "htcpen", | ||
153 | htcpen_dev); | ||
154 | if (err) { | ||
155 | printk(KERN_ERR "htcpen: irq busy\n"); | ||
156 | goto request_irq_failed; | ||
157 | } | ||
158 | |||
159 | inb_p(HTCPEN_PORT_IRQ_CLEAR); | ||
160 | |||
161 | err = input_register_device(htcpen_dev); | ||
162 | if (err) | ||
163 | goto input_register_failed; | ||
164 | |||
165 | dev_set_drvdata(dev, htcpen_dev); | ||
166 | |||
167 | return 0; | ||
168 | |||
169 | input_register_failed: | ||
170 | free_irq(HTCPEN_IRQ, htcpen_dev); | ||
171 | request_irq_failed: | ||
172 | input_free_device(htcpen_dev); | ||
173 | input_alloc_failed: | ||
174 | release_region(HTCPEN_PORT_INDEX, 2); | ||
175 | request_region3_failed: | ||
176 | release_region(HTCPEN_PORT_INIT, 1); | ||
177 | request_region2_failed: | ||
178 | release_region(HTCPEN_PORT_IRQ_CLEAR, 1); | ||
179 | request_region1_failed: | ||
180 | return err; | ||
181 | } | ||
182 | |||
183 | static int __devexit htcpen_isa_remove(struct device *dev, unsigned int id) | ||
184 | { | ||
185 | struct input_dev *htcpen_dev = dev_get_drvdata(dev); | ||
186 | |||
187 | input_unregister_device(htcpen_dev); | ||
188 | |||
189 | free_irq(HTCPEN_IRQ, htcpen_dev); | ||
190 | |||
191 | release_region(HTCPEN_PORT_INDEX, 2); | ||
192 | release_region(HTCPEN_PORT_INIT, 1); | ||
193 | release_region(HTCPEN_PORT_IRQ_CLEAR, 1); | ||
194 | |||
195 | dev_set_drvdata(dev, NULL); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | #ifdef CONFIG_PM | ||
201 | static int htcpen_isa_suspend(struct device *dev, unsigned int n, | ||
202 | pm_message_t state) | ||
203 | { | ||
204 | outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT); | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | static int htcpen_isa_resume(struct device *dev, unsigned int n) | ||
210 | { | ||
211 | outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT); | ||
212 | |||
213 | return 0; | ||
214 | } | ||
215 | #endif | ||
216 | |||
217 | static struct isa_driver htcpen_isa_driver = { | ||
218 | .probe = htcpen_isa_probe, | ||
219 | .remove = __devexit_p(htcpen_isa_remove), | ||
220 | #ifdef CONFIG_PM | ||
221 | .suspend = htcpen_isa_suspend, | ||
222 | .resume = htcpen_isa_resume, | ||
223 | #endif | ||
224 | .driver = { | ||
225 | .owner = THIS_MODULE, | ||
226 | .name = "htcpen", | ||
227 | } | ||
228 | }; | ||
229 | |||
230 | static struct dmi_system_id __initdata htcshift_dmi_table[] = { | ||
231 | { | ||
232 | .ident = "Shift", | ||
233 | .matches = { | ||
234 | DMI_MATCH(DMI_SYS_VENDOR, "High Tech Computer Corp"), | ||
235 | DMI_MATCH(DMI_PRODUCT_NAME, "Shift"), | ||
236 | }, | ||
237 | }, | ||
238 | { } | ||
239 | }; | ||
240 | |||
241 | static int __init htcpen_isa_init(void) | ||
242 | { | ||
243 | if (!dmi_check_system(htcshift_dmi_table)) | ||
244 | return -ENODEV; | ||
245 | |||
246 | return isa_register_driver(&htcpen_isa_driver, 1); | ||
247 | } | ||
248 | |||
249 | static void __exit htcpen_isa_exit(void) | ||
250 | { | ||
251 | isa_unregister_driver(&htcpen_isa_driver); | ||
252 | } | ||
253 | |||
254 | module_init(htcpen_isa_init); | ||
255 | module_exit(htcpen_isa_exit); | ||
diff --git a/drivers/input/touchscreen/inexio.c b/drivers/input/touchscreen/inexio.c new file mode 100644 index 000000000000..192ade0a0fb9 --- /dev/null +++ b/drivers/input/touchscreen/inexio.c | |||
@@ -0,0 +1,207 @@ | |||
1 | /* | ||
2 | * iNexio serial touchscreen driver | ||
3 | * | ||
4 | * Copyright (c) 2008 Richard Lemon | ||
5 | * Based on the mtouch driver (c) Vojtech Pavlik and Dan Streetman | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | /* | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License version 2 as published by | ||
12 | * the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | /* | ||
16 | * 2008/06/19 Richard Lemon <richard@codelemon.com> | ||
17 | * Copied mtouch.c and edited for iNexio protocol | ||
18 | */ | ||
19 | |||
20 | #include <linux/errno.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <linux/serio.h> | ||
26 | #include <linux/init.h> | ||
27 | |||
28 | #define DRIVER_DESC "iNexio serial touchscreen driver" | ||
29 | |||
30 | MODULE_AUTHOR("Richard Lemon <richard@codelemon.com>"); | ||
31 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
32 | MODULE_LICENSE("GPL"); | ||
33 | |||
34 | /* | ||
35 | * Definitions & global arrays. | ||
36 | */ | ||
37 | |||
38 | #define INEXIO_FORMAT_TOUCH_BIT 0x01 | ||
39 | #define INEXIO_FORMAT_LENGTH 5 | ||
40 | #define INEXIO_RESPONSE_BEGIN_BYTE 0x80 | ||
41 | |||
42 | /* todo: check specs for max length of all responses */ | ||
43 | #define INEXIO_MAX_LENGTH 16 | ||
44 | |||
45 | #define INEXIO_MIN_XC 0 | ||
46 | #define INEXIO_MAX_XC 0x3fff | ||
47 | #define INEXIO_MIN_YC 0 | ||
48 | #define INEXIO_MAX_YC 0x3fff | ||
49 | |||
50 | #define INEXIO_GET_XC(data) (((data[1])<<7) | data[2]) | ||
51 | #define INEXIO_GET_YC(data) (((data[3])<<7) | data[4]) | ||
52 | #define INEXIO_GET_TOUCHED(data) (INEXIO_FORMAT_TOUCH_BIT & data[0]) | ||
53 | |||
54 | /* | ||
55 | * Per-touchscreen data. | ||
56 | */ | ||
57 | |||
58 | struct inexio { | ||
59 | struct input_dev *dev; | ||
60 | struct serio *serio; | ||
61 | int idx; | ||
62 | unsigned char data[INEXIO_MAX_LENGTH]; | ||
63 | char phys[32]; | ||
64 | }; | ||
65 | |||
66 | static void inexio_process_data(struct inexio *pinexio) | ||
67 | { | ||
68 | struct input_dev *dev = pinexio->dev; | ||
69 | |||
70 | if (INEXIO_FORMAT_LENGTH == ++pinexio->idx) { | ||
71 | input_report_abs(dev, ABS_X, INEXIO_GET_XC(pinexio->data)); | ||
72 | input_report_abs(dev, ABS_Y, INEXIO_GET_YC(pinexio->data)); | ||
73 | input_report_key(dev, BTN_TOUCH, INEXIO_GET_TOUCHED(pinexio->data)); | ||
74 | input_sync(dev); | ||
75 | |||
76 | pinexio->idx = 0; | ||
77 | } | ||
78 | } | ||
79 | |||
80 | static irqreturn_t inexio_interrupt(struct serio *serio, | ||
81 | unsigned char data, unsigned int flags) | ||
82 | { | ||
83 | struct inexio* pinexio = serio_get_drvdata(serio); | ||
84 | |||
85 | pinexio->data[pinexio->idx] = data; | ||
86 | |||
87 | if (INEXIO_RESPONSE_BEGIN_BYTE&pinexio->data[0]) | ||
88 | inexio_process_data(pinexio); | ||
89 | else | ||
90 | printk(KERN_DEBUG "inexio.c: unknown/unsynchronized data from device, byte %x\n",pinexio->data[0]); | ||
91 | |||
92 | return IRQ_HANDLED; | ||
93 | } | ||
94 | |||
95 | /* | ||
96 | * inexio_disconnect() is the opposite of inexio_connect() | ||
97 | */ | ||
98 | |||
99 | static void inexio_disconnect(struct serio *serio) | ||
100 | { | ||
101 | struct inexio* pinexio = serio_get_drvdata(serio); | ||
102 | |||
103 | input_get_device(pinexio->dev); | ||
104 | input_unregister_device(pinexio->dev); | ||
105 | serio_close(serio); | ||
106 | serio_set_drvdata(serio, NULL); | ||
107 | input_put_device(pinexio->dev); | ||
108 | kfree(pinexio); | ||
109 | } | ||
110 | |||
111 | /* | ||
112 | * inexio_connect() is the routine that is called when someone adds a | ||
113 | * new serio device that supports iNexio protocol and registers it as | ||
114 | * an input device. This is usually accomplished using inputattach. | ||
115 | */ | ||
116 | |||
117 | static int inexio_connect(struct serio *serio, struct serio_driver *drv) | ||
118 | { | ||
119 | struct inexio *pinexio; | ||
120 | struct input_dev *input_dev; | ||
121 | int err; | ||
122 | |||
123 | pinexio = kzalloc(sizeof(struct inexio), GFP_KERNEL); | ||
124 | input_dev = input_allocate_device(); | ||
125 | if (!pinexio || !input_dev) { | ||
126 | err = -ENOMEM; | ||
127 | goto fail1; | ||
128 | } | ||
129 | |||
130 | pinexio->serio = serio; | ||
131 | pinexio->dev = input_dev; | ||
132 | snprintf(pinexio->phys, sizeof(pinexio->phys), "%s/input0", serio->phys); | ||
133 | |||
134 | input_dev->name = "iNexio Serial TouchScreen"; | ||
135 | input_dev->phys = pinexio->phys; | ||
136 | input_dev->id.bustype = BUS_RS232; | ||
137 | input_dev->id.vendor = SERIO_INEXIO; | ||
138 | input_dev->id.product = 0; | ||
139 | input_dev->id.version = 0x0001; | ||
140 | input_dev->dev.parent = &serio->dev; | ||
141 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | ||
142 | input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); | ||
143 | input_set_abs_params(pinexio->dev, ABS_X, INEXIO_MIN_XC, INEXIO_MAX_XC, 0, 0); | ||
144 | input_set_abs_params(pinexio->dev, ABS_Y, INEXIO_MIN_YC, INEXIO_MAX_YC, 0, 0); | ||
145 | |||
146 | serio_set_drvdata(serio, pinexio); | ||
147 | |||
148 | err = serio_open(serio, drv); | ||
149 | if (err) | ||
150 | goto fail2; | ||
151 | |||
152 | err = input_register_device(pinexio->dev); | ||
153 | if (err) | ||
154 | goto fail3; | ||
155 | |||
156 | return 0; | ||
157 | |||
158 | fail3: serio_close(serio); | ||
159 | fail2: serio_set_drvdata(serio, NULL); | ||
160 | fail1: input_free_device(input_dev); | ||
161 | kfree(pinexio); | ||
162 | return err; | ||
163 | } | ||
164 | |||
165 | /* | ||
166 | * The serio driver structure. | ||
167 | */ | ||
168 | |||
169 | static struct serio_device_id inexio_serio_ids[] = { | ||
170 | { | ||
171 | .type = SERIO_RS232, | ||
172 | .proto = SERIO_INEXIO, | ||
173 | .id = SERIO_ANY, | ||
174 | .extra = SERIO_ANY, | ||
175 | }, | ||
176 | { 0 } | ||
177 | }; | ||
178 | |||
179 | MODULE_DEVICE_TABLE(serio, inexio_serio_ids); | ||
180 | |||
181 | static struct serio_driver inexio_drv = { | ||
182 | .driver = { | ||
183 | .name = "inexio", | ||
184 | }, | ||
185 | .description = DRIVER_DESC, | ||
186 | .id_table = inexio_serio_ids, | ||
187 | .interrupt = inexio_interrupt, | ||
188 | .connect = inexio_connect, | ||
189 | .disconnect = inexio_disconnect, | ||
190 | }; | ||
191 | |||
192 | /* | ||
193 | * The functions for inserting/removing us as a module. | ||
194 | */ | ||
195 | |||
196 | static int __init inexio_init(void) | ||
197 | { | ||
198 | return serio_register_driver(&inexio_drv); | ||
199 | } | ||
200 | |||
201 | static void __exit inexio_exit(void) | ||
202 | { | ||
203 | serio_unregister_driver(&inexio_drv); | ||
204 | } | ||
205 | |||
206 | module_init(inexio_init); | ||
207 | module_exit(inexio_exit); | ||
diff --git a/drivers/input/touchscreen/migor_ts.c b/drivers/input/touchscreen/migor_ts.c new file mode 100644 index 000000000000..c1cd99d58981 --- /dev/null +++ b/drivers/input/touchscreen/migor_ts.c | |||
@@ -0,0 +1,250 @@ | |||
1 | /* | ||
2 | * Touch Screen driver for Renesas MIGO-R Platform | ||
3 | * | ||
4 | * Copyright (c) 2008 Magnus Damm | ||
5 | * Copyright (c) 2007 Ujjwal Pande <ujjwal@kenati.com>, | ||
6 | * Kenati Technologies Pvt Ltd. | ||
7 | * | ||
8 | * This file is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public | ||
10 | * License as published by the Free Software Foundation; either | ||
11 | * version 2 of the License, or (at your option) any later version. | ||
12 | * | ||
13 | * This file is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public | ||
19 | * License along with this library; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <linux/interrupt.h> | ||
26 | #include <asm/io.h> | ||
27 | #include <linux/i2c.h> | ||
28 | #include <linux/timer.h> | ||
29 | |||
30 | #define EVENT_PENDOWN 1 | ||
31 | #define EVENT_REPEAT 2 | ||
32 | #define EVENT_PENUP 3 | ||
33 | |||
34 | struct migor_ts_priv { | ||
35 | struct i2c_client *client; | ||
36 | struct input_dev *input; | ||
37 | struct delayed_work work; | ||
38 | int irq; | ||
39 | }; | ||
40 | |||
41 | static const u_int8_t migor_ts_ena_seq[17] = { 0x33, 0x22, 0x11, | ||
42 | 0x01, 0x06, 0x07, }; | ||
43 | static const u_int8_t migor_ts_dis_seq[17] = { }; | ||
44 | |||
45 | static void migor_ts_poscheck(struct work_struct *work) | ||
46 | { | ||
47 | struct migor_ts_priv *priv = container_of(work, | ||
48 | struct migor_ts_priv, | ||
49 | work.work); | ||
50 | unsigned short xpos, ypos; | ||
51 | unsigned char event; | ||
52 | u_int8_t buf[16]; | ||
53 | |||
54 | memset(buf, 0, sizeof(buf)); | ||
55 | |||
56 | /* Set Index 0 */ | ||
57 | buf[0] = 0; | ||
58 | if (i2c_master_send(priv->client, buf, 1) != 1) { | ||
59 | dev_err(&priv->client->dev, "Unable to write i2c index\n"); | ||
60 | goto out; | ||
61 | } | ||
62 | |||
63 | /* Now do Page Read */ | ||
64 | if (i2c_master_recv(priv->client, buf, sizeof(buf)) != sizeof(buf)) { | ||
65 | dev_err(&priv->client->dev, "Unable to read i2c page\n"); | ||
66 | goto out; | ||
67 | } | ||
68 | |||
69 | ypos = ((buf[9] & 0x03) << 8 | buf[8]); | ||
70 | xpos = ((buf[11] & 0x03) << 8 | buf[10]); | ||
71 | event = buf[12]; | ||
72 | |||
73 | if (event == EVENT_PENDOWN || event == EVENT_REPEAT) { | ||
74 | input_report_key(priv->input, BTN_TOUCH, 1); | ||
75 | input_report_abs(priv->input, ABS_X, ypos); /*X-Y swap*/ | ||
76 | input_report_abs(priv->input, ABS_Y, xpos); | ||
77 | input_sync(priv->input); | ||
78 | } else if (event == EVENT_PENUP) { | ||
79 | input_report_key(priv->input, BTN_TOUCH, 0); | ||
80 | input_sync(priv->input); | ||
81 | } | ||
82 | out: | ||
83 | enable_irq(priv->irq); | ||
84 | } | ||
85 | |||
86 | static irqreturn_t migor_ts_isr(int irq, void *dev_id) | ||
87 | { | ||
88 | struct migor_ts_priv *priv = dev_id; | ||
89 | |||
90 | /* the touch screen controller chip is hooked up to the cpu | ||
91 | * using i2c and a single interrupt line. the interrupt line | ||
92 | * is pulled low whenever someone taps the screen. to deassert | ||
93 | * the interrupt line we need to acknowledge the interrupt by | ||
94 | * communicating with the controller over the slow i2c bus. | ||
95 | * | ||
96 | * we can't acknowledge from interrupt context since the i2c | ||
97 | * bus controller may sleep, so we just disable the interrupt | ||
98 | * here and handle the acknowledge using delayed work. | ||
99 | */ | ||
100 | |||
101 | disable_irq_nosync(irq); | ||
102 | schedule_delayed_work(&priv->work, HZ / 20); | ||
103 | |||
104 | return IRQ_HANDLED; | ||
105 | } | ||
106 | |||
107 | |||
108 | static int migor_ts_open(struct input_dev *dev) | ||
109 | { | ||
110 | struct migor_ts_priv *priv = input_get_drvdata(dev); | ||
111 | struct i2c_client *client = priv->client; | ||
112 | int count; | ||
113 | |||
114 | /* enable controller */ | ||
115 | count = i2c_master_send(client, migor_ts_ena_seq, | ||
116 | sizeof(migor_ts_ena_seq)); | ||
117 | if (count != sizeof(migor_ts_ena_seq)) { | ||
118 | dev_err(&client->dev, "Unable to enable touchscreen.\n"); | ||
119 | return -ENXIO; | ||
120 | } | ||
121 | |||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | static void migor_ts_close(struct input_dev *dev) | ||
126 | { | ||
127 | struct migor_ts_priv *priv = input_get_drvdata(dev); | ||
128 | struct i2c_client *client = priv->client; | ||
129 | |||
130 | disable_irq(priv->irq); | ||
131 | |||
132 | /* cancel pending work and wait for migor_ts_poscheck() to finish */ | ||
133 | if (cancel_delayed_work_sync(&priv->work)) { | ||
134 | /* | ||
135 | * if migor_ts_poscheck was canceled we need to enable IRQ | ||
136 | * here to balance disable done in migor_ts_isr. | ||
137 | */ | ||
138 | enable_irq(priv->irq); | ||
139 | } | ||
140 | |||
141 | /* disable controller */ | ||
142 | i2c_master_send(client, migor_ts_dis_seq, sizeof(migor_ts_dis_seq)); | ||
143 | |||
144 | enable_irq(priv->irq); | ||
145 | } | ||
146 | |||
147 | static int migor_ts_probe(struct i2c_client *client, | ||
148 | const struct i2c_device_id *idp) | ||
149 | { | ||
150 | struct migor_ts_priv *priv; | ||
151 | struct input_dev *input; | ||
152 | int error; | ||
153 | |||
154 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
155 | if (!priv) { | ||
156 | dev_err(&client->dev, "failed to allocate driver data\n"); | ||
157 | error = -ENOMEM; | ||
158 | goto err0; | ||
159 | } | ||
160 | |||
161 | dev_set_drvdata(&client->dev, priv); | ||
162 | |||
163 | input = input_allocate_device(); | ||
164 | if (!input) { | ||
165 | dev_err(&client->dev, "Failed to allocate input device.\n"); | ||
166 | error = -ENOMEM; | ||
167 | goto err1; | ||
168 | } | ||
169 | |||
170 | input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | ||
171 | input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); | ||
172 | |||
173 | input_set_abs_params(input, ABS_X, 95, 955, 0, 0); | ||
174 | input_set_abs_params(input, ABS_Y, 85, 935, 0, 0); | ||
175 | |||
176 | input->name = client->driver_name; | ||
177 | input->id.bustype = BUS_I2C; | ||
178 | input->dev.parent = &client->dev; | ||
179 | |||
180 | input->open = migor_ts_open; | ||
181 | input->close = migor_ts_close; | ||
182 | |||
183 | input_set_drvdata(input, priv); | ||
184 | |||
185 | priv->client = client; | ||
186 | priv->input = input; | ||
187 | INIT_DELAYED_WORK(&priv->work, migor_ts_poscheck); | ||
188 | priv->irq = client->irq; | ||
189 | |||
190 | error = input_register_device(input); | ||
191 | if (error) | ||
192 | goto err1; | ||
193 | |||
194 | error = request_irq(priv->irq, migor_ts_isr, IRQF_TRIGGER_LOW, | ||
195 | client->driver_name, priv); | ||
196 | if (error) { | ||
197 | dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); | ||
198 | goto err2; | ||
199 | } | ||
200 | |||
201 | return 0; | ||
202 | |||
203 | err2: | ||
204 | input_unregister_device(input); | ||
205 | input = NULL; /* so we dont try to free it below */ | ||
206 | err1: | ||
207 | input_free_device(input); | ||
208 | kfree(priv); | ||
209 | err0: | ||
210 | dev_set_drvdata(&client->dev, NULL); | ||
211 | return error; | ||
212 | } | ||
213 | |||
214 | static int migor_ts_remove(struct i2c_client *client) | ||
215 | { | ||
216 | struct migor_ts_priv *priv = dev_get_drvdata(&client->dev); | ||
217 | |||
218 | free_irq(priv->irq, priv); | ||
219 | input_unregister_device(priv->input); | ||
220 | kfree(priv); | ||
221 | |||
222 | dev_set_drvdata(&client->dev, NULL); | ||
223 | |||
224 | return 0; | ||
225 | } | ||
226 | |||
227 | static struct i2c_driver migor_ts_driver = { | ||
228 | .driver = { | ||
229 | .name = "migor_ts", | ||
230 | }, | ||
231 | .probe = migor_ts_probe, | ||
232 | .remove = migor_ts_remove, | ||
233 | }; | ||
234 | |||
235 | static int __init migor_ts_init(void) | ||
236 | { | ||
237 | return i2c_add_driver(&migor_ts_driver); | ||
238 | } | ||
239 | |||
240 | static void __exit migor_ts_exit(void) | ||
241 | { | ||
242 | i2c_del_driver(&migor_ts_driver); | ||
243 | } | ||
244 | |||
245 | MODULE_DESCRIPTION("MigoR Touchscreen driver"); | ||
246 | MODULE_AUTHOR("Magnus Damm <damm@opensource.se>"); | ||
247 | MODULE_LICENSE("GPL"); | ||
248 | |||
249 | module_init(migor_ts_init); | ||
250 | module_exit(migor_ts_exit); | ||
diff --git a/drivers/input/touchscreen/touchit213.c b/drivers/input/touchscreen/touchit213.c new file mode 100644 index 000000000000..d1297ba19daf --- /dev/null +++ b/drivers/input/touchscreen/touchit213.c | |||
@@ -0,0 +1,234 @@ | |||
1 | /* | ||
2 | * Sahara TouchIT-213 serial touchscreen driver | ||
3 | * | ||
4 | * Copyright (c) 2007-2008 Claudio Nieder <private@claudio.ch> | ||
5 | * | ||
6 | * Based on Touchright driver (drivers/input/touchscreen/touchright.c) | ||
7 | * Copyright (c) 2006 Rick Koch <n1gp@hotmail.com> | ||
8 | * Copyright (c) 2004 Vojtech Pavlik | ||
9 | * and Dan Streetman <ddstreet@ieee.org> | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * This program is free software; you can redistribute it and/or modify it | ||
14 | * under the terms of the GNU General Public License version 2 as published | ||
15 | * by the Free Software Foundation. | ||
16 | */ | ||
17 | |||
18 | #include <linux/errno.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/slab.h> | ||
22 | #include <linux/input.h> | ||
23 | #include <linux/serio.h> | ||
24 | #include <linux/init.h> | ||
25 | |||
26 | #define DRIVER_DESC "Sahara TouchIT-213 serial touchscreen driver" | ||
27 | |||
28 | MODULE_AUTHOR("Claudio Nieder <private@claudio.ch>"); | ||
29 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
30 | MODULE_LICENSE("GPL"); | ||
31 | |||
32 | /* | ||
33 | * Definitions & global arrays. | ||
34 | */ | ||
35 | |||
36 | /* | ||
37 | * Data is received through COM1 at 9600bit/s,8bit,no parity in packets | ||
38 | * of 5 byte each. | ||
39 | * | ||
40 | * +--------+ +--------+ +--------+ +--------+ +--------+ | ||
41 | * |1000000p| |0xxxxxxx| |0xxxxxxx| |0yyyyyyy| |0yyyyyyy| | ||
42 | * +--------+ +--------+ +--------+ +--------+ +--------+ | ||
43 | * MSB LSB MSB LSB | ||
44 | * | ||
45 | * The value of p is 1 as long as the screen is touched and 0 when | ||
46 | * reporting the location where touching stopped, e.g. where the pen was | ||
47 | * lifted from the screen. | ||
48 | * | ||
49 | * When holding the screen in landscape mode as the BIOS text output is | ||
50 | * presented, x is the horizontal axis with values growing from left to | ||
51 | * right and y is the vertical axis with values growing from top to | ||
52 | * bottom. | ||
53 | * | ||
54 | * When holding the screen in portrait mode with the Sahara logo in its | ||
55 | * correct position, x ist the vertical axis with values growing from | ||
56 | * top to bottom and y is the horizontal axis with values growing from | ||
57 | * right to left. | ||
58 | */ | ||
59 | |||
60 | #define T213_FORMAT_TOUCH_BIT 0x01 | ||
61 | #define T213_FORMAT_STATUS_BYTE 0x80 | ||
62 | #define T213_FORMAT_STATUS_MASK ~T213_FORMAT_TOUCH_BIT | ||
63 | |||
64 | /* | ||
65 | * On my Sahara Touch-IT 213 I have observed x values from 0 to 0x7f0 | ||
66 | * and y values from 0x1d to 0x7e9, so the actual measurement is | ||
67 | * probably done with an 11 bit precision. | ||
68 | */ | ||
69 | #define T213_MIN_XC 0 | ||
70 | #define T213_MAX_XC 0x07ff | ||
71 | #define T213_MIN_YC 0 | ||
72 | #define T213_MAX_YC 0x07ff | ||
73 | |||
74 | /* | ||
75 | * Per-touchscreen data. | ||
76 | */ | ||
77 | |||
78 | struct touchit213 { | ||
79 | struct input_dev *dev; | ||
80 | struct serio *serio; | ||
81 | int idx; | ||
82 | unsigned char csum; | ||
83 | unsigned char data[5]; | ||
84 | char phys[32]; | ||
85 | }; | ||
86 | |||
87 | static irqreturn_t touchit213_interrupt(struct serio *serio, | ||
88 | unsigned char data, unsigned int flags) | ||
89 | { | ||
90 | struct touchit213 *touchit213 = serio_get_drvdata(serio); | ||
91 | struct input_dev *dev = touchit213->dev; | ||
92 | |||
93 | touchit213->data[touchit213->idx] = data; | ||
94 | |||
95 | switch (touchit213->idx++) { | ||
96 | case 0: | ||
97 | if ((touchit213->data[0] & T213_FORMAT_STATUS_MASK) != | ||
98 | T213_FORMAT_STATUS_BYTE) { | ||
99 | pr_debug("unsynchronized data: 0x%02x\n", data); | ||
100 | touchit213->idx = 0; | ||
101 | } | ||
102 | break; | ||
103 | |||
104 | case 4: | ||
105 | touchit213->idx = 0; | ||
106 | input_report_abs(dev, ABS_X, | ||
107 | (touchit213->data[1] << 7) | touchit213->data[2]); | ||
108 | input_report_abs(dev, ABS_Y, | ||
109 | (touchit213->data[3] << 7) | touchit213->data[4]); | ||
110 | input_report_key(dev, BTN_TOUCH, | ||
111 | touchit213->data[0] & T213_FORMAT_TOUCH_BIT); | ||
112 | input_sync(dev); | ||
113 | break; | ||
114 | } | ||
115 | |||
116 | return IRQ_HANDLED; | ||
117 | } | ||
118 | |||
119 | /* | ||
120 | * touchit213_disconnect() is the opposite of touchit213_connect() | ||
121 | */ | ||
122 | |||
123 | static void touchit213_disconnect(struct serio *serio) | ||
124 | { | ||
125 | struct touchit213 *touchit213 = serio_get_drvdata(serio); | ||
126 | |||
127 | input_get_device(touchit213->dev); | ||
128 | input_unregister_device(touchit213->dev); | ||
129 | serio_close(serio); | ||
130 | serio_set_drvdata(serio, NULL); | ||
131 | input_put_device(touchit213->dev); | ||
132 | kfree(touchit213); | ||
133 | } | ||
134 | |||
135 | /* | ||
136 | * touchit213_connect() is the routine that is called when someone adds a | ||
137 | * new serio device that supports the Touchright protocol and registers it as | ||
138 | * an input device. | ||
139 | */ | ||
140 | |||
141 | static int touchit213_connect(struct serio *serio, struct serio_driver *drv) | ||
142 | { | ||
143 | struct touchit213 *touchit213; | ||
144 | struct input_dev *input_dev; | ||
145 | int err; | ||
146 | |||
147 | touchit213 = kzalloc(sizeof(struct touchit213), GFP_KERNEL); | ||
148 | input_dev = input_allocate_device(); | ||
149 | if (!touchit213 || !input_dev) { | ||
150 | err = -ENOMEM; | ||
151 | goto fail1; | ||
152 | } | ||
153 | |||
154 | touchit213->serio = serio; | ||
155 | touchit213->dev = input_dev; | ||
156 | snprintf(touchit213->phys, sizeof(touchit213->phys), | ||
157 | "%s/input0", serio->phys); | ||
158 | |||
159 | input_dev->name = "Sahara Touch-iT213 Serial TouchScreen"; | ||
160 | input_dev->phys = touchit213->phys; | ||
161 | input_dev->id.bustype = BUS_RS232; | ||
162 | input_dev->id.vendor = SERIO_TOUCHIT213; | ||
163 | input_dev->id.product = 0; | ||
164 | input_dev->id.version = 0x0100; | ||
165 | input_dev->dev.parent = &serio->dev; | ||
166 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | ||
167 | input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); | ||
168 | input_set_abs_params(touchit213->dev, ABS_X, | ||
169 | T213_MIN_XC, T213_MAX_XC, 0, 0); | ||
170 | input_set_abs_params(touchit213->dev, ABS_Y, | ||
171 | T213_MIN_YC, T213_MAX_YC, 0, 0); | ||
172 | |||
173 | serio_set_drvdata(serio, touchit213); | ||
174 | |||
175 | err = serio_open(serio, drv); | ||
176 | if (err) | ||
177 | goto fail2; | ||
178 | |||
179 | err = input_register_device(touchit213->dev); | ||
180 | if (err) | ||
181 | goto fail3; | ||
182 | |||
183 | return 0; | ||
184 | |||
185 | fail3: serio_close(serio); | ||
186 | fail2: serio_set_drvdata(serio, NULL); | ||
187 | fail1: input_free_device(input_dev); | ||
188 | kfree(touchit213); | ||
189 | return err; | ||
190 | } | ||
191 | |||
192 | /* | ||
193 | * The serio driver structure. | ||
194 | */ | ||
195 | |||
196 | static struct serio_device_id touchit213_serio_ids[] = { | ||
197 | { | ||
198 | .type = SERIO_RS232, | ||
199 | .proto = SERIO_TOUCHIT213, | ||
200 | .id = SERIO_ANY, | ||
201 | .extra = SERIO_ANY, | ||
202 | }, | ||
203 | { 0 } | ||
204 | }; | ||
205 | |||
206 | MODULE_DEVICE_TABLE(serio, touchit213_serio_ids); | ||
207 | |||
208 | static struct serio_driver touchit213_drv = { | ||
209 | .driver = { | ||
210 | .name = "touchit213", | ||
211 | }, | ||
212 | .description = DRIVER_DESC, | ||
213 | .id_table = touchit213_serio_ids, | ||
214 | .interrupt = touchit213_interrupt, | ||
215 | .connect = touchit213_connect, | ||
216 | .disconnect = touchit213_disconnect, | ||
217 | }; | ||
218 | |||
219 | /* | ||
220 | * The functions for inserting/removing us as a module. | ||
221 | */ | ||
222 | |||
223 | static int __init touchit213_init(void) | ||
224 | { | ||
225 | return serio_register_driver(&touchit213_drv); | ||
226 | } | ||
227 | |||
228 | static void __exit touchit213_exit(void) | ||
229 | { | ||
230 | serio_unregister_driver(&touchit213_drv); | ||
231 | } | ||
232 | |||
233 | module_init(touchit213_init); | ||
234 | module_exit(touchit213_exit); | ||
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 3a0a8ca57076..fdd645c214a2 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include <linux/init.h> | 49 | #include <linux/init.h> |
50 | #include <linux/usb.h> | 50 | #include <linux/usb.h> |
51 | #include <linux/usb/input.h> | 51 | #include <linux/usb/input.h> |
52 | #include <linux/hid.h> | ||
52 | 53 | ||
53 | 54 | ||
54 | #define DRIVER_VERSION "v0.6" | 55 | #define DRIVER_VERSION "v0.6" |
@@ -101,7 +102,7 @@ struct usbtouch_usb { | |||
101 | 102 | ||
102 | /* device types */ | 103 | /* device types */ |
103 | enum { | 104 | enum { |
104 | DEVTPYE_DUMMY = -1, | 105 | DEVTYPE_IGNORE = -1, |
105 | DEVTYPE_EGALAX, | 106 | DEVTYPE_EGALAX, |
106 | DEVTYPE_PANJIT, | 107 | DEVTYPE_PANJIT, |
107 | DEVTYPE_3M, | 108 | DEVTYPE_3M, |
@@ -115,8 +116,21 @@ enum { | |||
115 | DEVTYPE_GOTOP, | 116 | DEVTYPE_GOTOP, |
116 | }; | 117 | }; |
117 | 118 | ||
119 | #define USB_DEVICE_HID_CLASS(vend, prod) \ | ||
120 | .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \ | ||
121 | | USB_DEVICE_ID_MATCH_DEVICE, \ | ||
122 | .idVendor = (vend), \ | ||
123 | .idProduct = (prod), \ | ||
124 | .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ | ||
125 | .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE | ||
126 | |||
118 | static struct usb_device_id usbtouch_devices[] = { | 127 | static struct usb_device_id usbtouch_devices[] = { |
119 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX | 128 | #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX |
129 | /* ignore the HID capable devices, handled by usbhid */ | ||
130 | {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE}, | ||
131 | {USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE}, | ||
132 | |||
133 | /* normal device IDs */ | ||
120 | {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, | 134 | {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, |
121 | {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX}, | 135 | {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX}, |
122 | {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, | 136 | {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, |
@@ -262,7 +276,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch) | |||
262 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 276 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
263 | 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | 277 | 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); |
264 | dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d", | 278 | dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d", |
265 | __FUNCTION__, ret); | 279 | __func__, ret); |
266 | if (ret < 0) | 280 | if (ret < 0) |
267 | return ret; | 281 | return ret; |
268 | msleep(150); | 282 | msleep(150); |
@@ -273,7 +287,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch) | |||
273 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 287 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
274 | 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); | 288 | 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); |
275 | dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", | 289 | dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", |
276 | __FUNCTION__, ret); | 290 | __func__, ret); |
277 | if (ret >= 0) | 291 | if (ret >= 0) |
278 | break; | 292 | break; |
279 | if (ret != -EPIPE) | 293 | if (ret != -EPIPE) |
@@ -793,18 +807,18 @@ static void usbtouch_irq(struct urb *urb) | |||
793 | case -ETIME: | 807 | case -ETIME: |
794 | /* this urb is timing out */ | 808 | /* this urb is timing out */ |
795 | dbg("%s - urb timed out - was the device unplugged?", | 809 | dbg("%s - urb timed out - was the device unplugged?", |
796 | __FUNCTION__); | 810 | __func__); |
797 | return; | 811 | return; |
798 | case -ECONNRESET: | 812 | case -ECONNRESET: |
799 | case -ENOENT: | 813 | case -ENOENT: |
800 | case -ESHUTDOWN: | 814 | case -ESHUTDOWN: |
801 | /* this urb is terminated, clean up */ | 815 | /* this urb is terminated, clean up */ |
802 | dbg("%s - urb shutting down with status: %d", | 816 | dbg("%s - urb shutting down with status: %d", |
803 | __FUNCTION__, urb->status); | 817 | __func__, urb->status); |
804 | return; | 818 | return; |
805 | default: | 819 | default: |
806 | dbg("%s - nonzero urb status received: %d", | 820 | dbg("%s - nonzero urb status received: %d", |
807 | __FUNCTION__, urb->status); | 821 | __func__, urb->status); |
808 | goto exit; | 822 | goto exit; |
809 | } | 823 | } |
810 | 824 | ||
@@ -814,7 +828,7 @@ exit: | |||
814 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 828 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
815 | if (retval) | 829 | if (retval) |
816 | err("%s - usb_submit_urb failed with result: %d", | 830 | err("%s - usb_submit_urb failed with result: %d", |
817 | __FUNCTION__, retval); | 831 | __func__, retval); |
818 | } | 832 | } |
819 | 833 | ||
820 | static int usbtouch_open(struct input_dev *input) | 834 | static int usbtouch_open(struct input_dev *input) |
@@ -857,6 +871,10 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
857 | struct usbtouch_device_info *type; | 871 | struct usbtouch_device_info *type; |
858 | int err = -ENOMEM; | 872 | int err = -ENOMEM; |
859 | 873 | ||
874 | /* some devices are ignored */ | ||
875 | if (id->driver_info == DEVTYPE_IGNORE) | ||
876 | return -ENODEV; | ||
877 | |||
860 | interface = intf->cur_altsetting; | 878 | interface = intf->cur_altsetting; |
861 | endpoint = &interface->endpoint[0].desc; | 879 | endpoint = &interface->endpoint[0].desc; |
862 | 880 | ||
@@ -883,7 +901,7 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
883 | 901 | ||
884 | usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); | 902 | usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); |
885 | if (!usbtouch->irq) { | 903 | if (!usbtouch->irq) { |
886 | dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__); | 904 | dbg("%s - usb_alloc_urb failed: usbtouch->irq", __func__); |
887 | goto out_free_buffers; | 905 | goto out_free_buffers; |
888 | } | 906 | } |
889 | 907 | ||
@@ -939,14 +957,14 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
939 | if (type->init) { | 957 | if (type->init) { |
940 | err = type->init(usbtouch); | 958 | err = type->init(usbtouch); |
941 | if (err) { | 959 | if (err) { |
942 | dbg("%s - type->init() failed, err: %d", __FUNCTION__, err); | 960 | dbg("%s - type->init() failed, err: %d", __func__, err); |
943 | goto out_free_buffers; | 961 | goto out_free_buffers; |
944 | } | 962 | } |
945 | } | 963 | } |
946 | 964 | ||
947 | err = input_register_device(usbtouch->input); | 965 | err = input_register_device(usbtouch->input); |
948 | if (err) { | 966 | if (err) { |
949 | dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err); | 967 | dbg("%s - input_register_device failed, err: %d", __func__, err); |
950 | goto out_free_buffers; | 968 | goto out_free_buffers; |
951 | } | 969 | } |
952 | 970 | ||
@@ -966,12 +984,12 @@ static void usbtouch_disconnect(struct usb_interface *intf) | |||
966 | { | 984 | { |
967 | struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); | 985 | struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); |
968 | 986 | ||
969 | dbg("%s - called", __FUNCTION__); | 987 | dbg("%s - called", __func__); |
970 | 988 | ||
971 | if (!usbtouch) | 989 | if (!usbtouch) |
972 | return; | 990 | return; |
973 | 991 | ||
974 | dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__); | 992 | dbg("%s - usbtouch is initialized, cleaning up", __func__); |
975 | usb_set_intfdata(intf, NULL); | 993 | usb_set_intfdata(intf, NULL); |
976 | usb_kill_urb(usbtouch->irq); | 994 | usb_kill_urb(usbtouch->irq); |
977 | input_unregister_device(usbtouch->input); | 995 | input_unregister_device(usbtouch->input); |
diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c index 0b6e4cfa6a21..4c5d85a249ae 100644 --- a/drivers/input/touchscreen/wm9712.c +++ b/drivers/input/touchscreen/wm9712.c | |||
@@ -168,6 +168,18 @@ static void wm9712_phy_init(struct wm97xx *wm) | |||
168 | 64000 / rpu); | 168 | 64000 / rpu); |
169 | } | 169 | } |
170 | 170 | ||
171 | /* WM9712 five wire */ | ||
172 | if (five_wire) { | ||
173 | dig2 |= WM9712_45W; | ||
174 | dev_dbg(wm->dev, "setting 5-wire touchscreen mode."); | ||
175 | |||
176 | if (pil) { | ||
177 | dev_warn(wm->dev, "pressure measurement is not " | ||
178 | "supported in 5-wire mode\n"); | ||
179 | pil = 0; | ||
180 | } | ||
181 | } | ||
182 | |||
171 | /* touchpanel pressure current*/ | 183 | /* touchpanel pressure current*/ |
172 | if (pil == 2) { | 184 | if (pil == 2) { |
173 | dig2 |= WM9712_PIL; | 185 | dig2 |= WM9712_PIL; |
@@ -179,12 +191,6 @@ static void wm9712_phy_init(struct wm97xx *wm) | |||
179 | if (!pil) | 191 | if (!pil) |
180 | pressure = 0; | 192 | pressure = 0; |
181 | 193 | ||
182 | /* WM9712 five wire */ | ||
183 | if (five_wire) { | ||
184 | dig2 |= WM9712_45W; | ||
185 | dev_dbg(wm->dev, "setting 5-wire touchscreen mode."); | ||
186 | } | ||
187 | |||
188 | /* polling mode sample settling delay */ | 194 | /* polling mode sample settling delay */ |
189 | if (delay < 0 || delay > 15) { | 195 | if (delay < 0 || delay > 15) { |
190 | dev_dbg(wm->dev, "supplied delay out of range."); | 196 | dev_dbg(wm->dev, "supplied delay out of range."); |
diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index 59ea520a5d7a..5396c67ba0a4 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c | |||
@@ -219,11 +219,13 @@ struct adbhid { | |||
219 | int flags; | 219 | int flags; |
220 | }; | 220 | }; |
221 | 221 | ||
222 | #define FLAG_FN_KEY_PRESSED 0x00000001 | 222 | #define FLAG_FN_KEY_PRESSED 0x00000001 |
223 | #define FLAG_POWER_FROM_FN 0x00000002 | 223 | #define FLAG_POWER_FROM_FN 0x00000002 |
224 | #define FLAG_EMU_FWDEL_DOWN 0x00000004 | 224 | #define FLAG_EMU_FWDEL_DOWN 0x00000004 |
225 | #define FLAG_CAPSLOCK_TRANSLATE 0x00000008 | 225 | #define FLAG_CAPSLOCK_TRANSLATE 0x00000008 |
226 | #define FLAG_CAPSLOCK_DOWN 0x00000010 | 226 | #define FLAG_CAPSLOCK_DOWN 0x00000010 |
227 | #define FLAG_CAPSLOCK_IGNORE_NEXT 0x00000020 | ||
228 | #define FLAG_POWER_KEY_PRESSED 0x00000040 | ||
227 | 229 | ||
228 | static struct adbhid *adbhid[16]; | 230 | static struct adbhid *adbhid[16]; |
229 | 231 | ||
@@ -291,11 +293,20 @@ adbhid_input_keycode(int id, int scancode, int repeat) | |||
291 | if (keycode == ADB_KEY_CAPSLOCK && !up_flag) { | 293 | if (keycode == ADB_KEY_CAPSLOCK && !up_flag) { |
292 | /* Key pressed, turning on the CapsLock LED. | 294 | /* Key pressed, turning on the CapsLock LED. |
293 | * The next 0xff will be interpreted as a release. */ | 295 | * The next 0xff will be interpreted as a release. */ |
294 | ahid->flags |= FLAG_CAPSLOCK_TRANSLATE | 296 | if (ahid->flags & FLAG_CAPSLOCK_IGNORE_NEXT) { |
297 | /* Throw away this key event if it happens | ||
298 | * just after resume. */ | ||
299 | ahid->flags &= ~FLAG_CAPSLOCK_IGNORE_NEXT; | ||
300 | return; | ||
301 | } else { | ||
302 | ahid->flags |= FLAG_CAPSLOCK_TRANSLATE | ||
295 | | FLAG_CAPSLOCK_DOWN; | 303 | | FLAG_CAPSLOCK_DOWN; |
296 | } else if (scancode == 0xff) { | 304 | } |
305 | } else if (scancode == 0xff && | ||
306 | !(ahid->flags & FLAG_POWER_KEY_PRESSED)) { | ||
297 | /* Scancode 0xff usually signifies that the capslock | 307 | /* Scancode 0xff usually signifies that the capslock |
298 | * key was either pressed or released. */ | 308 | * key was either pressed or released, or that the |
309 | * power button was released. */ | ||
299 | if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) { | 310 | if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) { |
300 | keycode = ADB_KEY_CAPSLOCK; | 311 | keycode = ADB_KEY_CAPSLOCK; |
301 | if (ahid->flags & FLAG_CAPSLOCK_DOWN) { | 312 | if (ahid->flags & FLAG_CAPSLOCK_DOWN) { |
@@ -309,7 +320,7 @@ adbhid_input_keycode(int id, int scancode, int repeat) | |||
309 | } | 320 | } |
310 | } else { | 321 | } else { |
311 | printk(KERN_INFO "Spurious caps lock event " | 322 | printk(KERN_INFO "Spurious caps lock event " |
312 | "(scancode 0xff)."); | 323 | "(scancode 0xff).\n"); |
313 | } | 324 | } |
314 | } | 325 | } |
315 | } | 326 | } |
@@ -336,6 +347,12 @@ adbhid_input_keycode(int id, int scancode, int repeat) | |||
336 | } | 347 | } |
337 | break; | 348 | break; |
338 | case ADB_KEY_POWER: | 349 | case ADB_KEY_POWER: |
350 | /* Keep track of the power key state */ | ||
351 | if (up_flag) | ||
352 | ahid->flags &= ~FLAG_POWER_KEY_PRESSED; | ||
353 | else | ||
354 | ahid->flags |= FLAG_POWER_KEY_PRESSED; | ||
355 | |||
339 | /* Fn + Command will produce a bogus "power" keycode */ | 356 | /* Fn + Command will produce a bogus "power" keycode */ |
340 | if (ahid->flags & FLAG_FN_KEY_PRESSED) { | 357 | if (ahid->flags & FLAG_FN_KEY_PRESSED) { |
341 | keycode = ADB_KEY_CMD; | 358 | keycode = ADB_KEY_CMD; |
@@ -681,6 +698,21 @@ static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned i | |||
681 | return -1; | 698 | return -1; |
682 | } | 699 | } |
683 | 700 | ||
701 | static void | ||
702 | adbhid_kbd_capslock_remember(void) | ||
703 | { | ||
704 | struct adbhid *ahid; | ||
705 | int i; | ||
706 | |||
707 | for (i = 1; i < 16; i++) { | ||
708 | ahid = adbhid[i]; | ||
709 | |||
710 | if (ahid && ahid->id == ADB_KEYBOARD) | ||
711 | if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) | ||
712 | ahid->flags |= FLAG_CAPSLOCK_IGNORE_NEXT; | ||
713 | } | ||
714 | } | ||
715 | |||
684 | static int | 716 | static int |
685 | adb_message_handler(struct notifier_block *this, unsigned long code, void *x) | 717 | adb_message_handler(struct notifier_block *this, unsigned long code, void *x) |
686 | { | 718 | { |
@@ -697,8 +729,17 @@ adb_message_handler(struct notifier_block *this, unsigned long code, void *x) | |||
697 | } | 729 | } |
698 | 730 | ||
699 | /* Stop pending led requests */ | 731 | /* Stop pending led requests */ |
700 | while(leds_req_pending) | 732 | while (leds_req_pending) |
701 | adb_poll(); | 733 | adb_poll(); |
734 | |||
735 | /* After resume, and if the capslock LED is on, the PMU will | ||
736 | * send a "capslock down" key event. This confuses the | ||
737 | * restore_capslock_events logic. Remember if the capslock | ||
738 | * LED was on before suspend so the unwanted key event can | ||
739 | * be ignored after resume. */ | ||
740 | if (restore_capslock_events) | ||
741 | adbhid_kbd_capslock_remember(); | ||
742 | |||
702 | break; | 743 | break; |
703 | 744 | ||
704 | case ADB_MSG_POST_RESET: | 745 | case ADB_MSG_POST_RESET: |