bk://kernel.bkbits.net/vojtech/input
vojtech@suse.cz|ChangeSet|20040921141218|14729 vojtech

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/09/21 21:19:36-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# drivers/usb/input/hid-core.c
#   2004/09/21 21:19:32-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/char/keyboard.c
#   2004/09/21 21:19:32-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/21 21:18:33-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/serial/sunsu.c
#   2004/09/21 21:18:28-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/21 16:12:18+02:00 vojtech@suse.cz 
#   input: Add AT-compatible rawmode generation for ARM.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Woody Suwalski <woodys@xandros.com>
# 
# drivers/char/keyboard.c
#   2004/09/21 16:12:11+02:00 vojtech@suse.cz +4 -1
#   input: Add AT-compatible rawmode generation for ARM.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Woody Suwalski <woodys@xandros.com>
# 
# ChangeSet
#   2004/09/21 15:48:50+02:00 petero2@telia.com 
#   input: Add ALPS touchpad driver, driver by Neil Brown, Peter Osterlund
#          and Dmitry Torokhov, some fixes by Vojtech Pavlik.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Osterlund <petero2@telia.com>
# 
# drivers/input/mouse/alps.h
#   2004/09/21 15:48:43+02:00 petero2@telia.com +17 -0
# 
# drivers/input/mouse/alps.h
#   2004/09/21 15:48:43+02:00 petero2@telia.com +0 -0
#   BitKeeper file /data2/bk/input/drivers/input/mouse/alps.h
# 
# drivers/input/mouse/alps.c
#   2004/09/21 15:48:42+02:00 petero2@telia.com +422 -0
# 
# drivers/input/mousedev.c
#   2004/09/21 15:48:42+02:00 petero2@telia.com +10 -4
#   input: Add ALPS touchpad driver, driver by Neil Brown, Peter Osterlund
#          and Dmitry Torokhov, some fixes by Vojtech Pavlik.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Osterlund <petero2@telia.com>
# 
# drivers/input/mouse/psmouse.h
#   2004/09/21 15:48:42+02:00 petero2@telia.com +3 -0
#   input: Add ALPS touchpad driver, driver by Neil Brown, Peter Osterlund
#          and Dmitry Torokhov, some fixes by Vojtech Pavlik.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Osterlund <petero2@telia.com>
# 
# drivers/input/mouse/psmouse-base.c
#   2004/09/21 15:48:42+02:00 petero2@telia.com +22 -1
#   input: Add ALPS touchpad driver, driver by Neil Brown, Peter Osterlund
#          and Dmitry Torokhov, some fixes by Vojtech Pavlik.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Osterlund <petero2@telia.com>
# 
# drivers/input/mouse/alps.c
#   2004/09/21 15:48:42+02:00 petero2@telia.com +0 -0
#   BitKeeper file /data2/bk/input/drivers/input/mouse/alps.c
# 
# drivers/input/mouse/Makefile
#   2004/09/21 15:48:42+02:00 petero2@telia.com +1 -1
#   input: Add ALPS touchpad driver, driver by Neil Brown, Peter Osterlund
#          and Dmitry Torokhov, some fixes by Vojtech Pavlik.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Osterlund <petero2@telia.com>
# 
# ChangeSet
#   2004/09/21 15:27:54+02:00 pmaydell@chiark.greenend.org.uk 
#   input: Add support for Kensington ThinkingMouse PS/2 protocol.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Maydell <pmaydell@chiark.greenend.org.uk>
# 
# drivers/input/mouse/psmouse.h
#   2004/09/21 15:27:48+02:00 pmaydell@chiark.greenend.org.uk +11 -7
#   input: Add support for Kensington ThinkingMouse PS/2 protocol.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Maydell <pmaydell@chiark.greenend.org.uk>
# 
# drivers/input/mouse/psmouse-base.c
#   2004/09/21 15:27:48+02:00 pmaydell@chiark.greenend.org.uk +50 -5
#   input: Add support for Kensington ThinkingMouse PS/2 protocol.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Maydell <pmaydell@chiark.greenend.org.uk>
# 
# ChangeSet
#   2004/09/21 10:04:06+02:00 vojtech@suse.cz 
#   input: Some HID devices have problems returning the HID class descriptor.
#          Try a few times before giving up.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
# 
# drivers/usb/input/hid-core.c
#   2004/09/21 10:04:00+02:00 vojtech@suse.cz +8 -3
#   input: Some HID devices have problems returning the HID class descriptor.
#          Try a few times before giving up.
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
# 
# ChangeSet
#   2004/09/21 09:24:21+02:00 pnelson@suse.cz 
#   input: Fix oops in gamecon
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Nelson <pnelson@andrew.cmu.edu>
# 
# drivers/input/joystick/gamecon.c
#   2004/09/21 09:24:14+02:00 pnelson@suse.cz +3 -3
#   input: Fix oops in gamecon
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Peter Nelson <pnelson@andrew.cmu.edu>
# 
# ChangeSet
#   2004/09/19 21:58:28-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/input/serio/Kconfig
#   2004/09/19 21:58:24-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/19 13:46:50+02:00 olh@suse.de 
#   input: Joydump depends on gameport
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Olaf Hering <olh@suse.de>
# 
# drivers/input/joystick/Kconfig
#   2004/09/19 13:46:33+02:00 olh@suse.de +1 -1
#   input: Joydump depends on gameport
#   
#   Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
#   Patch-by: Olaf Hering <olh@suse.de>
# 
# ChangeSet
#   2004/09/17 13:30:06-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# Documentation/kernel-parameters.txt
#   2004/09/17 13:30:02-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/16 16:27:12-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# include/linux/hiddev.h
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# fs/compat_ioctl.c
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hiddev.c
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/serio/Kconfig
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/09/16 16:27:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/08 12:29:01-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# include/linux/hiddev.h
#   2004/09/08 12:28:56-07:00 akpm@bix.(none) +0 -7
#   Auto merged
# 
# drivers/usb/input/hiddev.c
#   2004/09/08 12:28:56-07:00 akpm@bix.(none) +0 -6
#   Auto merged
# 
# drivers/Makefile
#   2004/09/08 12:28:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/07 21:06:53-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/09/07 21:06:48-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/09/07 21:06:47-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/09/03 14:23:28-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# MAINTAINERS
#   2004/09/03 14:23:24-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/31 14:02:33-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# MAINTAINERS
#   2004/08/31 14:02:26-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/28 16:27:11-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# MAINTAINERS
#   2004/08/28 16:27:07-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/27 23:57:20-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/input/serio/Kconfig
#   2004/08/27 23:57:14-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/08/27 23:57:14-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/27 13:41:40-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# MAINTAINERS
#   2004/08/27 13:41:36-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/08/27 13:41:36-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/25 19:45:04-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# MAINTAINERS
#   2004/08/25 19:44:59-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/25 14:17:06-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# include/linux/compat_ioctl.h
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-core.c
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/serio/gscps2.c
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/gameport/vortex.c
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/gameport/emu10k1-gp.c
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/08/25 14:17:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/24 17:54:26-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/input/serio/gscps2.c
#   2004/08/24 17:54:22-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/08/24 17:54:22-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/08/24 17:54:22-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/23 16:53:47-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/usb/input/hid-core.c
#   2004/08/23 16:53:43-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/gameport/vortex.c
#   2004/08/23 16:53:43-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/gameport/emu10k1-gp.c
#   2004/08/23 16:53:43-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/08/23 16:53:43-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# MAINTAINERS
#   2004/08/23 16:53:42-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/23 14:14:32-07:00 akpm@bix.(none) 
#   Merge
# 
# MAINTAINERS
#   2004/08/23 14:14:28-07:00 akpm@bix.(none) +0 -0
#   SCCS merged
# 
# fs/compat_ioctl.c
#   2004/08/23 14:07:45-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-core.c
#   2004/08/23 14:07:44-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/08/23 14:07:44-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/dmi_scan.c
#   2004/08/23 14:07:44-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/23 14:06:49-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# include/linux/compat_ioctl.h
#   2004/08/23 14:06:45-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/08/23 14:06:45-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/22 21:20:58-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# include/linux/compat_ioctl.h
#   2004/08/22 21:20:54-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/15 01:07:14-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# arch/i386/kernel/dmi_scan.c
#   2004/08/15 01:07:10-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/04 17:51:18-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/08/04 17:51:15-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/08/04 11:19:18-07:00 vojtech@kernel.bkbits.net 
#   Merge kernel.bkbits.net:/home/vojtech/linus
#   into kernel.bkbits.net:/home/vojtech/input
# 
# fs/compat_ioctl.c
#   2004/08/04 11:19:12-07:00 vojtech@kernel.bkbits.net +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/29 23:23:37-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/07/29 23:23:33-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hiddev.c
#   2004/07/29 23:23:33-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-core.c
#   2004/07/29 23:23:33-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/07/29 23:23:33-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/29 23:22:42-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/07/29 23:22:38-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/27 12:48:04-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# drivers/serial/sunsu.c
#   2004/07/27 12:48:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/keyboard/sunkbd.c
#   2004/07/27 12:48:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/joystick/analog.c
#   2004/07/27 12:48:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/26 22:48:28-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/serial/sunsu.c
#   2004/07/26 22:48:25-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/keyboard/sunkbd.c
#   2004/07/26 22:48:25-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/joystick/analog.c
#   2004/07/26 22:48:25-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/25 16:28:12-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/07/25 16:28:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-core.c
#   2004/07/25 16:28:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/07/25 16:28:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/16 18:31:00-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/usb/input/hid-core.c
#   2004/07/16 18:30:57-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/Makefile
#   2004/07/16 18:30:57-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/13 12:40:25-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/07/13 12:40:21-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/11 23:41:44-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hiddev.c
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-tmff.c
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/serio/i8042-io.h
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/char/keyboard.c
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/dmi_scan.c
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/07/11 23:41:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/11 13:33:39-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# arch/i386/kernel/dmi_scan.c
#   2004/07/11 13:33:36-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/07/11 13:33:36-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/08 14:24:00-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# include/linux/compat_ioctl.h
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# fs/compat_ioctl.c
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hiddev.c
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-tmff.c
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/input/serio/i8042-io.h
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/char/keyboard.c
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/dmi_scan.c
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/07/08 14:23:56-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/06 23:59:45-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# include/linux/compat_ioctl.h
#   2004/07/06 23:59:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# fs/compat_ioctl.c
#   2004/07/06 23:59:41-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/07/05 13:01:11-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-input
# 
# drivers/usb/input/hiddev.c
#   2004/07/05 13:01:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# arch/i386/kernel/dmi_scan.c
#   2004/07/05 13:01:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# Documentation/kernel-parameters.txt
#   2004/07/05 13:01:08-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/06/30 11:25:44-07:00 akpm@bix.(none) 
#   Merge bk://kernel.bkbits.net/vojtech/input
#   into bix.(none):/usr/src/bk-input
# 
# fs/compat_ioctl.c
#   2004/06/30 11:25:40-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/usb/input/hid-tmff.c
#   2004/06/30 11:25:40-07:00 akpm@bix.(none) +0 -1
#   Auto merged
# 
# drivers/input/serio/i8042-io.h
#   2004/06/30 11:25:40-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/char/keyboard.c
#   2004/06/30 11:25:40-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c
--- a/drivers/char/keyboard.c	2004-09-21 21:20:42 -07:00
+++ b/drivers/char/keyboard.c	2004-09-21 21:20:42 -07:00
@@ -939,7 +939,10 @@
 	tasklet_enable(&keyboard_tasklet);
 }
 
