diff options
Diffstat (limited to 'drivers/input/keyboard/omap4-keypad.c')
| -rw-r--r-- | drivers/input/keyboard/omap4-keypad.c | 18 |
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 | ||
| 66 | enum { | 76 | enum { |
| 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)); |
