--- hp_psaux.c	Wed Sep  5 10:51:44 2001
+++ hp_psaux.c.orig	Tue Aug 28 12:02:32 2001
@@ -44,5 +44,4 @@
 /* HP specific LASI PS/2 keyboard and psaux constants */
 #define	AUX_REPLY_ACK	0xFA	/* Command byte ACK. */
-#define	AUX_RESEND	0xFE	/* Sent by the keyb. Asking for resending the last command. */
 #define	AUX_RECONNECT	0xAA	/* scancode when ps2 device is plugged (back) in */
 
@@ -73,5 +72,6 @@
 
 static unsigned long lasikbd_hpa;
-static int cmd_status;
+static unsigned long lasips2_hpa;
+
 
 static inline u8 read_input(unsigned long hpa)
@@ -107,8 +107,7 @@
 	}
 
-#if 0
 	if (wait)
 		printk(KERN_DEBUG "Lasi PS/2 wait %d\n", wait);
-#endif	
+	
 	gsc_writeb(val, hpa+LASI_XMTDATA);
 
@@ -125,26 +124,12 @@
 static void lasikbd_leds(unsigned char leds)
 {
-       cmd_status=2;
-       while (cmd_status!=0) {
-               write_output(KBD_CMD_SET_LEDS, lasikbd_hpa);
-               mdelay(5);
-       }
-
-       cmd_status=2;
-       while (cmd_status!=0) {
-               write_output(leds, lasikbd_hpa);
-               mdelay(5);
-       }
-
-       cmd_status=2;
-       while (cmd_status!=0) {
-          write_output(KBD_CMD_ENABLE, lasikbd_hpa);
-          mdelay(5);
-       }
+	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(unsigned long hpa)
+int lasi_ps2_test(void *hpa)
 {
 	u8 control,c;
@@ -171,54 +156,8 @@
 #endif 
 
-static int init_keyb(unsigned long hpa)
-{
-       int fail;
-       u8 data=0;
-
-
-       do {
-               while ((read_status(hpa) & LASI_STAT_TBNE));
-               gsc_writeb(KBD_CMD_SET_LEDS, hpa+LASI_XMTDATA);
-
-               while (!(read_status(hpa) & LASI_STAT_RBNE));
-
-               while ((read_status(hpa) & LASI_STAT_RBNE)) data=read_input(hpa);
-       }while(data!=AUX_REPLY_ACK);
-
-       fail=0;
-
-       do {
-               while ((read_status(hpa) & LASI_STAT_TBNE));
-               gsc_writeb(0x00, hpa+LASI_XMTDATA);
-
-               while (!(read_status(hpa) & LASI_STAT_RBNE));
-
-               while ((read_status(hpa) & LASI_STAT_RBNE)) {
-                       data=read_input(hpa);
-                       fail++;
-                       if(fail==10) break;
-               }
-       }while(data!=AUX_REPLY_ACK);
-
-       fail=0;
-       do {
-               while ((read_status(hpa) & LASI_STAT_TBNE));
-               gsc_writeb(KBD_CMD_ENABLE, hpa+LASI_XMTDATA);
-
-               while (!(read_status(hpa) & LASI_STAT_RBNE));
-               while ((read_status(hpa) & LASI_STAT_RBNE)) {
-                       data=read_input(hpa);
-                       fail++;
-                       if(fail==10) break;
-               }
-
-       }while(data!=AUX_REPLY_ACK);
-
-       return 1;
-}
-
-static void __init lasi_ps2_reset(unsigned long hpa)
+static int __init lasi_ps2_reset(unsigned long hpa, int id)
 {
 	u8 control;
+	int ret = 1;
 
 	/* reset the interface */
@@ -229,4 +168,20 @@
 	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;
 }
 
@@ -409,5 +364,5 @@
 	fasync_aux(-1, file, 0);
 	if (--aux_count) {
-		unlock_kernel();
+	   unlock_kernel();
 		return 0;
 	}
@@ -445,5 +400,7 @@
         
         if (id==1) 
-		hpa -= LASI_PSAUX_OFFSET; 
+           hpa -= LASI_PSAUX_OFFSET; 
+        lasikbd_hpa = hpa;
+        
 
         status_keyb = read_status(hpa);
@@ -452,33 +409,27 @@
         while ((status_keyb|status_mouse) & LASI_STAT_RBNE){
            
-		while (status_keyb & LASI_STAT_RBNE) {
+           while (status_keyb & LASI_STAT_RBNE) {
 	      
-		scancode = read_input(hpa);
+              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 (scancode == AUX_REPLY_ACK)
-			cmd_status=0;
-
-		else if (scancode == AUX_RESEND)
-			cmd_status=1;
-		else
-			handle_at_scancode(scancode);
+	      /* 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);
-		}
+	      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);
+           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);
+           status_keyb = read_status(hpa);
         }
 
@@ -487,16 +438,22 @@
 }
 
+
+
+	
 extern struct pt_regs *kbd_pt_regs;
 
 static void lasikbd_interrupt(int irq, void *dev, struct pt_regs *regs)
 {
+	lasips2_hpa = (unsigned long) dev; /* save "hpa" for lasikbd_leds() */
 	kbd_pt_regs = regs;
-	handle_lasikbd_event(dev);
+	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
@@ -512,5 +469,5 @@
 	unsigned int irq;
 	char *name;
-	int device_found=0;
+	int device_found;
 	u8 id;
 
@@ -532,8 +489,18 @@
 	
 	/* reset the PS/2 port */
-	lasi_ps2_reset(hpa);
+	device_found = lasi_ps2_reset(hpa,id);
+
+	/* allocate the irq and memory region for that device */
+	if (!(irq = busdevice_alloc_irq(dev)))
+		return -ENODEV;
+		    
+	if (request_irq(irq, lasikbd_interrupt, 0, name, (void *)hpa))
+		return -ENODEV;
+	
+	if (!request_mem_region(hpa, LASI_STATUS + 4, name))
+		return -ENODEV;
+
 	switch (id) {
 	case 0:	
-		device_found = init_keyb(hpa);
 		register_kbd_ops(&gsc_ps2_kbd_ops);
 		break;
@@ -561,15 +528,4 @@
 	} /* of case */
 	
-        /* allocate the irq and memory region for that device */
-	if (!(irq = busdevice_alloc_irq(dev)))
-		return -ENODEV;
-
-	if (request_irq(irq, lasikbd_interrupt, 0, name, (void *)hpa))
-		return -ENODEV;
-
-	if (!request_mem_region((unsigned long)hpa, LASI_STATUS + 4, name))
-		return -ENODEV;
-
-
 	printk(KERN_INFO "PS/2 %s port at 0x%08lx (irq %d) found, "
 			 "%sdevice attached.\n",
