summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Mochel <mochel@osdl.org>2002-12-02 03:18:07 -0600
committerPatrick Mochel <mochel@osdl.org>2002-12-02 03:18:07 -0600
commit94d24994e77e724d8e27e44c36e3d0877cf7222d (patch)
tree39a51f4dc1c4c5aeaa8d220057966140a01a469a
parentc445065596bb32adc9bf3f31b50657de41496b1c (diff)
parent467578b996aca77ad96b13d0c475227cf7ee753a (diff)
Merge osdl.org:/home/mochel/src/kernel/devel/linux-2.5-virgin
into osdl.org:/home/mochel/src/kernel/devel/linux-2.5-core
-rw-r--r--Documentation/filesystems/vfat.txt4
-rw-r--r--arch/parisc/kernel/Makefile3
-rw-r--r--arch/parisc/kernel/keyboard.c101
-rw-r--r--arch/sparc/kernel/sparc_ksyms.c6
-rw-r--r--arch/sparc/kernel/sys_sunos.c2
-rw-r--r--arch/sparc/kernel/tick14.c1
-rw-r--r--arch/sparc/mm/iommu.c4
-rw-r--r--arch/sparc64/Makefile5
-rw-r--r--arch/sparc64/kernel/smp.c78
-rw-r--r--arch/sparc64/kernel/sys_sparc32.c3
-rw-r--r--arch/sparc64/solaris/ioctl.c2
-rw-r--r--drivers/char/hp_keyb.c519
-rw-r--r--drivers/char/hp_psaux.c551
-rw-r--r--drivers/ide/ide-geometry.c77
-rw-r--r--drivers/ide/ide-probe.c6
-rw-r--r--drivers/input/misc/Kconfig9
-rw-r--r--drivers/input/misc/Makefile5
-rw-r--r--drivers/input/misc/gsc_ps2.c699
-rw-r--r--drivers/media/video/tuner.c2
-rw-r--r--drivers/serial/sunzilog.c5
-rw-r--r--fs/xfs/support/move.c1
-rw-r--r--include/asm-sparc/elf.h2
-rw-r--r--include/asm-sparc/hardirq.h1
-rw-r--r--include/asm-sparc/io.h3
-rw-r--r--include/asm-sparc/irq.h2
-rw-r--r--include/asm-sparc/page.h3
-rw-r--r--include/asm-sparc64/irq.h2
-rw-r--r--include/asm-sparc64/rwsem.h2
-rw-r--r--include/asm-sparc64/system.h12
-rw-r--r--sound/core/ioctl32/ioctl32.c1
-rw-r--r--sound/core/ioctl32/rawmidi32.c1
-rw-r--r--sound/core/ioctl32/seq32.c1
-rw-r--r--sound/core/ioctl32/timer32.c1
33 files changed, 796 insertions, 1318 deletions
diff --git a/Documentation/filesystems/vfat.txt b/Documentation/filesystems/vfat.txt
index 7bb45c085eb4..e41109f88dac 100644
--- a/Documentation/filesystems/vfat.txt
+++ b/Documentation/filesystems/vfat.txt
@@ -8,10 +8,12 @@ if you want to format from within Linux.
VFAT MOUNT OPTIONS
----------------------------------------------------------------------
-umask=### -- The permission mask (see umask(1)) for the regulare file.
+umask=### -- The permission mask (for files and directories, see umask(1)).
The default is the umask of current process.
dmask=### -- The permission mask for the directory.
The default is the umask of current process.
+fmask=### -- The permission mask for files.
+ The default is the umask of current process.
codepage=### -- Sets the codepage for converting to shortname characters
on FAT and VFAT filesystems. By default, codepage 437
is used. This is the default for the U.S. and some
diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile
index e5151a06241d..404cf4862226 100644
--- a/arch/parisc/kernel/Makefile
+++ b/arch/parisc/kernel/Makefile
@@ -11,7 +11,7 @@ endif
AFLAGS_entry.o := -traditional
AFLAGS_pacache.o := -traditional
-export-objs := parisc_ksyms.o keyboard.o
+export-objs := parisc_ksyms.o
obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \
pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \
@@ -22,7 +22,6 @@ obj-y := cache.o pacache.o setup.o traps.o time.o irq.o \
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_PA11) += pci-dma.o
obj-$(CONFIG_PCI) += pci.o
-obj-$(CONFIG_VT) += keyboard.o
obj-$(CONFIG_PARISC64) += binfmt_elf32.o sys_parisc32.o \
ioctl32.o signal32.o
# only supported for PCX-W/U in 64-bit mode at the moment
diff --git a/arch/parisc/kernel/keyboard.c b/arch/parisc/kernel/keyboard.c
deleted file mode 100644
index 296d118cd23f..000000000000
--- a/arch/parisc/kernel/keyboard.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
- * ---------------------------------------------------------------
- * This source file will be removed as soon as we have converted
- * hp_psaux.c and hp_keyb.c to the input layer !
- *
- */
-
-/*
- * linux/arch/parisc/kernel/keyboard.c
- *
- * Alex deVries <adevries@thepuffingroup.com>
- * Copyright (1999) The Puffin Group
- * Mostly rewritten by Philipp Rumpf <prumpf@tux.org>
- * Copyright 2000 Philipp Rumpf
- */
-
-#include <linux/errno.h>
-#include <linux/keyboard.h>
-#include <asm/keyboard.h>
-#include <linux/module.h>
-
-static int def_setkeycode(unsigned int x, unsigned int y)
-{
- return 0;
-}
-
-static int def_getkeycode(unsigned int x)
-{
- return 0;
-}
-
-static int def_translate(unsigned char scancode, unsigned char *keycode,
- char raw)
-{
- *keycode = scancode;
-
- return 1;
-}
-
-static char def_unexpected_up(unsigned char c)
-{
- return 128;
-}
-
-static void def_leds(unsigned char leds)
-{
-}
-
-static void def_init_hw(void)
-{
-}
-
-static char def_sysrq_xlate[NR_KEYS];
-
-#define DEFAULT_KEYB_OPS \
- .setkeycode = def_setkeycode, \
- .getkeycode = def_getkeycode, \
- .translate = def_translate, \
- .unexpected_up = def_unexpected_up, \
- .leds = def_leds, \
- .init_hw = def_init_hw, \
- .sysrq_key = 0xff, \
- .sysrq_xlate = def_sysrq_xlate,
-
-static struct kbd_ops def_kbd_ops = {
- DEFAULT_KEYB_OPS
-};
-
-struct kbd_ops *kbd_ops = &def_kbd_ops;
-
-void unregister_kbd_ops(void)
-{
- struct kbd_ops new_kbd_ops = { DEFAULT_KEYB_OPS };
- register_kbd_ops(&new_kbd_ops);
-}
-EXPORT_SYMBOL(unregister_kbd_ops);
-
-void register_kbd_ops(struct kbd_ops *ops)
-{
- if(ops->setkeycode)
- kbd_ops->setkeycode = ops->setkeycode;
-
- if(ops->getkeycode)
- kbd_ops->getkeycode = ops->getkeycode;
-
- if(ops->translate)
- kbd_ops->translate = ops->translate;
-
- if(ops->unexpected_up)
- kbd_ops->unexpected_up = ops->unexpected_up;
-
- if(ops->leds)
- kbd_ops->leds = ops->leds;
-
- if(ops->init_hw)
- kbd_ops->init_hw = ops->init_hw;
-
- kbd_ops->sysrq_key = ops->sysrq_key;
- kbd_ops->sysrq_xlate = ops->sysrq_xlate;
-}
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
index 4e6d14aba32d..1adbf88aee8f 100644
--- a/arch/sparc/kernel/sparc_ksyms.c
+++ b/arch/sparc/kernel/sparc_ksyms.c
@@ -90,11 +90,13 @@ extern void dump_thread(struct pt_regs *, struct user *);
#define EXPORT_SYMBOL_DOT(sym) \
extern int __sparc_dot_ ## sym (int) __asm__("." #sym); \
-__EXPORT_SYMBOL(__sparc_dot_ ## sym, "." #sym)
+const struct kernel_symbol __ksymtab___sparc_dot_##sym \
+__attribute__((section("__ksymtab"))) \
+= { (unsigned long)&__sparc_dot_##sym , "." #sym }
#define EXPORT_SYMBOL_PRIVATE(sym) \
extern int __sparc_priv_ ## sym (int) __asm__("__" #sym); \
-const struct module_symbol __export_priv_##sym \
+const struct kernel_symbol __export_priv_##sym \
__attribute__((section("__ksymtab"))) = \
{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym }
diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c
index a8ca7ceffa46..1babc9d4d326 100644
--- a/arch/sparc/kernel/sys_sunos.c
+++ b/arch/sparc/kernel/sys_sunos.c
@@ -34,6 +34,8 @@
#include <linux/smp.h>
#include <linux/smp_lock.h>
+#include <net/sock.h>
+
#include <asm/uaccess.h>
#ifndef KERNEL_DS
#include <linux/segment.h>
diff --git a/arch/sparc/kernel/tick14.c b/arch/sparc/kernel/tick14.c
index 387b0f792c42..4a304b6efcd3 100644
--- a/arch/sparc/kernel/tick14.c
+++ b/arch/sparc/kernel/tick14.c
@@ -16,6 +16,7 @@
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/timex.h>
+#include <linux/interrupt.h>
#include <asm/oplib.h>
#include <asm/segment.h>
diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c
index bfd111abb687..1aefe5f9bbb3 100644
--- a/arch/sparc/mm/iommu.c
+++ b/arch/sparc/mm/iommu.c
@@ -192,9 +192,9 @@ static void iommu_get_scsi_sgl_pflush(struct scatterlist *sg, int sz, struct sbu
{
unsigned long page, oldpage = 0;
- while(sz >= 0) {
+ while(sz != 0) {
--sz;
- page = ((unsigned long) sg[sz].offset) & PAGE_MASK;
+ page = (unsigned long) page_address(sg[sz].page);
if (oldpage == page)
page += PAGE_SIZE; /* We flushed that page already */
while(page < (unsigned long)(page_address(sg[sz].page) + sg[sz].offset + sg[sz].length)) {
diff --git a/arch/sparc64/Makefile b/arch/sparc64/Makefile
index 5c3010bb681d..82aa13f717a9 100644
--- a/arch/sparc64/Makefile
+++ b/arch/sparc64/Makefile
@@ -19,6 +19,7 @@ CC := $(shell if gcc -m64 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then e
NEW_GCC := $(shell if $(CC) -m64 -mcmodel=medlow -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo y; else echo n; fi; )
NEW_GAS := $(shell if $(LD) -V 2>&1 | grep 'elf64_sparc' > /dev/null; then echo y; else echo n; fi)
UNDECLARED_REGS := $(shell if $(CC) -c -x assembler /dev/null -Wa,--help | grep undeclared-regs > /dev/null; then echo y; else echo n; fi; )
+INLINE_LIMIT := $(shell if $(CC) -m64 -finline-limit=100000 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo y; else echo n; fi; )
export NEW_GCC
@@ -51,6 +52,10 @@ else
AFLAGS += -m64 -mcpu=ultrasparc $(CC_UNDECL)
endif
+ifeq ($(INLINE_LIMIT),y)
+ CFLAGS := $(CFLAGS) -finline-limit=100000
+endif
+
ifeq ($(CONFIG_MCOUNT),y)
CFLAGS := $(subst -fomit-frame-pointer,,$(CFLAGS))
CFLAGS := $(CFLAGS) -pg
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index d5c544b6bc4b..1323bf050e2f 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -145,28 +145,28 @@ void __init smp_callin(void)
* purposes. Also workaround BB_ERRATA_1 by doing a dummy
* read back of %tick after writing it.
*/
- __asm__ __volatile__("
- sethi %%hi(0x80000000), %%g1
- ba,pt %%xcc, 1f
- sllx %%g1, 32, %%g1
- .align 64
-1: rd %%tick, %%g2
- add %%g2, 6, %%g2
- andn %%g2, %%g1, %%g2
- wrpr %%g2, 0, %%tick
- rdpr %%tick, %%g0"
+ __asm__ __volatile__(
+ "sethi %%hi(0x80000000), %%g1\n\t"
+ "ba,pt %%xcc, 1f\n\t"
+ " sllx %%g1, 32, %%g1\n\t"
+ ".align 64\n"
+"1: rd %%tick, %%g2\n\t"
+ "add %%g2, 6, %%g2\n\t"
+ "andn %%g2, %%g1, %%g2\n\t"
+ "wrpr %%g2, 0, %%tick\n\t"
+ "rdpr %%tick, %%g0"
: /* no outputs */
: /* no inputs */
: "g1", "g2");
if (SPARC64_USE_STICK) {
/* Let the user get at STICK too. */
- __asm__ __volatile__("
- sethi %%hi(0x80000000), %%g1
- sllx %%g1, 32, %%g1
- rd %%asr24, %%g2
- andn %%g2, %%g1, %%g2
- wr %%g2, 0, %%asr24"
+ __asm__ __volatile__(
+ "sethi %%hi(0x80000000), %%g1\n\t"
+ "sllx %%g1, 32, %%g1\n\t"
+ "rd %%asr24, %%g2\n\t"
+ "andn %%g2, %%g1, %%g2\n\t"
+ "wr %%g2, 0, %%asr24"
: /* no outputs */
: /* no inputs */
: "g1", "g2");
@@ -283,18 +283,18 @@ again:
* ADDR 0x20) for the dummy read. -DaveM
*/
tmp = 0x40;
- __asm__ __volatile__("
- wrpr %1, %2, %%pstate
- stxa %4, [%0] %3
- stxa %5, [%0+%8] %3
- add %0, %8, %0
- stxa %6, [%0+%8] %3
- membar #Sync
- stxa %%g0, [%7] %3
- membar #Sync
- mov 0x20, %%g1
- ldxa [%%g1] 0x7f, %%g0
- membar #Sync"
+ __asm__ __volatile__(
+ "wrpr %1, %2, %%pstate\n\t"
+ "stxa %4, [%0] %3\n\t"
+ "stxa %5, [%0+%8] %3\n\t"
+ "add %0, %8, %0\n\t"
+ "stxa %6, [%0+%8] %3\n\t"
+ "membar #Sync\n\t"
+ "stxa %%g0, [%7] %3\n\t"
+ "membar #Sync\n\t"
+ "mov 0x20, %%g1\n\t"
+ "ldxa [%%g1] 0x7f, %%g0\n\t"
+ "membar #Sync"
: "=r" (tmp)
: "r" (pstate), "i" (PSTATE_IE), "i" (ASI_INTR_W),
"r" (data0), "r" (data1), "r" (data2), "r" (target),
@@ -1054,21 +1054,21 @@ static void __init smp_setup_percpu_timer(void)
* read back from %tick_cmpr right after writing to it. -DaveM
*/
if (!SPARC64_USE_STICK) {
- __asm__ __volatile__("
- rd %%tick, %%g1
- ba,pt %%xcc, 1f
- add %%g1, %0, %%g1
- .align 64
- 1: wr %%g1, 0x0, %%tick_cmpr
- rd %%tick_cmpr, %%g0"
+ __asm__ __volatile__(
+ "rd %%tick, %%g1\n\t"
+ "ba,pt %%xcc, 1f\n\t"
+ " add %%g1, %0, %%g1\n\t"
+ ".align 64\n"
+ "1: wr %%g1, 0x0, %%tick_cmpr\n\t"
+ "rd %%tick_cmpr, %%g0"
: /* no outputs */
: "r" (current_tick_offset)
: "g1");
} else {
- __asm__ __volatile__("
- rd %%asr24, %%g1
- add %%g1, %0, %%g1
- wr %%g1, 0x0, %%asr25"
+ __asm__ __volatile__(
+ "rd %%asr24, %%g1\n\t"
+ "add %%g1, %0, %%g1\n\t"
+ "wr %%g1, 0x0, %%asr25"
: /* no outputs */
: "r" (current_tick_offset)
: "g1");
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
index 001ce5705865..8133eb418fb7 100644
--- a/arch/sparc64/kernel/sys_sparc32.c
+++ b/arch/sparc64/kernel/sys_sparc32.c
@@ -51,6 +51,7 @@
#include <linux/sysctl.h>
#include <linux/binfmts.h>
#include <linux/dnotify.h>
+#include <linux/security.h>
#include <asm/types.h>
#include <asm/ipc.h>
@@ -1096,7 +1097,7 @@ out_nofree:
/* VERIFY_WRITE actually means a read, as we write to user space */
if ((retval + (type == VERIFY_WRITE)) > 0)
dnotify_parent(file->f_dentry,
- (type == VERIFY_WRITE) ? DN_MODIFY : DN_ACCESS);
+ (type == VERIFY_WRITE) ? DN_ACCESS : DN_MODIFY);
return retval;
}
diff --git a/arch/sparc64/solaris/ioctl.c b/arch/sparc64/solaris/ioctl.c
index 6fdf08d880e7..0288fdbee40b 100644
--- a/arch/sparc64/solaris/ioctl.c
+++ b/arch/sparc64/solaris/ioctl.c
@@ -369,6 +369,7 @@ static inline int solaris_sockmod(unsigned int fd, unsigned int cmd, u32 arg)
case 106: /* SI_GETINTRANSIT */
case 107: /* SI_TCL_LINK */
case 108: /* SI_TCL_UNLINK */
+ ;
}
return TNOTSUPPORT;
}
@@ -456,6 +457,7 @@ static inline int solaris_timod(unsigned int fd, unsigned int cmd, u32 arg,
case 145: /* TI_GETPEERNAME */
case 146: /* TI_SETMYNAME */
case 147: /* TI_SETPEERNAME */
+ ;
}
return TNOTSUPPORT;
}
diff --git a/drivers/char/hp_keyb.c b/drivers/char/hp_keyb.c
deleted file mode 100644
index 1453a661db01..000000000000
--- a/drivers/char/hp_keyb.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * linux/drivers/char/hp_keyb.c
- * helper-functions for the keyboard/psaux driver for HP-PARISC workstations
- *
- * based on pc_keyb.c by Geert Uytterhoeven & Martin Mares
- *
- * 2000/10/26 Debacker Xavier <debackex@esiee.fr>
- * Marteau Thomas <marteaut@esiee.fr>
- * Djoudi Malek <djoudim@esiee.fr>
- * - fixed some keysym defines
- *
- * 2001/04/28 Debacker Xavier <debackex@esiee.fr>
- * - scancode translation rewritten in handle_at_scancode()
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/ptrace.h>
-#include <linux/signal.h>
-#include <linux/timer.h>
-#include <linux/random.h>
-#include <linux/ctype.h>
-#include <linux/kbd_ll.h>
-#include <linux/init.h>
-
-#include <asm/bitops.h>
-#include <asm/irq.h>
-#include <asm/hardware.h>
-#include <asm/io.h>
-#include <asm/system.h>
-
-#define KBD_REPORT_ERR
-#define KBD_REPORT_UNKN
-
-#define KBD_ESCAPEE0 0xe0 /* in */
-#define KBD_ESCAPEE1 0xe1 /* in */
-
-#define ESCE0(x) (0xe000|(x))
-#define ESCE1(x) (0xe100|(x))
-
-#define KBD_BAT 0xaa /* in */
-#define KBD_SETLEDS 0xed /* out */
-#define KBD_ECHO 0xee /* in/out */
-#define KBD_BREAK 0xf0 /* in */
-#define KBD_TYPRATEDLY 0xf3 /* out */
-#define KBD_SCANENABLE 0xf4 /* out */
-#define KBD_DEFDISABLE 0xf5 /* out */
-#define KBD_DEFAULT 0xf6 /* out */
-#define KBD_ACK 0xfa /* in */
-#define KBD_DIAGFAIL 0xfd /* in */
-#define KBD_RESEND 0xfe /* in/out */
-#define KBD_RESET 0xff /* out */
-
-#define CODE_BREAK 1
-#define CODE_ESCAPEE0 2
-#define CODE_ESCAPEE1 4
-#define CODE_ESCAPE12 8
-
-#define K_NONE 0x7f
-#define K_ESC 0x01
-#define K_F1 0x3b
-#define K_F2 0x3c
-#define K_F3 0x3d
-#define K_F4 0x3e
-#define K_F5 0x3f
-#define K_F6 0x40
-#define K_F7 0x41
-#define K_F8 0x42
-#define K_F9 0x43
-#define K_F10 0x44
-#define K_F11 0x57
-#define K_F12 0x58
-#define K_PRNT 0x54
-#define K_SCRL 0x46
-#define K_BRK 0x77
-#define K_AGR 0x29
-#define K_1 0x02
-#define K_2 0x03
-#define K_3 0x04
-#define K_4 0x05
-#define K_5 0x06
-#define K_6 0x07
-#define K_7 0x08
-#define K_8 0x09
-#define K_9 0x0a
-#define K_0 0x0b
-#define K_MINS 0x0c
-#define K_EQLS 0x0d
-#define K_BKSP 0x0e
-#define K_INS 0x6e
-#define K_HOME 0x66
-#define K_PGUP 0x68
-#define K_NUML 0x45
-#define KP_SLH 0x62
-#define KP_STR 0x37
-#define KP_MNS 0x4a
-#define K_TAB 0x0f
-#define K_Q 0x10
-#define K_W 0x11
-#define K_E 0x12
-#define K_R 0x13
-#define K_T 0x14
-#define K_Y 0x15
-#define K_U 0x16
-#define K_I 0x17
-#define K_O 0x18
-#define K_P 0x19
-#define K_LSBK 0x1a
-#define K_RSBK 0x1b
-#define K_ENTR 0x1c
-#define K_DEL 111
-#define K_END 0x6b
-#define K_PGDN 0x6d
-#define KP_7 0x47
-#define KP_8 0x48
-#define KP_9 0x49
-#define KP_PLS 0x4e
-#define K_CAPS 0x3a
-#define K_A 0x1e
-#define K_S 0x1f
-#define K_D 0x20
-#define K_F 0x21
-#define K_G 0x22
-#define K_H 0x23
-#define K_J 0x24
-#define K_K 0x25
-#define K_L 0x26
-#define K_SEMI 0x27
-#define K_SQOT 0x28
-#define K_HASH K_NONE
-#define KP_4 0x4b
-#define KP_5 0x4c
-#define KP_6 0x4d
-#define K_LSFT 0x2a
-#define K_BSLH 0x2b
-#define K_Z 0x2c
-#define K_X 0x2d
-#define K_C 0x2e
-#define K_V 0x2f
-#define K_B 0x30
-#define K_N 0x31
-#define K_M 0x32
-#define K_COMA 0x33
-#define K_DOT 0x34
-#define K_FSLH 0x35
-#define K_RSFT 0x36
-#define K_UP 0x67
-#define KP_1 0x4f
-#define KP_2 0x50
-#define KP_3 0x51
-#define KP_ENT 0x60
-#define K_LCTL 0x1d
-#define K_LALT 0x38
-#define K_SPCE 0x39
-#define K_RALT 0x64
-#define K_RCTL 0x61
-#define K_LEFT 0x69
-#define K_DOWN 0x6c
-#define K_RGHT 0x6a
-#define KP_0 0x52
-#define KP_DOT 0x53
-
-static unsigned char keycode_translate[256] =
-{
-/* 00 */ K_NONE, K_F9 , K_NONE, K_F5 , K_F3 , K_F1 , K_F2 , K_F12 ,
-/* 08 */ K_NONE, K_F10 , K_F8 , K_F6 , K_F4 , K_TAB , K_AGR , K_NONE,
-/* 10 */ K_NONE, K_LALT, K_LSFT, K_NONE, K_LCTL, K_Q , K_1 , K_NONE,
-/* 18 */ K_NONE, K_NONE, K_Z , K_S , K_A , K_W , K_2 , K_NONE,
-/* 20 */ K_NONE, K_C , K_X , K_D , K_E , K_4 , K_3 , K_NONE,
-/* 28 */ K_NONE, K_SPCE, K_V , K_F , K_T , K_R , K_5 , K_NONE,
-/* 30 */ K_NONE, K_N , K_B , K_H , K_G , K_Y , K_6 , K_NONE,
-/* 38 */ K_NONE, K_NONE, K_M , K_J , K_U , K_7 , K_8 , K_NONE,
-/* 40 */ K_NONE, K_COMA, K_K , K_I , K_O , K_0 , K_9 , K_NONE,
-/* 48 */ K_NONE, K_DOT , K_FSLH, K_L , K_SEMI, K_P , K_MINS, K_NONE,
-/* 50 */ K_NONE, K_NONE, K_SQOT, K_NONE, K_LSBK, K_EQLS, K_NONE, K_NONE,
-/* 58 */ K_CAPS, K_RSFT, K_ENTR, K_RSBK, K_NONE, K_BSLH, K_NONE, K_NONE,
-/* 60 */ K_NONE, K_HASH, K_NONE, K_NONE, K_NONE, K_NONE, K_BKSP, K_NONE,
-/* 68 */ K_NONE, KP_1 , K_NONE, KP_4 , KP_7 , K_NONE, K_NONE, K_NONE,
-/* 70 */ KP_0 , KP_DOT, KP_2 , KP_5 , KP_6 , KP_8 , K_ESC , K_NUML,
-/* 78 */ K_F11 , KP_PLS, KP_3 , KP_MNS, KP_STR, KP_9 , K_SCRL, K_PRNT,
-/* 80 */ K_NONE, K_NONE, K_NONE, K_F7 , K_NONE, K_NONE, K_NONE, K_NONE,
-/* 88 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* 90 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* 98 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* a0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* a8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* b0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* b8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* c0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* c8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* d0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* d8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* e0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* e8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* f0 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
-/* f8 */ K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, KBD_RESEND, K_NONE
-};
-
-/* ----- the following code stolen from pc_keyb.c */
-
-
-#ifdef CONFIG_MAGIC_SYSRQ
-unsigned char hp_ps2kbd_sysrq_xlate[128] =
- "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */
- "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */
- "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */
- "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
- "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
- "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
- "\r\000/"; /* 0x60 - 0x6f */
-#endif
-
-/*
- * Translation of escaped scancodes to keycodes.
- * This is now user-settable.
- * The keycodes 1-88,96-111,119 are fairly standard, and
- * should probably not be changed - changing might confuse X.
- * X also interprets scancode 0x5d (KEY_Begin).
- *
- * For 1-88 keycode equals scancode.
- */
-
-#define E0_KPENTER 96
-#define E0_RCTRL 97
-#define E0_KPSLASH 98
-#define E0_PRSCR 99
-#define E0_RALT 100
-#define E0_BREAK 101 /* (control-pause) */
-#define E0_HOME 102
-#define E0_UP 103
-#define E0_PGUP 104
-#define E0_LEFT 105
-#define E0_RIGHT 106
-#define E0_END 107
-#define E0_DOWN 108
-#define E0_PGDN 109
-#define E0_INS 110
-#define E0_DEL 111
-
-#define E1_PAUSE 119
-
-/*
- * The keycodes below are randomly located in 89-95,112-118,120-127.
- * They could be thrown away (and all occurrences below replaced by 0),
- * but that would force many users to use the `setkeycodes' utility, where
- * they needed not before. It does not matter that there are duplicates, as
- * long as no duplication occurs for any single keyboard.
- */
-#define SC_LIM 89 /* 0x59 == 89 */
-
-#define FOCUS_PF1 85 /* actual code! */
-#define FOCUS_PF2 89
-#define FOCUS_PF3 90
-#define FOCUS_PF4 91
-#define FOCUS_PF5 92
-#define FOCUS_PF6 93
-#define FOCUS_PF7 94
-#define FOCUS_PF8 95
-#define FOCUS_PF9 120
-#define FOCUS_PF10 121
-#define FOCUS_PF11 122
-#define FOCUS_PF12 123
-
-#define JAP_86 124
-/* tfj@olivia.ping.dk:
- * The four keys are located over the numeric keypad, and are
- * labelled A1-A4. It's an rc930 keyboard, from
- * Regnecentralen/RC International, Now ICL.
- * Scancodes: 59, 5a, 5b, 5c.
- */
-#define RGN1 124
-#define RGN2 125
-#define RGN3 126
-#define RGN4 127
-
-static unsigned char high_keys[128 - SC_LIM] = {
- RGN1, RGN2, RGN3, RGN4, 0, 0, 0, /* 0x59-0x5f */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */
- 0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12, /* 0x68-0x6f */
- 0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3, /* 0x70-0x77 */
- FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7, /* 0x78-0x7b */
- FOCUS_PF8, JAP_86, FOCUS_PF10, 0 /* 0x7c-0x7f */
-};
-
-/* BTC */
-#define E0_MACRO 112
-/* LK450 */
-#define E0_F13 113
-#define E0_F14 114
-#define E0_HELP 115
-#define E0_DO 116
-#define E0_F17 117
-#define E0_KPMINPLUS 118
-/*
- * My OmniKey generates e0 4c for the "OMNI" key and the
- * right alt key does nada. [kkoller@nyx10.cs.du.edu]
- */
-#define E0_OK 124
-/*
- * New microsoft keyboard is rumoured to have
- * e0 5b (left window button), e0 5c (right window button),
- * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU]
- * [or: Windows_L, Windows_R, TaskMan]
- */
-#define E0_MSLW 125
-#define E0_MSRW 126
-#define E0_MSTM 127
-
-static unsigned char e0_keys[128] = {
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x07 */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x08-0x0f */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x17 */
- 0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0, /* 0x18-0x1f */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x27 */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x28-0x2f */
- 0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR, /* 0x30-0x37 */
- E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP, /* 0x38-0x3f */
- E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME, /* 0x40-0x47 */
- E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */
- E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0, /* 0x50-0x57 */
- 0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0, /* 0x58-0x5f */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */
- 0, 0, 0, 0, 0, 0, 0, E0_MACRO, /* 0x68-0x6f */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x77 */
- 0, 0, 0, 0, 0, 0, 0, 0 /* 0x78-0x7f */
-};
-
-int pckbd_setkeycode(unsigned int scancode, unsigned int keycode)
-{
- if (scancode < SC_LIM || scancode > 255 || keycode > 127)
- return -EINVAL;
- if (scancode < 128)
- high_keys[scancode - SC_LIM] = keycode;
- else
- e0_keys[scancode - 128] = keycode;
- return 0;
-}
-
-int pckbd_getkeycode(unsigned int scancode)
-{
- return
- (scancode < SC_LIM || scancode > 255) ? -EINVAL :
- (scancode < 128) ? high_keys[scancode - SC_LIM] :
- e0_keys[scancode - 128];
-}
-
-int pckbd_translate(unsigned char scancode, unsigned char *keycode,
- char raw_mode)
-{
- static int prev_scancode;
-
- /* special prefix scancodes.. */
- if (scancode == 0xe0 || scancode == 0xe1) {
- prev_scancode = scancode;
- return 0;
- }
-
- /* 0xFF is sent by a few keyboards, ignore it. 0x00 is error */
- if (scancode == 0x00 || scancode == 0xff) {
- prev_scancode = 0;
- return 0;
- }
- scancode &= 0x7f;
-
- if (prev_scancode) {
- /*
- * usually it will be 0xe0, but a Pause key generates
- * e1 1d 45 e1 9d c5 when pressed, and nothing when released
- */
- if (prev_scancode != 0xe0) {
- if (prev_scancode == 0xe1 && scancode == 0x1d) {
- prev_scancode = 0x100;
- return 0;
- } else if (prev_scancode == 0x100 && scancode == 0x45) {
- *keycode = E1_PAUSE;
- prev_scancode = 0;
- } else {
-#ifdef KBD_REPORT_UNKN
- if (!raw_mode)
- printk(KERN_INFO "keyboard: unknown e1 escape sequence\n");
-#endif
- prev_scancode = 0;
- return 0;
- }
- } else {
- prev_scancode = 0;
- /*
- * The keyboard maintains its own internal caps lock and
- * num lock statuses. In caps lock mode E0 AA precedes make
- * code and E0 2A follows break code. In num lock mode,
- * E0 2A precedes make code and E0 AA follows break code.
- * We do our own book-keeping, so we will just ignore these.
- */
- /*
- * For my keyboard there is no caps lock mode, but there are
- * both Shift-L and Shift-R modes. The former mode generates
- * E0 2A / E0 AA pairs, the latter E0 B6 / E0 36 pairs.
- * So, we should also ignore the latter. - aeb@cwi.nl
- */
- if (scancode == 0x2a || scancode == 0x36)
- return 0;
-
- if (e0_keys[scancode])
- *keycode = e0_keys[scancode];
- else {
-#ifdef KBD_REPORT_UNKN
- if (!raw_mode)
- printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n",
- scancode);
-#endif
- return 0;
- }
- }
- } else if (scancode >= SC_LIM) {
- /* This happens with the FOCUS 9000 keyboard
- Its keys PF1..PF12 are reported to generate
- 55 73 77 78 79 7a 7b 7c 74 7e 6d 6f
- Moreover, unless repeated, they do not generate
- key-down events, so we have to zero up_flag below */
- /* Also, Japanese 86/106 keyboards are reported to
- generate 0x73 and 0x7d for \ - and \ | respectively. */
- /* Also, some Brazilian keyboard is reported to produce
- 0x73 and 0x7e for \ ? and KP-dot, respectively. */
-
- *keycode = high_keys[scancode - SC_LIM];
-
- if (!*keycode) {
- if (!raw_mode) {
-#ifdef KBD_REPORT_UNKN
- printk(KERN_INFO "keyboard: unrecognized scancode (%02x)"
- " - ignored\n", scancode);
-#endif
- }
- return 0;
- }
- } else
- *keycode = scancode;
-
- return 1;
-}
-
-/* ----- end of stolen part ------ */
-
-
-void kbd_reset_setup(void)
-{
-}
-
-void handle_at_scancode(int keyval)
-{
- static int brk;
- static int esc0;
- static int esc1;
- int scancode = 0;
-
- switch (keyval) {
- case KBD_BREAK :
- /* sets the "release_key" bit when a key is
- released. HP keyboard send f0 followed by
- the keycode while AT keyboard send the keycode
- with this bit set. */
- brk = 0x80;
- return;
- case KBD_ESCAPEE0 :
- /* 2chars sequence, commonly used to differenciate
- the two ALT keys and the two ENTER keys and so
- on... */
- esc0 = 2; /* e0-xx are 2 chars */
- scancode = keyval;
- break;
- case KBD_ESCAPEE1 :
- /* 3chars sequence, only used by the Pause key. */
- esc1 = 3; /* e1-xx-xx are 3 chars */
- scancode = keyval;
- break;
-#if 0
- case KBD_RESEND :
- /* dunno what to do when it happens. RFC */
- printk(KERN_INFO "keyboard: KBD_RESEND received.\n");
- return;
-#endif
- case 0x14 :
- /* translate e1-14-77-e1-f0-14-f0-77 to
- e1-1d-45-e1-9d-c5 (the Pause key) */
- if (esc1==2) scancode = brk | 0x1d;
- break;
- case 0x77 :
- if (esc1==1) scancode = brk | 0x45;
- break;
- case 0x12 :
- /* an extended key is e0-12-e0-xx e0-f0-xx-e0-f0-12
- on HP, while it is e0-2a-e0-xx e0-(xx|80)-f0-aa
- on AT. */
- if (esc0==1) scancode = brk | 0x2a;
- break;
- }
-
-
- /* translates HP scancodes to AT scancodes */
- if (!scancode) scancode = brk | keycode_translate[keyval];
-
-
- if (!scancode) printk(KERN_INFO "keyboard: unexpected key code %02x\n",keyval);
-
- /* now behave like an AT keyboard */
- handle_scancode(scancode,!(scancode&0x80));
-
- if (esc0) esc0--;
- if (esc1) esc1--;
-
- /* release key bit must be unset for the next key */
- brk = 0;
-}
-
diff --git a/drivers/char/hp_psaux.c b/drivers/char/hp_psaux.c
deleted file mode 100644
index a19ed351a987..000000000000
--- a/drivers/char/hp_psaux.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * LASI PS/2 keyboard/psaux driver for HP-PARISC workstations
- *
- * (c) Copyright 1999 The Puffin Group Inc.
- * by Alex deVries <adevries@thepuffingroup.com>
- * Copyright 1999, 2000 Philipp Rumpf <prumpf@tux.org>
- *
- * 2000/10/26 Debacker Xavier (debackex@esiee.fr)
- * Marteau Thomas (marteaut@esiee.fr)
- * Djoudi Malek (djoudim@esiee.fr)
- * fixed leds control
- * implemented the psaux and controlled the mouse scancode based on pc_keyb.c
- */
-
-#include <linux/config.h>
-
-#include <asm/hardware.h>
-#include <asm/keyboard.h>
-#include <asm/gsc.h>
-
-#include <linux/types.h>
-#include <linux/ptrace.h> /* interrupt.h wants struct pt_regs defined */
-#include <linux/interrupt.h>
-#include <linux/sched.h> /* for request_irq/free_irq */
-#include <linux/ioport.h>
-#include <linux/kernel.h>
-#include <linux/wait.h>
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/pc_keyb.h>
-#include <linux/kbd_kern.h>
-
-/* mouse includes */
-#include <linux/miscdevice.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/spinlock.h>
-#include <linux/smp_lock.h>
-#include <asm/uaccess.h>
-#include <linux/poll.h>
-
-/* HP specific LASI PS/2 keyboard and psaux constants */
-#define AUX_REPLY_ACK 0xFA /* Command byte ACK. */
-#define AUX_RECONNECT 0xAA /* scancode when ps2 device is plugged (back) in */
-
-#define LASI_PSAUX_OFFSET 0x0100 /* offset from keyboard to psaux port */
-
-#define LASI_ID 0x00 /* ID and reset port offsets */
-#define LASI_RESET 0x00
-#define LASI_RCVDATA 0x04 /* receive and transmit port offsets */
-#define LASI_XMTDATA 0x04
-#define LASI_CONTROL 0x08 /* see: control register bits */
-#define LASI_STATUS 0x0C /* see: status register bits */
-
-/* control register bits */
-#define LASI_CTRL_ENBL 0x01 /* enable interface */
-#define LASI_CTRL_LPBXR 0x02 /* loopback operation */
-#define LASI_CTRL_DIAG 0x20 /* directly control clock/data line */
-#define LASI_CTRL_DATDIR 0x40 /* data line direct control */
-#define LASI_CTRL_CLKDIR 0x80 /* clock line direct control */
-
-/* status register bits */
-#define LASI_STAT_RBNE 0x01
-#define LASI_STAT_TBNE 0x02
-#define LASI_STAT_TERR 0x04
-#define LASI_STAT_PERR 0x08
-#define LASI_STAT_CMPINTR 0x10
-#define LASI_STAT_DATSHD 0x40
-#define LASI_STAT_CLKSHD 0x80
-
-static void *lasikbd_hpa;
-static void *lasips2_hpa;
-
-
-static inline u8 read_input(void *hpa)
-{
- return gsc_readb(hpa+LASI_RCVDATA);
-}
-
-static inline u8 read_control(void *hpa)
-{
- return gsc_readb(hpa+LASI_CONTROL);
-}
-
-static inline void write_control(u8 val, void *hpa)
-{
- gsc_writeb(val, hpa+LASI_CONTROL);
-}
-
-static inline u8 read_status(void *hpa)
-{
- return gsc_readb(hpa+LASI_STATUS);
-}
-
-static int write_output(u8 val, void *hpa)
-{
- int wait = 0;
-
- while (read_status(hpa) & LASI_STAT_TBNE) {
- wait++;
- if (wait>10000) {
- /* printk(KERN_WARNING "Lasi PS/2 transmit buffer timeout\n"); */
- return 0;
- }
- }
-
- if (wait)
- printk(KERN_DEBUG "Lasi PS/2 wait %d\n", wait);
-
- gsc_writeb(val, hpa+LASI_XMTDATA);
-
- return 1;
-}
-
-/* This function is the PA-RISC adaptation of i386 source */
-
-static inline int aux_write_ack(u8 val)
-{
- return write_output(val, lasikbd_hpa+LASI_PSAUX_OFFSET);
-}
-
-static void lasikbd_leds(unsigned char leds)
-{
- write_output(KBD_CMD_SET_LEDS, lasikbd_hpa);
- write_output(leds, lasikbd_hpa);
- write_output(KBD_CMD_ENABLE, lasikbd_hpa);
-}
-
-#if 0
-/* this might become useful again at some point. not now -prumpf */
-int lasi_ps2_test(void *hpa)
-{
- u8 control,c;
- int i, ret = 0;
-
- control = read_control(hpa);
- write_control(control | LASI_CTRL_LPBXR | LASI_CTRL_ENBL, hpa);
-
- for (i=0; i<256; i++) {
- write_output(i, hpa);
-
- while (!(read_status(hpa) & LASI_STAT_RBNE))
- /* just wait */;
-
- c = read_input(hpa);
- if (c != i)
- ret--;
- }
-
- write_control(control, hpa);
-
- return ret;
-}
-#endif
-
-static int __init lasi_ps2_reset(void *hpa, int id)
-{
- u8 control;
- int ret = 1;
-
- /* reset the interface */
- gsc_writeb(0xff, hpa+LASI_RESET);
- gsc_writeb(0x0 , hpa+LASI_RESET);
-
- /* enable it */
- control = read_control(hpa);
- write_control(control | LASI_CTRL_ENBL, hpa);
-
- /* initializes the leds at the default state */
- if (id==0) {
- write_output(KBD_CMD_SET_LEDS, hpa);
- write_output(0, hpa);
- ret = write_output(KBD_CMD_ENABLE, hpa);
- }
-
- return ret;
-}
-
-static int inited;
-
-static void lasi_ps2_init_hw(void)
-{
- ++inited;
-}
-
-
-/* Greatly inspired by pc_keyb.c */
-
-/*
- * Wait for keyboard controller input buffer to drain.
- *
- * Don't use 'jiffies' so that we don't depend on
- * interrupts..
- *
- * Quote from PS/2 System Reference Manual:
- *
- * "Address hex 0060 and address hex 0064 should be written only when
- * the input-buffer-full bit and output-buffer-full bit in the
- * Controller Status register are set 0."
- */
-#ifdef CONFIG_PSMOUSE
-
-static struct aux_queue *queue;
-static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
-static unsigned char mouse_reply_expected;
-static int aux_count;
-
-static int fasync_aux(int fd, struct file *filp, int on)
-{
- int retval;
-
- retval = fasync_helper(fd, filp, on, &queue->fasync);
- if (retval < 0)
- return retval;
-
- return 0;
-}
-
-
-
-static inline void handle_mouse_scancode(unsigned char scancode)
-{
- if (mouse_reply_expected) {
- if (scancode == AUX_REPLY_ACK) {
- mouse_reply_expected--;
- return;
- }
- mouse_reply_expected = 0;
- }
- else if (scancode == AUX_RECONNECT) {
- queue->head = queue->tail = 0; /* Flush input queue */
- return;
- }
-
- add_mouse_randomness(scancode);
- if (aux_count) {
- int head = queue->head;
-
- queue->buf[head] = scancode;
- head = (head + 1) & (AUX_BUF_SIZE-1);
-
- if (head != queue->tail) {
- queue->head = head;
- kill_fasync(&queue->fasync, SIGIO, POLL_IN);
- wake_up_interruptible(&queue->proc_list);
- }
- }
-}
-
-static inline int queue_empty(void)
-{
- return queue->head == queue->tail;
-}
-
-static unsigned char get_from_queue(void)
-{
- unsigned char result;
- unsigned long flags;
-
- spin_lock_irqsave(&kbd_controller_lock, flags);
- result = queue->buf[queue->tail];
- queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1);
- spin_unlock_irqrestore(&kbd_controller_lock, flags);
-
- return result;
-}
-
-
-/*
- * Write to the aux device.
- */
-
-static ssize_t write_aux(struct file * file, const char * buffer,
- size_t count, loff_t *ppos)
-{
- ssize_t retval = 0;
-
- if (count) {
- ssize_t written = 0;
-
- if (count > 32)
- count = 32; /* Limit to 32 bytes. */
- do {
- char c;
- get_user(c, buffer++);
- written++;
- } while (--count);
- retval = -EIO;
- if (written) {
- retval = written;
- file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
- }
- }
-
- return retval;
-}
-
-
-
-static ssize_t read_aux(struct file * file, char * buffer,
- size_t count, loff_t *ppos)
-{
- DECLARE_WAITQUEUE(wait, current);
- ssize_t i = count;
- unsigned char c;
-
- if (queue_empty()) {
- if (file->f_flags & O_NONBLOCK)
- return -EAGAIN;
- add_wait_queue(&queue->proc_list, &wait);
-repeat:
- set_current_state(TASK_INTERRUPTIBLE);
- if (queue_empty() && !signal_pending(current)) {
- schedule();
- goto repeat;
- }
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&queue->proc_list, &wait);
- }
- while (i > 0 && !queue_empty()) {
- c = get_from_queue();
- put_user(c, buffer++);
- i--;
- }
- if (count-i) {
- file->f_dentry->d_inode->i_atime = CURRENT_TIME;
- return count-i;
- }
- if (signal_pending(current))
- return -ERESTARTSYS;
- return 0;
-}
-
-
-static int open_aux(struct inode * inode, struct file * file)
-{
- if (aux_count++)
- return 0;
-
- queue->head = queue->tail = 0; /* Flush input queue */
- aux_count = 1;
- aux_write_ack(AUX_ENABLE_DEV); /* Enable aux device */
-
- return 0;
-}
-
-
-/* No kernel lock held - fine */
-static unsigned int aux_poll(struct file *file, poll_table * wait)
-{
-
- poll_wait(file, &queue->proc_list, wait);
- if (!queue_empty())
- return POLLIN | POLLRDNORM;
- return 0;
-}
-
-
-static int release_aux(struct inode * inode, struct file * file)
-{
- lock_kernel();
- fasync_aux(-1, file, 0);
- if (--aux_count) {
- unlock_kernel();
- return 0;
- }
- unlock_kernel();
- return 0;
-}
-
-static struct file_operations psaux_fops = {
- .read = read_aux,
- .write = write_aux,
- .poll = aux_poll,
- .open = open_aux,
- .release = release_aux,
- .fasync = fasync_aux,
-};
-
-static struct miscdevice psaux_mouse = {
- .minor = PSMOUSE_MINOR,
- .name = "psaux",
- .fops = &psaux_fops,
-};
-
-#endif /* CONFIG_PSMOUSE */
-
-
-/* This function is looking at the PS2 controller and empty the two buffers */
-
-static u8 handle_lasikbd_event(void *hpa)
-{
- u8 status_keyb,status_mouse,scancode,id;
- extern void handle_at_scancode(int); /* in drivers/char/keyb_at.c */
-
- /* Mask to get the base address of the PS/2 controller */
- id = gsc_readb(hpa+LASI_ID) & 0x0f;
-
- if (id==1)
- hpa -= LASI_PSAUX_OFFSET;
- lasikbd_hpa = hpa;
-
-
- status_keyb = read_status(hpa);
- status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
-
- while ((status_keyb|status_mouse) & LASI_STAT_RBNE){
-
- while (status_keyb & LASI_STAT_RBNE) {
-
- scancode = read_input(hpa);
-
- /* XXX don't know if this is a valid fix, but filtering
- * 0xfa avoids 'unknown scancode' errors on, eg, capslock
- * on some keyboards.
- */
- if (inited && scancode != 0xfa)
- handle_at_scancode(scancode);
-
- status_keyb =read_status(hpa);
- }
-
-#ifdef CONFIG_PSMOUSE
- while (status_mouse & LASI_STAT_RBNE) {
- scancode = read_input(hpa+LASI_PSAUX_OFFSET);
- handle_mouse_scancode(scancode);
- status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
- }
- status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
-#endif /* CONFIG_PSMOUSE */
- status_keyb = read_status(hpa);
- }
-
- tasklet_schedule(&keyboard_tasklet);
- return (status_keyb|status_mouse);
-}
-
-
-
-
-extern struct pt_regs *kbd_pt_regs;
-
-static void lasikbd_interrupt(int irq, void *dev, struct pt_regs *regs)
-{
- lasips2_hpa = dev; /* save "hpa" for lasikbd_leds() */
- kbd_pt_regs = regs;
- handle_lasikbd_event(lasips2_hpa);
-}
-
-
-extern int pckbd_translate(unsigned char, unsigned char *, char);
-
-static struct kbd_ops gsc_ps2_kbd_ops = {
- .translate = pckbd_translate,
- .init_hw = lasi_ps2_init_hw,
- .leds = lasikbd_leds,
-#ifdef CONFIG_MAGIC_SYSRQ
- .sysrq_key = 0x54,
- .sysrq_xlate = hp_ps2kbd_sysrq_xlate,
-#endif
-};
-
-static int __init
-lasi_ps2_register(struct hp_device *d, struct pa_iodc_driver *dri)
-{
- void *hpa = (void *) d->hpa;
- unsigned int irq;
- char *name;
- int device_found;
- u8 id;
-
- id = gsc_readb(hpa+LASI_ID) & 0x0f;
-
- switch (id) {
- case 0:
- name = "keyboard";
- lasikbd_hpa = hpa;
- break;
- case 1:
- name = "psaux";
- break;
- default:
- printk(KERN_WARNING "%s: Unknown PS/2 port (id=%d) - ignored.\n",
- __FUNCTION__, id );
- return 0;
- }
-
- /* reset the PS/2 port */
- device_found = lasi_ps2_reset(hpa,id);
-
- /* allocate the irq and memory region for that device */
- if (!(irq = busdevice_alloc_irq(d)))
- return -ENODEV;
-
- if (request_irq(irq, lasikbd_interrupt, 0, name, hpa))
- return -ENODEV;
-
- if (!request_mem_region((unsigned long)hpa, LASI_STATUS + 4, name))
- return -ENODEV;
-
- switch (id) {
- case 0:
- register_kbd_ops(&gsc_ps2_kbd_ops);
- break;
- case 1:
-#ifdef CONFIG_PSMOUSE
- queue = (struct aux_queue *) kmalloc(sizeof(*queue), GFP_KERNEL);
- if (!queue)
- return -ENOMEM;
-
- memset(queue, 0, sizeof(*queue));
- queue->head = queue->tail = 0;
- init_waitqueue_head(&queue->proc_list);
-
- misc_register(&psaux_mouse);
-
- aux_write_ack(AUX_ENABLE_DEV);
- /* try it a second time, this will give status if the device is
- * available */
- device_found = aux_write_ack(AUX_ENABLE_DEV);
- break;
-#else
- /* return without printing any unnecessary and misleading info */
- return 0;
-#endif
- } /* of case */
-
- printk(KERN_INFO "PS/2 %s controller at 0x%08lx (irq %d) found, "
- "%sdevice attached.\n",
- name, (unsigned long)hpa, irq,
- device_found ? "":"no ");
-
- return 0;
-}
-
-
-static struct pa_iodc_driver lasi_psaux_drivers_for[] __initdata = {
- {HPHW_FIO, 0x0, 0,0x00084, 0, 0,
- DRIVER_CHECK_HWTYPE + DRIVER_CHECK_SVERSION,
- "Lasi psaux", "generic", (void *) lasi_ps2_register},
- { 0, }
-};
-
-static int __init gsc_ps2_init(void)
-{
- return pdc_register_driver(lasi_psaux_drivers_for);
-}
-
-module_init(gsc_ps2_init);
-
diff --git a/drivers/ide/ide-geometry.c b/drivers/ide/ide-geometry.c
index 52d5e84726e4..eee2867db9c4 100644
--- a/drivers/ide/ide-geometry.c
+++ b/drivers/ide/ide-geometry.c
@@ -6,83 +6,6 @@
#include <linux/mc146818rtc.h>
#include <asm/io.h>
-/*
- * We query CMOS about hard disks : it could be that we have a SCSI/ESDI/etc
- * controller that is BIOS compatible with ST-506, and thus showing up in our
- * BIOS table, but not register compatible, and therefore not present in CMOS.
- *
- * Furthermore, we will assume that our ST-506 drives <if any> are the primary
- * drives in the system -- the ones reflected as drive 1 or 2. The first
- * drive is stored in the high nibble of CMOS byte 0x12, the second in the low
- * nibble. This will be either a 4 bit drive type or 0xf indicating use byte
- * 0x19 for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS. A non-zero value
- * means we have an AT controller hard disk for that drive.
- *
- * Of course, there is no guarantee that either drive is actually on the
- * "primary" IDE interface, but we don't bother trying to sort that out here.
- * If a drive is not actually on the primary interface, then these parameters
- * will be ignored. This results in the user having to supply the logical
- * drive geometry as a boot parameter for each drive not on the primary i/f.
- *
- * The only "perfect" way to handle this would be to modify the setup.[cS] code
- * to do BIOS calls Int13h/Fn08h and Int13h/Fn48h to get all of the drive info
- * for us during initialization. I have the necessary docs -- any takers? -ml
- *
- * I did this, but it doesn't work - there is no reasonable way to find the
- * correspondence between the BIOS numbering of the disks and the Linux
- * numbering. -aeb
- *
- * The code below is bad. One of the problems is that drives 1 and 2
- * may be SCSI disks (even when IDE disks are present), so that
- * the geometry we read here from BIOS is attributed to the wrong disks.
- * Consequently, also the former "drive->present = 1" below was a mistake.
- *
- * Eventually the entire routine below should be removed.
- *
- * 17-OCT-2000 rjohnson@analogic.com Added spin-locks for reading CMOS
- * chip.
- */
-
-void probe_cmos_for_drives (ide_hwif_t *hwif)
-{
-#ifdef __i386__
- extern struct drive_info_struct drive_info;
- u8 cmos_disks, *BIOS = (u8 *) &drive_info;
- int unit;
- unsigned long flags;
-
- if (hwif->chipset == ide_pdc4030 && hwif->channel != 0)
- return;
-
- spin_lock_irqsave(&rtc_lock, flags);
- cmos_disks = CMOS_READ(0x12);
- spin_unlock_irqrestore(&rtc_lock, flags);
- /* Extract drive geometry from CMOS+BIOS if not already setup */
- for (unit = 0; unit < MAX_DRIVES; ++unit) {
- ide_drive_t *drive = &hwif->drives[unit];
-
- if ((cmos_disks & (0xf0 >> (unit*4)))
- && !drive->present && !drive->nobios) {
- u16 cyl = *(u16 *)BIOS;
- unsigned char head = *(BIOS+2);
- unsigned char sect = *(BIOS+14);
- if (cyl > 0 && head > 0 && sect > 0 && sect < 64) {
- drive->cyl = drive->bios_cyl = cyl;
- drive->head = drive->bios_head = head;
- drive->sect = drive->bios_sect = sect;
- drive->ctl = *(BIOS+8);
- } else {
- printk("hd%c: C/H/S=%d/%d/%d from BIOS ignored\n",
- unit+'a', cyl, head, sect);
- }
- }
-
- BIOS += 16;
- }
-#endif
-}
-
-
extern unsigned long current_capacity (ide_drive_t *);
/*
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 5a8f40da8a88..3749322c8c91 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -639,12 +639,6 @@ void probe_hwif (ide_hwif_t *hwif)
if (hwif->noprobe)
return;
-#ifdef CONFIG_BLK_DEV_IDE
- if (hwif->io_ports[IDE_DATA_OFFSET] == HD_DATA) {
- extern void probe_cmos_for_drives(ide_hwif_t *);
- probe_cmos_for_drives(hwif);
- }
-#endif
if ((hwif->chipset != ide_4drives || !hwif->mate || !hwif->mate->present) &&
#if CONFIG_BLK_DEV_PDC4030
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index c3d5fc08708f..85f0aa028e41 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -56,3 +56,12 @@ config INPUT_UINPUT
The module will be called uinput.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
+config INPUT_GSC
+ tristate "PA-RISC GSC PS/2 keyboard/mouse support"
+ depends on GSC && INPUT && INPUT_MISC
+ help
+ Say Y here if you have a PS/2 keyboard and/or mouse attached
+ to your PA-RISC box. HP run the keyboard in AT mode rather than
+ XT mode like everyone else, so we need our own driver.
+ Furthermore, the GSC PS/2 controller shares IRQ between mouse and
+ keyboard.
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 6e78fdbaa947..908b5bb0f897 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -8,7 +8,4 @@ obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
obj-$(CONFIG_INPUT_UINPUT) += uinput.o
-
-# The global Rules.make.
-
-include $(TOPDIR)/Rules.make
+obj-$(CONFIG_INPUT_GSC) += gsc_ps2.o
diff --git a/drivers/input/misc/gsc_ps2.c b/drivers/input/misc/gsc_ps2.c
new file mode 100644
index 000000000000..6d615575589e
--- /dev/null
+++ b/drivers/input/misc/gsc_ps2.c
@@ -0,0 +1,699 @@
+/*
+ * drivers/input/misc/gsc_ps2.c
+ *
+ * Copyright (c) 2002 Laurent Canet <canetl@esiee.fr>
+ * Copyright (c) 2002 Thibaut Varene <varenet@esiee.fr>
+ *
+ * Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c
+ * Copyright (c) 1999 Alex deVries <adevries@thepuffingroup.com>
+ * Copyright (c) 1999-2000 Philipp Rumpf <prumpf@tux.org>
+ * Copyright (c) 2000 Xavier Debacker <debackex@esiee.fr>
+ * Copyright (c) 2000-2001 Thomas Marteau <marteaut@esiee.fr>
+ *
+ * HP PS/2 Keyboard, found in PA/RISC Workstations
+ * very similar to AT keyboards, but without i8042
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * STATUS:
+ * 11/09: lc: Only basic keyboard is supported, mouse still needs to be done.
+ * 11/12: tv: switching iomapping; cleaning code; improving module stuff.
+ * 11/13: lc & tv: leds aren't working. auto_repeat/meta are. Generaly good behavior.
+ * 11/15: tv: 2AM: leds ARE working !
+ * 11/16: tv: 3AM: escaped keycodes emulation *handled*, some keycodes are
+ * still deliberately ignored (18), what are they used for ?
+ * 11/21: lc: mouse is now working
+ * 11/29: tv: first try for error handling in init sequence
+ *
+ * TODO:
+ * Error handling in init sequence
+ * SysRq handling
+ * Pause key handling
+ * Intellimouse & other rodents handling (at least send an error when
+ * such a mouse is plugged : it will totally fault)
+ * Mouse: set scaling / Dino testing
+ * Bug chasing...
+ *
+ */
+
+#include <linux/input.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/ptrace.h> /* interrupt.h wants struct pt_regs defined */
+#include <linux/interrupt.h>
+#include <linux/sched.h> /* for request_irq/free_irq */
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <linux/pc_keyb.h>
+#include <linux/ioport.h>
+#include <linux/kd.h>
+
+#include <asm/irq.h>
+#include <asm/io.h>
+
+/* Debugging stuff */
+#undef KBD_DEBUG
+#ifdef KBD_DEBUG
+ #define DPRINTK(fmt,args...) printk(KERN_DEBUG __FILE__ ":" fmt, ##args)
+#else
+ #define DPRINTK(x,...)
+#endif
+
+
+/*
+ * Driver constants
+ */
+
+/* PS/2 keyboard and mouse constants */
+#define AUX_RECONNECT 0xAA /* PS/2 Mouse end of test successful */
+#define AUX_REPLY_ACK 0xFA
+
+/* Order of the mouse bytes coming to the host */
+#define PACKET_X 1
+#define PACKET_Y 2
+#define PACKET_CTRL 0
+
+#define GSC_MOUSE_OFFSET 0x0100 /* offset from keyboard to mouse port */
+#define GSC_DINO_OFFSET 0x800 /* offset for DINO controller versus LASI one */
+
+#define GSC_ID 0x00 /* ID and reset port offsets */
+#define GSC_RESET 0x00
+#define GSC_RCVDATA 0x04 /* receive and transmit port offsets */
+#define GSC_XMTDATA 0x04
+#define GSC_CONTROL 0x08 /* see: control register bits */
+#define GSC_STATUS 0x0C /* see: status register bits */
+
+/* Control register bits */
+#define GSC_CTRL_ENBL 0x01 /* enable interface */
+#define GSC_CTRL_LPBXR 0x02 /* loopback operation */
+#define GSC_CTRL_DIAG 0x20 /* directly control clock/data line */
+#define GSC_CTRL_DATDIR 0x40 /* data line direct control */
+#define GSC_CTRL_CLKDIR 0x80 /* clock line direct control */
+
+/* Status register bits */
+#define GSC_STAT_RBNE 0x01 /* Receive Buffer Not Empty */
+#define GSC_STAT_TBNE 0x02 /* Transmit Buffer Not Empty */
+#define GSC_STAT_TERR 0x04 /* Timeout Error */
+#define GSC_STAT_PERR 0x08 /* Parity Error */
+#define GSC_STAT_CMPINTR 0x10 /* Composite Interrupt */
+#define GSC_STAT_DATSHD 0x40 /* Data Line Shadow */
+#define GSC_STAT_CLKSHD 0x80 /* Clock Line Shadow */
+
+/* Keycode map */
+#define KBD_ESCAPE0 0xe0
+#define KBD_ESCAPE1 0xe1
+#define KBD_RELEASE 0xf0
+#define KBD_ACK 0xfa
+#define KBD_RESEND 0xfe
+#define KBD_UNKNOWN 0
+
+#define KBD_TBLSIZE 512
+
+/* Mouse */
+#define MOUSE_LEFTBTN 0x1
+#define MOUSE_MIDBTN 0x4
+#define MOUSE_RIGHTBTN 0x2
+#define MOUSE_ALWAYS1 0x8
+#define MOUSE_XSIGN 0x10
+#define MOUSE_YSIGN 0x20
+#define MOUSE_XOVFLOW 0x40
+#define MOUSE_YOVFLOW 0x80
+
+
+static unsigned char hpkeyb_keycode[KBD_TBLSIZE] =
+{
+ /* 00 */ KBD_UNKNOWN, KEY_F9, KBD_UNKNOWN, KEY_F5, KEY_F3, KEY_F1, KEY_F2, KEY_F12,
+ /* 08 */ KBD_UNKNOWN, KEY_F10, KEY_F8, KEY_F6, KEY_F4, KEY_TAB, KEY_GRAVE, KBD_UNKNOWN,
+ /* 10 */ KBD_UNKNOWN, KEY_LEFTALT, KEY_LEFTSHIFT, KBD_UNKNOWN, KEY_LEFTCTRL, KEY_Q, KEY_1, KBD_UNKNOWN,
+ /* 18 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, KBD_UNKNOWN,
+ /* 20 */ KBD_UNKNOWN, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, KBD_UNKNOWN,
+ /* 28 */ KBD_UNKNOWN, KEY_SPACE, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KBD_UNKNOWN,
+ /* 30 */ KBD_UNKNOWN, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, KBD_UNKNOWN,
+ /* 38 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, KBD_UNKNOWN,
+ /* 40 */ KBD_UNKNOWN, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, KBD_UNKNOWN,
+ /* 48 */ KBD_UNKNOWN, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, KBD_UNKNOWN,
+ /* 50 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_APOSTROPHE,KBD_UNKNOWN, KEY_LEFTBRACE, KEY_EQUAL, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 58 */ KEY_CAPSLOCK, KEY_RIGHTSHIFT,KEY_ENTER, KEY_RIGHTBRACE,KBD_UNKNOWN, KEY_BACKSLASH,KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 60 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KEY_BACKSPACE, KBD_UNKNOWN,
+ /* 68 */ KBD_UNKNOWN, KEY_KP1, KBD_UNKNOWN, KEY_KP4, KEY_KP7, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 70 */ KEY_KP0, KEY_KPDOT, KEY_KP2, KEY_KP5, KEY_KP6, KEY_KP8, KEY_ESC, KEY_NUMLOCK,
+ /* 78 */ KEY_F11, KEY_KPPLUS, KEY_KP3, KEY_KPMINUS, KEY_KPASTERISK,KEY_KP9, KEY_SCROLLLOCK,KEY_103RD,
+ /* 80 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KEY_F7, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 88 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 90 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 98 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* a0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* a8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* b0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* b8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* c0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* c8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* d0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* d8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* e0 */ KBD_ESCAPE0, KBD_ESCAPE1, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* e8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* f0 */ KBD_RELEASE, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* f8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_ACK, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_RESEND, KBD_UNKNOWN,
+/* These are offset for escaped keycodes */
+ /* 00 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 08 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 10 */ KBD_UNKNOWN, KEY_RIGHTALT, KBD_UNKNOWN, KBD_UNKNOWN, KEY_RIGHTCTRL, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 18 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 20 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 28 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 30 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 38 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 40 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 48 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_KPSLASH, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 50 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 58 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_KPENTER, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 60 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 68 */ KBD_UNKNOWN, KEY_END, KBD_UNKNOWN, KEY_LEFT, KEY_HOME, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 70 */ KEY_INSERT, KEY_DELETE, KEY_DOWN, KBD_UNKNOWN, KEY_RIGHT, KEY_UP, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 78 */ KBD_UNKNOWN, KBD_UNKNOWN, KEY_PAGEDOWN, KBD_UNKNOWN, KEY_SYSRQ, KEY_PAGEUP, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 80 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 88 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 90 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* 98 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* a0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* a8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* b0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* b8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* c0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* c8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* d0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* d8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* e0 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* e8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* f0 */ KBD_RELEASE, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN,
+ /* f8 */ KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN, KBD_UNKNOWN
+};
+
+
+/* Keyboard struct */
+static struct {
+ struct input_dev dev;
+ char * addr;
+ unsigned int irq;
+ unsigned int scancode;
+ unsigned int escaped;
+ unsigned int released;
+ unsigned int initialized;
+}
+hpkeyb = {
+ .escaped = 0,
+ .released = 0,
+ .initialized = 0
+};
+
+/* Mouse struct */
+static struct {
+ struct input_dev dev;
+ char * addr;
+ unsigned long irq;
+ unsigned long initialized;
+ int nbread;
+ unsigned char bytes[3];
+ unsigned long last;
+}
+hpmouse = {
+ .initialized = 0,
+ .nbread = 0
+};
+
+static spinlock_t gscps2_lock = SPIN_LOCK_UNLOCKED;
+
+
+/*
+ * Various HW level routines
+ */
+
+#define gscps2_readb_input(x) readb(x+GSC_RCVDATA)
+#define gscps2_readb_control(x) readb(x+GSC_CONTROL)
+#define gscps2_readb_status(x) readb(x+GSC_STATUS)
+#define gscps2_writeb_control(x, y) writeb(x, y+GSC_CONTROL)
+
+static inline void gscps2_writeb_output(u8 val, char * addr)
+{
+ int wait = 250; /* Keyboard is expected to react within 250ms */
+
+ while (gscps2_readb_status(addr) & GSC_STAT_TBNE) {
+ if (!--wait)
+ return; /* This should not happen */
+ mdelay(1);
+ }
+ writeb(val, addr+GSC_XMTDATA);
+}
+
+static inline unsigned char gscps2_wait_input(char * addr)
+{
+ int wait = 250; /* Keyboard is expected to react within 250ms */
+
+ while (!(gscps2_readb_status(addr) & GSC_STAT_RBNE)) {
+ if (!--wait)
+ return 0; /* This should not happen */
+ mdelay(1);
+ }
+ return gscps2_readb_input(addr);
+}
+
+static int gscps2_writeb_safe_output(u8 val)
+{
+ /* This function waits for keyboard's ACK */
+ u8 scanread = KBD_UNKNOWN;
+ int loop = 5;
+
+ while (hpkeyb_keycode[scanread]!=KBD_ACK && --loop > 0) {
+ gscps2_writeb_output(val, hpkeyb.addr);
+ mdelay(5);
+ scanread = gscps2_wait_input(hpkeyb.addr);
+ }
+
+ if (loop <= 0)
+ return -1;
+
+ return 0;
+}
+
+/* Reset the PS2 port */
+static void __init gscps2_reset(char * addr)
+{
+ /* reset the interface */
+ writeb(0xff, addr+GSC_RESET);
+ writeb(0x0 , addr+GSC_RESET);
+
+ /* enable it */
+ gscps2_writeb_control(gscps2_readb_control(addr) | GSC_CTRL_ENBL, addr);
+}
+
+
+/**
+ * gscps2_kbd_docode() - PS2 Keyboard basic handler
+ *
+ * Receives a keyboard scancode, analyses it and sends it to the input layer.
+ */
+
+static void gscps2_kbd_docode(void)
+{
+ int scancode = gscps2_readb_input(hpkeyb.addr);
+ DPRINTK("rel=%d scancode=%d, esc=%d ", hpkeyb.released, scancode, hpkeyb.escaped);
+
+ /* Handle previously escaped scancodes */
+ if (hpkeyb.escaped == KBD_ESCAPE0)
+ scancode |= 0x100; /* jump to the next 256 chars of the table */
+
+ switch (hpkeyb_keycode[scancode]) {
+ case KBD_RELEASE:
+ DPRINTK("release\n");
+ hpkeyb.released = 1;
+ break;
+ case KBD_RESEND:
+ DPRINTK("resend request\n");
+ break;
+ case KBD_ACK:
+ DPRINTK("ACK\n");
+ break;
+ case KBD_ESCAPE0:
+ case KBD_ESCAPE1:
+ DPRINTK("escape code %d\n", hpkeyb_keycode[scancode]);
+ hpkeyb.escaped = hpkeyb_keycode[scancode];
+ break;
+ case KBD_UNKNOWN:
+ DPRINTK("received unknown scancode %d, escape %d.\n",
+ scancode, hpkeyb.escaped); /* This is a DPRINTK atm since we do not handle escaped scancodes cleanly */
+ if (hpkeyb.escaped)
+ hpkeyb.escaped = 0;
+ if (hpkeyb.released)
+ hpkeyb.released = 0;
+ return;
+ default:
+ hpkeyb.scancode = scancode;
+ DPRINTK("sent=%d, rel=%d\n",hpkeyb.scancode, hpkeyb.released);
+ input_report_key(&hpkeyb.dev, hpkeyb_keycode[hpkeyb.scancode], !hpkeyb.released);
+ input_sync(&hpkeyb.dev);
+ if (hpkeyb.escaped)
+ hpkeyb.escaped = 0;
+ if (hpkeyb.released)
+ hpkeyb.released = 0;
+ break;
+ }
+}
+
+
+/**
+ * gscps2_mouse_docode() - PS2 Mouse basic handler
+ *
+ * Receives mouse codes, processes them by packets of three, and sends
+ * correct events to the input layer.
+ */
+
+static void gscps2_mouse_docode(void)
+{
+ int xrel, yrel;
+
+ /* process BAT (end of basic tests) command */
+ if ((hpmouse.nbread == 1) && (hpmouse.bytes[0] == AUX_RECONNECT))
+ hpmouse.nbread--;
+
+ /* stolen from psmouse.c */
+ if (hpmouse.nbread && time_after(jiffies, hpmouse.last + HZ/20)) {
+ printk(KERN_DEBUG "%s:%d : Lost mouse synchronization, throwing %d bytes away.\n", __FILE__, __LINE__,
+ hpmouse.nbread);
+ hpmouse.nbread = 0;
+ }
+
+ hpmouse.last = jiffies;
+ hpmouse.bytes[hpmouse.nbread++] = gscps2_readb_input(hpmouse.addr);
+
+ /* process packet */
+ if (hpmouse.nbread == 3) {
+
+ if (!(hpmouse.bytes[PACKET_CTRL] & MOUSE_ALWAYS1))
+ DPRINTK("Mouse: error on packet always1 bit checking\n");
+ /* XXX should exit now, bad data on the line! */
+
+ if ((hpmouse.bytes[PACKET_CTRL] & (MOUSE_XOVFLOW | MOUSE_YOVFLOW)))
+ DPRINTK("Mouse: position overflow\n");
+
+ input_report_key(&hpmouse.dev, BTN_LEFT, hpmouse.bytes[PACKET_CTRL] & MOUSE_LEFTBTN);
+ input_report_key(&hpmouse.dev, BTN_MIDDLE, hpmouse.bytes[PACKET_CTRL] & MOUSE_MIDBTN);
+ input_report_key(&hpmouse.dev, BTN_RIGHT, hpmouse.bytes[PACKET_CTRL] & MOUSE_RIGHTBTN);
+
+ xrel = hpmouse.bytes[PACKET_X];
+ yrel = hpmouse.bytes[PACKET_Y];
+
+ /* Data sent by mouse are 9-bit signed, the sign bit is in the control packet */
+ if (xrel && (hpmouse.bytes[PACKET_CTRL] & MOUSE_XSIGN))
+ xrel = xrel - 0x100;
+ if (yrel && (hpmouse.bytes[PACKET_CTRL] & MOUSE_YSIGN))
+ yrel = yrel - 0x100;
+
+ input_report_rel(&hpmouse.dev, REL_X, xrel);
+ input_report_rel(&hpmouse.dev, REL_Y, -yrel); /* Y axis is received upside-down */
+
+ input_sync(&hpmouse.dev);
+
+ hpmouse.nbread = 0;
+ }
+}
+
+
+/**
+ * gscps2_interrupt() - Interruption service routine
+ *
+ * This processes the list of scancodes queued and sends appropriate
+ * key value to the system.
+ */
+
+static void gscps2_interrupt(int irq, void *dev, struct pt_regs *reg)
+{
+ /* process mouse actions */
+ while (gscps2_readb_status(hpmouse.addr) & GSC_STAT_RBNE)
+ gscps2_mouse_docode();
+
+ /* process keyboard scancode */
+ while (gscps2_readb_status(hpkeyb.addr) & GSC_STAT_RBNE)
+ gscps2_kbd_docode();
+}
+
+
+/**
+ * gscps2_hpkeyb_event() - Event handler
+ * @return: success/error report
+ *
+ * Currently only updates leds on keyboard
+ */
+
+int gscps2_hpkeyb_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ DPRINTK("Calling %s, type=%d, code=%d, value=%d\n",
+ __FUNCTION__, type, code, value);
+
+ if (!hpkeyb.initialized)
+ return -1;
+
+ if (type == EV_LED) {
+ u8 leds[2];
+
+ if (gscps2_writeb_safe_output(KBD_CMD_SET_LEDS)) {
+ printk(KERN_ERR "gsckbd_leds: timeout\n");
+ return -1;
+ }
+ DPRINTK("KBD_CMD_SET_LEDS\n");
+
+ *leds = (test_bit(LED_SCROLLL, dev->led) ? LED_SCR : 0)
+ | (test_bit(LED_NUML, dev->led) ? LED_NUM : 0)
+ | (test_bit(LED_CAPSL, dev->led) ? LED_CAP : 0);
+ DPRINTK("Sending leds=%x\n", *leds);
+
+ if (gscps2_writeb_safe_output(*leds)) {
+ printk(KERN_ERR "gsckbd_leds: timeout\n");
+ return -1;
+ }
+ DPRINTK("leds sent\n");
+
+ if (gscps2_writeb_safe_output(KBD_CMD_ENABLE)) {
+ printk(KERN_ERR "gsckbd_leds: timeout\n");
+ return -1;
+ }
+ DPRINTK("End\n");
+
+ return 0;
+
+ }
+ return -1;
+}
+
+
+/**
+ * gscps2_kbd_probe() - Probes keyboard device and init input_dev structure
+ * @return: number of device initialized (1, 0 on error)
+ */
+
+static int __init gscps2_kbd_probe(void)
+{
+ int i, res = 0;
+ unsigned long flags;
+
+ if (hpkeyb.initialized) {
+ printk(KERN_ERR "GSC PS/2 keyboard driver already registered\n");
+ return 0;
+ }
+
+ spin_lock_irqsave(&gscps2_lock, flags);
+
+ if (!gscps2_writeb_safe_output(KBD_CMD_SET_LEDS) &&
+ !gscps2_writeb_safe_output(0) &&
+ !gscps2_writeb_safe_output(KBD_CMD_ENABLE))
+ res = 1;
+
+ spin_unlock_irqrestore(&gscps2_lock, flags);
+
+ if (!res)
+ printk(KERN_ERR "Keyboard initialization sequence failled\n");
+
+ init_input_dev(&hpkeyb.dev);
+
+ for (i = 0; i < KBD_TBLSIZE; i++)
+ if (hpkeyb_keycode[i] != KBD_UNKNOWN)
+ set_bit(hpkeyb_keycode[i], hpkeyb.dev.keybit);
+
+ hpkeyb.dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
+ hpkeyb.dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
+ hpkeyb.dev.keycode = hpkeyb_keycode;
+ hpkeyb.dev.keycodesize = sizeof(unsigned char);
+ hpkeyb.dev.keycodemax = KBD_TBLSIZE;
+ hpkeyb.dev.name = "GSC Keyboard";
+ hpkeyb.dev.phys = "hpkbd/input0";
+
+ hpkeyb.dev.event = gscps2_hpkeyb_event;
+
+ /* TODO These need some adjustement, are they really useful ? */
+ hpkeyb.dev.id.bustype = BUS_GSC;
+ hpkeyb.dev.id.vendor = 0x0001;
+ hpkeyb.dev.id.product = 0x0001;
+ hpkeyb.dev.id.version = 0x0010;
+ hpkeyb.initialized = 1;
+
+ return 1;
+}
+
+
+/**
+ * gscps2_mouse_probe() - Probes mouse device and init input_dev structure
+ * @return: number of device initialized (1, 0 on error)
+ *
+ * Currently no check on initialization is performed
+ */
+
+static int __init gscps2_mouse_probe(void)
+{
+ if (hpmouse.initialized) {
+ printk(KERN_ERR "GSC PS/2 Mouse driver already registered\n");
+ return 0;
+ }
+
+ init_input_dev(&hpmouse.dev);
+
+ hpmouse.dev.name = "GSC Mouse";
+ hpmouse.dev.phys = "hpmouse/input0";
+ hpmouse.dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+ hpmouse.dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
+ hpmouse.dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
+ hpmouse.last = 0;
+
+ gscps2_writeb_output(AUX_ENABLE_DEV, hpmouse.addr);
+ /* Try it a second time, this will give status if the device is available */
+ gscps2_writeb_output(AUX_ENABLE_DEV, hpmouse.addr);
+
+ /* TODO These need some adjustement, are they really useful ? */
+ hpmouse.dev.id.bustype = BUS_GSC;
+ hpmouse.dev.id.vendor = 0x0001;
+ hpmouse.dev.id.product = 0x0001;
+ hpmouse.dev.id.version = 0x0010;
+ hpmouse.initialized = 1;
+ return 1; /* XXX: we don't check if initialization failed */
+}
+
+
+/**
+ * gscps2_probe() - Probes PS2 devices
+ * @return: success/error report
+ */
+
+static int __init gscps2_probe(struct parisc_device *dev)
+{
+ u8 id;
+ char *addr, *name;
+ int ret, device_found = 0;
+ unsigned long hpa = dev->hpa;
+
+ if (!dev->irq)
+ goto fail_pitifully;
+
+ /* Offset for DINO PS/2. Works with LASI even */
+ if (dev->id.sversion == 0x96)
+ hpa += GSC_DINO_OFFSET;
+
+ addr = ioremap(hpa, 256);
+
+ if (!hpmouse.initialized || !hpkeyb.initialized)
+ gscps2_reset(addr);
+
+ ret = -EINVAL;
+ id = readb(addr+GSC_ID) & 0x0f;
+ switch (id) {
+ case 0: /* keyboard */
+ hpkeyb.addr = addr;
+ name = "keyboard";
+ device_found = gscps2_kbd_probe();
+ break;
+ case 1: /* mouse */
+ hpmouse.addr = addr;
+ name = "mouse";
+ device_found = gscps2_mouse_probe();
+ break;
+ default:
+ printk(KERN_WARNING "%s: Unsupported PS/2 port (id=%d) ignored\n",
+ __FUNCTION__, id);
+ goto fail_miserably;
+ }
+
+ /* No valid device found */
+ ret = -ENODEV;
+ if (!device_found)
+ goto fail_miserably;
+
+ /* Here we claim only if we have a device attached */
+ /* Allocate the irq and memory region for that device */
+ ret = -EBUSY;
+ if (request_irq(dev->irq, gscps2_interrupt, 0, name, NULL))
+ goto fail_miserably;
+
+ if (!request_mem_region(hpa, GSC_STATUS + 4, name))
+ goto fail_request_mem;
+
+ /* Finalize input struct and register it */
+ switch (id) {
+ case 0: /* keyboard */
+ hpkeyb.irq = dev->irq;
+ input_register_device(&hpkeyb.dev);
+ break;
+ case 1: /* mouse */
+ hpmouse.irq = dev->irq;
+ input_register_device(&hpmouse.dev);
+ break;
+ default:
+ break;
+ }
+
+ printk(KERN_INFO "input: PS/2 %s port at 0x%08lx (irq %d) found and attached\n",
+ name, hpa, dev->irq);
+
+ return 0;
+
+fail_request_mem: free_irq(dev->irq, NULL);
+fail_miserably: iounmap(addr);
+fail_pitifully: return ret;
+}
+
+
+
+static struct parisc_device_id gscps2_device_tbl[] = {
+ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00084 }, /* LASI PS/2 */
+/* { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00096 }, DINO PS/2 (XXX Not yet tested) */
+ { 0, } /* 0 terminated list */
+};
+
+static struct parisc_driver gscps2_driver = {
+ .name = "GSC PS2",
+ .id_table = gscps2_device_tbl,
+ .probe = gscps2_probe,
+};
+
+static int __init gscps2_init(void)
+{
+ if (register_parisc_driver(&gscps2_driver))
+ return -EBUSY;
+ return 0;
+}
+
+static void __exit gscps2_exit(void)
+{
+ /* TODO this is probably not very good and needs to be checked */
+ if (hpkeyb.initialized) {
+ free_irq(hpkeyb.irq, gscps2_interrupt);
+ iounmap(hpkeyb.addr);
+ hpkeyb.initialized = 0;
+ input_unregister_device(&hpkeyb.dev);
+ }
+ if (hpmouse.initialized) {
+ free_irq(hpmouse.irq, gscps2_interrupt);
+ iounmap(hpmouse.addr);
+ hpmouse.initialized = 0;
+ input_unregister_device(&hpmouse.dev);
+ }
+ unregister_parisc_driver(&gscps2_driver);
+}
+
+
+MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@esiee.fr>");
+MODULE_DESCRIPTION("GSC PS/2 keyboard/mouse driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl);
+
+
+module_init(gscps2_init);
+module_exit(gscps2_exit);
diff --git a/drivers/media/video/tuner.c b/drivers/media/video/tuner.c
index 0c08bf609dc4..c98c00282c3b 100644
--- a/drivers/media/video/tuner.c
+++ b/drivers/media/video/tuner.c
@@ -982,7 +982,7 @@ static struct i2c_driver driver = {
.detach_client = tuner_detach,
.command = tuner_command,
};
-static structi2c_clientclient_template =
+static struct i2c_client client_template =
{
.name = "(tunerunset)",
.flags = I2C_CLIENT_ALLOW_USE,
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
index e0d0b9007f25..b3c334adc64f 100644
--- a/drivers/serial/sunzilog.c
+++ b/drivers/serial/sunzilog.c
@@ -1586,8 +1586,9 @@ static void __init sunzilog_init_hw(void)
} else {
/* Normal serial TTY. */
up->parity_mask = 0xff;
- up->curregs[R3] = RxENAB;
- up->curregs[R5] = TxENAB;
+ up->curregs[R4] = PAR_EVEN | X16CLK | SB1;
+ up->curregs[R3] = RxENAB | Rx8;
+ up->curregs[R5] = TxENAB | Tx8;
up->curregs[R9] = NV | MIE;
up->curregs[R10] = NRZ;
up->curregs[R11] = TCBR | RCBR;
diff --git a/fs/xfs/support/move.c b/fs/xfs/support/move.c
index 15dbd090c6b8..92acc1b75a8f 100644
--- a/fs/xfs/support/move.c
+++ b/fs/xfs/support/move.c
@@ -30,6 +30,7 @@
* http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
*/
+#include <linux/errno.h>
#include <asm/uaccess.h>
#include <xfs_types.h>
diff --git a/include/asm-sparc/elf.h b/include/asm-sparc/elf.h
index 59d2f8e11964..239d2da0a6c0 100644
--- a/include/asm-sparc/elf.h
+++ b/include/asm-sparc/elf.h
@@ -56,7 +56,7 @@ typedef struct {
} elf_fpregset_t;
#define ELF_CORE_COPY_TASK_REGS(__tsk, __elf_regs) \
- ({ ELF_CORE_COPY_REGS((*(__elf_regs)), (__tsk)->thread_info->kregs); 1; })
+ ({ ELF_CORE_COPY_REGS((*(__elf_regs)), (__tsk)->thread.kregs); 1; })
/*
* This is used to ensure we don't load something for the wrong architecture.
diff --git a/include/asm-sparc/hardirq.h b/include/asm-sparc/hardirq.h
index 8057289e0f3e..822ec6f1062d 100644
--- a/include/asm-sparc/hardirq.h
+++ b/include/asm-sparc/hardirq.h
@@ -11,6 +11,7 @@
#include <linux/threads.h>
#include <linux/brlock.h>
#include <linux/spinlock.h>
+#include <linux/cache.h>
/* entry.S is sensitive to the offsets of these fields */ /* XXX P3 Is it? */
typedef struct {
diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h
index 848111d7980b..f3fdacf95ba5 100644
--- a/include/asm-sparc/io.h
+++ b/include/asm-sparc/io.h
@@ -187,9 +187,6 @@ extern unsigned long sbus_ioremap(struct resource *res, unsigned long offset,
extern void sbus_iounmap(unsigned long vaddr, unsigned long size);
-#define virt_to_phys(x) __pa((unsigned long)(x))
-#define phys_to_virt(x) __va((unsigned long)(x))
-
/*
* At the moment, we do not use CMOS_READ anywhere outside of rtc.c,
* so rtc_port is static in it. This should not change unless a new
diff --git a/include/asm-sparc/irq.h b/include/asm-sparc/irq.h
index d3f935afaf87..fb99a8c81f81 100644
--- a/include/asm-sparc/irq.h
+++ b/include/asm-sparc/irq.h
@@ -19,7 +19,7 @@
BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int)
#define __irq_itoa(irq) BTFIXUP_CALL(__irq_itoa)(irq)
-#define NR_IRQS 15
+#define NR_IRQS 16
#define irq_cannonicalize(irq) (irq)
diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h
index a08100e59c69..7e521e0c31f4 100644
--- a/include/asm-sparc/page.h
+++ b/include/asm-sparc/page.h
@@ -174,6 +174,9 @@ extern __inline__ int get_order(unsigned long size)
#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET))
+#define virt_to_phys(x) __pa((unsigned long)(x))
+#define phys_to_virt(x) __va((unsigned long)(x))
+
#define pfn_to_page(pfn) (mem_map + (pfn))
#define page_to_pfn(page) ((unsigned long)((page) - mem_map))
#define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
diff --git a/include/asm-sparc64/irq.h b/include/asm-sparc64/irq.h
index 397744bb33d7..5fbe174012cc 100644
--- a/include/asm-sparc64/irq.h
+++ b/include/asm-sparc64/irq.h
@@ -110,7 +110,7 @@ static __inline__ char *__irq_itoa(unsigned int irq)
return buff;
}
-#define NR_IRQS 15
+#define NR_IRQS 16
#define irq_cannonicalize(irq) (irq)
extern void disable_irq(unsigned int);
diff --git a/include/asm-sparc64/rwsem.h b/include/asm-sparc64/rwsem.h
index a559e183a1dd..fb100f981554 100644
--- a/include/asm-sparc64/rwsem.h
+++ b/include/asm-sparc64/rwsem.h
@@ -279,7 +279,7 @@ static __inline__ int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
"mov %%g7, %0\n\t"
: "=&r" (tmp)
: "0" (tmp), "r" (sem)
- : "g5", "g7", "memory");
+ : "g5", "g7", "memory", "cc");
return tmp + delta;
}
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h
index 9f7710f5a589..98c738d70a06 100644
--- a/include/asm-sparc64/system.h
+++ b/include/asm-sparc64/system.h
@@ -164,6 +164,11 @@ do { spin_unlock_irq(&(prev)->switch_lock); \
* not preserve it's value. Hairy, but it lets us remove 2 loads
* and 2 stores in this critical code path. -DaveM
*/
+#if __GNUC__ >= 3
+#define EXTRA_CLOBBER ,"%l1"
+#else
+#define EXTRA_CLOBBER
+#endif
#define switch_to(prev, next, last) \
do { if (test_thread_flag(TIF_PERFCTR)) { \
unsigned long __tmp; \
@@ -209,10 +214,11 @@ do { if (test_thread_flag(TIF_PERFCTR)) { \
: "0" (next->thread_info), \
"i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_FLAGS), "i" (TI_CWP), \
"i" (_TIF_NEWCHILD), "i" (TI_TASK) \
- : "cc", "g1", "g2", "g3", "g5", "g7", \
- "l2", "l3", "l4", "l5", "l6", "l7", \
+ : "cc", \
+ "g1", "g2", "g3", "g5", "g7", \
+ "l2", "l3", "l4", "l5", "l6", "l7", \
"i0", "i1", "i2", "i3", "i4", "i5", \
- "o0", "o1", "o2", "o3", "o4", "o5", "o7"); \
+ "o0", "o1", "o2", "o3", "o4", "o5", "o7" EXTRA_CLOBBER);\
/* If you fuck with this, update ret_from_syscall code too. */ \
if (test_thread_flag(TIF_PERFCTR)) { \
write_pcr(current_thread_info()->pcr_reg); \
diff --git a/sound/core/ioctl32/ioctl32.c b/sound/core/ioctl32/ioctl32.c
index fd37aab6d80d..4c2e37a01ee4 100644
--- a/sound/core/ioctl32/ioctl32.c
+++ b/sound/core/ioctl32/ioctl32.c
@@ -24,6 +24,7 @@
#include <linux/init.h>
#include <linux/time.h>
#include <linux/slab.h>
+#include <linux/fs.h>
#include <linux/init.h>
#include <sound/core.h>
#include <sound/control.h>
diff --git a/sound/core/ioctl32/rawmidi32.c b/sound/core/ioctl32/rawmidi32.c
index f75a53d4e8af..31b3319fba7a 100644
--- a/sound/core/ioctl32/rawmidi32.c
+++ b/sound/core/ioctl32/rawmidi32.c
@@ -20,6 +20,7 @@
#include <sound/driver.h>
#include <linux/time.h>
+#include <linux/fs.h>
#include <sound/core.h>
#include <sound/rawmidi.h>
#include <asm/uaccess.h>
diff --git a/sound/core/ioctl32/seq32.c b/sound/core/ioctl32/seq32.c
index e7a19f6c4ce6..1d396554b7ba 100644
--- a/sound/core/ioctl32/seq32.c
+++ b/sound/core/ioctl32/seq32.c
@@ -20,6 +20,7 @@
#include <sound/driver.h>
#include <linux/time.h>
+#include <linux/fs.h>
#include <sound/core.h>
#include <sound/timer.h>
#include <asm/uaccess.h>
diff --git a/sound/core/ioctl32/timer32.c b/sound/core/ioctl32/timer32.c
index b0167274aca1..1672e0342ec4 100644
--- a/sound/core/ioctl32/timer32.c
+++ b/sound/core/ioctl32/timer32.c
@@ -20,6 +20,7 @@
#include <sound/driver.h>
#include <linux/time.h>
+#include <linux/fs.h>
#include <sound/core.h>
#include <sound/timer.h>
#include <asm/uaccess.h>