summaryrefslogtreecommitdiffstats
path: root/drivers/media/IR/ir-raw-event.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/IR/ir-raw-event.c')
-rw-r--r--drivers/media/IR/ir-raw-event.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/media/IR/ir-raw-event.c b/drivers/media/IR/ir-raw-event.c
index 9c71ac858923..0ae55433cef9 100644
--- a/drivers/media/IR/ir-raw-event.c
+++ b/drivers/media/IR/ir-raw-event.c
@@ -17,6 +17,13 @@
/* Define the max number of bit transitions per IR keycode */
#define MAX_IR_EVENT_SIZE 256
+static void ir_keyup_timer(unsigned long data)
+{
+ struct input_dev *input_dev = (struct input_dev *)data;
+
+ ir_keyup(input_dev);
+}
+
int ir_raw_event_register(struct input_dev *input_dev)
{
struct ir_input_dev *ir = input_get_drvdata(input_dev);
@@ -27,6 +34,11 @@ int ir_raw_event_register(struct input_dev *input_dev)
size = sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE * 2;
size = roundup_pow_of_two(size);
+ init_timer(&ir->raw->timer_keyup);
+ ir->raw->timer_keyup.function = ir_keyup_timer;
+ ir->raw->timer_keyup.data = (unsigned long)input_dev;
+ set_bit(EV_REP, input_dev->evbit);
+
rc = kfifo_alloc(&ir->raw->kfifo, size, GFP_KERNEL);
return rc;
@@ -40,6 +52,8 @@ void ir_raw_event_unregister(struct input_dev *input_dev)
if (!ir->raw)
return;
+ del_timer_sync(&ir->raw->timer_keyup);
+
kfifo_free(&ir->raw->kfifo);
kfree(ir->raw);
ir->raw = NULL;