* [PATCH 1/2] Input: gpio_keys: report a wakeup_event for a button press on a wake_up button.
2012-07-30 1:09 [PATCH 0/2] Report wake_events for some button presses NeilBrown
@ 2012-07-30 1:09 ` NeilBrown
2012-07-30 1:09 ` [PATCH 2/2] Input: twl4030-pwrbutton: report a wakeup_event on button press NeilBrown
2012-07-30 5:49 ` [PATCH 0/2] Report wake_events for some button presses Dmitry Torokhov
2 siblings, 0 replies; 4+ messages in thread
From: NeilBrown @ 2012-07-30 1:09 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input, linux-kernel, linux-pm, NeilBrown
In order to avoid races with suspend, a wakeup event must register as
such by calling pm_wakeup_event() or pm_stay_awake(). This will ensure
that the current suspend cycle aborts.
When the user-space visible event is created in the interrupt handler
(gpio_keys_irq_isr), a simple pm_wakeup_event() with no delay is
sufficient as suspend will synchronise with all interrupt delivery.
When the user-space visible event is created later
(gpio_keys_gpio_isr), we need to bracket the event with
pm_stay_awake() and pm_relax().
Signed-off-by: NeilBrown <neilb@suse.de>
---
drivers/input/keyboard/gpio_keys.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 62bfce4..ee6e525 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -346,6 +346,8 @@ static void gpio_keys_gpio_work_func(struct work_struct *work)
container_of(work, struct gpio_button_data, work);
gpio_keys_gpio_report_event(bdata);
+ if (bdata->button->wakeup)
+ pm_relax(bdata->input->dev.parent);
}
static void gpio_keys_gpio_timer(unsigned long _data)
@@ -361,6 +363,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
BUG_ON(irq != bdata->irq);
+ if (bdata->button->wakeup)
+ pm_stay_awake(bdata->input->dev.parent);
if (bdata->timer_debounce)
mod_timer(&bdata->timer,
jiffies + msecs_to_jiffies(bdata->timer_debounce));
@@ -397,6 +401,9 @@ static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id)
spin_lock_irqsave(&bdata->lock, flags);
if (!bdata->key_pressed) {
+ if (bdata->button->wakeup)
+ pm_wakeup_event(bdata->input->dev.parent, 0);
+
input_event(input, EV_KEY, button->code, 1);
input_sync(input);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] Input: twl4030-pwrbutton: report a wakeup_event on button press.
2012-07-30 1:09 [PATCH 0/2] Report wake_events for some button presses NeilBrown
2012-07-30 1:09 ` [PATCH 1/2] Input: gpio_keys: report a wakeup_event for a button press on a wake_up button NeilBrown
@ 2012-07-30 1:09 ` NeilBrown
2012-07-30 5:49 ` [PATCH 0/2] Report wake_events for some button presses Dmitry Torokhov
2 siblings, 0 replies; 4+ messages in thread
From: NeilBrown @ 2012-07-30 1:09 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input, linux-kernel, linux-pm, NeilBrown
As the power button causes a wake from suspend, we need to register
the event with the pm sustem to avoid racing with suspend.
As the input event is reported in the interrupt handler, as simple
pm_wakeup_event() is sufficient.
Signed-off-by: NeilBrown <neilb@suse.de>
---
drivers/input/misc/twl4030-pwrbutton.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c
index 38e4b50..b3dd96d 100644
--- a/drivers/input/misc/twl4030-pwrbutton.c
+++ b/drivers/input/misc/twl4030-pwrbutton.c
@@ -42,6 +42,7 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr)
err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value,
STS_HW_CONDITIONS);
if (!err) {
+ pm_wakeup_event(pwr->dev.parent, 0);
input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ);
input_sync(pwr);
} else {
^ permalink raw reply related [flat|nested] 4+ messages in thread