diff -ruNp 702-keyboard-and-8250-hooks-old/drivers/char/keyboard.c 702-keyboard-and-8250-hooks-new/drivers/char/keyboard.c
--- 702-keyboard-and-8250-hooks-old/drivers/char/keyboard.c	2004-12-14 07:00:02.181078656 +1100
+++ 702-keyboard-and-8250-hooks-new/drivers/char/keyboard.c	2004-12-14 06:59:30.519891888 +1100
@@ -33,6 +33,7 @@
 #include <linux/string.h>
 #include <linux/random.h>
 #include <linux/init.h>
+#include <linux/suspend.h>
 #include <linux/slab.h>
 
 #include <linux/kbd_kern.h>
@@ -1091,6 +1092,10 @@ void kbd_keycode(unsigned int keycode, i
 		return;
 	}
 #endif
+	if (down && (test_suspend_state(SUSPEND_RUNNING))) {
+		suspend_handle_keypress(keycode, SUSPEND_KEY_KEYBOARD);
+		return;
+	}
 #if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
 	if (keycode == KEY_A && sparc_l1_a_state) {
 		sparc_l1_a_state = 0;
diff -ruNp 702-keyboard-and-8250-hooks-old/drivers/serial/8250.c 702-keyboard-and-8250-hooks-new/drivers/serial/8250.c
--- 702-keyboard-and-8250-hooks-old/drivers/serial/8250.c	2004-12-14 07:00:02.184078200 +1100
+++ 702-keyboard-and-8250-hooks-new/drivers/serial/8250.c	2004-12-14 06:59:54.937179896 +1100
@@ -39,6 +39,7 @@
 #include <linux/serial_core.h>
 #include <linux/serial.h>
 #include <linux/serial_8250.h>
+#include <linux/suspend.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -1068,6 +1069,12 @@ receive_chars(struct uart_8250_port *up,
 		}
 		if (uart_handle_sysrq_char(&up->port, ch, regs))
 			goto ignore_char;
+#if defined(CONFIG_SERIAL_CORE_CONSOLE) && defined(CONFIG_SOFTWARE_SUSPEND2)
+		if (test_suspend_state(SUSPEND_RUNNING)) {
+			suspend_handle_keypress(ch, SUSPEND_KEY_SERIAL);
+			goto ignore_char;
+		}
+#endif
 		if ((lsr & up->port.ignore_status_mask) == 0) {
 			tty_insert_flip_char(tty, ch, flag);
 		}
