Commit b6834b02 authored by Rakesh Iyer's avatar Rakesh Iyer Committed by Dmitry Torokhov

Input: tegra-kbc - enable key interrupt for wakeup

Enable keypress interrupt to support wakeup from low power state.
Signed-off-by: default avatarRakesh Iyer <riyer@nvidia.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 82f6aba8
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#define KBC_FIFO_TH_CNT_SHIFT(cnt) (cnt << 14) #define KBC_FIFO_TH_CNT_SHIFT(cnt) (cnt << 14)
#define KBC_DEBOUNCE_CNT_SHIFT(cnt) (cnt << 4) #define KBC_DEBOUNCE_CNT_SHIFT(cnt) (cnt << 4)
#define KBC_CONTROL_FIFO_CNT_INT_EN (1 << 3) #define KBC_CONTROL_FIFO_CNT_INT_EN (1 << 3)
#define KBC_CONTROL_KEYPRESS_INT_EN (1 << 1)
#define KBC_CONTROL_KBC_EN (1 << 0) #define KBC_CONTROL_KBC_EN (1 << 0)
/* KBC Interrupt Register */ /* KBC Interrupt Register */
...@@ -356,6 +357,18 @@ static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable) ...@@ -356,6 +357,18 @@ static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable)
writel(val, kbc->mmio + KBC_CONTROL_0); writel(val, kbc->mmio + KBC_CONTROL_0);
} }
static void tegra_kbc_set_keypress_interrupt(struct tegra_kbc *kbc, bool enable)
{
u32 val;
val = readl(kbc->mmio + KBC_CONTROL_0);
if (enable)
val |= KBC_CONTROL_KEYPRESS_INT_EN;
else
val &= ~KBC_CONTROL_KEYPRESS_INT_EN;
writel(val, kbc->mmio + KBC_CONTROL_0);
}
static void tegra_kbc_keypress_timer(unsigned long data) static void tegra_kbc_keypress_timer(unsigned long data)
{ {
struct tegra_kbc *kbc = (struct tegra_kbc *)data; struct tegra_kbc *kbc = (struct tegra_kbc *)data;
...@@ -831,6 +844,8 @@ static int tegra_kbc_suspend(struct device *dev) ...@@ -831,6 +844,8 @@ static int tegra_kbc_suspend(struct device *dev)
msleep(30); msleep(30);
kbc->keypress_caused_wake = false; kbc->keypress_caused_wake = false;
/* Enable keypress interrupt before going into suspend. */
tegra_kbc_set_keypress_interrupt(kbc, true);
enable_irq(kbc->irq); enable_irq(kbc->irq);
enable_irq_wake(kbc->irq); enable_irq_wake(kbc->irq);
} else { } else {
...@@ -852,6 +867,8 @@ static int tegra_kbc_resume(struct device *dev) ...@@ -852,6 +867,8 @@ static int tegra_kbc_resume(struct device *dev)
if (device_may_wakeup(&pdev->dev)) { if (device_may_wakeup(&pdev->dev)) {
disable_irq_wake(kbc->irq); disable_irq_wake(kbc->irq);
tegra_kbc_setup_wakekeys(kbc, false); tegra_kbc_setup_wakekeys(kbc, false);
/* We will use fifo interrupts for key detection. */
tegra_kbc_set_keypress_interrupt(kbc, false);
/* Restore the resident time of continuous polling mode. */ /* Restore the resident time of continuous polling mode. */
writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0); writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment