Index: linux-2.6.21/drivers/cbus/retu-pwrbutton.c =================================================================== --- linux-2.6.21.orig/drivers/cbus/retu-pwrbutton.c 2008-02-20 22:44:18.000000000 +0000 +++ linux-2.6.21/drivers/cbus/retu-pwrbutton.c 2008-02-20 22:46:22.000000000 +0000 @@ -53,7 +53,9 @@ state = PWRBTN_PRESSED; if (pwrbtn_state != state) { - input_report_key(pwrbtn_dev, KEY_POWER, state); + input_report_key(pwrbtn_dev, KEY_SUSPEND, state); + if (state == PWRBTN_PRESSED) + input_event(pwrbtn_dev, EV_PWR, KEY_SUSPEND, 1); pwrbtn_state = state; } } @@ -92,8 +94,8 @@ if (!pwrbtn_dev) return -ENOMEM; - pwrbtn_dev->evbit[0] = BIT(EV_KEY); - pwrbtn_dev->keybit[LONG(KEY_POWER)] = BIT(KEY_POWER); + pwrbtn_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); + pwrbtn_dev->keybit[LONG(KEY_SUSPEND)] = BIT(KEY_SUSPEND); pwrbtn_dev->name = "retu-pwrbutton"; input_register_device(pwrbtn_dev); Index: linux-2.6.21/drivers/char/apm-emulation.c =================================================================== --- linux-2.6.21.orig/drivers/char/apm-emulation.c 2008-02-21 00:32:41.000000000 +0000 +++ linux-2.6.21/drivers/char/apm-emulation.c 2008-02-21 00:33:43.000000000 +0000 @@ -206,10 +206,18 @@ return ret; } +static in_suspend; + static void apm_suspend(void) { struct apm_user *as; - int err = pm_suspend(PM_SUSPEND_MEM); + int err; + + in_suspend = 1; + + err = pm_suspend(PM_SUSPEND_MEM); + + in_suspend = 0; /* * Anyone on the APM queues will think we're still suspended. @@ -663,6 +671,9 @@ { unsigned long flags; + if (in_suspend) + return; + spin_lock_irqsave(&kapmd_queue_lock, flags); queue_add_event(&kapmd_queue, event); spin_unlock_irqrestore(&kapmd_queue_lock, flags);