diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 2cb8a000c..f4922ccb8 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -81,7 +81,6 @@ config SOC_AM43XX
 	select MACH_OMAP_GENERIC
 	select HAVE_ARM_SCU
 	select MIGHT_HAVE_CACHE_L2X0
-	select WKUP_M3_RPROC if PM
 
 config SOC_DRA7XX
 	bool "TI DRA7XX"
@@ -255,6 +254,11 @@ config MACH_OMAP3517EVM
 	default y
 	select OMAP_PACKAGE_CBB
 
+config MACH_CLAP_ARM_EKB2
+	bool "CLAP-ARM_EKB2 Support"
+	depends on SOC_AM43XX
+	default y
+
 config MACH_CRANEBOARD
 	bool "AM3517/05 CRANE board"
 	depends on ARCH_OMAP3
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 60fabedb1..594499d8e 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -272,7 +272,7 @@ obj-$(CONFIG_MACH_CM_T3517)		+= board-cm-t3517.o
 obj-$(CONFIG_MACH_TOUCHBOOK)		+= board-omap3touchbook.o
 
 obj-$(CONFIG_MACH_OMAP3517EVM)		+= board-am3517evm.o
-
+obj-$(CONFIG_MACH_CLAP_ARM_EKB2)	+= ekb2_driver.o
 obj-$(CONFIG_MACH_CRANEBOARD)		+= board-am3517crane.o
 
 obj-$(CONFIG_MACH_SBC3530)		+= board-omap3stalker.o
