aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorAxel Haslam <axelhaslam@ti.com>2011-10-02 17:48:02 -0500
committerZiyann <jaraidaniel@gmail.com>2014-10-01 12:59:22 +0200
commit0e7a3285e4772eccf231f7685f62948d198f3f16 (patch)
treea9641ea1d036cc59d1a204c930929276c007ddab /drivers/input
parent2c2d284421d293daf577285fbc486e2cf3eb9b2d (diff)
downloadkernel_samsung_tuna-0e7a3285e4772eccf231f7685f62948d198f3f16.zip
kernel_samsung_tuna-0e7a3285e4772eccf231f7685f62948d198f3f16.tar.gz
kernel_samsung_tuna-0e7a3285e4772eccf231f7685f62948d198f3f16.tar.bz2
Input: omap4-keypad - cleanup keypad driver
Long key press is not needed on android since it is simulated on user space. Extra interrupts may leave userspace confused. Use bitfiled instead of hardcoded values to set KBD_CTRL, and change PVR divisor to 0x6, which would allow a debouncing time of ~10ms. Set mpu irq to level instead of edge, since if mpu is in low power a edge detection may be lost if the event is a wkup event. Change-Id: I2b96abdfa573614a5a669b13eed8c60baf2b07af Signed-off-by: Andrii Danylov <x0158318@ti.com> Signed-off-by: Axel Haslam <axelhaslam@ti.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/keyboard/omap4-keypad.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c
index e26e388..0977ee4 100644
--- a/drivers/input/keyboard/omap4-keypad.c
+++ b/drivers/input/keyboard/omap4-keypad.c
@@ -57,14 +57,21 @@
#define OMAP4_DEF_IRQENABLE_TIMEOUTEN (1 << 2)
#define OMAP4_DEF_WUP_EVENT_ENA (1 << 0)
#define OMAP4_DEF_WUP_LONG_KEY_ENA (1 << 1)
+#define OMAP4_DEF_WUP_TIMEOUTEN_ENA (1 << 2)
#define OMAP4_DEF_CTRL_NOSOFTMODE (1 << 1)
-#define OMAP4_DEF_CTRLPTVVALUE (1 << 2)
-#define OMAP4_DEF_CTRLPTV (1 << 1)
+#define OMAP4_DEF_CTRL_PTV (1 << 2)
+
+#define OMAP4_DEF_REPEAT_MODE (1 << 8)
+#define OMAP4_DEF_TIMEOUT_LONG_KEY (1 << 7)
+#define OMAP4_DEF_TIMEOUT_EMPTY (1 << 6)
+#define OMAP4_DEF_LONG_KEY (1 << 5)
/* OMAP4 values */
#define OMAP4_VAL_IRQDISABLE 0x00
-#define OMAP4_VAL_DEBOUNCINGTIME 0x07
-#define OMAP4_VAL_FUNCTIONALCFG 0x1E
+/* DEBOUNCE TIME VALUE = 0x2 PVT = 0x6 Tperiod = 12ms*/
+#define OMAP4_VAL_DEBOUNCINGTIME 0x2
+#define OMAP4_VAL_PVT 0x6
+
#define OMAP4_MASK_IRQSTATUSDISABLE 0xFFFF
@@ -91,10 +98,6 @@ static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
unsigned int col, row, code, changed;
u32 *new_state = (u32 *) key_state;
- /* Disable interrupts */
- __raw_writel(OMAP4_VAL_IRQDISABLE,
- keypad_data->base + OMAP4_KBD_IRQENABLE);
-
*new_state = __raw_readl(keypad_data->base + OMAP4_KBD_FULLCODE31_0);
*(new_state + 1) = __raw_readl(keypad_data->base
+ OMAP4_KBD_FULLCODE63_32);
@@ -125,10 +128,6 @@ static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
__raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
keypad_data->base + OMAP4_KBD_IRQSTATUS);
- /* enable interrupts */
- __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
- keypad_data->base + OMAP4_KBD_IRQENABLE);
-
return IRQ_HANDLED;
}
@@ -140,17 +139,24 @@ static int omap4_keypad_open(struct input_dev *input)
disable_irq(keypad_data->irq);
- __raw_writel(OMAP4_VAL_FUNCTIONALCFG,
+ __raw_writel(OMAP4_DEF_CTRL_NOSOFTMODE |
+ (OMAP4_VAL_PVT << OMAP4_DEF_CTRL_PTV),
keypad_data->base + OMAP4_KBD_CTRL);
+
__raw_writel(OMAP4_VAL_DEBOUNCINGTIME,
keypad_data->base + OMAP4_KBD_DEBOUNCINGTIME);
- __raw_writel(OMAP4_VAL_IRQDISABLE,
- keypad_data->base + OMAP4_KBD_IRQSTATUS);
- __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
+
+ /* Enable event IRQ*/
+ __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN,
keypad_data->base + OMAP4_KBD_IRQENABLE);
- __raw_writel(OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA,
+
+ /* Enable event wkup*/
+ __raw_writel(OMAP4_DEF_WUP_EVENT_ENA,
keypad_data->base + OMAP4_KBD_WAKEUPENABLE);
+ /* clear pending interrupts */
+ __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
+ keypad_data->base + OMAP4_KBD_IRQSTATUS);
enable_irq(keypad_data->irq);
return 0;
@@ -274,13 +280,19 @@ static int __devinit omap4_keypad_probe(struct platform_device *pdev)
matrix_keypad_build_keymap(pdata->keymap_data, row_shift,
input_dev->keycode, input_dev->keybit);
+ /*
+ * Set irq level detection for mpu. Edge event are missed
+ * in gic if the mpu is in low power and keypad event
+ * is a wakeup.
+ */
error = request_irq(keypad_data->irq, omap4_keypad_interrupt,
- IRQF_TRIGGER_RISING,
+ IRQF_TRIGGER_HIGH,
"omap4-keypad", keypad_data);
if (error) {
dev_err(&pdev->dev, "failed to register interrupt\n");
goto err_free_input;
}
+ enable_irq_wake(OMAP44XX_IRQ_KBD_CTL);
pm_runtime_enable(&pdev->dev);