Hello, All:

I have a situation where a Dell laptop would loose its
keyboard after resume (thanks to Ben LaHaise for
diagnosing this probelm). BIOS enables touchpad
when resumed and if a user touches touchpad, "hardware"
delivers IRQ 12 and will not deliver IRQ 1 until we
process the mouse event. Which we do not (in case
a USB mouse is used, for instance).

I may do what BIOS ought to do upon suspend, but it
does not feel right. So... do we need anything like that?
If yes, I may polish it up w.r.t. non-x86 etc.

-- Pete

diff -ur -X dontdiff linux-2.4.2-0.1.32/drivers/char/keyboard.c 
linux-2.4.2-0.1.32-p3/drivers/char/keyboard.c
--- linux-2.4.2-0.1.32/drivers/char/keyboard.c  Mon Mar 26 16:59:28 2001
+++ linux-2.4.2-0.1.32-p3/drivers/char/keyboard.c       Wed Mar 28 15:33:47 2001
@@ -162,6 +162,14 @@
 
 static struct pm_dev *pm_kbd;
 
+static int pm_kbd_request(struct pm_dev *dev, pm_request_t req, void *data)
+{
+       if (req == PM_RESUME) {
+               kbd_pm_resume();
+       }
+       return 0;
+}
+
 /*
  * Many other routines do put_queue, but I think either
  * they produce ASCII, or they produce some user-assigned
@@ -934,7 +942,7 @@
        tasklet_enable(&keyboard_tasklet);
        tasklet_schedule(&keyboard_tasklet);
        
-       pm_kbd = pm_register(PM_SYS_DEV, PM_SYS_KBC, NULL);
+       pm_kbd = pm_register(PM_SYS_DEV, PM_SYS_KBC, pm_kbd_request);
 
        return 0;
 }
diff -ur -X dontdiff linux-2.4.2-0.1.32/drivers/char/pc_keyb.c 
linux-2.4.2-0.1.32-p3/drivers/char/pc_keyb.c
--- linux-2.4.2-0.1.32/drivers/char/pc_keyb.c   Mon Mar 26 17:00:03 2001
+++ linux-2.4.2-0.1.32-p3/drivers/char/pc_keyb.c        Wed Mar 28 15:41:06 2001
@@ -530,6 +530,31 @@
        }
 }
 
+void pckbd_pm_resume(void)
+{
+       unsigned int flags;
+
+/* P3 */ printk("pckbd_pm_resume: queue %p aux_count %d\n", queue, aux_count);
+       if (queue) {                    /* Aux port detected */
+               if (aux_count == 0) {   /* Mouse not in use */
+                       spin_lock_irqsave(&kbd_controller_lock, flags);
+                       /*
+                        * Dell Lat. C600 A06 enables mouse after resume.
+                        * When user touches the pad, it posts IRQ 12
+                        * (which we do not process), thus holding keyboard.
+                        */
+                       kbd_write_command(KBD_CCMD_MOUSE_DISABLE);
+                       /* kbd_write_cmd(AUX_INTS_OFF); */ /* Config & lock */
+                       kb_wait();
+                       kbd_write_command(KBD_CCMD_WRITE_MODE);
+                       kb_wait();
+                       kbd_write_output(AUX_INTS_OFF);
+                       spin_unlock_irqrestore(&kbd_controller_lock, flags);
+/* P3 */ printk("pckbd_pm_resume: done\n");
+               }
+       }
+}
+
 /*
  * In case we run on a non-x86 hardware we need to initialize both the
  * keyboard controller and the keyboard.  On a x86, the BIOS will
diff -ur -X dontdiff linux-2.4.2-0.1.32/include/asm-i386/keyboard.h 
linux-2.4.2-0.1.32-p3/include/asm-i386/keyboard.h
--- linux-2.4.2-0.1.32/include/asm-i386/keyboard.h      Wed Feb 21 19:11:45 2001
+++ linux-2.4.2-0.1.32-p3/include/asm-i386/keyboard.h   Wed Mar 28 15:11:13 2001
@@ -26,6 +26,7 @@
                           char raw_mode);
 extern char pckbd_unexpected_up(unsigned char keycode);
 extern void pckbd_leds(unsigned char leds);
+extern void pckbd_pm_resume(void);
 extern void pckbd_init_hw(void);
 extern unsigned char pckbd_sysrq_xlate[128];
 
@@ -34,6 +35,7 @@
 #define kbd_translate          pckbd_translate
 #define kbd_unexpected_up      pckbd_unexpected_up
 #define kbd_leds               pckbd_leds
+#define kbd_pm_resume          pckbd_pm_resume
 #define kbd_init_hw            pckbd_init_hw
 #define kbd_sysrq_xlate                pckbd_sysrq_xlate
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to