linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup
@ 2012-01-18 22:33 Rakesh Iyer
  2012-01-19  5:47 ` Shubhrajyoti
  0 siblings, 1 reply; 4+ messages in thread
From: Rakesh Iyer @ 2012-01-18 22:33 UTC (permalink / raw)
  To: dmitry.torokhov; +Cc: swarren, linux-input, linux-kernel, Rakesh Iyer

Enable keypress interrupt to support wakeup from low power state.

Signed-off-by: Rakesh Iyer <riyer@nvidia.com>
---
 drivers/input/keyboard/tegra-kbc.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c
index a136e2e..b307a46 100644
--- a/drivers/input/keyboard/tegra-kbc.c
+++ b/drivers/input/keyboard/tegra-kbc.c
@@ -48,6 +48,7 @@
 #define KBC_FIFO_TH_CNT_SHIFT(cnt)	(cnt << 14)
 #define KBC_DEBOUNCE_CNT_SHIFT(cnt)	(cnt << 4)
 #define KBC_CONTROL_FIFO_CNT_INT_EN	(1 << 3)
+#define KBC_CONTROL_KEYPRESS_INT_EN	(1 << 1)
 #define KBC_CONTROL_KBC_EN		(1 << 0)
 
 /* KBC Interrupt Register */
@@ -356,6 +357,18 @@ static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable)
 	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)
 {
 	struct tegra_kbc *kbc = (struct tegra_kbc *)data;
@@ -831,6 +844,8 @@ static int tegra_kbc_suspend(struct device *dev)
 		msleep(30);
 
 		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_wake(kbc->irq);
 	} else {
@@ -852,6 +867,8 @@ static int tegra_kbc_resume(struct device *dev)
 	if (device_may_wakeup(&pdev->dev)) {
 		disable_irq_wake(kbc->irq);
 		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. */
 		writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup
  2012-01-18 22:33 [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup Rakesh Iyer
@ 2012-01-19  5:47 ` Shubhrajyoti
  2012-01-19 18:21   ` Rakesh Iyer
  0 siblings, 1 reply; 4+ messages in thread
From: Shubhrajyoti @ 2012-01-19  5:47 UTC (permalink / raw)
  To: Rakesh Iyer; +Cc: dmitry.torokhov, swarren, linux-input, linux-kernel

On Thursday 19 January 2012 04:03 AM, Rakesh Iyer wrote:
> Enable keypress interrupt to support wakeup from low power state.
>
> Signed-off-by: Rakesh Iyer <riyer@nvidia.com>
> ---
>  drivers/input/keyboard/tegra-kbc.c |   17 +++++++++++++++++
>  1 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c
> index a136e2e..b307a46 100644
> --- a/drivers/input/keyboard/tegra-kbc.c
> +++ b/drivers/input/keyboard/tegra-kbc.c
> @@ -48,6 +48,7 @@
>  #define KBC_FIFO_TH_CNT_SHIFT(cnt)	(cnt << 14)
>  #define KBC_DEBOUNCE_CNT_SHIFT(cnt)	(cnt << 4)
>  #define KBC_CONTROL_FIFO_CNT_INT_EN	(1 << 3)
> +#define KBC_CONTROL_KEYPRESS_INT_EN	(1 << 1)
>  #define KBC_CONTROL_KBC_EN		(1 << 0)
>  
>  /* KBC Interrupt Register */
> @@ -356,6 +357,18 @@ static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable)
>  	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)
>  {
>  	struct tegra_kbc *kbc = (struct tegra_kbc *)data;
> @@ -831,6 +844,8 @@ static int tegra_kbc_suspend(struct device *dev)
>  		msleep(30);
>  
>  		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_wake(kbc->irq);
>  	} else {
> @@ -852,6 +867,8 @@ static int tegra_kbc_resume(struct device *dev)
>  	if (device_may_wakeup(&pdev->dev)) {
>  		disable_irq_wake(kbc->irq);
>  		tegra_kbc_setup_wakekeys(kbc, false);
> +		/* We will use fifo interrupts for key detection. */
> +		tegra_kbc_set_keypress_interrupt(kbc, false);
Why do yo disable on resume why not have it enabled always?

>  
>  		/* Restore the resident time of continuous polling mode. */
>  		writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0);


^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup
  2012-01-19  5:47 ` Shubhrajyoti
