|
@@ -49,6 +49,7 @@
|
|
|
#define SKE_ASR3 0x2C
|
|
|
|
|
|
#define SKE_NUM_ASRX_REGISTERS (4)
|
|
|
+#define KEY_PRESSED_DELAY 10
|
|
|
|
|
|
/**
|
|
|
* struct ske_keypad - data structure used by keypad driver
|
|
@@ -92,7 +93,7 @@ static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr,
|
|
|
static int __init ske_keypad_chip_init(struct ske_keypad *keypad)
|
|
|
{
|
|
|
u32 value;
|
|
|
- int timeout = 50;
|
|
|
+ int timeout = keypad->board->debounce_ms;
|
|
|
|
|
|
/* check SKE_RIS to be 0 */
|
|
|
while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--)
|
|
@@ -196,18 +197,22 @@ static void ske_keypad_read_data(struct ske_keypad *keypad)
|
|
|
static irqreturn_t ske_keypad_irq(int irq, void *dev_id)
|
|
|
{
|
|
|
struct ske_keypad *keypad = dev_id;
|
|
|
- int retries = 20;
|
|
|
+ int timeout = keypad->board->debounce_ms;
|
|
|
|
|
|
/* disable auto scan interrupt; mask the interrupt generated */
|
|
|
ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0);
|
|
|
ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA);
|
|
|
|
|
|
- while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --retries)
|
|
|
+ while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout)
|
|
|
cpu_relax();
|
|
|
|
|
|
/* SKEx registers are stable and can be read */
|
|
|
ske_keypad_read_data(keypad);
|
|
|
|
|
|
+ /* wait until raw interrupt is clear */
|
|
|
+ while ((readl(keypad->reg_base + SKE_RIS)) && --timeout)
|
|
|
+ msleep(KEY_PRESSED_DELAY);
|
|
|
+
|
|
|
/* enable auto scan interrupts */
|
|
|
ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA);
|
|
|
|