input: keyboard: rk_keys: add wake lock
authorHuang, Tao <huangtao@rock-chips.com>
Tue, 19 May 2015 02:56:23 +0000 (10:56 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 19 May 2015 03:09:02 +0000 (11:09 +0800)
New version Android will never call EPOLLWAKEUP or EVIOCSSUSPENDBLOCK.
So we need add wake lock in driver.

Signed-off-by: Huang, Tao <huangtao@rock-chips.com>
drivers/input/keyboard/rk_keys.c

index 1a0af7f44a8ee50ebf024aaf407a1f20e48fdae0..c8688b04f8590d738b43cd6052a562fbb7a27858 100755 (executable)
@@ -23,6 +23,7 @@
 #include <linux/input.h>
 #include <linux/adc.h>
 #include <linux/slab.h>
+#include <linux/wakelock.h>
 
 #include <linux/iio/iio.h>
 #include <linux/iio/machine.h>
@@ -50,6 +51,7 @@
 
 #define DEBOUNCE_JIFFIES       (10 / (MSEC_PER_SEC / HZ))      /* 10ms */
 #define ADC_SAMPLE_JIFFIES     (100 / (MSEC_PER_SEC / HZ))     /* 100ms */
+#define WAKE_LOCK_JIFFIES      (1 * HZ)                        /* 1s */
 
 enum rk_key_type {
        TYPE_GPIO = 1,
@@ -75,6 +77,7 @@ struct rk_keys_drvdata {
        bool in_suspend;
        int result;
        int rep;
+       struct wake_lock wake_lock;
        struct input_dev *input;
        struct delayed_work adc_poll_work;
        struct iio_channel *chan;
@@ -160,6 +163,8 @@ static irqreturn_t keys_isr(int irq, void *dev_id)
                input_event(input, EV_KEY, button->code, button->state);
                input_sync(input);
        }
+       if (button->wakeup)
+               wake_lock_timeout(&pdata->wake_lock, WAKE_LOCK_JIFFIES);
        mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES);
 
        return IRQ_HANDLED;
@@ -371,6 +376,8 @@ static int keys_probe(struct platform_device *pdev)
                input_set_capability(input, EV_KEY, button->code);
        }
 
+       wake_lock_init(&ddata->wake_lock, WAKE_LOCK_SUSPEND, input->name);
+
        for (i = 0; i < ddata->nbuttons; i++) {
                struct rk_keys_button *button = &ddata->button[i];
 
@@ -443,6 +450,7 @@ static int keys_probe(struct platform_device *pdev)
 fail2:
        device_init_wakeup(dev, 0);
 fail1:
+       wake_lock_destroy(&ddata->wake_lock);
        while (--i >= 0)
                del_timer_sync(&ddata->button[i].timer);
 fail0:
@@ -464,6 +472,7 @@ static int keys_remove(struct platform_device *pdev)
        if (ddata->chan)
                cancel_delayed_work_sync(&ddata->adc_poll_work);
        input_unregister_device(input);
+       wake_lock_destroy(&ddata->wake_lock);
 
        sinput_dev = NULL;
        spdata = NULL;