diff --git a/arch/arm/mach-omap2/ekb2_driver.c b/arch/arm/mach-omap2/ekb2_driver.c
new file mode 100644
index 000000000..04ee7178d
--- /dev/null
+++ b/arch/arm/mach-omap2/ekb2_driver.c
@@ -0,0 +1,603 @@
+/*
+ * ekb2_driver.c - CLAP-ARM_EKB2 driver.
+ *
+ * Copyright (c) 2014, YAMAHA CORPORATION.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/major.h>
+#include <linux/gpio.h>
+#include <linux/export.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+#include <asm/page.h>
+#include <linux/device.h>
+#include <linux/cdev.h>
+#include <linux/fs.h>
+#include <linux/backing-dev.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/signal.h>
+#include <linux/pid.h>
+#include <linux/sched.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/jiffies.h>
+#include "gpmc.h"
+
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <asm/mach-types.h>
+#include <asm/mach/map.h>
+
+#include <linux/ngs_kev_api.h>
+
+#if 0
+#define Dprintk( fmt ) printk("[ekb2_driver.c L%-3d] : " fmt , __LINE__)
+#define DAprintk( fmt , ... ) printk("[ekb2_driver.c L%-3d] : " fmt , __LINE__ , __VA_ARGS__ )
+#else
+#define Dprintk( fmt )
+#define DAprintk( fmt , ... )
+#endif
+
+#define CMD_GPMC_MAGIC				'g'
+#define CMD_GPIO2_5_SOFTRESET		_IOW(CMD_GPMC_MAGIC, 0, unsigned short)
+#define CMD_GPMC_CS1_TIMING			_IOW(CMD_GPMC_MAGIC, 1, unsigned short)
+#define CMD_GPMC_NR_MAX				1
+
+#define GPIO_NUM_CALC(bank, gpio)	(32*(bank)+(gpio))	// GPIO number
+#define GPIO0_4_NUMBER				GPIO_NUM_CALC(0,4)	// GPIO0_4
+#define GPIO0_5_NUMBER				GPIO_NUM_CALC(0,5)	// GPIO0_5
+#define GPIO0_7_NUMBER				GPIO_NUM_CALC(0,7)	// GPIO0_7
+#define GPIO0_20_NUMBER				GPIO_NUM_CALC(0,20)	// GPIO0_20
+#define GPIO1_20_NUMBER				GPIO_NUM_CALC(1,20)	// GPIO1_20
+#define GPIO2_5_NUMBER				GPIO_NUM_CALC(2,5)	// GPIO2_5  ->  Not required on EKB2
+
+#define GPIO3_22_NUMBER				GPIO_NUM_CALC(3,22)	// GPIO3_22
+
+#define GPIO4_10_NUMBER 	GPIO_NUM_CALC(4,10)
+#define GPIO4_11_NUMBER 	GPIO_NUM_CALC(4,11)
+#define GPIO4_12_NUMBER 	GPIO_NUM_CALC(4,12)
+#define GPIO4_13_NUMBER 	GPIO_NUM_CALC(4,13)
+#define GPIO4_14_NUMBER 	GPIO_NUM_CALC(4,14)
+#define GPIO4_15_NUMBER	GPIO_NUM_CALC(4,15)
+
+#define IRQ_USER_INT_NUM			39					// User Interrupt Switch IRQ Number
+
+struct ioctl_parm {
+	unsigned long  offset;
+	unsigned short data;
+};
+
+static dev_t devno;
+static struct cdev c_dev;
+static struct class *ekb2_class;
+
+struct gpio_fas {
+	struct fasync_struct *fasync;
+};
+struct gpio_fas gpio_f;
+
+//! POW-INT signal pid
+static int ekb2_param_pow_int = 1;
+module_param_named(pow_int, ekb2_param_pow_int, int, S_IRUGO|S_IWUSR);
+//! force-poweroff interval(msec. or 0(disable))
+static unsigned long ekb2_param_force_poweroff = 10000;
+module_param_named(force_poweroff, ekb2_param_force_poweroff, ulong, S_IRUGO|S_IWUSR);
+
+static unsigned long ekb2_pow_int_on_jiffies = 0;
+static struct tasklet_struct ekb2_tasklet_pow_int_on;
+static struct tasklet_struct ekb2_tasklet_pow_int_off;
+//! for reboot_notifier
+struct notifier_block ekb2_halt_notifier;
+
+
+int ekb2_main_lcd_backlight_enable(void)
+{
+	int ret;
+
+    // LCD Backlight Turn On Sequence
+    Dprintk("GPIO5_9 set\n");
+    ret = gpio_request(GPIO_NUM_CALC(5,9), "GPIO5_9");
+    gpio_export(GPIO_NUM_CALC(5,9), true);
+    gpio_direction_output(GPIO_NUM_CALC(5,9),1);
+
+    mdelay(200);
+
+	Dprintk("GPIO5_27 set\n");
+	ret = gpio_request(GPIO_NUM_CALC(5,27), "GPIO5_27");
+	gpio_export(GPIO_NUM_CALC(5,27), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,27),1);
+
+	mdelay(20);
+
+	Dprintk("GPIO0_20 set\n");
+	ret = gpio_request(GPIO_NUM_CALC(0,20), "GPIO0_20");
+	gpio_export(GPIO_NUM_CALC(0,20), true);
+	gpio_direction_output(GPIO_NUM_CALC(0,20),1);
+
+	mdelay(12);
+
+	Dprintk("GPIO5_20 set\n");
+	ret = gpio_request(GPIO_NUM_CALC(5,20), "GPIO5_20");
+	gpio_export(GPIO_NUM_CALC(5,20), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,20),1);
+
+	return 0;
+}
+
+int ekb2_main_lcd_backlight_disable(void)
+{
+	// LCD Backlight Turn Off Sequence
+
+	gpio_set_value(GPIO_NUM_CALC(5,20), 0);
+
+	mdelay(50);
+
+	gpio_set_value(GPIO_NUM_CALC(0,20), 0);
+
+	mdelay(10);
+
+	gpio_set_value(GPIO_NUM_CALC(5,27), 0);
+
+	mdelay(250);
+
+	gpio_set_value(GPIO_NUM_CALC(5,9), 0);
+
+	return 0;
+}
+
+int ekb2_sub_lcd_backlight_enable(void)
+{
+	int ret;
+
+	Dprintk("GPIO5_10 set\n");
+	// LCD Backlight Turn On Sequence
+	ret = gpio_request(GPIO_NUM_CALC(5,10), "GPIO5_10");
+	gpio_export(GPIO_NUM_CALC(5,10), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,10),1);
+
+	return 0;
+}
+
+int ekb2_main_lcd_backlight_preSequence_pwmDisable(void)
+{
+    Dprintk("ekb2_main_lcd_backlight_preSequence_pwmDisable\n");
+    gpio_direction_output(GPIO_NUM_CALC(0,20),1);
+    
+    mdelay(10);
+
+	return 0;
+}
+
+EXPORT_SYMBOL(ekb2_main_lcd_backlight_enable);
+EXPORT_SYMBOL(ekb2_main_lcd_backlight_disable);
+EXPORT_SYMBOL(ekb2_sub_lcd_backlight_enable);
+EXPORT_SYMBOL(ekb2_main_lcd_backlight_preSequence_pwmDisable);
+
+static void ekb2_force_power_off(void)
+{
+	// omit H/W reset seq.
+	for(;;){
+		gpio_set_value(GPIO_NUM_CALC(5,7), 0);
+	}
+}
+static void ekb2_pm_power_off(void)
+{
+	while(gpio_get_value(GPIO_NUM_CALC(4,10)) == 0){
+		msleep_interruptible(10);
+	}
+	for(;;){
+		mdelay(100);
+		gpio_set_value(GPIO_NUM_CALC(5,7), 0);
+	}
+}
+static int ekb2_halt_handler(
+	struct notifier_block* x, unsigned long code, void *unused){
+	if((enum system_states)(code) == SYSTEM_HALT){
+		printk(KERN_WARNING "halt => poweroff\n");
+		ekb2_pm_power_off();
+	}
+	return NOTIFY_DONE;
+}
+static void ekb2_signal_pow_int(unsigned long data){
+	const int sig = (int)(data);
+	struct pid* pid = NULL;
+	if(ekb2_param_pow_int < 0) return;
+
+	pid = find_get_pid((pid_t)(ekb2_param_pow_int));
+	if(!pid){
+		pid = find_get_pid((pid_t)(1));
+	}
+	if(pid){
+		kill_pid(pid, sig, 1);
+		put_pid(pid);
+	}
+}
+static void ekb2_pow_int_on_handler(unsigned long data){
+	ekb2_pow_int_on_jiffies = jiffies;
+	ekb2_signal_pow_int(data);
+}
+static void ekb2_pow_int_off_handler(unsigned long data){
+	if((ekb2_param_force_poweroff != 0) && (ekb2_pow_int_on_jiffies != 0)){
+		unsigned long diff = ((long)(jiffies) - (long)(ekb2_pow_int_on_jiffies));
+		if(jiffies_to_msecs(diff) > ekb2_param_force_poweroff){
+			ekb2_force_power_off();
+		}
+		ekb2_pow_int_on_jiffies = 0;
+	}
+	ekb2_signal_pow_int(data);
+}
+static irqreturn_t gpio4_10_irq_handler(int irq, void *data)
+{
+	if((system_state > SYSTEM_RUNNING)
+	&& (gpio_get_value(GPIO_NUM_CALC(4,10)) == 0)){
+		ekb2_force_power_off();
+	}
+	if(data != &ekb2_param_pow_int) return IRQ_NONE;
+
+	tasklet_schedule((gpio_get_value(GPIO_NUM_CALC(4,10)) == 0)
+		? &ekb2_tasklet_pow_int_on : &ekb2_tasklet_pow_int_off);
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t gpio4_11_irq_handler(int irq, void *data)
+{
+	// Signal
+	ngs_kedrv_updateModel(0, 1);
+
+	// Clear IRQ
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t gpio4_12_irq_handler(int irq, void *data)
+{
+	// Signal
+	ngs_kedrv_updateModel(1, 1);
+
+	// Clear IRQ
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t gpio4_13_irq_handler(int irq, void *data)
+{
+	// Signal
+	ngs_kedrv_updateModel(2, 1);
+
+	// Clear IRQ
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t gpio4_14_irq_handler(int irq, void *data)
+{
+	// Signal
+	ngs_kedrv_updateModel(3, 1);
+
+	// Clear IRQ
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t gpio3_22_irq_handler(int irq, void *data)
+{
+	// Signal
+	ngs_kedrv_updateModel(4, 1);
+
+	// Clear IRQ
+
+	return IRQ_HANDLED;
+}
+
+
+static int
+gpio_irq_set(unsigned gpio, char *label, irq_handler_t handler, char *name)
+{
+	int ret;
+
+	ret = gpio_request(gpio, label);
+	if(ret) {
+		return -EPERM;
+	}
+	gpio_direction_input(gpio);
+
+	ret = irq_set_irq_type(gpio_to_irq(gpio), IRQF_TRIGGER_FALLING);  // Falling Trigger
+	if(ret) {
+		gpio_free(gpio);
+		return -EPERM;
+	}
+
+	if (handler) {
+		ret = request_irq(gpio_to_irq(gpio), handler, IRQF_TRIGGER_FALLING, name, NULL);
+		if(ret) {
+			gpio_free(gpio);
+			return -EPERM;
+		}
+	}
+
+	return 0;
+}
+
+static int gpio_debounce_set(unsigned gpio , char *label , unsigned debounce )
+{
+	int ret;
+
+	ret = gpio_request(gpio, label);
+	if(ret) {
+		return -EPERM;
+	}
+	gpio_direction_input(gpio);
+
+	gpio_set_debounce(gpio , debounce);
+
+	gpio_export(gpio, true);
+
+	return 0;
+}
+
+int gpio_init(void)
+{
+	int ret;
+
+	ret = gpio_irq_set(GPIO4_11_NUMBER,  "GPIO4_11",  gpio4_11_irq_handler,  "gpio4_11_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO4_11\n");
+
+	ret = gpio_irq_set(GPIO4_12_NUMBER,  "GPIO4_12",  gpio4_12_irq_handler,  "gpio4_12_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO4_11\n");
+
+	ret = gpio_irq_set(GPIO4_13_NUMBER,  "GPIO4_13",  gpio4_13_irq_handler,  "gpio4_13_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO4_13\n");
+
+	ret = gpio_irq_set(GPIO4_14_NUMBER,  "GPIO4_14",  gpio4_14_irq_handler,  "gpio4_14_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO4_14\n");
+
+	ret = gpio_irq_set(GPIO4_15_NUMBER,  "GPIO4_15",  NULL,  "gpio4_15_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO4_15\n");
+
+	ret = gpio_irq_set(GPIO3_22_NUMBER,  "GPIO3_22",  gpio3_22_irq_handler,  "gpio3_22_irq");
+	if (ret < 0)
+		printk(KERN_ERR "Can't setup GPIO3_22\n");
+
+	// Debounce enable for Mechanical Input
+	gpio_debounce_set(GPIO_NUM_CALC(4,0), "GPIO4_0" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,1), "GPIO4_1" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,2), "GPIO4_2" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,3), "GPIO4_3" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,4), "GPIO4_4" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,5), "GPIO4_5" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,6), "GPIO4_6" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,7), "GPIO4_7" , 2000);
+	gpio_debounce_set(GPIO_NUM_CALC(4,8), "GPIO4_8" , 2000);
+
+	// Power Int
+	gpio_debounce_set(GPIO_NUM_CALC(4,10), "GPIO4_10" , 2000);
+	ret = irq_set_irq_type(gpio_to_irq(GPIO_NUM_CALC(4,10)),
+		IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING);
+	ret = request_irq(gpio_to_irq(GPIO_NUM_CALC(4,10)), gpio4_10_irq_handler,
+		IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,
+		"gpio4_10_irq", &ekb2_param_pow_int);
+
+	// Reset On Init
+	ret = gpio_request(GPIO_NUM_CALC(5,7), "GPIO5_7");
+	gpio_export(GPIO_NUM_CALC(5,7), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,7),1);
+	// Power Supply High Init
+	ret = gpio_request(GPIO_NUM_CALC(0,29), "GPIO0_29");
+	gpio_export(GPIO_NUM_CALC(0,29), true);
+	gpio_direction_output(GPIO_NUM_CALC(0,29),1);
+	// DAC Mute0 On Init
+	ret = gpio_request(GPIO_NUM_CALC(5,2), "GPIO5_2");
+	gpio_export(GPIO_NUM_CALC(5,2), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,2),1);
+	// DAC Mute1 On Init
+	ret = gpio_request(GPIO_NUM_CALC(5,3), "GPIO5_3");
+	gpio_export(GPIO_NUM_CALC(5,3), true);
+	gpio_direction_output(GPIO_NUM_CALC(5,3),1);
+
+	return 0;
+}
+
+static int ekb2_open(struct inode *inode, struct file *file)
+{
+	Dprintk("ekb2 open\n");
+
+	return 0;
+}
+
+static long ekb2_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+	int ret = 0;
+
+	if( _IOC_TYPE(cmd) != CMD_GPMC_MAGIC ) {
+		return -ENOTTY;
+	}
+	if( _IOC_NR(cmd) > CMD_GPMC_NR_MAX ) {
+		return -ENOTTY;
+	}
+
+	if( _IOC_DIR(cmd) & _IOC_READ ) {
+		ret = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
+	} else if (_IOC_DIR(cmd) & _IOC_WRITE) {
+		ret = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
+	}
+	if (ret) {
+		return -EFAULT;
+	}
+
+	return ret;
+}
+
+static int ekb2_close(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static int ekb2_fasync(int fd, struct file *file, int mode)
+{
+	return fasync_helper(fd, file, mode, &gpio_f.fasync);
+}
+
+static void ekb2_mmap_data_open(struct vm_area_struct *vma)
+{
+//	printk("VMA open, virt %lx, phys %lx\n", vma->vm_start, vma->vm_pgoff<<PAGE_SHIFT);
+}
+
+static void ekb2_mmap_data_close(struct vm_area_struct *vma)
+{
+//	printk("VMA close\n");
+}
+
+static struct vm_operations_struct ekb2_vm_ops_data_mmio =
+{
+	.open  = ekb2_mmap_data_open,
+	.close = ekb2_mmap_data_close,
+};
+
+#define GPMC_EXMEM_BASE  0x00000000
+#define GPMC_EXMEM_SIZE  0x20000000
+
+static int ekb2_mmap(struct file *file, struct vm_area_struct *vma)
+{
+	unsigned long off      = vma->vm_pgoff << PAGE_SHIFT;
+	unsigned long physical = (GPMC_EXMEM_BASE + off);
+	unsigned long pfn      = vma->vm_pgoff +(GPMC_EXMEM_BASE >> PAGE_SHIFT);
+	unsigned long vsize    = vma->vm_end - vma->vm_start;
+	unsigned long psize    = GPMC_EXMEM_SIZE - off;
+
+	vma->vm_ops = &ekb2_vm_ops_data_mmio;
+	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+	vma->vm_flags |= VM_IO;
+
+	Dprintk("----- ekb2 mmap -------\n");
+	DAprintk(" vma_start = 0x%08lX\n", vma->vm_start);
+	DAprintk(" vma_end   = 0x%08lX\n", vma->vm_end);
+	DAprintk(" off       = 0x%08lX\n", off);
+	DAprintk(" physical  = 0x%08lX\n", physical);
+	DAprintk(" pfn       = 0x%08lX\n", pfn);
+	DAprintk(" vsize     = 0x%08lX\n", vsize);
+	DAprintk(" psize     = 0x%08lX\n", psize);
+	Dprintk("------------------------\n");
+
+	if (remap_pfn_range(vma,
+			    vma->vm_start,
+			    pfn,
+			    vsize,
+			    vma->vm_page_prot)) {
+		printk("ERROR : remap_pfn_range\n");
+		return -EAGAIN;
+	}
+
+	return 0;
+}
+
+static const struct file_operations ekb2_fops = {
+	.owner			= THIS_MODULE,
+	.open			= ekb2_open,
+	.mmap			= ekb2_mmap,
+	.unlocked_ioctl	= ekb2_ioctl,
+	.release		= ekb2_close,
+	.fasync			= ekb2_fasync,
+};
+
+static int __init init_ekb2(void)
+{
+	int ret;
+
+#if 1
+	Dprintk("[EKB2] init_ekb2() \n");
+#endif
+
+	ret = alloc_chrdev_region(&devno, 0, 1, "ekb2_dev");
+	if (ret < 0) {
+		Dprintk("ERROR : alloc_chrdev_region() \n");
+		return -1;
+	}
+
+	if ((ekb2_class = class_create(THIS_MODULE, "ekb2_chardev")) == NULL) {
+		Dprintk("ERROR : class_create()\n");
+		unregister_chrdev_region(devno, 1);
+		return -1;
+	}
+
+	if (device_create(ekb2_class, NULL, devno, NULL, "ekb2_dev" ) == NULL) {
+		Dprintk("ERROR : device_create() \n");
+		class_destroy(ekb2_class);
+		unregister_chrdev_region(devno, 1);
+		return -1;
+	}
+
+	cdev_init(&c_dev, &ekb2_fops);
+
+	if (cdev_add( &c_dev, devno, 1) == -1) {
+		Dprintk("ERROR : cdev_add() \n");
+		device_destroy(ekb2_class, devno);
+		class_destroy(ekb2_class );
+		unregister_chrdev_region(devno, 1);
+		return -1;
+	}
+
+	gpio_init();
+
+	tasklet_init(&ekb2_tasklet_pow_int_off, &ekb2_pow_int_off_handler, (unsigned long)(SIGTERM));
+	tasklet_init(&ekb2_tasklet_pow_int_on, &ekb2_pow_int_on_handler, (unsigned long)(SIGUSR2));
+	ekb2_halt_notifier.notifier_call = &ekb2_halt_handler;
+	ekb2_halt_notifier.priority = INT_MIN;
+	ret = register_reboot_notifier(&ekb2_halt_notifier);
+	if(!pm_power_off){
+		pm_power_off = &ekb2_pm_power_off;
+	}
+
+	return 0;
+}
+
+
+static void __exit exit_ekb2(void)
+{
+	pm_power_off = NULL;
+	unregister_reboot_notifier(&ekb2_halt_notifier);
+	tasklet_kill(&ekb2_tasklet_pow_int_on);
+	tasklet_kill(&ekb2_tasklet_pow_int_off);
+
+#if defined(EKB2_DRIVER_CONFIG_DISABLE_EMERGENCY_POWEROFF)
+	free_irq(gpio_to_irq(GPIO4_10_NUMBER), NULL);
+	gpio_free(GPIO4_10_NUMBER);
+#endif
+	free_irq(gpio_to_irq(GPIO4_11_NUMBER), NULL);
+	gpio_free(GPIO4_11_NUMBER);
+	free_irq(gpio_to_irq(GPIO4_12_NUMBER), NULL);
+	gpio_free(GPIO4_12_NUMBER);
+	free_irq(gpio_to_irq(GPIO4_13_NUMBER), NULL);
+	gpio_free(GPIO4_13_NUMBER);
+	free_irq(gpio_to_irq(GPIO4_14_NUMBER), NULL);
+	gpio_free(GPIO4_14_NUMBER);
+	free_irq(gpio_to_irq(GPIO4_15_NUMBER), NULL);
+	gpio_free(GPIO4_15_NUMBER);
+	free_irq(gpio_to_irq(GPIO3_22_NUMBER), NULL);
+	gpio_free(GPIO3_22_NUMBER);
+
+	cdev_del(&c_dev);
+	device_destroy(ekb2_class, devno);
+	class_destroy(ekb2_class);
+	unregister_chrdev_region(devno, 1);
+}
+
+MODULE_AUTHOR("Yamaha Corporation");
+MODULE_DESCRIPTION("CLAP-ARM_EKB2 driver");
+MODULE_LICENSE("GPL");
+
+module_init(init_ekb2);
+module_exit(exit_ekb2);
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index 6308dcdcb..8e52697c9 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -340,6 +340,10 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t)
 	int div;
 	u32 l;
 
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+//	printk("[GPMC] gpmc_cs_set_timings()  CS=%d \n", cs);
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
 	div = gpmc_calc_divider(t->sync_clk);
 	if (div < 0)
 		return div;
@@ -352,8 +356,28 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t)
 	GPMC_SET_ONE(GPMC_CS_CONFIG3,  8, 12, adv_rd_off);
 	GPMC_SET_ONE(GPMC_CS_CONFIG3, 16, 20, adv_wr_off);
 
+#ifdef CONFIG_MACH_CLAP_ARM_EKB2
+	gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, BIT(4), 0);
+	gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, BIT(25), 0);
+	gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, BIT(29), 0);
+	if (cs == 1 || cs == 0) {
+		gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, BIT(24), 1);
+		gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, BIT(28), 1);
+	}
+#endif /* CONFIG_MACH_CLAP_ARM_EKB2 */
+
 	GPMC_SET_ONE(GPMC_CS_CONFIG4,  0,  3, oe_on);
 	GPMC_SET_ONE(GPMC_CS_CONFIG4,  8, 12, oe_off);
