#include <linux/module.h>
 
 #include "cx88.h"
+#include <media/ir-core.h>
 #include <media/ir-common.h>
 
 #define MODULE_NAME "cx88xx"
 struct cx88_IR {
        struct cx88_core *core;
        struct input_dev *input;
-       struct ir_input_state ir;
        struct ir_dev_props props;
+       u64 ir_type;
 
        int users;
 
        u32 sampling;
        u32 samples[16];
        int scount;
-       unsigned long release;
 
        /* poll external decoder */
        int polling;
 
                data = (data << 4) | ((gpio_key & 0xf0) >> 4);
 
-               ir_input_keydown(ir->input, &ir->ir, data);
-               ir_input_nokey(ir->input, &ir->ir);
+               ir_keydown(ir->input, data, 0);
 
        } else if (ir->mask_keydown) {
                /* bit set on keydown */
-               if (gpio & ir->mask_keydown) {
-                       ir_input_keydown(ir->input, &ir->ir, data);
-               } else {
-                       ir_input_nokey(ir->input, &ir->ir);
-               }
+               if (gpio & ir->mask_keydown)
+                       ir_keydown(ir->input, data, 0);
 
        } else if (ir->mask_keyup) {
                /* bit cleared on keydown */
-               if (0 == (gpio & ir->mask_keyup)) {
-                       ir_input_keydown(ir->input, &ir->ir, data);
-               } else {
-                       ir_input_nokey(ir->input, &ir->ir);
-               }
+               if (0 == (gpio & ir->mask_keyup))
+                       ir_keydown(ir->input, data, 0);
 
        } else {
                /* can't distinguish keydown/up :-/ */
-               ir_input_keydown(ir->input, &ir->ir, data);
-               ir_input_nokey(ir->input, &ir->ir);
+               ir_keydown(ir->input, data, 0);
        }
 }
 
        snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name);
        snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci));
 
-       err = ir_input_init(input_dev, &ir->ir, ir_type);
-       if (err < 0)
-               goto err_out_free;
+       ir->ir_type = ir_type;
 
        input_dev->name = ir->name;
        input_dev->phys = ir->phys;
        }
        if (!ir->scount) {
                /* nothing to sample */
-               if (ir->ir.keypressed && time_after(jiffies, ir->release))
-                       ir_input_nokey(ir->input, &ir->ir);
                return;
        }
 
 
                if (ircode == 0) { /* key still pressed */
                        ir_dprintk("pulse distance decoded repeat code\n");
-                       ir->release = jiffies + msecs_to_jiffies(120);
+                       ir_repeat(ir->input);
                        break;
                }
 
                        break;
                }
 
-               ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0x7f);
-
-               ir_input_keydown(ir->input, &ir->ir, (ircode >> 16) & 0x7f);
-               ir->release = jiffies + msecs_to_jiffies(120);
+               ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0xff);
+               ir_keydown(ir->input, (ircode >> 16) & 0xff, 0);
                break;
        case CX88_BOARD_HAUPPAUGE:
        case CX88_BOARD_HAUPPAUGE_DVB_T1:
                if ( dev != 0x1e && dev != 0x1f )
                        /* not a hauppauge remote */
                        break;
-               ir_input_keydown(ir->input, &ir->ir, code);
-               ir->release = jiffies + msecs_to_jiffies(120);
+               ir_keydown(ir->input, code, toggle);
                break;
        case CX88_BOARD_PINNACLE_PCTV_HD_800i:
                ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
                ir_dprintk("biphase decoded: %x\n", ircode);
                if ((ircode & 0xfffff000) != 0x3000)
                        break;
-               ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f);
-               ir->release = jiffies + msecs_to_jiffies(120);
+               /* Note: bit 0x800 being the toggle is assumed, not checked
+                  with real hardware  */
+               ir_keydown(ir->input, ircode & 0x3f, ircode & 0x0800 ? 1 : 0);
                break;
        }