diff -Nur linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/looxc550_buttons.c linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/looxc550_buttons.c
--- linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/looxc550_buttons.c	1970-01-01 05:00:00.000000000 +0500
+++ linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/looxc550_buttons.c	2007-07-10 21:00:49.000000000 +0600
@@ -0,0 +1,118 @@
+/*
+ *  linux/arch/arm/mach-pxa/looxc550/looxc550_buttons.c
+ *
+ *  Keyboard definitions for FSC LOOX C550
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#include <linux/input.h>
+#include <linux/input_pda.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/platform_device.h>
+#include <linux/gpio_keys.h>
+
+#include <asm/mach-types.h>
+#include <asm/arch/pxa27x_keyboard.h>
+#include <asm/arch/looxc550.h>
+
+
+/**************************** Keyboard **************************/
+
+static struct pxa27x_keyboard_platform_data looxc550_buttons = {
+    .nr_rows = 5,
+    .nr_cols = 2,
+    .keycodes = {
+	{	_KEY_RECORD,
+		KEY_UP
+	},
+	{	_KEY_CALENDAR,
+		KEY_DOWN
+        },
+	{	KEY_RIGHT,
+		_KEY_MAIL
+	},
+	{	_KEY_CONTACTS,
+		KEY_LEFT
+        },
+	{	_KEY_HOMEPAGE,
+		KEY_ENTER
+        },
+    },
+    .gpio_modes = {
+	GPIO_NR_LOOXC550_KP_MKIN0_MD,
+	GPIO_NR_LOOXC550_KP_MKIN1_MD,
+	GPIO_NR_LOOXC550_KP_MKIN2_MD,
+	GPIO_NR_LOOXC550_KP_MKIN3_MD,
+	GPIO_NR_LOOXC550_KP_MKIN4_MD,
+	GPIO_NR_LOOXC550_KP_MKOUT0_MD,
+	GPIO_NR_LOOXC550_KP_MKOUT1_MD,
+    }
+};
+
+static struct platform_device looxc550_pxa_keyboard = {
+	.name	= "pxa27x-keyboard",
+	.id	= -1,
+	.dev	= {
+		.platform_data = &looxc550_buttons
+	}
+};
+
+/*
+Power button connected to GPIO 0, so we need use gpio-keys
+*/
+
+static struct gpio_keys_button looxc550_gpio_buttons[] = {
+	{ KEY_POWER, GPIO_NR_LOOXC550_KEYPWR, 0, "Power button"}
+};
+
+static struct gpio_keys_platform_data looxc550_gpio_keys_data = {
+	.buttons = looxc550_gpio_buttons,
+	.nbuttons = ARRAY_SIZE(looxc550_gpio_buttons)
+};
+
+static struct platform_device looxc550_gpio_keys = {
+	.name = "gpio-keys",
+	.dev = {
+		.platform_data = &looxc550_gpio_keys_data
+	}
+};
+
+/*********************************************************************/
+
+static int __devinit looxc550_buttons_probe(struct platform_device *dev)
+{
+	platform_device_register(&looxc550_pxa_keyboard);
+	platform_device_register(&looxc550_gpio_keys);
+        return 0;
+}
+
+static struct platform_driver looxc550_buttons_driver = {
+	.driver	= {
+	    .name= "looxc550-buttons",
+	},
+	.probe	= looxc550_buttons_probe
+};
+
+static int __init looxc550_buttons_init(void)
+{
+	if (!machine_is_looxc550())
+	    return -ENODEV;
+	return platform_driver_register(&looxc550_buttons_driver);
+}
+
+static void __exit looxc550_buttons_exit(void)
+{
+	platform_driver_unregister(&looxc550_buttons_driver);
+}
+
+module_init(looxc550_buttons_init);
+module_exit(looxc550_buttons_exit);
+
+MODULE_DESCRIPTION ("Buttons support for FSC Loox C550");
+MODULE_LICENSE ("GPL");
diff -Nur linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/looxc550.c linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/looxc550.c
--- linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/looxc550.c	2007-07-08 02:52:32.000000000 +0600
+++ linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/looxc550.c	2007-07-10 22:17:05.000000000 +0600
@@ -154,9 +154,14 @@
 	}
 };
 
+static struct platform_device looxc550_keyboard = {
+	.name = "looxc550-buttons"
+};
+
 static struct platform_device *devices[] __initdata = {
 	&ads7846_ssp,
-	&ads7846_ts
+	&ads7846_ts,
+	&looxc550_keyboard
 };
 
 static void __init looxc550_init(void)
diff -Nur linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/Makefile linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/Makefile
--- linux-2.6.x-hh-orig/arch/arm/mach-pxa/looxc550/Makefile	2007-07-08 02:49:10.000000000 +0600
+++ linux-2.6.x-hh11/arch/arm/mach-pxa/looxc550/Makefile	2007-07-10 16:00:56.000000000 +0600
@@ -1 +1 @@
-obj-y += looxc550.o
+obj-y += looxc550.o looxc550_buttons.o
diff -Nur linux-2.6.x-hh-orig/drivers/input/keyboard/gpio_keys.c linux-2.6.x-hh11/drivers/input/keyboard/gpio_keys.c
--- linux-2.6.x-hh-orig/drivers/input/keyboard/gpio_keys.c	2007-04-14 03:13:34.000000000 +0600
+++ linux-2.6.x-hh11/drivers/input/keyboard/gpio_keys.c	2007-07-10 22:13:24.000000000 +0600
@@ -79,7 +79,7 @@
 		int irq = gpio_to_irq(pdata->buttons[i].gpio);
 
 		set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
-		error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+		error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM | IRQF_SHARED | IRQF_DISABLED,
 				     pdata->buttons[i].desc ? pdata->buttons[i].desc : "gpio_keys",
 				     pdev);
 		if (error) {
diff -Nur linux-2.6.x-hh-orig/include/asm-arm/arch-pxa/looxc550.h linux-2.6.x-hh11/include/asm-arm/arch-pxa/looxc550.h
--- linux-2.6.x-hh-orig/include/asm-arm/arch-pxa/looxc550.h	2007-07-10 17:48:16.000000000 +0600
+++ linux-2.6.x-hh11/include/asm-arm/arch-pxa/looxc550.h	2007-07-10 20:01:47.000000000 +0600
@@ -1,4 +1,37 @@
+#include <asm/arch/pxa-regs.h>
+
+#define GPIO_NR_LOOXC550_KEYPWR			0
+
+#define GPIO_NR_LOOXC550_BATTCOVER		4
+
+#define GPIO_NR_LOOXC550_EXTPOWER		9
+
+#define GPIO_NR_LOOXC550_USBCONNECT		13
+
 #define GPIO_NR_LOOXC550_SD_RO			15
+
 #define GPIO_NR_LOOXC550_SD_DETECT		78
+
+#define GPIO_NR_LOOXC550_HP_JACK		93
 #define GPIO_NR_LOOXC550_TOUCHPANEL_IRQ_N	94
+
+#define GPIO_NR_LOOXC550_KP_MKIN3		97
+#define GPIO_NR_LOOXC550_KP_MKIN4		98
+
+
+#define GPIO_NR_LOOXC550_KP_MKIN0		100
+#define GPIO_NR_LOOXC550_KP_MKIN1		101
+#define GPIO_NR_LOOXC550_KP_MKIN2		102
+#define GPIO_NR_LOOXC550_KP_MKOUT0		103
+#define GPIO_NR_LOOXC550_KP_MKOUT1		104
+
 #define GPIO_NR_LOOXC550_SD_POWER		108
+
+#define GPIO_NR_LOOXC550_KP_MKIN0_MD		(GPIO_NR_LOOXC550_KP_MKIN0 | GPIO_ALT_FN_1_IN)
+#define GPIO_NR_LOOXC550_KP_MKIN1_MD		(GPIO_NR_LOOXC550_KP_MKIN1 | GPIO_ALT_FN_1_IN)
+#define GPIO_NR_LOOXC550_KP_MKIN2_MD		(GPIO_NR_LOOXC550_KP_MKIN2 | GPIO_ALT_FN_1_IN)
+#define GPIO_NR_LOOXC550_KP_MKIN3_MD		(GPIO_NR_LOOXC550_KP_MKIN3 | GPIO_ALT_FN_3_IN)
+#define GPIO_NR_LOOXC550_KP_MKIN4_MD		(GPIO_NR_LOOXC550_KP_MKIN4 | GPIO_ALT_FN_3_IN)
+
+#define GPIO_NR_LOOXC550_KP_MKOUT0_MD		(GPIO_NR_LOOXC550_KP_MKOUT0 | GPIO_ALT_FN_2_OUT)
+#define GPIO_NR_LOOXC550_KP_MKOUT1_MD		(GPIO_NR_LOOXC550_KP_MKOUT1 | GPIO_ALT_FN_2_OUT)