-#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64) || defined(CONFIG_PARISC) || defined(CONFIG_SUPERH)
+#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\
+    defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC32) ||\
+    defined(CONFIG_SPARC64) || defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
+    (defined(CONFIG_ARM) && defined(CONFIG_KEYBOARD_ATKBD) && !defined(CONFIG_RPC))
 
 #define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\
 			((dev)->id.bustype == BUS_I8042) && ((dev)->id.vendor == 0x0001) && ((dev)->id.product == 0x0001))
diff -Nru a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig
--- a/drivers/input/joystick/Kconfig	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/joystick/Kconfig	2004-09-21 21:20:42 -07:00
@@ -249,7 +249,7 @@
 
 config JOYSTICK_JOYDUMP
 	tristate "Gameport data dumper"
-	depends on INPUT && INPUT_JOYSTICK
+	depends on INPUT && INPUT_JOYSTICK && GAMEPORT
 	help
 	  Say Y here if you want to dump data from your joystick into the system
 	  log for debugging purposes. Say N if you are making a production
diff -Nru a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c
--- a/drivers/input/joystick/gamecon.c	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/joystick/gamecon.c	2004-09-21 21:20:42 -07:00
@@ -89,7 +89,7 @@
 static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 };
 
 static char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick",
-				"Multisystem 2-button joystick", "N64 controller", "PSX controller"
+				"Multisystem 2-button joystick", "N64 controller", "PSX controller",
 				"PSX DDR controller" };
 /*
  * N64 support.
@@ -271,7 +271,7 @@
 		udelay(gc_psx_delay);
 		read = parport_read_status(gc->pd->port) ^ 0x80;
 		for (j = 0; j < 5; j++)
-			data[j] |= (read & gc_status_bit[j] & gc->pads[GC_PSX]) ? (1 << i) : 0;
+			data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0;
 		parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER);
 		udelay(gc_psx_delay);
 	}
@@ -300,7 +300,7 @@
 	gc_psx_command(gc, 0, data2);							/* Dump status */
 
 	for (i =0; i < 5; i++)								/* Find the longest pad */
