Index: linux-2.6.12/drivers/input/keyboard/corgikbd.c
===================================================================
--- linux-2.6.12.orig/drivers/input/keyboard/corgikbd.c	2005-07-24 16:32:30.000000000 +0100
+++ linux-2.6.12/drivers/input/keyboard/corgikbd.c	2005-07-24 16:39:30.000000000 +0100
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/input.h>
 #include <linux/interrupt.h>
+#include <linux/jiffies.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <asm/irq.h>
@@ -76,6 +77,9 @@
 
 	struct timer_list timer;
 	struct timer_list htimer;
+
+	unsigned int suspended;
+	unsigned long suspend_jiffies;
 };
 
 #define KB_DISCHARGE_DELAY	10
@@ -138,6 +142,9 @@
 	unsigned long flags;
 	unsigned int num_pressed;
 
+	if (corgikbd_data->suspended)
+		return;
+
 	spin_lock_irqsave(&corgikbd_data->lock, flags);
 
 	if (regs)
@@ -162,8 +169,11 @@
 			if (rowd & KB_ROWMASK(row)) {
 				input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 1);
 				num_pressed++;
-				if (corgikbd_data->keycode[scancode] == CORGI_KEY_OFF)
+				if ((corgikbd_data->keycode[scancode] == CORGI_KEY_OFF)
+						&& time_after(jiffies, corgikbd_data->suspend_jiffies + HZ)) {
 					input_event(&corgikbd_data->input, EV_PWR, CORGI_KEY_OFF, 1);
+					corgikbd_data->suspend_jiffies=jiffies;
+				}
 			} else {
 				input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 0);
 			}
@@ -228,6 +238,9 @@
 	unsigned long gprr;
 	unsigned long flags;
 
+	if (corgikbd_data->suspended)
+		return;
+
 	gprr = read_scoop_reg(&corgiscoop_device.dev, SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB);
 	if (gprr != sharpsl_hinge_state) {
 		hinge_count = 0;
@@ -247,6 +260,34 @@
 	mod_timer(&corgikbd_data->htimer, jiffies + HINGE_SCAN_INTERVAL);
 }
 
+
+#ifdef CONFIG_PM
+static int corgikbd_suspend(struct device *dev, pm_message_t state, uint32_t level)
+{
+	if (level == SUSPEND_POWER_DOWN) {
+		struct corgikbd *corgikbd = dev_get_drvdata(dev);
+
+		corgikbd->suspended = 1;
+	}
+	return 0;
+}
+
+static int corgikbd_resume(struct device *dev, uint32_t level)
+{
+	if (level == RESUME_POWER_ON) {
+		struct corgikbd *corgikbd = dev_get_drvdata(dev);
+
+		/* Upon resume, ignore the suspend key for a short while */
+		corgikbd->suspend_jiffies=jiffies;
+		corgikbd->suspended = 0;
+	}
+	return 0;
+}
+#else
+#define corgikbd_suspend	NULL
+#define corgikbd_resume		NULL
+#endif
+
 static int __init corgikbd_probe(struct device *dev)
 {
 	int i;
@@ -259,7 +300,7 @@
 	dev_set_drvdata(dev,corgikbd);
 	strcpy(corgikbd->phys, "corgikbd/input0");
 
-	spin_lock_init(corgikbd->lock);
+	spin_lock_init(&corgikbd->lock);
 
 	/* Init Keyboard rescan timer */
 	init_timer(&corgikbd->timer);
@@ -271,6 +312,8 @@
 	corgikbd->htimer.function = corgikbd_hinge_timer;
 	corgikbd->htimer.data = (unsigned long) corgikbd;
 
+	corgikbd->suspend_jiffies=jiffies;
+
 	init_input_dev(&corgikbd->input);
 	corgikbd->input.private = corgikbd;
 	corgikbd->input.name = "Corgi Keyboard";
@@ -337,6 +380,8 @@
 	.bus		= &platform_bus_type,
 	.probe		= corgikbd_probe,
 	.remove		= corgikbd_remove,
+	.suspend	= corgikbd_suspend,
+	.resume		= corgikbd_resume,
 };
 
 static int __devinit corgikbd_init(void)

