aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/omap4-keypad.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/keyboard/omap4-keypad.c')
-rw-r--r--drivers/input/keyboard/omap4-keypad.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c
index 46406345742b..a7dc286f406c 100644
--- a/drivers/input/keyboard/omap4-keypad.c
+++ b/drivers/input/keyboard/omap4-keypad.c
@@ -60,8 +60,18 @@
60 60
61/* OMAP4 values */ 61/* OMAP4 values */
62#define OMAP4_VAL_IRQDISABLE 0x0 62#define OMAP4_VAL_IRQDISABLE 0x0
63#define OMAP4_VAL_DEBOUNCINGTIME 0x7 63
64#define OMAP4_VAL_PVT 0x7 64/*
65 * Errata i689: If a key is released for a time shorter than debounce time,
66 * the keyboard will idle and never detect the key release. The workaround
67 * is to use at least a 12ms debounce time. See omap5432 TRM chapter
68 * "26.4.6.2 Keyboard Controller Timer" for more information.
69 */
70#define OMAP4_KEYPAD_PTV_DIV_128 0x6
71#define OMAP4_KEYPAD_DEBOUNCINGTIME_MS(dbms, ptv) \
72 ((((dbms) * 1000) / ((1 << ((ptv) + 1)) * (1000000 / 32768))) - 1)
73#define OMAP4_VAL_DEBOUNCINGTIME_16MS \
74 OMAP4_KEYPAD_DEBOUNCINGTIME_MS(16, OMAP4_KEYPAD_PTV_DIV_128)
65 75
66enum { 76enum {
67 KBD_REVISION_OMAP4 = 0, 77 KBD_REVISION_OMAP4 = 0,
@@ -181,9 +191,9 @@ static int omap4_keypad_open(struct input_dev *input)
181 191
182 kbd_writel(keypad_data, OMAP4_KBD_CTRL, 192 kbd_writel(keypad_data, OMAP4_KBD_CTRL,
183 OMAP4_DEF_CTRL_NOSOFTMODE | 193 OMAP4_DEF_CTRL_NOSOFTMODE |
184 (OMAP4_VAL_PVT << OMAP4_DEF_CTRL_PTV_SHIFT)); 194 (OMAP4_KEYPAD_PTV_DIV_128 << OMAP4_DEF_CTRL_PTV_SHIFT));
185 kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME, 195 kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
186 OMAP4_VAL_DEBOUNCINGTIME); 196 OMAP4_VAL_DEBOUNCINGTIME_16MS);
187 /* clear pending interrupts */ 197 /* clear pending interrupts */
188 kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, 198 kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
189 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)); 199 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));