-		if((gc_status_bit[i] & gc->pads[GC_PSX]) && (GC_PSX_LEN(id[i]) > max_len))
+		if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) && (GC_PSX_LEN(id[i]) > max_len))
 			max_len = GC_PSX_LEN(id[i]);
 
 	for (i = 0; i < max_len * 2; i++) {						/* Read in all the data */
diff -Nru a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
--- a/drivers/input/mouse/Makefile	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/mouse/Makefile	2004-09-21 21:20:42 -07:00
@@ -14,4 +14,4 @@
 obj-$(CONFIG_MOUSE_SERIAL)	+= sermouse.o
 obj-$(CONFIG_MOUSE_VSXXXAA)	+= vsxxxaa.o
 
-psmouse-objs  := psmouse-base.o logips2pp.o synaptics.o
+psmouse-objs  := psmouse-base.o alps.o logips2pp.o synaptics.o
diff -Nru a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/drivers/input/mouse/alps.c	2004-09-21 21:20:42 -07:00
@@ -0,0 +1,422 @@
+/*
+ * ALPS touchpad PS/2 mouse driver
+ *
+ * Copyright (c) 2003 Neil Brown <neilb@cse.unsw.edu.au>
+ * Copyright (c) 2003 Peter Osterlund <petero2@telia.com>
+ * Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru>
+ *
+ * ALPS detection, tap switching and status querying info is taken from
+ * tpconfig utility (by C. Scott Ananian and Bruce Kall).
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include <linux/input.h>
+#include <linux/serio.h>
+
+#include "psmouse.h"
+#include "alps.h"
+
+#undef DEBUG
+#ifdef DEBUG
+#define dbg(format, arg...) printk(KERN_INFO "alps.c: " format "\n", ## arg)
+#else
+#define dbg(format, arg...) do {} while (0)
+#endif
+
+#define ALPS_MODEL_GLIDEPOINT	1
+#define ALPS_MODEL_DUALPOINT	2
+
+struct alps_model_info {
+	unsigned char signature[3];
+	unsigned char model;
+} alps_model_data[] = {
+	{ { 0x33, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x53, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x53, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x73, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x73, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x28 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x3c },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x50 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x63, 0x02, 0x64 },	ALPS_MODEL_GLIDEPOINT },
+	{ { 0x20, 0x02, 0x0e },	ALPS_MODEL_DUALPOINT },
+	{ { 0x22, 0x02, 0x0a },	ALPS_MODEL_DUALPOINT },
+	{ { 0x22, 0x02, 0x14 }, ALPS_MODEL_DUALPOINT },
+};
+
+/*
+ * ALPS abolute Mode
+ * byte 0:  1    1    1    1    1  mid0 rig0 lef0
+ * byte 1:  0   x6   x5   x4   x3   x2   x1   x0
+ * byte 2:  0   x10  x9   x8   x7  up1  fin  ges
+ * byte 3:  0   y9   y8   y7    1  mid1 rig1 lef1
+ * byte 4:  0   y6   y5   y4   y3   y2   y1   y0
+ * byte 5:  0   z6   z5   z4   z3   z2   z1   z0
+ *
+ * On a dualpoint, {mid,rig,lef}0 are the stick, 1 are the pad.
+ * We just 'or' them together for now.
+ *
+ * We used to send 'ges'tures as BTN_TOUCH but this made it impossible
+ * to disable tap events in the synaptics driver since the driver
+ * was unable to distinguish a gesture tap from an actual button click.
+ * A tap gesture now creates an emulated touch that the synaptics
+ * driver can interpret as a tap event, if MaxTapTime=0 and
+ * MaxTapMove=0 then the driver will ignore taps.
+ *
+ * The touchpad on an 'Acer Aspire' has 4 buttons:
+ *   left,right,up,down.
+ * This device always sets {mid,rig,lef}0 to 1 and
+ * reflects left,right,down,up in lef1,rig1,mid1,up1.
+ */
+
+static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs)
+{
+	unsigned char *packet = psmouse->packet;
+	struct input_dev *dev = &psmouse->dev;
+	int x, y, z;
+	int left = 0, right = 0, middle = 0;
+
+	input_regs(dev, regs);
+
+	if ((packet[0] & 0xc8) == 0x08) {   /* 3-byte PS/2 packet */
+		x = packet[1];
+		if (packet[0] & 0x10)
+			x = x - 256;
+		y = packet[2];
+		if (packet[0] & 0x20)
+			y = y - 256;
+		left  = (packet[0]     ) & 1;
+		right = (packet[0] >> 1) & 1;
+
+		input_report_rel(dev, REL_X, x);
+		input_report_rel(dev, REL_Y, -y);
+		input_report_key(dev, BTN_A, left);
+		input_report_key(dev, BTN_B, right);
+		input_sync(dev);
+		return;
+	}
+
+	x = (packet[1] & 0x7f) | ((packet[2] & 0x78)<<(7-3));
+	y = (packet[4] & 0x7f) | ((packet[3] & 0x70)<<(7-4));
+	z = packet[5];
+
+	if (z == 127) {	/* DualPoint stick is relative, not absolute */
+		if (x > 383)
+			x = x - 768;
+		if (y > 255)
+			y = y - 512;
+		left  = packet[3] & 1;
+		right = (packet[3] >> 1) & 1;
+
+		input_report_rel(dev, REL_X, x);
+		input_report_rel(dev, REL_Y, -y);
+		input_report_key(dev, BTN_LEFT, left);
+		input_report_key(dev, BTN_RIGHT, right);
+		input_sync(dev);
+		return;
+	}
+
+	if (z > 30) input_report_key(dev, BTN_TOUCH, 1);
+	if (z < 25) input_report_key(dev, BTN_TOUCH, 0);
+
+	if (z > 0) {
+		input_report_abs(dev, ABS_X, x);
+		input_report_abs(dev, ABS_Y, y);
+	}
+	input_report_abs(dev, ABS_PRESSURE, z);
+	input_report_key(dev, BTN_TOOL_FINGER, z > 0);
+
+	left  |= (packet[2]     ) & 1;
+	left  |= (packet[3]     ) & 1;
+	right |= (packet[3] >> 1) & 1;
+	if (packet[0] == 0xff) {
+		int back    = (packet[3] >> 2) & 1;
+		int forward = (packet[2] >> 2) & 1;
+		if (back && forward) {
+			middle = 1;
+			back = 0;
+			forward = 0;
+		}
+		input_report_key(dev, BTN_BACK,    back);
+		input_report_key(dev, BTN_FORWARD, forward);
+	} else {
+		left   |= (packet[0]     ) & 1;
+		right  |= (packet[0] >> 1) & 1;
+		middle |= (packet[0] >> 2) & 1;
+		middle |= (packet[3] >> 2) & 1;
+	}
+
+	input_report_key(dev, BTN_LEFT, left);
+	input_report_key(dev, BTN_RIGHT, right);
+	input_report_key(dev, BTN_MIDDLE, middle);
+
+	input_sync(dev);
+}
+
+static psmouse_ret_t alps_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
+{
+	if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */
+		if (psmouse->pktcnt == 3) {
+			alps_process_packet(psmouse, regs);
+			return PSMOUSE_FULL_PACKET;
+		}
+		return PSMOUSE_GOOD_DATA;
+	}
+
+	/* ALPS absolute mode packets start with 0b11111mrl */
+	if ((psmouse->packet[0] & 0xf8) != 0xf8)
+		return PSMOUSE_BAD_DATA;
+
+	/* Bytes 2 - 6 should have 0 in the highest bit */
+	if (psmouse->pktcnt > 1 && psmouse->pktcnt <= 6 &&
+	    (psmouse->packet[psmouse->pktcnt] & 0x80))
+		return PSMOUSE_BAD_DATA;
+
+	if (psmouse->pktcnt == 6) {
+		alps_process_packet(psmouse, regs);
+		return PSMOUSE_FULL_PACKET;
+	}
+
+	return PSMOUSE_GOOD_DATA;
+}
+
+int alps_get_model(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+	int i;
+
+	/*
+	 * First try "E6 report".
+	 * ALPS should return 0x00,0x00,0x0a or 0x00,0x00,0x64
+	 */
+	param[0] = 0;
+	if (psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11))
+		return -1;
+
+	param[0] = param[1] = param[2] = 0xff;
+	if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO))
+		return -1;
+
+	dbg("E6 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
+
+	if (param[0] != 0x00 || param[1] != 0x00 || (param[2] != 0x0a && param[2] != 0x64))
+		return -1;
+
+	/* Now try "E7 report". ALPS should return 0x33 in byte 1 */
+	param[0] = 0;
+	if (psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE21) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE21) ||
+	    psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE21))
+		return -1;
+
+	param[0] = param[1] = param[2] = 0xff;
+	if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO))
+		return -1;
+
+	dbg("E7 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
+
+	for (i = 0; i < ARRAY_SIZE(alps_model_data); i++)
+		if (!memcmp(param, alps_model_data[i].signature, sizeof(alps_model_data[i].signature)))
+			return alps_model_data[i].model;
+
+	return -1;
+}
+
+/*
+ * For DualPoint devices select the device that should respond to
+ * subsequent commands. It looks like glidepad is behind stickpointer,
+ * I'd thought it would be other way around...
+ */
+static int alps_passthrough_mode(struct psmouse *psmouse, int enable)
+{
+	unsigned char param[3];
+	int cmd = enable ? PSMOUSE_CMD_SETSCALE21 : PSMOUSE_CMD_SETSCALE11;
+
+	if (psmouse_command(psmouse, NULL, cmd) ||
+	    psmouse_command(psmouse, NULL, cmd) ||
+	    psmouse_command(psmouse, NULL, cmd) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE))
+		return -1;
+
+	/* we may get 3 more bytes, just ignore them */
+	psmouse_command(psmouse, param, 0x0300);
+
+	return 0;
+}
+
+static int alps_magic_knock(struct psmouse *psmouse)
+{
+	/* Try ALPS magic knock - 4 disable before enable */
+	if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_ENABLE))
+		return -1;
+	return 0;
+}
+
+static int alps_absolute_mode(struct psmouse *psmouse)
+{
+	if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS))
+		return -1;
+
+	if (alps_passthrough_mode(psmouse, 1))
+		return -1;
+
+	if (alps_magic_knock(psmouse))
+		return -1;
+
+	if (alps_passthrough_mode(psmouse, 0))
+		return -1;
+
+	if (alps_magic_knock(psmouse))
+		return -1;
+
+	/*
+	 * Switch mouse to poll (remote) mode so motion data will not
+	 * get in our way
+	 */
+	return psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETPOLL);
+}
+
+static int alps_get_status(struct psmouse *psmouse, char *param)
+{
+	/* Get status: 0xF5 0xF5 0xF5 0xE9 */
+	if (psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO))
+		return -1;
+
+	dbg("Status: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);
+
+	return 0;
+}
+
+/*
+ * Turn touchpad tapping on or off. The sequences are:
+ * 0xE9 0xF5 0xF5 0xF3 0x0A to enable,
+ * 0xE9 0xF5 0xF5 0xE8 0x00 to disable.
+ * My guess that 0xE9 (GetInfo) is here as a sync point.
+ * For models that also have stickpointer (DualPoints) its tapping
+ * is controlled separately (0xE6 0xE6 0xE6 0xF3 0x14|0x0A) but
+ * we don't fiddle with it.
+ */
+static int alps_tap_mode(struct psmouse *psmouse, int model, int enable)
+{
+	int rc = 0;
+	int cmd = enable ? PSMOUSE_CMD_SETRATE : PSMOUSE_CMD_SETRES;
+	unsigned char tap_arg = enable ? 0x0A : 0x00;
+	unsigned char param[4];
+
+	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 1))
+		return -1;
+
+	if (psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, NULL, PSMOUSE_CMD_DISABLE) ||
+	    psmouse_command(psmouse, &tap_arg, cmd))
+		rc = -1;
+
+	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 0))
+		return -1;
+
+	if (alps_get_status(psmouse, param))
+		return -1;
+
+
+	return rc;
+}
+
+static int alps_reconnect(struct psmouse *psmouse)
+{
+	int model;
+	unsigned char param[4];
+
+	if ((model = alps_get_model(psmouse)) < 0)
+		return -1;
+
+	if (alps_get_status(psmouse, param))
+		return -1;
+
+	if ((model == ALPS_MODEL_DUALPOINT ? param[2] : param[0]) & 0x04)
+		alps_tap_mode(psmouse, model, 0);
+
+	if (alps_absolute_mode(psmouse)) {
+		printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+static void alps_disconnect(struct psmouse *psmouse)
+{
+	psmouse_reset(psmouse);
+}
+
+int alps_init(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+	int model;
+
+	if ((model = alps_get_model(psmouse)) < 0)
+		return -1;
+
+	if (alps_get_status(psmouse, param)) {
+		printk(KERN_ERR "alps.c: touchpad status report request failed\n");
+		return -1;
+	}
+
+	printk(KERN_INFO "ALPS Touchpad (%s) detected\n",
+		model == ALPS_MODEL_GLIDEPOINT ? "Glidepoint" : "Dualpoint");
+
+	if ((model == ALPS_MODEL_DUALPOINT ? param[2] : param[0]) & 0x04) {
+		printk(KERN_INFO "  Disabling hardware tapping\n");
+		if (alps_tap_mode(psmouse, model, 0))
+			printk(KERN_WARNING "alps.c: Failed to disable hardware tapping\n");
+	}
+
+	if (alps_absolute_mode(psmouse)) {
+		printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
+		return -1;
+	}
+
+	psmouse->dev.evbit[LONG(EV_REL)] |= BIT(EV_REL);
+	psmouse->dev.relbit[LONG(REL_X)] |= BIT(REL_X);
+	psmouse->dev.relbit[LONG(REL_Y)] |= BIT(REL_Y);
+	psmouse->dev.keybit[LONG(BTN_A)] |= BIT(BTN_A);
+	psmouse->dev.keybit[LONG(BTN_B)] |= BIT(BTN_B);
+
+	psmouse->dev.evbit[LONG(EV_ABS)] |= BIT(EV_ABS);
+	input_set_abs_params(&psmouse->dev, ABS_X, 0, 1023, 0, 0);
+	input_set_abs_params(&psmouse->dev, ABS_Y, 0, 1023, 0, 0);
+	input_set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 127, 0, 0);
+
+	psmouse->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);
+	psmouse->dev.keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER);
+	psmouse->dev.keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD);
+	psmouse->dev.keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK);
+
+	psmouse->protocol_handler = alps_process_byte;
+	psmouse->disconnect = alps_disconnect;
+	psmouse->reconnect = alps_reconnect;
+
+	return 0;
+}
+
+int alps_detect(struct psmouse *psmouse)
+{
+	return alps_get_model(psmouse) < 0 ? 0 : 1;
+}
+
diff -Nru a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/drivers/input/mouse/alps.h	2004-09-21 21:20:42 -07:00
@@ -0,0 +1,17 @@
+/*
+ * ALPS touchpad PS/2 mouse driver
+ *
+ * Copyright (c) 2003 Peter Osterlund <petero2@telia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#ifndef _ALPS_H
+#define _ALPS_H
+
+int alps_detect(struct psmouse *psmouse);
+int alps_init(struct psmouse *psmouse);
+
+#endif
diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/mouse/psmouse-base.c	2004-09-21 21:20:42 -07:00
@@ -2,6 +2,7 @@
  * PS/2 mouse driver
  *
  * Copyright (c) 1999-2002 Vojtech Pavlik
+ * Copyright (c) 2003-2004 Dmitry Torokhov
  */
 
 /*
@@ -21,6 +22,7 @@
 #include "psmouse.h"
 #include "synaptics.h"
 #include "logips2pp.h"
+#include "alps.h"
 
 #define DRIVER_DESC	"PS/2 mouse driver"
 
@@ -55,7 +57,7 @@
 __obsolete_setup("psmouse_resetafter=");
 __obsolete_setup("psmouse_rate=");
 
-static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2"};
+static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "ThinkPS/2", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2", "AlpsPS/2" };
 
 /*
  * psmouse_process_byte() analyzes the PS/2 data stream and reports
@@ -110,6 +112,15 @@
 	}
 
 /*
+ * Extra button on ThinkingMouse
+ */
+	if (psmouse->type == PSMOUSE_THINKPS) {
+		input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1);
+		/* Without this bit of weirdness moving up gives wildly high Y changes. */
+		packet[1] |= (packet[0] & 0x40) << 1;
+	}
+
+/*
  * Generic PS/2 Mouse
  */
 
