#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>
#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,
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;
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;
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];
fail2:
device_init_wakeup(dev, 0);
fail1:
+ wake_lock_destroy(&ddata->wake_lock);
while (--i >= 0)
del_timer_sync(&ddata->button[i].timer);
fail0:
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;