diff --git a/arch/arm/mach-sc/board-sp7715ga.c b/arch/arm/mach-sc/board-sp7715ga.c
index d80e056..cc9db11 100755
--- a/arch/arm/mach-sc/board-sp7715ga.c
+++ b/arch/arm/mach-sc/board-sp7715ga.c
@@ -26,8 +26,10 @@
 #include <asm/localtimer.h>
 
 #include <linux/i2c.h>
-//#include <linux/i2c/ft53x6_ts.h>
+#if(defined(CONFIG_TOUCHSCREEN))
+#include <linux/i2c/ft53x6_ts.h>
 #include <linux/i2c/focaltech.h>
+#endif
 #if(defined(CONFIG_INPUT_LIS3DH_I2C)||defined(CONFIG_INPUT_LIS3DH_I2C_MODULE))
 #include <linux/i2c/lis3dh.h>
 #endif
@@ -67,6 +69,11 @@
 #include <mach/regulator.h>
 #include <mach/i2s.h>
 
+#if defined(CONFIG_KEYBOARD_GPIO)
+#include <linux/gpio_keys.h>
+#include <linux/interrupt.h>
+#endif
+
 extern void __init sci_reserve(void);
 extern void __init sci_map_io(void);
 extern void __init sci_init_irq(void);
@@ -78,15 +85,35 @@ extern int __init sprd_ramconsole_init(void);
 #endif
 
 /*keypad define */
