|
@@ -60,8 +60,18 @@
|
|
|
|
|
|
/* OMAP4 values */
|
|
/* OMAP4 values */
|
|
#define OMAP4_VAL_IRQDISABLE 0x0
|
|
#define OMAP4_VAL_IRQDISABLE 0x0
|
|
-#define OMAP4_VAL_DEBOUNCINGTIME 0x7
|
|
|
|
-#define OMAP4_VAL_PVT 0x7
|
|
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Errata i689: If a key is released for a time shorter than debounce time,
|
|
|
|
+ * the keyboard will idle and never detect the key release. The workaround
|
|
|
|
+ * is to use at least a 12ms debounce time. See omap5432 TRM chapter
|
|
|
|
+ * "26.4.6.2 Keyboard Controller Timer" for more information.
|
|
|
|
+ */
|
|
|
|
+#define OMAP4_KEYPAD_PTV_DIV_128 0x6
|
|
|
|
+#define OMAP4_KEYPAD_DEBOUNCINGTIME_MS(dbms, ptv) \
|
|
|
|
+ ((((dbms) * 1000) / ((1 << ((ptv) + 1)) * (1000000 / 32768))) - 1)
|
|
|
|
+#define OMAP4_VAL_DEBOUNCINGTIME_16MS \
|
|
|
|
+ OMAP4_KEYPAD_DEBOUNCINGTIME_MS(16, OMAP4_KEYPAD_PTV_DIV_128)
|
|
|
|
|
|
enum {
|
|
enum {
|
|
KBD_REVISION_OMAP4 = 0,
|
|
KBD_REVISION_OMAP4 = 0,
|
|
@@ -181,9 +191,9 @@ static int omap4_keypad_open(struct input_dev *input)
|
|
|
|
|
|
kbd_writel(keypad_data, OMAP4_KBD_CTRL,
|
|
kbd_writel(keypad_data, OMAP4_KBD_CTRL,
|
|
OMAP4_DEF_CTRL_NOSOFTMODE |
|
|
OMAP4_DEF_CTRL_NOSOFTMODE |
|
|
- (OMAP4_VAL_PVT << OMAP4_DEF_CTRL_PTV_SHIFT));
|
|
|
|
|
|
+ (OMAP4_KEYPAD_PTV_DIV_128 << OMAP4_DEF_CTRL_PTV_SHIFT));
|
|
kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
|
|
kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
|
|
- OMAP4_VAL_DEBOUNCINGTIME);
|
|
|
|
|
|
+ OMAP4_VAL_DEBOUNCINGTIME_16MS);
|
|
/* clear pending interrupts */
|
|
/* clear pending interrupts */
|
|
kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
|
|
kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
|
|
kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
|
|
kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
|