aboutsummaryrefslogtreecommitdiffstats
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 @@
17/* Define the max number of bit transitions per IR keycode */ 17/* Define the max number of bit transitions per IR keycode */
18#define MAX_IR_EVENT_SIZE 256 18#define MAX_IR_EVENT_SIZE 256
19 19
20static void ir_keyup_timer(unsigned long data)
21{
22 struct input_dev *input_dev = (struct input_dev *)data;
23
24 ir_keyup(input_dev);
25}
26
20int ir_raw_event_register(struct input_dev *input_dev) 27int ir_raw_event_register(struct input_dev *input_dev)
21{ 28{
22 struct ir_input_dev *ir = input_get_drvdata(input_dev); 29 struct ir_input_dev *ir = input_get_drvdata(input_dev);
@@ -27,6 +34,11 @@ int ir_raw_event_register(struct input_dev *input_dev)
27 size = sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE * 2; 34 size = sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE * 2;
28 size = roundup_pow_of_two(size); 35 size = roundup_pow_of_two(size);
29 36
37 init_timer(&ir->raw->timer_keyup);
38 ir->raw->timer_keyup.function = ir_keyup_timer;
39 ir->raw->timer_keyup.data = (unsigned long)input_dev;
40 set_bit(EV_REP, input_dev->evbit);
41
30 rc = kfifo_alloc(&ir->raw->kfifo, size, GFP_KERNEL); 42 rc = kfifo_alloc(&ir->raw->kfifo, size, GFP_KERNEL);
31 43
32 return rc; 44 return rc;
@@ -40,6 +52,8 @@ void ir_raw_event_unregister(struct input_dev *input_dev)
40 if (!ir->raw) 52 if (!ir->raw)
41 return; 53 return;
42 54
55 del_timer_sync(&ir->raw->timer_keyup);
56
43 kfifo_free(&ir->raw->kfifo); 57 kfifo_free(&ir->raw->kfifo);
44 kfree(ir->raw); 58 kfree(ir->raw);
45 ir->raw = NULL; 59 ir->raw = NULL;