diff --git a/Kernel/drivers/input/keyboard/Kconfig b/Kernel/drivers/input/keyboard/Kconfig
--- a/Kernel/drivers/input/keyboard/Kconfig
+++ b/Kernel/drivers/input/keyboard/Kconfig
@@ -213,23 +213,31 @@
         help
         Victory Product
 
-config KEYPAD_S3C_VICTORY_EXPORT_TIMER_DELAY
-	bool "Export keypad_timer delay via sysfs"
+config KEYPAD_S3C_VICTORY_EXPORT_DELAYS
+	bool "Export keypad column-switch and timer delays via sysfs"
 	depends on KEYPAD_S3C_VICTORY && SYSFS
 	default y
 	help
-	  Allows runtime configuration of the keypad_timer delay via a sysfs
-	  exported timer_delay variable.
+	  Allows runtime configuration of the keypad column-switch and timer delays
+	  via sysfs exported column_delay and timer_delay variables.
 
-	  The current delay may be read with:
+	  The current delays may be read with:
+	    cat /sys/devices/platform/s3c-keypad/column_delay
 	    cat /sys/devices/platform/s3c-keypad/timer_delay
-	  and a new delay may be set with:
-	    echo N > /sys/devices/platform/s3c-keypad/timer_delay
-	  where N is the delay in jiffies.
+	  and new delays may be set with:
+	    echo C > /sys/devices/platform/s3c-keypad/column_delay
+	    echo T > /sys/devices/platform/s3c-keypad/timer_delay
+	  where C is the column-switch delay (µs) and T the timer delay (jiffies).
 
-	  A delay of "1" yields the shortest timer, and the most responsive keypad
-	  possible, whereas a delay of HZ (e.g., "256") is the longest allowed.
-	  For HZ=256, a delay of "7" (3*HZ/100) is default.
+	  A timer delay of "1" yields the shortest timer, and the most responsive
+	  keypad possible, whereas a delay of HZ (e.g., "256") is the longest
+	  allowed.  For HZ=256, a delay of "7" (3*HZ/100) is default.
+
+	  A column-switch delay of "1" is the most efficient (0.02% CPU util.) but
+	  results in ghost key presses across columns (rows).  The default "300" is
+	  very inefficient, 6.9% CPU util., for a timer delay of "7".  Values of
+	  "50" (1.4% CPU) and even "5" (0.2% CPU) work well without ghosting.  This
+	  delay affects efficiency only, not responsiveness.
 
 endif
 
diff --git a/Kernel/drivers/input/keyboard/victory/s3c-keypad.c b/Kernel/drivers/input/keyboard/victory/s3c-keypad.c
--- a/Kernel/drivers/input/keyboard/victory/s3c-keypad.c
+++ b/Kernel/drivers/input/keyboard/victory/s3c-keypad.c
@@ -79,14 +79,19 @@
 
 static int in_sleep = 0;
 
-#define TIMER_DELAY_DEFAULT (3*HZ/100)
-#define TIMER_DELAY_MAX     HZ
+#define COLUMN_DELAY_DEFAULT KEYPAD_DELAY
+#define COLUMN_DELAY_MAX     (1000000/(HZ*KEYPAD_COLUMNS))
+#define TIMER_DELAY_DEFAULT  (3*HZ/100)
+#define TIMER_DELAY_MAX      HZ
 
-#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_TIMER_DELAY
-#define TIMER_DELAY timer_delay
-static unsigned long timer_delay = TIMER_DELAY_DEFAULT;
+#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_DELAYS
+#define COLUMN_DELAY column_delay
+#define TIMER_DELAY  timer_delay
+static unsigned long column_delay = COLUMN_DELAY_DEFAULT;
+static unsigned long timer_delay  = TIMER_DELAY_DEFAULT;
 #else
-#define TIMER_DELAY TIMER_DELAY_DEFAULT
+#define COLUMN_DELAY COLUMN_DELAY_DEFAULT
+#define TIMER_DELAY  TIMER_DELAY_DEFAULT
 #endif
 
 //static ssize_t keyshort_test(struct device *dev, struct device_attribute *attr, char *buf);
@@ -183,7 +188,7 @@
 
 		writel(cval, key_base+S3C_KEYIFCOL);             // make that Normal output.
 								 // others shuld be High-Z output.
-		udelay(KEYPAD_DELAY);
+		udelay(COLUMN_DELAY);
 
 		// rval = ~(readl(key_base+S3C_KEYIFROW)) & ((1<<KEYPAD_ROWS)-1) ;
 
@@ -669,33 +674,37 @@
 static DEVICE_ATTR(brightness, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, NULL, key_led_control);
 // nandu froyo merge
 
-#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_TIMER_DELAY
-static ssize_t timer_delay_show(struct device *dev,
-                                struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%lu\n", timer_delay);
-}
+#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_DELAYS
+#define DELAY_ATTR(delay, delay_max) \
+static ssize_t delay##_show(struct device *dev, \
+                            struct device_attribute *attr, char *buf) \
+{ \
+	return snprintf(buf, PAGE_SIZE, "%lu\n", delay); \
+} \
+\
+static ssize_t delay##_store(struct device *dev, \
+                             struct device_attribute *attr, \
+                             const char *buf, size_t count) \
+{ \
+	unsigned long val; \
+	int res; \
+\
+	if ((res = strict_strtoul(buf, 10, &val)) < 0) \
+		return res; \
+\
+	if (val == 0 || val > delay_max) \
+		return -EINVAL; \
+\
+	delay = val; \
+\
+	return count; \
+} \
+\
+static DEVICE_ATTR(delay, S_IRUGO | S_IWUSR, delay##_show, delay##_store);
 
-static ssize_t timer_delay_store(struct device *dev,
-                                 struct device_attribute *attr,
-                                 const char *buf, size_t count)
-{
-	unsigned long val;
-	int res;
-
-	if ((res = strict_strtoul(buf, 10, &val)) < 0)
-		return res;
-
-	if (val == 0 || val > TIMER_DELAY_MAX)
-		return -EINVAL;
-
-	timer_delay = val;
-
-	return count;
-}
-
-static DEVICE_ATTR(timer_delay, S_IRUGO | S_IWUSR, timer_delay_show,
-                   timer_delay_store);
+DELAY_ATTR(column_delay, COLUMN_DELAY_MAX)
+DELAY_ATTR(timer_delay,  TIMER_DELAY_MAX)
+#undef DELAY_ATTR
 #endif
 
 static int __init s3c_keypad_probe(struct platform_device *pdev)
@@ -879,7 +888,10 @@
         pr_err("Failed to create device file(%s)!\n", dev_attr_brightness.attr.name);
   	}
 
-#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_TIMER_DELAY
+#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_DELAYS
+	if (device_create_file(&pdev->dev, &dev_attr_column_delay) < 0)
+		pr_err("Unable to create \"%s\".\n", dev_attr_column_delay.attr.name);
+
 	if (device_create_file(&pdev->dev, &dev_attr_timer_delay) < 0)
 		pr_err("Unable to create \"%s\".\n", dev_attr_timer_delay.attr.name);
 #endif
@@ -922,7 +934,8 @@
 		keypad_clock = NULL;
 	}
 
-#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_TIMER_DELAY
+#ifdef CONFIG_KEYPAD_S3C_VICTORY_EXPORT_DELAYS
+	device_remove_file(&pdev->dev, &dev_attr_column_delay);
 	device_remove_file(&pdev->dev, &dev_attr_timer_delay);
 #endif
 	input_unregister_device(input_dev);
