| From e4ee87750d3c4a38fe304e88168f576bc16d474d Mon Sep 17 00:00:00 2001 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Mon, 3 Dec 2018 11:24:30 -0800 |
| Subject: Input: omap-keypad - fix keyboard debounce configuration |
| |
| [ Upstream commit 6c3516fed7b61a3527459ccfa67fab130d910610 ] |
| |
| I noticed that the Android v3.0.8 kernel on droid4 is using different |
| keypad values from the mainline kernel and does not have issues with |
| keys occasionally being stuck until pressed again. Turns out there was |
| an earlier patch posted to fix this as "Input: omap-keypad: errata i689: |
| Correct debounce time", but it was never reposted to fix use macros |
| for timing calculations. |
| |
| This updated version is using macros, and also fixes the use of the |
| input clock rate to use 32768KiHz instead of 32000KiHz. And we want to |
| use the known good Android kernel values of 3 and 6 instead of 2 and 6 |
| in the earlier patch. |
| |
| Reported-by: Pavel Machek <pavel@ucw.cz> |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/input/keyboard/omap4-keypad.c | 18 ++++++++++++++---- |
| 1 file changed, 14 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c |
| index 3ab045369c0c..1739221aa5fa 100644 |
| --- a/drivers/input/keyboard/omap4-keypad.c |
| +++ b/drivers/input/keyboard/omap4-keypad.c |
| @@ -60,8 +60,18 @@ |
| |
| /* OMAP4 values */ |
| #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 { |
| KBD_REVISION_OMAP4 = 0, |
| @@ -181,9 +191,9 @@ static int omap4_keypad_open(struct input_dev *input) |
| |
| kbd_writel(keypad_data, OMAP4_KBD_CTRL, |
| 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, |
| - OMAP4_VAL_DEBOUNCINGTIME); |
| + OMAP4_VAL_DEBOUNCINGTIME_16MS); |
| /* clear pending interrupts */ |
| kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, |
| kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)); |
| -- |
| 2.19.1 |
| |