Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1676542 > unrolled thread

[PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase

Started byEnric Balletbo i Serra <enric.balletbo@collabora.com>
First post2017-06-28 12:40 +0200
Last post2017-07-02 22:50 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase Enric Balletbo i Serra <enric.balletbo@collabora.com> - 2017-06-28 12:40 +0200
    Re: [PATCH RESEND] input: gpio_keys: handle the missing key press  event in resume phase Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2017-07-02 22:50 +0200

#1676542 — [PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase

FromEnric Balletbo i Serra <enric.balletbo@collabora.com>
Date2017-06-28 12:40 +0200
Subject[PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase
Message-ID<tXiy6-5Cj-21@gated-at.bofh.it>
From: Joseph Lo <josephl@nvidia.com>

The GPIO key press event might be missed in the resume phase, if the key
had been released before the system had been resumed to the stage that it
could capture the press event. So we simulate the wakeup key press event
in case the key had been released by the time we got interrupt handler
to run.

Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
This patch was sent long time ago [1] but apparently did not receive feedback
and seems that nobody take care of it. I think might be interesting have this
upstream so I resend this version just rebased on top of mainline and tested
on a veyron device.

[1] https://patchwork.kernel.org/patch/7157201/

 drivers/input/keyboard/gpio_keys.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index da3d362..a047b9a 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -48,6 +48,7 @@ struct gpio_button_data {
 	spinlock_t lock;
 	bool disabled;
 	bool key_pressed;
+	bool suspended;
 };
 
 struct gpio_keys_drvdata {
@@ -396,8 +397,20 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
 
 	BUG_ON(irq != bdata->irq);
 
-	if (bdata->button->wakeup)
+	if (bdata->button->wakeup) {
+		const struct gpio_keys_button *button = bdata->button;
+
 		pm_stay_awake(bdata->input->dev.parent);
+		if (bdata->suspended  &&
+		    (button->type == 0 || button->type == EV_KEY)) {
+			/*
+			 * Simulate wakeup key press in case the key has
+			 * already released by the time we got interrupt
+			 * handler to run.
+			 */
+			input_report_key(bdata->input, button->code, 1);
+		}
+	}
 
 	mod_delayed_work(system_wq,
 			 &bdata->work,
@@ -855,6 +868,7 @@ static int __maybe_unused gpio_keys_suspend(struct device *dev)
 			struct gpio_button_data *bdata = &ddata->data[i];
 			if (bdata->button->wakeup)
 				enable_irq_wake(bdata->irq);
+			bdata->suspended = true;
 		}
 	} else {
 		mutex_lock(&input->mutex);
@@ -878,6 +892,7 @@ static int __maybe_unused gpio_keys_resume(struct device *dev)
 			struct gpio_button_data *bdata = &ddata->data[i];
 			if (bdata->button->wakeup)
 				disable_irq_wake(bdata->irq);
+			bdata->suspended = false;
 		}
 	} else {
 		mutex_lock(&input->mutex);
-- 
2.9.3

[toc] | [next] | [standalone]


#1679560 — Re: [PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase

FromDmitry Torokhov <dmitry.torokhov@gmail.com>
Date2017-07-02 22:50 +0200
SubjectRe: [PATCH RESEND] input: gpio_keys: handle the missing key press event in resume phase
Message-ID<tYTYC-7jX-17@gated-at.bofh.it>
In reply to#1676542
On Wed, Jun 28, 2017 at 12:29:40PM +0200, Enric Balletbo i Serra wrote:
> From: Joseph Lo <josephl@nvidia.com>
> 
> The GPIO key press event might be missed in the resume phase, if the key
> had been released before the system had been resumed to the stage that it
> could capture the press event. So we simulate the wakeup key press event
> in case the key had been released by the time we got interrupt handler
> to run.
> 
> Signed-off-by: Joseph Lo <josephl@nvidia.com>
> Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
> ---
> This patch was sent long time ago [1] but apparently did not receive feedback
> and seems that nobody take care of it. I think might be interesting have this
> upstream so I resend this version just rebased on top of mainline and tested
> on a veyron device.

Applied, thank you.

> 
> [1] https://patchwork.kernel.org/patch/7157201/
> 
>  drivers/input/keyboard/gpio_keys.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
> index da3d362..a047b9a 100644
> --- a/drivers/input/keyboard/gpio_keys.c
> +++ b/drivers/input/keyboard/gpio_keys.c
> @@ -48,6 +48,7 @@ struct gpio_button_data {
>  	spinlock_t lock;
>  	bool disabled;
>  	bool key_pressed;
> +	bool suspended;
>  };
>  
>  struct gpio_keys_drvdata {
> @@ -396,8 +397,20 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
>  
>  	BUG_ON(irq != bdata->irq);
>  
> -	if (bdata->button->wakeup)
> +	if (bdata->button->wakeup) {
> +		const struct gpio_keys_button *button = bdata->button;
> +
>  		pm_stay_awake(bdata->input->dev.parent);
> +		if (bdata->suspended  &&
> +		    (button->type == 0 || button->type == EV_KEY)) {
> +			/*
> +			 * Simulate wakeup key press in case the key has
> +			 * already released by the time we got interrupt
> +			 * handler to run.
> +			 */
> +			input_report_key(bdata->input, button->code, 1);
> +		}
> +	}
>  
>  	mod_delayed_work(system_wq,
>  			 &bdata->work,
> @@ -855,6 +868,7 @@ static int __maybe_unused gpio_keys_suspend(struct device *dev)
>  			struct gpio_button_data *bdata = &ddata->data[i];
>  			if (bdata->button->wakeup)
>  				enable_irq_wake(bdata->irq);
> +			bdata->suspended = true;
>  		}
>  	} else {
>  		mutex_lock(&input->mutex);
> @@ -878,6 +892,7 @@ static int __maybe_unused gpio_keys_resume(struct device *dev)
>  			struct gpio_button_data *bdata = &ddata->data[i];
>  			if (bdata->button->wakeup)
>  				disable_irq_wake(bdata->irq);
> +			bdata->suspended = false;
>  		}
>  	} else {
>  		mutex_lock(&input->mutex);
> -- 
> 2.9.3
> 

-- 
Dmitry

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web