@@ -146,7 +157,7 @@
 				flags & SERIO_PARITY ? " bad parity" : "");
 		psmouse->nak = 1;
 		clear_bit(PSMOUSE_FLAG_ACK, &psmouse->flags);
-		clear_bit(PSMOUSE_FLAG_CMD,  &psmouse->flags);
+		clear_bit(PSMOUSE_FLAG_CMD, &psmouse->flags);
 		wake_up_interruptible(&psmouse->wait);
 		goto out;
 	}
@@ -458,6 +469,26 @@
 }
 
 /*
+ * Kensington ThinkingMouse / ExpertMouse magic init.
+ */
+static int thinking_detect(struct psmouse *psmouse)
+{
+	unsigned char param[2];
+	unsigned char seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20, 0 };
+	int i;
+
+	param[0] = 10;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	param[0] = 0;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	for (i = 0; seq[i]; i++)
+		psmouse_command(psmouse, seq + i, PSMOUSE_CMD_SETRATE);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
+
+	return param[0] == 2;
+}
+
+/*
  * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
  * the mouse may have.
  */
@@ -468,6 +499,22 @@
 	int synaptics_hardware = 0;
 
 /*
+ * Try Kensington ThinkingMouse (we try first, because synaptics probe
+ * upsets the thinkingmouse).
+ */
+
+	if (max_proto > PSMOUSE_PS2 && thinking_detect(psmouse)) {
+
+		if (set_properties) {
+			set_bit(BTN_EXTRA, psmouse->dev.keybit);
+			psmouse->vendor = "Kensington";
+			psmouse->name = "ThinkingMouse";
+		}
+
+		return PSMOUSE_THINKPS;
+	}
+
+/*
  * Try Synaptics TouchPad
  */
 	if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse)) {
@@ -494,6 +541,25 @@
 		synaptics_reset(psmouse);
 	}
 
