]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/media/IR/ir-raw-event.c
V4L/DVB: saa7134: don't wait too much to generate an IR event on raw_decode
[net-next-2.6.git] / drivers / media / IR / ir-raw-event.c
index 9c71ac85892390cd56e279acf65d27b4ad36ac52..0ae55433cef9d43b4e3e5f635c04864348e3affb 100644 (file)
 /* 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;