+
+#ifdef CONFIG_MACH_CLAP_ARM_EKB2
+	gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, BIT(4), 0);
+	gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, BIT(13), 0);
+	if (cs == 1 || cs == 0)
+		gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, BIT(14), 1);
+	else
+		gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, BIT(14), 0);
+#endif /* CONFIG_MACH_CLAP_ARM_EKB2 */
+
 	GPMC_SET_ONE(GPMC_CS_CONFIG4, 16, 19, we_on);
 	GPMC_SET_ONE(GPMC_CS_CONFIG4, 24, 28, we_off);
 
@@ -1513,6 +1537,10 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
 	int ret, cs;
 	u32 val;
 
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+//	printk("[GPMC] gpmc_probe_generic_child() \n");
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
 	if (of_property_read_u32(child, "reg", &cs) < 0) {
 		dev_err(&pdev->dev, "%s has no 'reg' property\n",
 			child->full_name);
@@ -1583,6 +1611,11 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
 		goto err;
 	}
 
+#ifdef CONFIG_MACH_CLAP_ARM_EKB2
+	gpmc_write_reg(GPMC_CONFIG, 0x12);
+#endif /* CONFIG_MACH_CLAP_ARM_EKB2 */
+
+
 	/* Clear limited address i.e. enable A26-A11 */
 	val = gpmc_read_reg(GPMC_CONFIG);
 	val &= ~GPMC_CONFIG_LIMITEDADDRESS;