+/*
+ * Try ALPS TouchPad
+ */
+	if (max_proto > PSMOUSE_IMEX && alps_detect(psmouse)) {
+
+		if (set_properties) {
+			psmouse->vendor = "ALPS";
+			psmouse->name = "TouchPad";
+		}
+
+		if (!set_properties || alps_init(psmouse) == 0)
+			return PSMOUSE_ALPS;
+
+/*
+ * Init failed, try basic relative protocols
+ */
+		max_proto = PSMOUSE_IMEX;
+	}
+
 	if (max_proto > PSMOUSE_IMEX && genius_detect(psmouse)) {
 
 		if (set_properties) {
@@ -608,7 +674,7 @@
 	else if (psmouse_resolution)
 		param[0] = 0;
 
-        psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
 }
 
 /*
@@ -639,7 +705,7 @@
 	if (psmouse_max_proto != PSMOUSE_PS2) {
 		psmouse_set_rate(psmouse);
 		psmouse_set_resolution(psmouse);
-		psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+		psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
 	}
 
 /*
@@ -846,7 +912,7 @@
 	psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
 
 	if (psmouse->reconnect) {
-	       if (psmouse->reconnect(psmouse))
+		if (psmouse->reconnect(psmouse))
 			goto out;
 	} else if (psmouse_probe(psmouse) < 0 ||
 		   psmouse->type != psmouse_extensions(psmouse, psmouse_max_proto, 0))
diff -Nru a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
--- a/drivers/input/mouse/psmouse.h	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/mouse/psmouse.h	2004-09-21 21:20:42 -07:00
@@ -2,9 +2,11 @@
 #define _PSMOUSE_H
 
 #define PSMOUSE_CMD_SETSCALE11	0x00e6
+#define PSMOUSE_CMD_SETSCALE21	0x00e7
 #define PSMOUSE_CMD_SETRES	0x10e8
 #define PSMOUSE_CMD_GETINFO	0x03e9
 #define PSMOUSE_CMD_SETSTREAM	0x00ea
+#define PSMOUSE_CMD_SETPOLL	0x00f0
 #define PSMOUSE_CMD_POLL	0x03eb
 #define PSMOUSE_CMD_GETID	0x02f2
 #define PSMOUSE_CMD_SETRATE	0x10f3
@@ -69,13 +71,18 @@
 	void (*pt_deactivate)(struct psmouse *psmouse);
 };
 
-#define PSMOUSE_PS2		1
-#define PSMOUSE_PS2PP		2
-#define PSMOUSE_PS2TPP		3
-#define PSMOUSE_GENPS		4
-#define PSMOUSE_IMPS		5
-#define PSMOUSE_IMEX		6
-#define PSMOUSE_SYNAPTICS 	7
+enum psmouse_type {
+	PSMOUSE_NONE,
+	PSMOUSE_PS2,
+	PSMOUSE_PS2PP,
+	PSMOUSE_PS2TPP,
+	PSMOUSE_THINKPS,
+	PSMOUSE_GENPS,
+	PSMOUSE_IMPS,
+	PSMOUSE_IMEX,
+	PSMOUSE_SYNAPTICS,
+	PSMOUSE_ALPS,
+};
 
 int psmouse_command(struct psmouse *psmouse, unsigned char *param, int command);
 int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command);
diff -Nru a/drivers/input/mousedev.c b/drivers/input/mousedev.c
--- a/drivers/input/mousedev.c	2004-09-21 21:20:42 -07:00
+++ b/drivers/input/mousedev.c	2004-09-21 21:20:42 -07:00
@@ -115,20 +115,26 @@
 #define fx(i)  (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
 #define fy(i)  (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
 
-static void mousedev_touchpad_event(struct mousedev *mousedev, unsigned int code, int value)
+static void mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mousedev, unsigned int code, int value)
 {
+	int size;
+
 	if (mousedev->touch) {
 		switch (code) {
 			case ABS_X:
+				size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
+				if (size == 0) size = xres;
 				fx(0) = value;
 				if (mousedev->pkt_count >= 2)
-					mousedev->packet.dx = ((fx(0) - fx(1)) / 2 + (fx(1) - fx(2)) / 2) / 8;
+					mousedev->packet.dx = ((fx(0) - fx(1)) / 2 + (fx(1) - fx(2)) / 2) * xres / (size * 2);
 				break;
 
 			case ABS_Y:
+				size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y];
+				if (size == 0) size = yres;
 				fy(0) = value;
 				if (mousedev->pkt_count >= 2)
-					mousedev->packet.dy = -((fy(0) - fy(1)) / 2 + (fy(1) - fy(2)) / 2) / 8;
+					mousedev->packet.dy = -((fy(0) - fy(1)) / 2 + (fy(1) - fy(2)) / 2) * yres / (size * 2);
 				break;
 		}
 	}
@@ -279,7 +285,7 @@
 				return;
 
 			if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
-				mousedev_touchpad_event(mousedev, code, value);
+				mousedev_touchpad_event(handle->dev, mousedev, code, value);
 			else
 				mousedev_abs_event(handle->dev, mousedev, code, value);
 
diff -Nru a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
--- a/drivers/usb/input/hid-core.c	2004-09-21 21:20:42 -07:00
+++ b/drivers/usb/input/hid-core.c	2004-09-21 21:20:42 -07:00
@@ -1275,9 +1275,14 @@
 static int hid_get_class_descriptor(struct usb_device *dev, int ifnum,
 		unsigned char type, void *buf, int size)
 {
-	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
-		USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
-		(type << 8), ifnum, buf, size, HZ * USB_CTRL_GET_TIMEOUT);
+	int result, retries = 4;
+	do {
+		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+				USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
+				(type << 8), ifnum, buf, size, HZ * USB_CTRL_GET_TIMEOUT);
+		retries--;
+	} while (result < 0 && retries);
+	return result;
 }
 
 int hid_open(struct hid_device *hid)
