V4L/DVB (4882): budget-ci IR: make debounce logic conditional
authorDavid Hardeman <david@hardeman.nu>
Sat, 2 Dec 2006 23:16:06 +0000 (21:16 -0200)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 10 Dec 2006 11:05:19 +0000 (09:05 -0200)
Change the debounce logic so that it is not used at all unless the
debounce parameter has been set. This makes for a much "snappier" remote
for most users as there is no timeout to wait for (the debounce logic has
a 350ms timer for the next repeat, but with the RC5 protocol, one event
per ~110ms is possible)

Signed-off-by: David Hardeman <david@hardeman.nu>
Signed-off-by: Andrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/ttpci/budget-ci.c

index 2a3707c87942355ea4a7c3f21b72881de6db76f0..83a1c5f44a0a959d9b3388ace5df327fb53f0530 100644 (file)
@@ -159,27 +159,32 @@ static void msp430_ir_interrupt(unsigned long data)
        if (budget_ci->ir.rc5_device != IR_DEVICE_ANY && budget_ci->ir.rc5_device != device)
                return;
 
-       /* Are we still waiting for a keyup event while this is a new key? */
-       if ((ir_key != dev->repeat_key || toggle != prev_toggle) && del_timer(&dev->timer))
-               ir_input_nokey(dev, &budget_ci->ir.state);
-
-       prev_toggle = toggle;
-
        /* Ignore repeated key sequences if requested */
-       if (ir_key == dev->repeat_key && bounces > 0 && timer_pending(&dev->timer)) {
+       if (toggle == prev_toggle && ir_key == dev->repeat_key &&
+           bounces > 0 && timer_pending(&dev->timer)) {
+               if (ir_debug)
+                       printk("budget_ci: debounce logic ignored IR command\n");
                bounces--;
                return;
        }
+       prev_toggle = toggle;
 
-       /* New keypress? */
-       if (!timer_pending(&dev->timer))
-               bounces = debounce;
+       /* Are we still waiting for a keyup event? */
+       if (del_timer(&dev->timer))
+               ir_input_nokey(dev, &budget_ci->ir.state);
 
-       /* Prepare a keyup event sometime in the future */
-       mod_timer(&dev->timer, jiffies + msecs_to_jiffies(IR_REPEAT_TIMEOUT));
+       /* Generate keypress */
+       if (ir_debug)
+               printk("budget_ci: generating keypress 0x%02x\n", ir_key);
+       ir_input_keydown(dev, &budget_ci->ir.state, ir_key, (ir_key & (command << 8)));
 
-       /* Generate a new or repeated keypress */
-       ir_input_keydown(dev, &budget_ci->ir.state, ir_key, ((device << 8) | command));
+       /* Do we want to delay the keyup event? */
+       if (debounce) {
+               bounces = debounce;
+               mod_timer(&dev->timer, jiffies + msecs_to_jiffies(IR_REPEAT_TIMEOUT));
+       } else {
+               ir_input_nokey(dev, &budget_ci->ir.state);
+       }
 }
 
 static void msp430_ir_debounce(unsigned long data)
@@ -297,11 +302,9 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
                break;
        }
 
-       /* initialise the key-up timeout handler */
+       /* initialise the key-up debounce timeout handler */
        input_dev->timer.function = msp430_ir_keyup;
        input_dev->timer.data = (unsigned long) &budget_ci->ir;
-       input_dev->rep[REP_DELAY] = 1;
-       input_dev->rep[REP_PERIOD] = 1;
 
        error = input_register_device(input_dev);
        if (error) {