@@ -1591,6 +1624,39 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
 	/* Enable CS region */
 	gpmc_cs_enable_mem(cs);
 
+//#ifdef CONFIG_MACH_CLAP_ARM_EKB2
+#if 0
+	// EXT_OUT bit0 = ON
+	if( cs == 1 ) {
+		unsigned char *gpmc_cs1_extout;
+		gpmc_cs1_extout = (unsigned char *)ioremap(base+0x00200000, 0x1);
+		gpmc_cs1_extout[0] = 0x01;		// ext_out0 = ON
+		iounmap(gpmc_cs1_extout);
+	}
+#endif /* CONFIG_MACH_CLAP_ARM_EKB2 */
+
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+	if(0){
+		u32 x;
+		printk("[GPMC] ----- CS%d -------------------\n" , cs );
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
+		printk("        GPMC_CS_CONFIG1 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG2);
+		printk("        GPMC_CS_CONFIG2 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG3);
+		printk("        GPMC_CS_CONFIG3 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG4);
+		printk("        GPMC_CS_CONFIG4 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG5);
+		printk("        GPMC_CS_CONFIG5 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG6);
+		printk("        GPMC_CS_CONFIG6 : 0x%08X \n", x);
+		x = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
+		printk("        GPMC_CS_CONFIG7 : 0x%08X \n", x);
+	}
+//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+
 no_timings:
 	if (of_platform_device_create(child, NULL, &pdev->dev))
 		return 0;
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index b75201ff4..21d9d4e29 100644
--- a/drivers/video/backlight/pwm_bl.c
+++ b/drivers/video/backlight/pwm_bl.c
@@ -24,6 +24,8 @@
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 
+extern int ekb2_main_lcd_backlight_preSequence_pwmDisable(void);
+
 struct pwm_bl_data {
 	struct pwm_device	*pwm;
 	struct device		*dev;
@@ -63,6 +65,7 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
 
 	pwm_enable(pb->pwm);
 	pb->enabled = true;
+
 }
 
 static void pwm_backlight_power_off(struct pwm_bl_data *pb)
@@ -70,6 +73,7 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
 	if (!pb->enabled)
 		return;
 
+    ekb2_main_lcd_backlight_preSequence_pwmDisable();
 	pwm_config(pb->pwm, 0, pb->period);
 	pwm_disable(pb->pwm);
 
@@ -359,6 +363,16 @@ static int pwm_backlight_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int pwm_backlight_shutdown(struct device *dev)
+{
+	struct backlight_device *bl = dev_get_drvdata(dev);
+	struct pwm_bl_data *pb = bl_get_data(bl);
+
+	pwm_backlight_power_off(pb);
+
+	return 0;
+}
+
 #ifdef CONFIG_PM_SLEEP
 static int pwm_backlight_suspend(struct device *dev)
 {
@@ -401,6 +415,7 @@ static struct platform_driver pwm_backlight_driver = {
 		.owner		= THIS_MODULE,
 		.pm		= &pwm_backlight_pm_ops,
 		.of_match_table	= of_match_ptr(pwm_backlight_of_match),
+		.shutdown = pwm_backlight_shutdown,
 	},
 	.probe		= pwm_backlight_probe,
 	.remove		= pwm_backlight_remove,
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-dpi.c b/drivers/video/fbdev/omap2/displays-new/panel-dpi.c
index 3636b61dc..daf8125cc 100644
--- a/drivers/video/fbdev/omap2/displays-new/panel-dpi.c
+++ b/drivers/video/fbdev/omap2/displays-new/panel-dpi.c
@@ -20,6 +20,9 @@
 #include <video/omap-panel-data.h>
 #include <video/of_display_timing.h>
 
+extern int ekb2_main_lcd_backlight_enable(void);
+extern int ekb2_main_lcd_backlight_disable(void);
+
 struct panel_drv_data {
 	struct omap_dss_device dssdev;
 	struct omap_dss_device *in;
@@ -89,6 +92,8 @@ static int panel_dpi_enable(struct omap_dss_device *dssdev)
 	if (gpio_is_valid(ddata->backlight_gpio))
 		gpio_set_value_cansleep(ddata->backlight_gpio, 1);
 
+	ekb2_main_lcd_backlight_enable();
+
 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
 	return 0;
@@ -297,6 +302,11 @@ err_gpio:
 	return r;
 }
 
+static void panel_dpi_shutdown(struct device *dev)
+{
+	ekb2_main_lcd_backlight_disable();
+}
+
 static int __exit panel_dpi_remove(struct platform_device *pdev)
 {
 	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
@@ -327,6 +337,7 @@ static struct platform_driver panel_dpi_driver = {
 		.name = "panel-dpi",
 		.owner = THIS_MODULE,
 		.of_match_table = panel_dpi_of_match,
+		.shutdown = panel_dpi_shutdown,
 	},
 };
 
diff --git a/include/linux/ngs_kev_api.h b/include/linux/ngs_kev_api.h
new file mode 100644
index 000000000..bcefbb889
--- /dev/null
+++ b/include/linux/ngs_kev_api.h
@@ -0,0 +1,18 @@
+#ifndef __NGS_KEDRV_API_H__
+#define __NGS_KEDRV_API_H__
+
+#ifdef MODULE
+extern int (*do_ngs_kedrv_updateModel)(int model_id, int value);
+#else
+int (*do_ngs_kedrv_updateModel)(int model_id, int value) __attribute__ ((weak));
+
+EXPORT_SYMBOL(do_ngs_kedrv_updateModel);
+#endif
+
+#define ngs_kedrv_updateModel(model, value) \
+          if (do_ngs_kedrv_updateModel) { \
+            do_ngs_kedrv_updateModel(model, value);\
+          }
+
+
+#endif /* __NGS_KEDRV_API_H__ */