@ 2012-01-19 18:21   ` Rakesh Iyer
  2012-01-24  5:24     ` Datta, Shubhrajyoti
  0 siblings, 1 reply; 4+ messages in thread
From: Rakesh Iyer @ 2012-01-19 18:21 UTC (permalink / raw)
  To: Shubhrajyoti; +Cc: dmitry.torokhov, Stephen Warren, linux-input, linux-kernel

>  	if (device_may_wakeup(&pdev->dev)) {
>  		disable_irq_wake(kbc->irq);
>  		tegra_kbc_setup_wakekeys(kbc, false);
> +		/* We will use fifo interrupts for key detection. */
> +		tegra_kbc_set_keypress_interrupt(kbc, false);
Why do yo disable on resume why not have it enabled always?

>  
>  		/* Restore the resident time of continuous polling mode. */
>  		writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0);

For the relevant discussion, Tegra KBC provides the following interrupts - 
a) The keypress interrupt which is generated as soon as a key is pressed, 
      before matrix scanning begins.
b) FIFO interrupt which is generated when actual keys are decoded from the matrix, 
     and put into the FIFO. 

During normal operation the keypress interrupt is not useful as we have to wait for the 
keys to make it into the FIFO before reporting it to the higher layers.

Since we have turned off scanning(in the following commit) we cannot use the FIFO interrupt 
during the resume, so we rely on the keypress interrupt and generate the wakeup key.

Commit that turned off scanning

    Input: tegra-kbc - fix wakeup from suspend

    For wakeup to be reliable, kbc needs to be in interrupt mode before suspend.
    Created common routine to control the FIFO interrupt.
    Added synchronization to ensure orderly suspend.


Regards
Rakesh

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup
  2012-01-19 18:21   ` Rakesh Iyer
@ 2012-01-24  5:24     ` Datta, Shubhrajyoti
  0 siblings, 0 replies; 4+ messages in thread
From: Datta, Shubhrajyoti @ 2012-01-24  5:24 UTC (permalink / raw)
  To: Rakesh Iyer; +Cc: dmitry.torokhov, Stephen Warren, linux-input, linux-kernel

Hi Rakesh,

On Thu, Jan 19, 2012 at 11:51 PM, Rakesh Iyer <riyer@nvidia.com> wrote:
>>       if (device_may_wakeup(&pdev->dev)) {
>>               disable_irq_wake(kbc->irq);
>>               tegra_kbc_setup_wakekeys(kbc, false);
>> +             /* We will use fifo interrupts for key detection. */
>> +             tegra_kbc_set_keypress_interrupt(kbc, false);
> Why do yo disable on resume why not have it enabled always?
>
>>
>>               /* Restore the resident time of continuous polling mode. */
>>               writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0);
>
> For the relevant discussion, Tegra KBC provides the following interrupts -
> a) The keypress interrupt which is generated as soon as a key is pressed,
>      before matrix scanning begins.
> b) FIFO interrupt which is generated when actual keys are decoded from the matrix,
>     and put into the FIFO.
>
> During normal operation the keypress interrupt is not useful as we have to wait for the
> keys to make it into the FIFO before reporting it to the higher layers.
>
> Since we have turned off scanning(in the following commit) we cannot use the FIFO interrupt
> during the resume, so we rely on the keypress interrupt and generate the wakeup key.
>
> Commit that turned off scanning
>
>    Input: tegra-kbc - fix wakeup from suspend
>
>    For wakeup to be reliable, kbc needs to be in interrupt mode before suspend.

Does it need to be disabled at resume?

>    Created common routine to control the FIFO interrupt.
>    Added synchronization to ensure orderly suspend.
>
>
> Regards
> Rakesh

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-01-24  5:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-18 22:33 [PATCH v1] Input: tegra-kbc - enable key interrupt for wakeup Rakesh Iyer
2012-01-19  5:47 ` Shubhrajyoti
2012-01-19 18:21   ` Rakesh Iyer
2012-01-24  5:24     ` Datta, Shubhrajyoti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).