-#define CUSTOM_KEYPAD_ROWS          (SCI_ROW0 | SCI_ROW1)
-#define CUSTOM_KEYPAD_COLS          (SCI_COL0 | SCI_COL1)
-#define ROWS	(2)
-#define COLS	(2)
+#define CUSTOM_KEYPAD_ROWS          (SCI_ROW0 | SCI_ROW1 | SCI_ROW2 )
+#define CUSTOM_KEYPAD_COLS          (SCI_COL0 | SCI_COL1 | SCI_COL2 )
+#define ROWS	(3)
+#define COLS	(3)
+
+#if defined(CONFIG_KEYBOARD_GPIO)
+#define GPIO_1_KEY 101
+#define GPIO_2_KEY 108
+#define GPIO_4_KEY 107
+#define GPIO_6_KEY 109
+#define GPIO_NUMERIC_STAR_KEY 100
+#define GPIO_UP_KEY 99
+#define GPIO_9_KEY 102
+#define GPIO_7_KEY 103
+#define GPIO_8_KEY 106
+#define GPIO_LEFT_KEY 105
+#define GPIO_RIGHT_KEY 110
+#define GPIO_SELECT_KEY 104
+#endif
 
 static const unsigned int board_keymap[] = {
-	KEY(0, 0, KEY_VOLUMEDOWN),
-	KEY(1, 0, KEY_VOLUMEUP),
-	KEY(0, 1, KEY_CAMERA),
+	KEY(0, 0, KEY_5),
+	KEY(1, 0, KEY_BACK),
+	KEY(2, 0, KEY_DOWN),
+	KEY(0, 1, KEY_SEND),
+	KEY(1, 1, KEY_0),
+	KEY(0, 2, KEY_3),
+	KEY(1, 2, KEY_MENU),
+	KEY(2, 2, KEY_NUMERIC_POUND),
 };
 
 static const struct matrix_keymap_data customize_keymap = {
@@ -108,6 +135,9 @@ static struct sci_keypad_platform_data sci_keypad_data = {
 static struct platform_device rfkill_device;
 static struct platform_device brcm_bluesleep_device;
 static struct platform_device kb_backlight_device;
+#if defined(CONFIG_KEYBOARD_GPIO)
+static struct platform_device gpio_button_device;
+#endif
 
 static struct platform_device *devices[] __initdata = {
 	&sprd_serial_device0,
@@ -200,6 +230,9 @@ static struct platform_device *devices[] __initdata = {
 #ifdef  CONFIG_RF_SHARK	
 	&trout_fm_device,
 #endif
+#if defined(CONFIG_KEYBOARD_GPIO)
+	&gpio_button_device,
+#endif
 	&sprd_headset_device,
     &sprd_saudio_voip_device,
 };
@@ -272,6 +305,121 @@ static struct platform_device rfkill_device = {
 };
 #endif
 
+#if defined(CONFIG_KEYBOARD_GPIO)
+static struct gpio_keys_button gpio_buttons[] = {
+	{
+		.gpio	= GPIO_1_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_1,
+		.desc = "Key 1",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_2_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_2,
+		.desc = "Key 2",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_4_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_4,
+		.desc = "Key 4",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_6_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_6,
+		.desc = "Key 6",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_7_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_7,
+		.desc = "Key 7",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_8_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_8,
+		.desc = "Key 8",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_9_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_9,
+		.desc = "Key 9",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_UP_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_UP,
+		.desc = "Up key",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_LEFT_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_LEFT,
+		.desc = "Left key",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_RIGHT_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_RIGHT,
+		.desc = "Right key",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_SELECT_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_SELECT,
+		.desc = "Select key",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+	{
+		.gpio	= GPIO_NUMERIC_STAR_KEY,
+		.ds_irqflags = IRQF_TRIGGER_LOW,
+		.code = KEY_NUMERIC_STAR,
+		.desc = "Star key",
+		.active_low = 1,
+		.debounce_interval = 2,
+	},
+};
+
+static struct gpio_keys_platform_data gpio_button_data = {
+	.buttons = gpio_buttons,
+	.nbuttons = ARRAY_SIZE(gpio_buttons),
+};
+
+static struct platform_device gpio_button_device = {
+	.name = "gpio-keys",
+	.id = -1,
+	.num_resources = 0,
+	.dev = {
+			.platform_data = &gpio_button_data,
+	}
+};
+#endif
+
 /* keypad backlight */
 static struct platform_device kb_backlight_device = {
 	.name           = "keyboard-backlight",
@@ -324,7 +472,7 @@ static struct serial_data plat_data2 = {
 	.clk = 26000000,
 };
 
-static struct ft5x0x_ts_platform_data ft5x0x_ts_info = {
+/*static struct ft5x0x_ts_platform_data ft5x0x_ts_info = {
 	.irq_gpio_number	= GPIO_TOUCH_IRQ,
 	.reset_gpio_number	= GPIO_TOUCH_RESET,
 	.vdd_name 			= "vdd28",
@@ -341,7 +489,7 @@ static struct ft5x0x_ts_platform_data ft5x0x_ts_info = {
         .TP_MAX_X = 540,
         .TP_MAX_Y = 960,
 #endif
-};
+};*/
 
 #if(defined(CONFIG_INPUT_LTR558_I2C)||defined(CONFIG_INPUT_LTR558_I2C_MODULE))
 static struct ltr558_pls_platform_data ltr558_pls_info = {
@@ -411,10 +411,12 @@ static struct i2c_board_info i2c0_boardinfo[] = {
 };
 
 static struct i2c_board_info i2c1_boardinfo[] = {
+#if(defined(CONFIG_TOUCHSCREEN))
 	{
 		I2C_BOARD_INFO(FOCALTECH_TS_NAME, FOCALTECH_TS_ADDR),
 		.platform_data = &ft5x0x_ts_info,
 	},
+#endif
 };
 
 static struct i2c_board_info i2c2_boardinfo[] = {
@@ -461,8 +611,8 @@ static struct i2c_board_info i2c2_boardinfo[] = {
 static int sc8810_add_i2c_devices(void)
 {
 	i2c_register_board_info(0, i2c0_boardinfo, ARRAY_SIZE(i2c0_boardinfo));
-	i2c_register_board_info(1, i2c1_boardinfo, ARRAY_SIZE(i2c1_boardinfo));
-	i2c_register_board_info(2, i2c2_boardinfo, ARRAY_SIZE(i2c2_boardinfo));
+	//i2c_register_board_info(1, i2c1_boardinfo, ARRAY_SIZE(i2c1_boardinfo));
+	//i2c_register_board_info(2, i2c2_boardinfo, ARRAY_SIZE(i2c2_boardinfo));
 	return 0;
 }
 
