diff -Naru kernel26.orig/arch/arm/mach-pxa/htcsable/htcsable.c kernel26/arch/arm/mach-pxa/htcsable/htcsable.c
--- kernel26.orig/arch/arm/mach-pxa/htcsable/htcsable.c	2008-03-17 02:37:02.000000000 +0100
+++ kernel26/arch/arm/mach-pxa/htcsable/htcsable.c	2008-03-17 02:24:22.000000000 +0100
@@ -15,6 +15,8 @@
 #include <linux/fb.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/gpio_keys.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -111,7 +113,6 @@
 extern struct platform_device htcsable_keyboard;
 static struct platform_device htcsable_udc       = { .name = "htcsable_udc", };
 static struct platform_device htcsable_ts        = { .name = "htcsable_ts", };
-static struct platform_device htcsable_kbd        = { .name = "htcsable_kbd", };
 static struct platform_device htcsable_buttons   = { .name = "htcsable_buttons", };
 static struct platform_device htcsable_lcd        = { .name = "htcsable_lcd", };
 
@@ -229,7 +230,6 @@
 
 static struct platform_device *htcsable_asic3_devices[] __initdata = {
 	&htcsable_ts,
-	&htcsable_kbd,
 	&htcsable_lcd,
 	&htcsable_keyboard,
 	&htcsable_buttons,
@@ -341,8 +341,26 @@
   },
 };
 
+static struct gpio_keys_button htcsable_gpio_buttons[] = {
+        { KEY_POWER,     GPIO_NR_HTCSABLE_KEY_ON_N, 0, "Power button" },
+};
+
+static struct gpio_keys_platform_data htcsable_gpio_keys_data = {
+        .buttons = htcsable_gpio_buttons,
+        .nbuttons = ARRAY_SIZE(htcsable_gpio_buttons),
+};
+
+static struct platform_device htcsable_gpio_keys = {
+        .name = "gpio-keys",
+        .dev = {
+                .platform_data = &htcsable_gpio_keys_data,
+        },
+};
+
+
 static struct platform_device *devices[] __initdata = {
   &htcsable_core,
+  &htcsable_gpio_keys,
 };
 
 #ifdef CONFIG_HTCSABLE_BT
diff -Naru kernel26.orig/arch/arm/mach-pxa/htcsable/htcsable_kbd.c kernel26/arch/arm/mach-pxa/htcsable/htcsable_kbd.c
--- kernel26.orig/arch/arm/mach-pxa/htcsable/htcsable_kbd.c	2008-03-11 00:59:19.000000000 +0100
+++ kernel26/arch/arm/mach-pxa/htcsable/htcsable_kbd.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,90 +0,0 @@
-/*
- *  htcsable_kbd.c
- *  Keyboard support for the h4350 ipaq
- *
- *  (c) Shawn Anderson, March, 2006
- *  This code is released under the GNU General Public License
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include <linux/platform_device.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/input_pda.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <asm/arch/h4000-gpio.h>
-#include <asm/arch/h4000-asic.h>
-#include <asm/arch/pxa-regs.h>
-#include <asm/hardware.h>
-#include <asm/arch/bitfield.h>
-#include <asm/mach-types.h>     /* machine_is_ */
-
-static struct input_dev *htcsable_kbd;
-
-#define KEY_FUNC 0x32
-
-static irqreturn_t htcsable_pwr_btn(int irq, void* data)
-{
-	int pressed;
-	pressed = !GET_H4000_GPIO(POWER_BUTTON_N);
-
-	input_report_key(htcsable_kbd, KEY_POWER, pressed);
-	input_sync(htcsable_kbd);
-
-	return IRQ_HANDLED;
-}
-
-static int __init htcsable_kbd_probe(struct platform_device * pdev)
-{
-	if (!(machine_is_hw6900() || machine_is_htcbeetles()))
-		return -ENODEV;
-
-	if (!(htcsable_kbd = input_allocate_device()))
-		return -ENOMEM;
-
-	htcsable_kbd->name        = "HP iPAQ hw6915 power key driver";
-	htcsable_kbd->evbit[0]    = BIT(EV_KEY) | BIT(EV_REP);
-
-	set_bit(KEY_POWER, htcsable_kbd->keybit);
-	request_irq(IRQ_GPIO(GPIO_NR_H4000_POWER_BUTTON_N), htcsable_pwr_btn,
-			IRQF_SAMPLE_RANDOM, "Power button", NULL);
-	set_irq_type(IRQ_GPIO(GPIO_NR_H4000_POWER_BUTTON_N), IRQT_BOTHEDGE);
-
-	input_register_device(htcsable_kbd);
-
-	return 0;
-}
-
-static int htcsable_kbd_remove(struct platform_device * pdev)
-{       
-	input_unregister_device(htcsable_kbd);
-	free_irq(IRQ_GPIO(GPIO_NR_H4000_POWER_BUTTON_N), NULL);
-
-	return 0;
-}
-
-static struct platform_driver htcsable_kbd_driver = {
-	.probe    = htcsable_kbd_probe,
-	.remove   = htcsable_kbd_remove,
-	.driver   = {
-	    .name = "htcsable_kbd",
-	},
-};
-
-static int __init htcsable_kbd_init(void)
-{
-	return platform_driver_register(&htcsable_kbd_driver);
-}
-
-static void __exit htcsable_kbd_exit(void)
-{
-	platform_driver_unregister(&htcsable_kbd_driver);
-}
-
-module_init(htcsable_kbd_init);
-module_exit(htcsable_kbd_exit);
-
-MODULE_AUTHOR("Shawn Anderson");
-MODULE_DESCRIPTION("Keyboard support for the iPAQ h43xx");
-MODULE_LICENSE("GPL");
diff -Naru kernel26.orig/arch/arm/mach-pxa/htcsable/Makefile kernel26/arch/arm/mach-pxa/htcsable/Makefile
--- kernel26.orig/arch/arm/mach-pxa/htcsable/Makefile	2008-03-17 02:36:04.000000000 +0100
+++ kernel26/arch/arm/mach-pxa/htcsable/Makefile	2008-03-17 02:15:40.000000000 +0100
@@ -6,16 +6,14 @@
                                     htcsable_pm.o \
                                     htcsable_core.o \
 				    htcsable_keyboard.o \
-                                    htcsable_buttons.o \
-                                    htcsable_kbd.o
+                                    htcsable_buttons.o
 
 obj-$(CONFIG_MACH_HW6900)    += htcsable.o htcsable_udc.o \
                                     htcsable_ts2.o \
                                     htcsable_pm.o \
                                     htcsable_core.o \
 				    htcsable_keyboard.o \
-                                    htcsable_buttons.o \
-                                    htcsable_kbd.o
+                                    htcsable_buttons.o
 
 obj-$(CONFIG_HTCSABLE_BT)		+= htcsable_bt.o
 obj-$(CONFIG_HTCSABLE_PHONE)		+= htcsable_phone.o

