V4L/DVB (13612): IR: Move common IR code to drivers/media/IR
authorMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 11 Dec 2009 11:00:00 +0000 (08:00 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 16 Dec 2009 02:18:42 +0000 (00:18 -0200)
This is the first step of creating a common code for IR that can be
used by other input devices.

For now, keep IR dir at drivers/media, to easy the movement of the IR files,
but later patches may move it to drivers/IR or drivers/input/IR.

No functional changes is done on this patch.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
12 files changed:
drivers/media/IR/Kconfig [new file with mode: 0644]
drivers/media/IR/Makefile [new file with mode: 0644]
drivers/media/IR/ir-functions.c [new file with mode: 0644]
drivers/media/IR/ir-keymaps.c [new file with mode: 0644]
drivers/media/IR/ir-keytable.c [new file with mode: 0644]
drivers/media/Kconfig
drivers/media/Makefile
drivers/media/common/Makefile
drivers/media/common/ir-functions.c [deleted file]
drivers/media/common/ir-keymaps.c [deleted file]
drivers/media/common/ir-keytable.c [deleted file]
drivers/media/video/Kconfig

diff --git a/drivers/media/IR/Kconfig b/drivers/media/IR/Kconfig
new file mode 100644 (file)
index 0000000..5b4ac96
--- /dev/null
@@ -0,0 +1,4 @@
+config VIDEO_IR
+       tristate
+       depends on INPUT
+       default INPUT
diff --git a/drivers/media/IR/Makefile b/drivers/media/IR/Makefile
new file mode 100644 (file)
index 0000000..2781f43
--- /dev/null
@@ -0,0 +1,3 @@
+ir-common-objs  := ir-functions.o ir-keymaps.o ir-keytable.o
+
+obj-$(CONFIG_VIDEO_IR) += ir-common.o
diff --git a/drivers/media/IR/ir-functions.c b/drivers/media/IR/ir-functions.c
new file mode 100644 (file)
index 0000000..e616f62
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ *
+ * some common structs and functions to handle infrared remotes via
+ * input layer ...
+ *
+ * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/jiffies.h>
+#include <media/ir-common.h>
+
+/* -------------------------------------------------------------------------- */
+
+MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
+MODULE_LICENSE("GPL");
+
+static int repeat = 1;
+module_param(repeat, int, 0444);
+MODULE_PARM_DESC(repeat,"auto-repeat for IR keys (default: on)");
+
+int media_ir_debug;    /* media_ir_debug level (0,1,2) */
+module_param_named(debug, media_ir_debug, int, 0644);
+
+/* -------------------------------------------------------------------------- */
+
+static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
+{
+       if (KEY_RESERVED == ir->keycode) {
+               printk(KERN_INFO "%s: unknown key: key=0x%02x down=%d\n",
+                      dev->name, ir->ir_key, ir->keypressed);
+               return;
+       }
+       IR_dprintk(1,"%s: key event code=%d down=%d\n",
+               dev->name,ir->keycode,ir->keypressed);
+       input_report_key(dev,ir->keycode,ir->keypressed);
+       input_sync(dev);
+}
+
+/* -------------------------------------------------------------------------- */
+
+int ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
+                  int ir_type, struct ir_scancode_table *ir_codes)
+{
+       ir->ir_type = ir_type;
+
+       ir->keytable.size = ir_roundup_tablesize(ir_codes->size);
+       ir->keytable.scan = kzalloc(ir->keytable.size *
+                                   sizeof(struct ir_scancode), GFP_KERNEL);
+       if (!ir->keytable.scan)
+               return -ENOMEM;
+
+       IR_dprintk(1, "Allocated space for %d keycode entries (%zd bytes)\n",
+               ir->keytable.size,
+               ir->keytable.size * sizeof(ir->keytable.scan));
+
+       ir_copy_table(&ir->keytable, ir_codes);
+       ir_set_keycode_table(dev, &ir->keytable);
+
+       clear_bit(0, dev->keybit);
+       set_bit(EV_KEY, dev->evbit);
+       if (repeat)
+               set_bit(EV_REP, dev->evbit);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ir_input_init);
+
+
+void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir)
+{
+       if (ir->keypressed) {
+               ir->keypressed = 0;
+               ir_input_key_event(dev,ir);
+       }
+}
+EXPORT_SYMBOL_GPL(ir_input_nokey);
+
+void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
+                     u32 ir_key)
+{
+       u32 keycode = ir_g_keycode_from_table(dev, ir_key);
+
+       if (ir->keypressed && ir->keycode != keycode) {
+               ir->keypressed = 0;
+               ir_input_key_event(dev,ir);
+       }
+       if (!ir->keypressed) {
+               ir->ir_key  = ir_key;
+               ir->keycode = keycode;
+               ir->keypressed = 1;
+               ir_input_key_event(dev,ir);
+       }
+}
+EXPORT_SYMBOL_GPL(ir_input_keydown);
+
+/* -------------------------------------------------------------------------- */
+/* extract mask bits out of data and pack them into the result */
+u32 ir_extract_bits(u32 data, u32 mask)
+{
+       u32 vbit = 1, value = 0;
+
+       do {
+           if (mask&1) {
+               if (data&1)
+                       value |= vbit;
+               vbit<<=1;
+           }
+           data>>=1;
+       } while (mask>>=1);
+
+       return value;
+}
+EXPORT_SYMBOL_GPL(ir_extract_bits);
+
+static int inline getbit(u32 *samples, int bit)
+{
+       return (samples[bit/32] & (1 << (31-(bit%32)))) ? 1 : 0;
+}
+
+/* sump raw samples for visual debugging ;) */
+int ir_dump_samples(u32 *samples, int count)
+{
+       int i, bit, start;
+
+       printk(KERN_DEBUG "ir samples: ");
+       start = 0;
+       for (i = 0; i < count * 32; i++) {
+               bit = getbit(samples,i);
+               if (bit)
+                       start = 1;
+               if (0 == start)
+                       continue;
+               printk("%s", bit ? "#" : "_");
+       }
+       printk("\n");
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ir_dump_samples);
+
+/* decode raw samples, pulse distance coding used by NEC remotes */
+int ir_decode_pulsedistance(u32 *samples, int count, int low, int high)
+{
+       int i,last,bit,len;
+       u32 curBit;
+       u32 value;
+
+       /* find start burst */
+       for (i = len = 0; i < count * 32; i++) {
+               bit = getbit(samples,i);
+               if (bit) {
+                       len++;
+               } else {
+                       if (len >= 29)
+                               break;
+                       len = 0;
+               }
+       }
+
+       /* start burst to short */
+       if (len < 29)
+               return 0xffffffff;
+
+       /* find start silence */
+       for (len = 0; i < count * 32; i++) {
+               bit = getbit(samples,i);
+               if (bit) {
+                       break;
+               } else {
+                       len++;
+               }
+       }
+
+       /* silence to short */
+       if (len < 7)
+               return 0xffffffff;
+
+       /* go decoding */
+       len   = 0;
+       last = 1;
+       value = 0; curBit = 1;
+       for (; i < count * 32; i++) {
+               bit  = getbit(samples,i);
+               if (last) {
+                       if(bit) {
+                               continue;
+                       } else {
+                               len = 1;
+                       }
+               } else {
+                       if (bit) {
+                               if (len > (low + high) /2)
+                                       value |= curBit;
+                               curBit <<= 1;
+                               if (curBit == 1)
+                                       break;
+                       } else {
+                               len++;
+                       }
+               }
+               last = bit;
+       }
+
+       return value;
+}
+EXPORT_SYMBOL_GPL(ir_decode_pulsedistance);
+
+/* decode raw samples, biphase coding, used by rc5 for example */
+int ir_decode_biphase(u32 *samples, int count, int low, int high)
+{
+       int i,last,bit,len,flips;
+       u32 value;
+
+       /* find start bit (1) */
+       for (i = 0; i < 32; i++) {
+               bit = getbit(samples,i);
+               if (bit)
+                       break;
+       }
+
+       /* go decoding */
+       len   = 0;
+       flips = 0;
+       value = 1;
+       for (; i < count * 32; i++) {
+               if (len > high)
+                       break;
+               if (flips > 1)
+                       break;
+               last = bit;
+               bit  = getbit(samples,i);
+               if (last == bit) {
+                       len++;
+                       continue;
+               }
+               if (len < low) {
+                       len++;
+                       flips++;
+                       continue;
+               }
+               value <<= 1;
+               value |= bit;
+               flips = 0;
+               len   = 1;
+       }
+       return value;
+}
+EXPORT_SYMBOL_GPL(ir_decode_biphase);
+
+/* RC5 decoding stuff, moved from bttv-input.c to share it with
+ * saa7134 */
+
+/* decode raw bit pattern to RC5 code */
+u32 ir_rc5_decode(unsigned int code)
+{
+       unsigned int org_code = code;
+       unsigned int pair;
+       unsigned int rc5 = 0;
+       int i;
+
+       for (i = 0; i < 14; ++i) {
+               pair = code & 0x3;
+               code >>= 2;
+
+               rc5 <<= 1;
+               switch (pair) {
+               case 0:
+               case 2:
+                       break;
+               case 1:
+                       rc5 |= 1;
+                       break;
+               case 3:
+                       IR_dprintk(1, "ir-common: ir_rc5_decode(%x) bad code\n", org_code);
+                       return 0;
+               }
+       }
+       IR_dprintk(1, "ir-common: code=%x, rc5=%x, start=%x, toggle=%x, address=%x, "
+               "instr=%x\n", rc5, org_code, RC5_START(rc5),
+               RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));
+       return rc5;
+}
+EXPORT_SYMBOL_GPL(ir_rc5_decode);
+
+void ir_rc5_timer_end(unsigned long data)
+{
+       struct card_ir *ir = (struct card_ir *)data;
+       struct timeval tv;
+       unsigned long current_jiffies, timeout;
+       u32 gap;
+       u32 rc5 = 0;
+
+       /* get time */
+       current_jiffies = jiffies;
+       do_gettimeofday(&tv);
+
+       /* avoid overflow with gap >1s */
+       if (tv.tv_sec - ir->base_time.tv_sec > 1) {
+               gap = 200000;
+       } else {
+               gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
+                   tv.tv_usec - ir->base_time.tv_usec;
+       }
+
+       /* signal we're ready to start a new code */
+       ir->active = 0;
+
+       /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */
+       if (gap < 28000) {
+               IR_dprintk(1, "ir-common: spurious timer_end\n");
+               return;
+       }
+
+       if (ir->last_bit < 20) {
+               /* ignore spurious codes (caused by light/other remotes) */
+               IR_dprintk(1, "ir-common: short code: %x\n", ir->code);
+       } else {
+               ir->code = (ir->code << ir->shift_by) | 1;
+               rc5 = ir_rc5_decode(ir->code);
+
+               /* two start bits? */
+               if (RC5_START(rc5) != ir->start) {
+                       IR_dprintk(1, "ir-common: rc5 start bits invalid: %u\n", RC5_START(rc5));
+
+                       /* right address? */
+               } else if (RC5_ADDR(rc5) == ir->addr) {
+                       u32 toggle = RC5_TOGGLE(rc5);
+                       u32 instr = RC5_INSTR(rc5);
+
+                       /* Good code, decide if repeat/repress */
+                       if (toggle != RC5_TOGGLE(ir->last_rc5) ||
+                           instr != RC5_INSTR(ir->last_rc5)) {
+                               IR_dprintk(1, "ir-common: instruction %x, toggle %x\n", instr,
+                                       toggle);
+                               ir_input_nokey(ir->dev, &ir->ir);
+                               ir_input_keydown(ir->dev, &ir->ir, instr);
+                       }
+
+                       /* Set/reset key-up timer */
+                       timeout = current_jiffies +
+                                 msecs_to_jiffies(ir->rc5_key_timeout);
+                       mod_timer(&ir->timer_keyup, timeout);
+
+                       /* Save code for repeat test */
+                       ir->last_rc5 = rc5;
+               }
+       }
+}
+EXPORT_SYMBOL_GPL(ir_rc5_timer_end);
+
+void ir_rc5_timer_keyup(unsigned long data)
+{
+       struct card_ir *ir = (struct card_ir *)data;
+
+       IR_dprintk(1, "ir-common: key released\n");
+       ir_input_nokey(ir->dev, &ir->ir);
+}
+EXPORT_SYMBOL_GPL(ir_rc5_timer_keyup);
diff --git a/drivers/media/IR/ir-keymaps.c b/drivers/media/IR/ir-keymaps.c
new file mode 100644 (file)
index 0000000..9bbe6b1
--- /dev/null
@@ -0,0 +1,3395 @@
+/*
+    Keytables for supported remote controls, used on drivers/media
+    devices.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ * NOTICE FOR DEVELOPERS:
+ *   The IR mappings should be as close as possible to what's
+ *   specified at:
+ *      http://linuxtv.org/wiki/index.php/Remote_Controllers
+ */
+#include <linux/module.h>
+
+#include <linux/input.h>
+#include <media/ir-common.h>
+
+/* empty keytable, can be used as placeholder for not-yet created keytables */
+static struct ir_scancode ir_codes_empty[] = {
+       { 0x2a, KEY_COFFEE },
+};
+
+struct ir_scancode_table ir_codes_empty_table = {
+       .scan = ir_codes_empty,
+       .size = ARRAY_SIZE(ir_codes_empty),
+};
+EXPORT_SYMBOL_GPL(ir_codes_empty_table);
+
+/* Michal Majchrowicz <mmajchrowicz@gmail.com> */
+static struct ir_scancode ir_codes_proteus_2309[] = {
+       /* numeric */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x5c, KEY_POWER },            /* power       */
+       { 0x20, KEY_ZOOM },             /* full screen */
+       { 0x0f, KEY_BACKSPACE },        /* recall      */
+       { 0x1b, KEY_ENTER },            /* mute        */
+       { 0x41, KEY_RECORD },           /* record      */
+       { 0x43, KEY_STOP },             /* stop        */
+       { 0x16, KEY_S },
+       { 0x1a, KEY_POWER2 },           /* off         */
+       { 0x2e, KEY_RED },
+       { 0x1f, KEY_CHANNELDOWN },      /* channel -   */
+       { 0x1c, KEY_CHANNELUP },        /* channel +   */
+       { 0x10, KEY_VOLUMEDOWN },       /* volume -    */
+       { 0x1e, KEY_VOLUMEUP },         /* volume +    */
+       { 0x14, KEY_F1 },
+};
+
+struct ir_scancode_table ir_codes_proteus_2309_table = {
+       .scan = ir_codes_proteus_2309,
+       .size = ARRAY_SIZE(ir_codes_proteus_2309),
+};
+EXPORT_SYMBOL_GPL(ir_codes_proteus_2309_table);
+
+/* Matt Jesson <dvb@jesson.eclipse.co.uk */
+static struct ir_scancode ir_codes_avermedia_dvbt[] = {
+       { 0x28, KEY_0 },                /* '0' / 'enter' */
+       { 0x22, KEY_1 },                /* '1' */
+       { 0x12, KEY_2 },                /* '2' / 'up arrow' */
+       { 0x32, KEY_3 },                /* '3' */
+       { 0x24, KEY_4 },                /* '4' / 'left arrow' */
+       { 0x14, KEY_5 },                /* '5' */
+       { 0x34, KEY_6 },                /* '6' / 'right arrow' */
+       { 0x26, KEY_7 },                /* '7' */
+       { 0x16, KEY_8 },                /* '8' / 'down arrow' */
+       { 0x36, KEY_9 },                /* '9' */
+
+       { 0x20, KEY_LIST },             /* 'source' */
+       { 0x10, KEY_TEXT },             /* 'teletext' */
+       { 0x00, KEY_POWER },            /* 'power' */
+       { 0x04, KEY_AUDIO },            /* 'audio' */
+       { 0x06, KEY_ZOOM },             /* 'full screen' */
+       { 0x18, KEY_VIDEO },            /* 'display' */
+       { 0x38, KEY_SEARCH },           /* 'loop' */
+       { 0x08, KEY_INFO },             /* 'preview' */
+       { 0x2a, KEY_REWIND },           /* 'backward <<' */
+       { 0x1a, KEY_FASTFORWARD },      /* 'forward >>' */
+       { 0x3a, KEY_RECORD },           /* 'capture' */
+       { 0x0a, KEY_MUTE },             /* 'mute' */
+       { 0x2c, KEY_RECORD },           /* 'record' */
+       { 0x1c, KEY_PAUSE },            /* 'pause' */
+       { 0x3c, KEY_STOP },             /* 'stop' */
+       { 0x0c, KEY_PLAY },             /* 'play' */
+       { 0x2e, KEY_RED },              /* 'red' */
+       { 0x01, KEY_BLUE },             /* 'blue' / 'cancel' */
+       { 0x0e, KEY_YELLOW },           /* 'yellow' / 'ok' */
+       { 0x21, KEY_GREEN },            /* 'green' */
+       { 0x11, KEY_CHANNELDOWN },      /* 'channel -' */
+       { 0x31, KEY_CHANNELUP },        /* 'channel +' */
+       { 0x1e, KEY_VOLUMEDOWN },       /* 'volume -' */
+       { 0x3e, KEY_VOLUMEUP },         /* 'volume +' */
+};
+
+struct ir_scancode_table ir_codes_avermedia_dvbt_table = {
+       .scan = ir_codes_avermedia_dvbt,
+       .size = ARRAY_SIZE(ir_codes_avermedia_dvbt),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt_table);
+
+/* Mauro Carvalho Chehab <mchehab@infradead.org> */
+static struct ir_scancode ir_codes_avermedia_m135a[] = {
+       { 0x00, KEY_POWER2 },
+       { 0x2e, KEY_DOT },              /* '.' */
+       { 0x01, KEY_MODE },             /* TV/FM */
+
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x11, KEY_0 },
+
+       { 0x13, KEY_RIGHT },            /* -> */
+       { 0x12, KEY_LEFT },             /* <- */
+
+       { 0x17, KEY_SLEEP },            /* Capturar Imagem */
+       { 0x10, KEY_SHUFFLE },          /* Amostra */
+
+       /* FIXME: The keys bellow aren't ok */
+
+       { 0x43, KEY_CHANNELUP },
+       { 0x42, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_ENTER },
+
+       { 0x14, KEY_MUTE },
+       { 0x08, KEY_AUDIO },
+
+       { 0x03, KEY_TEXT },
+       { 0x04, KEY_EPG },
+       { 0x2b, KEY_TV2 },              /* TV2 */
+
+       { 0x1d, KEY_RED },
+       { 0x1c, KEY_YELLOW },
+       { 0x41, KEY_GREEN },
+       { 0x40, KEY_BLUE },
+
+       { 0x1a, KEY_PLAYPAUSE },
+       { 0x19, KEY_RECORD },
+       { 0x18, KEY_PLAY },
+       { 0x1b, KEY_STOP },
+};
+
+struct ir_scancode_table ir_codes_avermedia_m135a_table = {
+       .scan = ir_codes_avermedia_m135a,
+       .size = ARRAY_SIZE(ir_codes_avermedia_m135a),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a_table);
+
+/* Oldrich Jedlicka <oldium.pro@seznam.cz> */
+static struct ir_scancode ir_codes_avermedia_cardbus[] = {
+       { 0x00, KEY_POWER },
+       { 0x01, KEY_TUNER },            /* TV/FM */
+       { 0x03, KEY_TEXT },             /* Teletext */
+       { 0x04, KEY_EPG },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x08, KEY_AUDIO },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0c, KEY_ZOOM },             /* Full screen */
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x10, KEY_PAGEUP },           /* 16-CH PREV */
+       { 0x11, KEY_0 },
+       { 0x12, KEY_INFO },
+       { 0x13, KEY_AGAIN },            /* CH RTN - channel return */
+       { 0x14, KEY_MUTE },
+       { 0x15, KEY_EDIT },             /* Autoscan */
+       { 0x17, KEY_SAVE },             /* Screenshot */
+       { 0x18, KEY_PLAYPAUSE },
+       { 0x19, KEY_RECORD },
+       { 0x1a, KEY_PLAY },
+       { 0x1b, KEY_STOP },
+       { 0x1c, KEY_FASTFORWARD },
+       { 0x1d, KEY_REWIND },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_VOLUMEUP },
+       { 0x22, KEY_SLEEP },            /* Sleep */
+       { 0x23, KEY_ZOOM },             /* Aspect */
+       { 0x26, KEY_SCREEN },           /* Pos */
+       { 0x27, KEY_ANGLE },            /* Size */
+       { 0x28, KEY_SELECT },           /* Select */
+       { 0x29, KEY_BLUE },             /* Blue/Picture */
+       { 0x2a, KEY_BACKSPACE },        /* Back */
+       { 0x2b, KEY_MEDIA },            /* PIP (Picture-in-picture) */
+       { 0x2c, KEY_DOWN },
+       { 0x2e, KEY_DOT },
+       { 0x2f, KEY_TV },               /* Live TV */
+       { 0x32, KEY_LEFT },
+       { 0x33, KEY_CLEAR },            /* Clear */
+       { 0x35, KEY_RED },              /* Red/TV */
+       { 0x36, KEY_UP },
+       { 0x37, KEY_HOME },             /* Home */
+       { 0x39, KEY_GREEN },            /* Green/Video */
+       { 0x3d, KEY_YELLOW },           /* Yellow/Music */
+       { 0x3e, KEY_OK },               /* Ok */
+       { 0x3f, KEY_RIGHT },
+       { 0x40, KEY_NEXT },             /* Next */
+       { 0x41, KEY_PREVIOUS },         /* Previous */
+       { 0x42, KEY_CHANNELDOWN },      /* Channel down */
+       { 0x43, KEY_CHANNELUP },        /* Channel up */
+};
+
+struct ir_scancode_table ir_codes_avermedia_cardbus_table = {
+       .scan = ir_codes_avermedia_cardbus,
+       .size = ARRAY_SIZE(ir_codes_avermedia_cardbus),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus_table);
+
+/* Attila Kondoros <attila.kondoros@chello.hu> */
+static struct ir_scancode ir_codes_apac_viewcomp[] = {
+
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x00, KEY_0 },
+       { 0x17, KEY_LAST },             /* +100 */
+       { 0x0a, KEY_LIST },             /* recall */
+
+
+       { 0x1c, KEY_TUNER },            /* TV/FM */
+       { 0x15, KEY_SEARCH },           /* scan */
+       { 0x12, KEY_POWER },            /* power */
+       { 0x1f, KEY_VOLUMEDOWN },       /* vol up */
+       { 0x1b, KEY_VOLUMEUP },         /* vol down */
+       { 0x1e, KEY_CHANNELDOWN },      /* chn up */
+       { 0x1a, KEY_CHANNELUP },        /* chn down */
+
+       { 0x11, KEY_VIDEO },            /* video */
+       { 0x0f, KEY_ZOOM },             /* full screen */
+       { 0x13, KEY_MUTE },             /* mute/unmute */
+       { 0x10, KEY_TEXT },             /* min */
+
+       { 0x0d, KEY_STOP },             /* freeze */
+       { 0x0e, KEY_RECORD },           /* record */
+       { 0x1d, KEY_PLAYPAUSE },        /* stop */
+       { 0x19, KEY_PLAY },             /* play */
+
+       { 0x16, KEY_GOTO },             /* osd */
+       { 0x14, KEY_REFRESH },          /* default */
+       { 0x0c, KEY_KPPLUS },           /* fine tune >>>> */
+       { 0x18, KEY_KPMINUS },          /* fine tune <<<< */
+};
+
+struct ir_scancode_table ir_codes_apac_viewcomp_table = {
+       .scan = ir_codes_apac_viewcomp,
+       .size = ARRAY_SIZE(ir_codes_apac_viewcomp),
+};
+EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp_table);
+
+/* ---------------------------------------------------------------------- */
+
+static struct ir_scancode ir_codes_pixelview[] = {
+
+       { 0x1e, KEY_POWER },    /* power */
+       { 0x07, KEY_MEDIA },    /* source */
+       { 0x1c, KEY_SEARCH },   /* scan */
+
+
+       { 0x03, KEY_TUNER },            /* TV/FM */
+
+       { 0x00, KEY_RECORD },
+       { 0x08, KEY_STOP },
+       { 0x11, KEY_PLAY },
+
+       { 0x1a, KEY_PLAYPAUSE },        /* freeze */
+       { 0x19, KEY_ZOOM },             /* zoom */
+       { 0x0f, KEY_TEXT },             /* min */
+
+       { 0x01, KEY_1 },
+       { 0x0b, KEY_2 },
+       { 0x1b, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x09, KEY_5 },
+       { 0x15, KEY_6 },
+       { 0x06, KEY_7 },
+       { 0x0a, KEY_8 },
+       { 0x12, KEY_9 },
+       { 0x02, KEY_0 },
+       { 0x10, KEY_LAST },             /* +100 */
+       { 0x13, KEY_LIST },             /* recall */
+
+       { 0x1f, KEY_CHANNELUP },        /* chn down */
+       { 0x17, KEY_CHANNELDOWN },      /* chn up */
+       { 0x16, KEY_VOLUMEUP },         /* vol down */
+       { 0x14, KEY_VOLUMEDOWN },       /* vol up */
+
+       { 0x04, KEY_KPMINUS },          /* <<< */
+       { 0x0e, KEY_SETUP },            /* function */
+       { 0x0c, KEY_KPPLUS },           /* >>> */
+
+       { 0x0d, KEY_GOTO },             /* mts */
+       { 0x1d, KEY_REFRESH },          /* reset */
+       { 0x18, KEY_MUTE },             /* mute/unmute */
+};
+
+struct ir_scancode_table ir_codes_pixelview_table = {
+       .scan = ir_codes_pixelview,
+       .size = ARRAY_SIZE(ir_codes_pixelview),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pixelview_table);
+
+/*
+   Mauro Carvalho Chehab <mchehab@infradead.org>
+   present on PV MPEG 8000GT
+ */
+static struct ir_scancode ir_codes_pixelview_new[] = {
+       { 0x3c, KEY_TIME },             /* Timeshift */
+       { 0x12, KEY_POWER },
+
+       { 0x3d, KEY_1 },
+       { 0x38, KEY_2 },
+       { 0x18, KEY_3 },
+       { 0x35, KEY_4 },
+       { 0x39, KEY_5 },
+       { 0x15, KEY_6 },
+       { 0x36, KEY_7 },
+       { 0x3a, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x3e, KEY_0 },
+
+       { 0x1c, KEY_AGAIN },            /* LOOP */
+       { 0x3f, KEY_MEDIA },            /* Source */
+       { 0x1f, KEY_LAST },             /* +100 */
+       { 0x1b, KEY_MUTE },
+
+       { 0x17, KEY_CHANNELDOWN },
+       { 0x16, KEY_CHANNELUP },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x14, KEY_VOLUMEDOWN },
+       { 0x13, KEY_ZOOM },
+
+       { 0x19, KEY_CAMERA },           /* SNAPSHOT */
+       { 0x1a, KEY_SEARCH },           /* scan */
+
+       { 0x37, KEY_REWIND },           /* << */
+       { 0x32, KEY_RECORD },           /* o (red) */
+       { 0x33, KEY_FORWARD },          /* >> */
+       { 0x11, KEY_STOP },             /* square */
+       { 0x3b, KEY_PLAY },             /* > */
+       { 0x30, KEY_PLAYPAUSE },        /* || */
+
+       { 0x31, KEY_TV },
+       { 0x34, KEY_RADIO },
+};
+
+struct ir_scancode_table ir_codes_pixelview_new_table = {
+       .scan = ir_codes_pixelview_new,
+       .size = ARRAY_SIZE(ir_codes_pixelview_new),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pixelview_new_table);
+
+static struct ir_scancode ir_codes_nebula[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_TV },
+       { 0x0b, KEY_AUX },
+       { 0x0c, KEY_DVD },
+       { 0x0d, KEY_POWER },
+       { 0x0e, KEY_MHP },      /* labelled 'Picture' */
+       { 0x0f, KEY_AUDIO },
+       { 0x10, KEY_INFO },
+       { 0x11, KEY_F13 },      /* 16:9 */
+       { 0x12, KEY_F14 },      /* 14:9 */
+       { 0x13, KEY_EPG },
+       { 0x14, KEY_EXIT },
+       { 0x15, KEY_MENU },
+       { 0x16, KEY_UP },
+       { 0x17, KEY_DOWN },
+       { 0x18, KEY_LEFT },
+       { 0x19, KEY_RIGHT },
+       { 0x1a, KEY_ENTER },
+       { 0x1b, KEY_CHANNELUP },
+       { 0x1c, KEY_CHANNELDOWN },
+       { 0x1d, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_RED },
+       { 0x20, KEY_GREEN },
+       { 0x21, KEY_YELLOW },
+       { 0x22, KEY_BLUE },
+       { 0x23, KEY_SUBTITLE },
+       { 0x24, KEY_F15 },      /* AD */
+       { 0x25, KEY_TEXT },
+       { 0x26, KEY_MUTE },
+       { 0x27, KEY_REWIND },
+       { 0x28, KEY_STOP },
+       { 0x29, KEY_PLAY },
+       { 0x2a, KEY_FASTFORWARD },
+       { 0x2b, KEY_F16 },      /* chapter */
+       { 0x2c, KEY_PAUSE },
+       { 0x2d, KEY_PLAY },
+       { 0x2e, KEY_RECORD },
+       { 0x2f, KEY_F17 },      /* picture in picture */
+       { 0x30, KEY_KPPLUS },   /* zoom in */
+       { 0x31, KEY_KPMINUS },  /* zoom out */
+       { 0x32, KEY_F18 },      /* capture */
+       { 0x33, KEY_F19 },      /* web */
+       { 0x34, KEY_EMAIL },
+       { 0x35, KEY_PHONE },
+       { 0x36, KEY_PC },
+};
+
+struct ir_scancode_table ir_codes_nebula_table = {
+       .scan = ir_codes_nebula,
+       .size = ARRAY_SIZE(ir_codes_nebula),
+};
+EXPORT_SYMBOL_GPL(ir_codes_nebula_table);
+
+/* DigitalNow DNTV Live DVB-T Remote */
+static struct ir_scancode ir_codes_dntv_live_dvb_t[] = {
+       { 0x00, KEY_ESC },              /* 'go up a level?' */
+       /* Keys 0 to 9 */
+       { 0x0a, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0b, KEY_TUNER },            /* tv/fm */
+       { 0x0c, KEY_SEARCH },           /* scan */
+       { 0x0d, KEY_STOP },
+       { 0x0e, KEY_PAUSE },
+       { 0x0f, KEY_LIST },             /* source */
+
+       { 0x10, KEY_MUTE },
+       { 0x11, KEY_REWIND },           /* backward << */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_CAMERA },           /* snap */
+       { 0x14, KEY_AUDIO },            /* stereo */
+       { 0x15, KEY_CLEAR },            /* reset */
+       { 0x16, KEY_PLAY },
+       { 0x17, KEY_ENTER },
+       { 0x18, KEY_ZOOM },             /* full screen */
+       { 0x19, KEY_FASTFORWARD },      /* forward >> */
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1c, KEY_INFO },             /* preview */
+       { 0x1d, KEY_RECORD },           /* record */
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_dntv_live_dvb_t_table = {
+       .scan = ir_codes_dntv_live_dvb_t,
+       .size = ARRAY_SIZE(ir_codes_dntv_live_dvb_t),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* IO-DATA BCTV7E Remote */
+static struct ir_scancode ir_codes_iodata_bctv7e[] = {
+       { 0x40, KEY_TV },
+       { 0x20, KEY_RADIO },            /* FM */
+       { 0x60, KEY_EPG },
+       { 0x00, KEY_POWER },
+
+       /* Keys 0 to 9 */
+       { 0x44, KEY_0 },                /* 10 */
+       { 0x50, KEY_1 },
+       { 0x30, KEY_2 },
+       { 0x70, KEY_3 },
+       { 0x48, KEY_4 },
+       { 0x28, KEY_5 },
+       { 0x68, KEY_6 },
+       { 0x58, KEY_7 },
+       { 0x38, KEY_8 },
+       { 0x78, KEY_9 },
+
+       { 0x10, KEY_L },                /* Live */
+       { 0x08, KEY_TIME },             /* Time Shift */
+
+       { 0x18, KEY_PLAYPAUSE },        /* Play */
+
+       { 0x24, KEY_ENTER },            /* 11 */
+       { 0x64, KEY_ESC },              /* 12 */
+       { 0x04, KEY_M },                /* Multi */
+
+       { 0x54, KEY_VIDEO },
+       { 0x34, KEY_CHANNELUP },
+       { 0x74, KEY_VOLUMEUP },
+       { 0x14, KEY_MUTE },
+
+       { 0x4c, KEY_VCR },              /* SVIDEO */
+       { 0x2c, KEY_CHANNELDOWN },
+       { 0x6c, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_ZOOM },
+
+       { 0x5c, KEY_PAUSE },
+       { 0x3c, KEY_RED },              /* || (red) */
+       { 0x7c, KEY_RECORD },           /* recording */
+       { 0x1c, KEY_STOP },
+
+       { 0x41, KEY_REWIND },           /* backward << */
+       { 0x21, KEY_PLAY },
+       { 0x61, KEY_FASTFORWARD },      /* forward >> */
+       { 0x01, KEY_NEXT },             /* skip >| */
+};
+
+struct ir_scancode_table ir_codes_iodata_bctv7e_table = {
+       .scan = ir_codes_iodata_bctv7e,
+       .size = ARRAY_SIZE(ir_codes_iodata_bctv7e),
+};
+EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* ADS Tech Instant TV DVB-T PCI Remote */
+static struct ir_scancode ir_codes_adstech_dvb_t_pci[] = {
+       /* Keys 0 to 9 */
+       { 0x4d, KEY_0 },
+       { 0x57, KEY_1 },
+       { 0x4f, KEY_2 },
+       { 0x53, KEY_3 },
+       { 0x56, KEY_4 },
+       { 0x4e, KEY_5 },
+       { 0x5e, KEY_6 },
+       { 0x54, KEY_7 },
+       { 0x4c, KEY_8 },
+       { 0x5c, KEY_9 },
+
+       { 0x5b, KEY_POWER },
+       { 0x5f, KEY_MUTE },
+       { 0x55, KEY_GOTO },
+       { 0x5d, KEY_SEARCH },
+       { 0x17, KEY_EPG },              /* Guide */
+       { 0x1f, KEY_MENU },
+       { 0x0f, KEY_UP },
+       { 0x46, KEY_DOWN },
+       { 0x16, KEY_LEFT },
+       { 0x1e, KEY_RIGHT },
+       { 0x0e, KEY_SELECT },           /* Enter */
+       { 0x5a, KEY_INFO },
+       { 0x52, KEY_EXIT },
+       { 0x59, KEY_PREVIOUS },
+       { 0x51, KEY_NEXT },
+       { 0x58, KEY_REWIND },
+       { 0x50, KEY_FORWARD },
+       { 0x44, KEY_PLAYPAUSE },
+       { 0x07, KEY_STOP },
+       { 0x1b, KEY_RECORD },
+       { 0x13, KEY_TUNER },            /* Live */
+       { 0x0a, KEY_A },
+       { 0x12, KEY_B },
+       { 0x03, KEY_PROG1 },            /* 1 */
+       { 0x01, KEY_PROG2 },            /* 2 */
+       { 0x00, KEY_PROG3 },            /* 3 */
+       { 0x06, KEY_DVD },
+       { 0x48, KEY_AUX },              /* Photo */
+       { 0x40, KEY_VIDEO },
+       { 0x19, KEY_AUDIO },            /* Music */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x08, KEY_CHANNELDOWN },
+       { 0x15, KEY_VOLUMEUP },
+       { 0x1c, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_adstech_dvb_t_pci_table = {
+       .scan = ir_codes_adstech_dvb_t_pci,
+       .size = ARRAY_SIZE(ir_codes_adstech_dvb_t_pci),
+};
+EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* MSI TV@nywhere MASTER remote */
+
+static struct ir_scancode ir_codes_msi_tvanywhere[] = {
+       /* Keys 0 to 9 */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0c, KEY_MUTE },
+       { 0x0f, KEY_SCREEN },           /* Full Screen */
+       { 0x10, KEY_FN },               /* Funtion */
+       { 0x11, KEY_TIME },             /* Time shift */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_MEDIA },            /* MTS */
+       { 0x14, KEY_SLOW },
+       { 0x16, KEY_REWIND },           /* backward << */
+       { 0x17, KEY_ENTER },            /* Return */
+       { 0x18, KEY_FASTFORWARD },      /* forward >> */
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_msi_tvanywhere_table = {
+       .scan = ir_codes_msi_tvanywhere,
+       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere),
+};
+EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_table);
+
+/* ---------------------------------------------------------------------- */
+
+/*
+  Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
+  is marked "KS003". The controller is I2C at address 0x30, but does not seem
+  to respond to probes until a read is performed from a valid device.
+  I don't know why...
+
+  Note: This remote may be of similar or identical design to the
+  Pixelview remote (?).  The raw codes and duplicate button codes
+  appear to be the same.
+
+  Henry Wong <henry@stuffedcow.net>
+  Some changes to formatting and keycodes by Mark Schultz <n9xmj@yahoo.com>
+
+*/
+
+static struct ir_scancode ir_codes_msi_tvanywhere_plus[] = {
+
+/*  ---- Remote Button Layout ----
+
+    POWER   SOURCE  SCAN    MUTE
+    TV/FM   1       2       3
+    |>      4       5       6
+    <|      7       8       9
+    ^^UP    0       +       RECALL
+    vvDN    RECORD  STOP    PLAY
+
+       MINIMIZE          ZOOM
+
+                 CH+
+      VOL-                   VOL+
+                 CH-
+
+       SNAPSHOT           MTS
+
+     <<      FUNC    >>     RESET
+*/
+
+       { 0x01, KEY_1 },                /* 1 */
+       { 0x0b, KEY_2 },                /* 2 */
+       { 0x1b, KEY_3 },                /* 3 */
+       { 0x05, KEY_4 },                /* 4 */
+       { 0x09, KEY_5 },                /* 5 */
+       { 0x15, KEY_6 },                /* 6 */
+       { 0x06, KEY_7 },                /* 7 */
+       { 0x0a, KEY_8 },                /* 8 */
+       { 0x12, KEY_9 },                /* 9 */
+       { 0x02, KEY_0 },                /* 0 */
+       { 0x10, KEY_KPPLUS },           /* + */
+       { 0x13, KEY_AGAIN },            /* Recall */
+
+       { 0x1e, KEY_POWER },            /* Power */
+       { 0x07, KEY_TUNER },            /* Source */
+       { 0x1c, KEY_SEARCH },           /* Scan */
+       { 0x18, KEY_MUTE },             /* Mute */
+
+       { 0x03, KEY_RADIO },            /* TV/FM */
+       /* The next four keys are duplicates that appear to send the
+          same IR code as Ch+, Ch-, >>, and << .  The raw code assigned
+          to them is the actual code + 0x20 - they will never be
+          detected as such unless some way is discovered to distinguish
+          these buttons from those that have the same code. */
+       { 0x3f, KEY_RIGHT },            /* |> and Ch+ */
+       { 0x37, KEY_LEFT },             /* <| and Ch- */
+       { 0x2c, KEY_UP },               /* ^^Up and >> */
+       { 0x24, KEY_DOWN },             /* vvDn and << */
+
+       { 0x00, KEY_RECORD },           /* Record */
+       { 0x08, KEY_STOP },             /* Stop */
+       { 0x11, KEY_PLAY },             /* Play */
+
+       { 0x0f, KEY_CLOSE },            /* Minimize */
+       { 0x19, KEY_ZOOM },             /* Zoom */
+       { 0x1a, KEY_CAMERA },           /* Snapshot */
+       { 0x0d, KEY_LANGUAGE },         /* MTS */
+
+       { 0x14, KEY_VOLUMEDOWN },       /* Vol- */
+       { 0x16, KEY_VOLUMEUP },         /* Vol+ */
+       { 0x17, KEY_CHANNELDOWN },      /* Ch- */
+       { 0x1f, KEY_CHANNELUP },        /* Ch+ */
+
+       { 0x04, KEY_REWIND },           /* << */
+       { 0x0e, KEY_MENU },             /* Function */
+       { 0x0c, KEY_FASTFORWARD },      /* >> */
+       { 0x1d, KEY_RESTART },          /* Reset */
+};
+
+struct ir_scancode_table ir_codes_msi_tvanywhere_plus_table = {
+       .scan = ir_codes_msi_tvanywhere_plus,
+       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere_plus),
+};
+EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* Cinergy 1400 DVB-T */
+static struct ir_scancode ir_codes_cinergy_1400[] = {
+       { 0x01, KEY_POWER },
+       { 0x02, KEY_1 },
+       { 0x03, KEY_2 },
+       { 0x04, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x06, KEY_5 },
+       { 0x07, KEY_6 },
+       { 0x08, KEY_7 },
+       { 0x09, KEY_8 },
+       { 0x0a, KEY_9 },
+       { 0x0c, KEY_0 },
+
+       { 0x0b, KEY_VIDEO },
+       { 0x0d, KEY_REFRESH },
+       { 0x0e, KEY_SELECT },
+       { 0x0f, KEY_EPG },
+       { 0x10, KEY_UP },
+       { 0x11, KEY_LEFT },
+       { 0x12, KEY_OK },
+       { 0x13, KEY_RIGHT },
+       { 0x14, KEY_DOWN },
+       { 0x15, KEY_TEXT },
+       { 0x16, KEY_INFO },
+
+       { 0x17, KEY_RED },
+       { 0x18, KEY_GREEN },
+       { 0x19, KEY_YELLOW },
+       { 0x1a, KEY_BLUE },
+
+       { 0x1b, KEY_CHANNELUP },
+       { 0x1c, KEY_VOLUMEUP },
+       { 0x1d, KEY_MUTE },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_CHANNELDOWN },
+
+       { 0x40, KEY_PAUSE },
+       { 0x4c, KEY_PLAY },
+       { 0x58, KEY_RECORD },
+       { 0x54, KEY_PREVIOUS },
+       { 0x48, KEY_STOP },
+       { 0x5c, KEY_NEXT },
+};
+
+struct ir_scancode_table ir_codes_cinergy_1400_table = {
+       .scan = ir_codes_cinergy_1400,
+       .size = ARRAY_SIZE(ir_codes_cinergy_1400),
+};
+EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* AVERTV STUDIO 303 Remote */
+static struct ir_scancode ir_codes_avertv_303[] = {
+       { 0x2a, KEY_1 },
+       { 0x32, KEY_2 },
+       { 0x3a, KEY_3 },
+       { 0x4a, KEY_4 },
+       { 0x52, KEY_5 },
+       { 0x5a, KEY_6 },
+       { 0x6a, KEY_7 },
+       { 0x72, KEY_8 },
+       { 0x7a, KEY_9 },
+       { 0x0e, KEY_0 },
+
+       { 0x02, KEY_POWER },
+       { 0x22, KEY_VIDEO },
+       { 0x42, KEY_AUDIO },
+       { 0x62, KEY_ZOOM },
+       { 0x0a, KEY_TV },
+       { 0x12, KEY_CD },
+       { 0x1a, KEY_TEXT },
+
+       { 0x16, KEY_SUBTITLE },
+       { 0x1e, KEY_REWIND },
+       { 0x06, KEY_PRINT },
+
+       { 0x2e, KEY_SEARCH },
+       { 0x36, KEY_SLEEP },
+       { 0x3e, KEY_SHUFFLE },
+       { 0x26, KEY_MUTE },
+
+       { 0x4e, KEY_RECORD },
+       { 0x56, KEY_PAUSE },
+       { 0x5e, KEY_STOP },
+       { 0x46, KEY_PLAY },
+
+       { 0x6e, KEY_RED },
+       { 0x0b, KEY_GREEN },
+       { 0x66, KEY_YELLOW },
+       { 0x03, KEY_BLUE },
+
+       { 0x76, KEY_LEFT },
+       { 0x7e, KEY_RIGHT },
+       { 0x13, KEY_DOWN },
+       { 0x1b, KEY_UP },
+};
+
+struct ir_scancode_table ir_codes_avertv_303_table = {
+       .scan = ir_codes_avertv_303,
+       .size = ARRAY_SIZE(ir_codes_avertv_303),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avertv_303_table);
+
+/* ---------------------------------------------------------------------- */
+
+/* DigitalNow DNTV Live! DVB-T Pro Remote */
+static struct ir_scancode ir_codes_dntv_live_dvbt_pro[] = {
+       { 0x16, KEY_POWER },
+       { 0x5b, KEY_HOME },
+
+       { 0x55, KEY_TV },               /* live tv */
+       { 0x58, KEY_TUNER },            /* digital Radio */
+       { 0x5a, KEY_RADIO },            /* FM radio */
+       { 0x59, KEY_DVD },              /* dvd menu */
+       { 0x03, KEY_1 },
+       { 0x01, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x1d, KEY_5 },
+       { 0x1f, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x19, KEY_8 },
+       { 0x1b, KEY_9 },
+       { 0x0c, KEY_CANCEL },
+       { 0x15, KEY_0 },
+       { 0x4a, KEY_CLEAR },
+       { 0x13, KEY_BACK },
+       { 0x00, KEY_TAB },
+       { 0x4b, KEY_UP },
+       { 0x4e, KEY_LEFT },
+       { 0x4f, KEY_OK },
+       { 0x52, KEY_RIGHT },
+       { 0x51, KEY_DOWN },
+       { 0x1e, KEY_VOLUMEUP },
+       { 0x0a, KEY_VOLUMEDOWN },
+       { 0x02, KEY_CHANNELDOWN },
+       { 0x05, KEY_CHANNELUP },
+       { 0x11, KEY_RECORD },
+       { 0x14, KEY_PLAY },
+       { 0x4c, KEY_PAUSE },
+       { 0x1a, KEY_STOP },
+       { 0x40, KEY_REWIND },
+       { 0x12, KEY_FASTFORWARD },
+       { 0x41, KEY_PREVIOUSSONG },     /* replay |< */
+       { 0x42, KEY_NEXTSONG },         /* skip >| */
+       { 0x54, KEY_CAMERA },           /* capture */
+       { 0x50, KEY_LANGUAGE },         /* sap */
+       { 0x47, KEY_TV2 },              /* pip */
+       { 0x4d, KEY_SCREEN },
+       { 0x43, KEY_SUBTITLE },
+       { 0x10, KEY_MUTE },
+       { 0x49, KEY_AUDIO },            /* l/r */
+       { 0x07, KEY_SLEEP },
+       { 0x08, KEY_VIDEO },            /* a/v */
+       { 0x0e, KEY_PREVIOUS },         /* recall */
+       { 0x45, KEY_ZOOM },             /* zoom + */
+       { 0x46, KEY_ANGLE },            /* zoom - */
+       { 0x56, KEY_RED },
+       { 0x57, KEY_GREEN },
+       { 0x5c, KEY_YELLOW },
+       { 0x5d, KEY_BLUE },
+};
+
+struct ir_scancode_table ir_codes_dntv_live_dvbt_pro_table = {
+       .scan = ir_codes_dntv_live_dvbt_pro,
+       .size = ARRAY_SIZE(ir_codes_dntv_live_dvbt_pro),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro_table);
+
+static struct ir_scancode ir_codes_em_terratec[] = {
+       { 0x01, KEY_CHANNEL },
+       { 0x02, KEY_SELECT },
+       { 0x03, KEY_MUTE },
+       { 0x04, KEY_POWER },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x08, KEY_CHANNELUP },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0c, KEY_CHANNELDOWN },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_0 },
+       { 0x12, KEY_MENU },
+       { 0x13, KEY_PRINT },
+       { 0x14, KEY_VOLUMEDOWN },
+       { 0x16, KEY_PAUSE },
+       { 0x18, KEY_RECORD },
+       { 0x19, KEY_REWIND },
+       { 0x1a, KEY_PLAY },
+       { 0x1b, KEY_FORWARD },
+       { 0x1c, KEY_BACKSPACE },
+       { 0x1e, KEY_STOP },
+       { 0x40, KEY_ZOOM },
+};
+
+struct ir_scancode_table ir_codes_em_terratec_table = {
+       .scan = ir_codes_em_terratec,
+       .size = ARRAY_SIZE(ir_codes_em_terratec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_em_terratec_table);
+
+static struct ir_scancode ir_codes_pinnacle_grey[] = {
+       { 0x3a, KEY_0 },
+       { 0x31, KEY_1 },
+       { 0x32, KEY_2 },
+       { 0x33, KEY_3 },
+       { 0x34, KEY_4 },
+       { 0x35, KEY_5 },
+       { 0x36, KEY_6 },
+       { 0x37, KEY_7 },
+       { 0x38, KEY_8 },
+       { 0x39, KEY_9 },
+
+       { 0x2f, KEY_POWER },
+
+       { 0x2e, KEY_P },
+       { 0x1f, KEY_L },
+       { 0x2b, KEY_I },
+
+       { 0x2d, KEY_SCREEN },
+       { 0x1e, KEY_ZOOM },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x0f, KEY_VOLUMEDOWN },
+       { 0x17, KEY_CHANNELUP },
+       { 0x1c, KEY_CHANNELDOWN },
+       { 0x25, KEY_INFO },
+
+       { 0x3c, KEY_MUTE },
+
+       { 0x3d, KEY_LEFT },
+       { 0x3b, KEY_RIGHT },
+
+       { 0x3f, KEY_UP },
+       { 0x3e, KEY_DOWN },
+       { 0x1a, KEY_ENTER },
+
+       { 0x1d, KEY_MENU },
+       { 0x19, KEY_AGAIN },
+       { 0x16, KEY_PREVIOUSSONG },
+       { 0x13, KEY_NEXTSONG },
+       { 0x15, KEY_PAUSE },
+       { 0x0e, KEY_REWIND },
+       { 0x0d, KEY_PLAY },
+       { 0x0b, KEY_STOP },
+       { 0x07, KEY_FORWARD },
+       { 0x27, KEY_RECORD },
+       { 0x26, KEY_TUNER },
+       { 0x29, KEY_TEXT },
+       { 0x2a, KEY_MEDIA },
+       { 0x18, KEY_EPG },
+};
+
+struct ir_scancode_table ir_codes_pinnacle_grey_table = {
+       .scan = ir_codes_pinnacle_grey,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_grey),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_grey_table);
+
+static struct ir_scancode ir_codes_flyvideo[] = {
+       { 0x0f, KEY_0 },
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x08, KEY_5 },
+       { 0x09, KEY_6 },
+       { 0x0b, KEY_7 },
+       { 0x0c, KEY_8 },
+       { 0x0d, KEY_9 },
+
+       { 0x0e, KEY_MODE },     /* Air/Cable */
+       { 0x11, KEY_VIDEO },    /* Video */
+       { 0x15, KEY_AUDIO },    /* Audio */
+       { 0x00, KEY_POWER },    /* Power */
+       { 0x18, KEY_TUNER },    /* AV Source */
+       { 0x02, KEY_ZOOM },     /* Fullscreen */
+       { 0x1a, KEY_LANGUAGE }, /* Stereo */
+       { 0x1b, KEY_MUTE },     /* Mute */
+       { 0x14, KEY_VOLUMEUP }, /* Volume + */
+       { 0x17, KEY_VOLUMEDOWN },/* Volume - */
+       { 0x12, KEY_CHANNELUP },/* Channel + */
+       { 0x13, KEY_CHANNELDOWN },/* Channel - */
+       { 0x06, KEY_AGAIN },    /* Recall */
+       { 0x10, KEY_ENTER },    /* Enter */
+
+       { 0x19, KEY_BACK },     /* Rewind  ( <<< ) */
+       { 0x1f, KEY_FORWARD },  /* Forward ( >>> ) */
+       { 0x0a, KEY_ANGLE },    /* no label, may be used as the PAUSE button */
+};
+
+struct ir_scancode_table ir_codes_flyvideo_table = {
+       .scan = ir_codes_flyvideo,
+       .size = ARRAY_SIZE(ir_codes_flyvideo),
+};
+EXPORT_SYMBOL_GPL(ir_codes_flyvideo_table);
+
+static struct ir_scancode ir_codes_flydvb[] = {
+       { 0x01, KEY_ZOOM },             /* Full Screen */
+       { 0x00, KEY_POWER },            /* Power */
+
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x08, KEY_5 },
+       { 0x09, KEY_6 },
+       { 0x0b, KEY_7 },
+       { 0x0c, KEY_8 },
+       { 0x0d, KEY_9 },
+       { 0x06, KEY_AGAIN },            /* Recall */
+       { 0x0f, KEY_0 },
+       { 0x10, KEY_MUTE },             /* Mute */
+       { 0x02, KEY_RADIO },            /* TV/Radio */
+       { 0x1b, KEY_LANGUAGE },         /* SAP (Second Audio Program) */
+
+       { 0x14, KEY_VOLUMEUP },         /* VOL+ */
+       { 0x17, KEY_VOLUMEDOWN },       /* VOL- */
+       { 0x12, KEY_CHANNELUP },        /* CH+ */
+       { 0x13, KEY_CHANNELDOWN },      /* CH- */
+       { 0x1d, KEY_ENTER },            /* Enter */
+
+       { 0x1a, KEY_MODE },             /* PIP */
+       { 0x18, KEY_TUNER },            /* Source */
+
+       { 0x1e, KEY_RECORD },           /* Record/Pause */
+       { 0x15, KEY_ANGLE },            /* Swap (no label on key) */
+       { 0x1c, KEY_PAUSE },            /* Timeshift/Pause */
+       { 0x19, KEY_BACK },             /* Rewind << */
+       { 0x0a, KEY_PLAYPAUSE },        /* Play/Pause */
+       { 0x1f, KEY_FORWARD },          /* Forward >> */
+       { 0x16, KEY_PREVIOUS },         /* Back |<< */
+       { 0x11, KEY_STOP },             /* Stop */
+       { 0x0e, KEY_NEXT },             /* End >>| */
+};
+
+struct ir_scancode_table ir_codes_flydvb_table = {
+       .scan = ir_codes_flydvb,
+       .size = ARRAY_SIZE(ir_codes_flydvb),
+};
+EXPORT_SYMBOL_GPL(ir_codes_flydvb_table);
+
+static struct ir_scancode ir_codes_cinergy[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_POWER },
+       { 0x0b, KEY_PROG1 },            /* app */
+       { 0x0c, KEY_ZOOM },             /* zoom/fullscreen */
+       { 0x0d, KEY_CHANNELUP },        /* channel */
+       { 0x0e, KEY_CHANNELDOWN },      /* channel- */
+       { 0x0f, KEY_VOLUMEUP },
+       { 0x10, KEY_VOLUMEDOWN },
+       { 0x11, KEY_TUNER },            /* AV */
+       { 0x12, KEY_NUMLOCK },          /* -/-- */
+       { 0x13, KEY_AUDIO },            /* audio */
+       { 0x14, KEY_MUTE },
+       { 0x15, KEY_UP },
+       { 0x16, KEY_DOWN },
+       { 0x17, KEY_LEFT },
+       { 0x18, KEY_RIGHT },
+       { 0x19, BTN_LEFT, },
+       { 0x1a, BTN_RIGHT, },
+       { 0x1b, KEY_WWW },              /* text */
+       { 0x1c, KEY_REWIND },
+       { 0x1d, KEY_FORWARD },
+       { 0x1e, KEY_RECORD },
+       { 0x1f, KEY_PLAY },
+       { 0x20, KEY_PREVIOUSSONG },
+       { 0x21, KEY_NEXTSONG },
+       { 0x22, KEY_PAUSE },
+       { 0x23, KEY_STOP },
+};
+
+struct ir_scancode_table ir_codes_cinergy_table = {
+       .scan = ir_codes_cinergy,
+       .size = ARRAY_SIZE(ir_codes_cinergy),
+};
+EXPORT_SYMBOL_GPL(ir_codes_cinergy_table);
+
+/* Alfons Geser <a.geser@cox.net>
+ * updates from Job D. R. Borges <jobdrb@ig.com.br> */
+static struct ir_scancode ir_codes_eztv[] = {
+       { 0x12, KEY_POWER },
+       { 0x01, KEY_TV },       /* DVR */
+       { 0x15, KEY_DVD },      /* DVD */
+       { 0x17, KEY_AUDIO },    /* music */
+                               /* DVR mode / DVD mode / music mode */
+
+       { 0x1b, KEY_MUTE },     /* mute */
+       { 0x02, KEY_LANGUAGE }, /* MTS/SAP / audio / autoseek */
+       { 0x1e, KEY_SUBTITLE }, /* closed captioning / subtitle / seek */
+       { 0x16, KEY_ZOOM },     /* full screen */
+       { 0x1c, KEY_VIDEO },    /* video source / eject / delall */
+       { 0x1d, KEY_RESTART },  /* playback / angle / del */
+       { 0x2f, KEY_SEARCH },   /* scan / menu / playlist */
+       { 0x30, KEY_CHANNEL },  /* CH surfing / bookmark / memo */
+
+       { 0x31, KEY_HELP },     /* help */
+       { 0x32, KEY_MODE },     /* num/memo */
+       { 0x33, KEY_ESC },      /* cancel */
+
+       { 0x0c, KEY_UP },       /* up */
+       { 0x10, KEY_DOWN },     /* down */
+       { 0x08, KEY_LEFT },     /* left */
+       { 0x04, KEY_RIGHT },    /* right */
+       { 0x03, KEY_SELECT },   /* select */
+
+       { 0x1f, KEY_REWIND },   /* rewind */
+       { 0x20, KEY_PLAYPAUSE },/* play/pause */
+       { 0x29, KEY_FORWARD },  /* forward */
+       { 0x14, KEY_AGAIN },    /* repeat */
+       { 0x2b, KEY_RECORD },   /* recording */
+       { 0x2c, KEY_STOP },     /* stop */
+       { 0x2d, KEY_PLAY },     /* play */
+       { 0x2e, KEY_CAMERA },   /* snapshot / shuffle */
+
+       { 0x00, KEY_0 },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+
+       { 0x2a, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x18, KEY_CHANNELUP },/* CH.tracking up */
+       { 0x19, KEY_CHANNELDOWN },/* CH.tracking down */
+
+       { 0x13, KEY_ENTER },    /* enter */
+       { 0x21, KEY_DOT },      /* . (decimal dot) */
+};
+
+struct ir_scancode_table ir_codes_eztv_table = {
+       .scan = ir_codes_eztv,
+       .size = ARRAY_SIZE(ir_codes_eztv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_eztv_table);
+
+/* Alex Hermann <gaaf@gmx.net> */
+static struct ir_scancode ir_codes_avermedia[] = {
+       { 0x28, KEY_1 },
+       { 0x18, KEY_2 },
+       { 0x38, KEY_3 },
+       { 0x24, KEY_4 },
+       { 0x14, KEY_5 },
+       { 0x34, KEY_6 },
+       { 0x2c, KEY_7 },
+       { 0x1c, KEY_8 },
+       { 0x3c, KEY_9 },
+       { 0x22, KEY_0 },
+
+       { 0x20, KEY_TV },               /* TV/FM */
+       { 0x10, KEY_CD },               /* CD */
+       { 0x30, KEY_TEXT },             /* TELETEXT */
+       { 0x00, KEY_POWER },            /* POWER */
+
+       { 0x08, KEY_VIDEO },            /* VIDEO */
+       { 0x04, KEY_AUDIO },            /* AUDIO */
+       { 0x0c, KEY_ZOOM },             /* FULL SCREEN */
+
+       { 0x12, KEY_SUBTITLE },         /* DISPLAY */
+       { 0x32, KEY_REWIND },           /* LOOP */
+       { 0x02, KEY_PRINT },            /* PREVIEW */
+
+       { 0x2a, KEY_SEARCH },           /* AUTOSCAN */
+       { 0x1a, KEY_SLEEP },            /* FREEZE */
+       { 0x3a, KEY_CAMERA },           /* SNAPSHOT */
+       { 0x0a, KEY_MUTE },             /* MUTE */
+
+       { 0x26, KEY_RECORD },           /* RECORD */
+       { 0x16, KEY_PAUSE },            /* PAUSE */
+       { 0x36, KEY_STOP },             /* STOP */
+       { 0x06, KEY_PLAY },             /* PLAY */
+
+       { 0x2e, KEY_RED },              /* RED */
+       { 0x21, KEY_GREEN },            /* GREEN */
+       { 0x0e, KEY_YELLOW },           /* YELLOW */
+       { 0x01, KEY_BLUE },             /* BLUE */
+
+       { 0x1e, KEY_VOLUMEDOWN },       /* VOLUME- */
+       { 0x3e, KEY_VOLUMEUP },         /* VOLUME+ */
+       { 0x11, KEY_CHANNELDOWN },      /* CHANNEL/PAGE- */
+       { 0x31, KEY_CHANNELUP }         /* CHANNEL/PAGE+ */
+};
+
+struct ir_scancode_table ir_codes_avermedia_table = {
+       .scan = ir_codes_avermedia,
+       .size = ARRAY_SIZE(ir_codes_avermedia),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_table);
+
+static struct ir_scancode ir_codes_videomate_tv_pvr[] = {
+       { 0x14, KEY_MUTE },
+       { 0x24, KEY_ZOOM },
+
+       { 0x01, KEY_DVD },
+       { 0x23, KEY_RADIO },
+       { 0x00, KEY_TV },
+
+       { 0x0a, KEY_REWIND },
+       { 0x08, KEY_PLAYPAUSE },
+       { 0x0f, KEY_FORWARD },
+
+       { 0x02, KEY_PREVIOUS },
+       { 0x07, KEY_STOP },
+       { 0x06, KEY_NEXT },
+
+       { 0x0c, KEY_UP },
+       { 0x0e, KEY_DOWN },
+       { 0x0b, KEY_LEFT },
+       { 0x0d, KEY_RIGHT },
+       { 0x11, KEY_OK },
+
+       { 0x03, KEY_MENU },
+       { 0x09, KEY_SETUP },
+       { 0x05, KEY_VIDEO },
+       { 0x22, KEY_CHANNEL },
+
+       { 0x12, KEY_VOLUMEUP },
+       { 0x15, KEY_VOLUMEDOWN },
+       { 0x10, KEY_CHANNELUP },
+       { 0x13, KEY_CHANNELDOWN },
+
+       { 0x04, KEY_RECORD },
+
+       { 0x16, KEY_1 },
+       { 0x17, KEY_2 },
+       { 0x18, KEY_3 },
+       { 0x19, KEY_4 },
+       { 0x1a, KEY_5 },
+       { 0x1b, KEY_6 },
+       { 0x1c, KEY_7 },
+       { 0x1d, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x1f, KEY_0 },
+
+       { 0x20, KEY_LANGUAGE },
+       { 0x21, KEY_SLEEP },
+};
+
+struct ir_scancode_table ir_codes_videomate_tv_pvr_table = {
+       .scan = ir_codes_videomate_tv_pvr,
+       .size = ARRAY_SIZE(ir_codes_videomate_tv_pvr),
+};
+EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr_table);
+
+/* Michael Tokarev <mjt@tls.msk.ru>
+   http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
+   keytable is used by MANLI MTV00[0x0c] and BeholdTV 40[13] at
+   least, and probably other cards too.
+   The "ascii-art picture" below (in comments, first row
+   is the keycode in hex, and subsequent row(s) shows
+   the button labels (several variants when appropriate)
+   helps to descide which keycodes to assign to the buttons.
+ */
+static struct ir_scancode ir_codes_manli[] = {
+
+       /*  0x1c            0x12  *
+        * FUNCTION         POWER *
+        *   FM              (|)  *
+        *                        */
+       { 0x1c, KEY_RADIO },    /*XXX*/
+       { 0x12, KEY_POWER },
+
+       /*  0x01    0x02    0x03  *
+        *   1       2       3    *
+        *                        *
+        *  0x04    0x05    0x06  *
+        *   4       5       6    *
+        *                        *
+        *  0x07    0x08    0x09  *
+        *   7       8       9    *
+        *                        */
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       /*  0x0a    0x00    0x17  *
+        * RECALL    0      +100  *
+        *                  PLUS  *
+        *                        */
+       { 0x0a, KEY_AGAIN },    /*XXX KEY_REWIND? */
+       { 0x00, KEY_0 },
+       { 0x17, KEY_DIGITS },   /*XXX*/
+
+       /*  0x14            0x10  *
+        *  MENU            INFO  *
+        *  OSD                   */
+       { 0x14, KEY_MENU },
+       { 0x10, KEY_INFO },
+
+       /*          0x0b          *
+        *           Up           *
+        *                        *
+        *  0x18    0x16    0x0c  *
+        *  Left     Ok     Right *
+        *                        *
+        *         0x015          *
+        *         Down           *
+        *                        */
+       { 0x0b, KEY_UP },
+       { 0x18, KEY_LEFT },
+       { 0x16, KEY_OK },       /*XXX KEY_SELECT? KEY_ENTER? */
+       { 0x0c, KEY_RIGHT },
+       { 0x15, KEY_DOWN },
+
+       /*  0x11            0x0d  *
+        *  TV/AV           MODE  *
+        *  SOURCE         STEREO *
+        *                        */
+       { 0x11, KEY_TV },       /*XXX*/
+       { 0x0d, KEY_MODE },     /*XXX there's no KEY_STEREO     */
+
+       /*  0x0f    0x1b    0x1a  *
+        *  AUDIO   Vol+    Chan+ *
+        *        TIMESHIFT???    *
+        *                        *
+        *  0x0e    0x1f    0x1e  *
+        *  SLEEP   Vol-    Chan- *
+        *                        */
+       { 0x0f, KEY_AUDIO },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1a, KEY_CHANNELUP },
+       { 0x0e, KEY_TIME },
+       { 0x1f, KEY_VOLUMEDOWN },
+       { 0x1e, KEY_CHANNELDOWN },
+
+       /*         0x13     0x19  *
+        *         MUTE   SNAPSHOT*
+        *                        */
+       { 0x13, KEY_MUTE },
+       { 0x19, KEY_CAMERA },
+
+       /* 0x1d unused ? */
+};
+
+struct ir_scancode_table ir_codes_manli_table = {
+       .scan = ir_codes_manli,
+       .size = ARRAY_SIZE(ir_codes_manli),
+};
+EXPORT_SYMBOL_GPL(ir_codes_manli_table);
+
+/* Mike Baikov <mike@baikov.com> */
+static struct ir_scancode ir_codes_gotview7135[] = {
+
+       { 0x11, KEY_POWER },
+       { 0x35, KEY_TV },
+       { 0x1b, KEY_0 },
+       { 0x29, KEY_1 },
+       { 0x19, KEY_2 },
+       { 0x39, KEY_3 },
+       { 0x1f, KEY_4 },
+       { 0x2c, KEY_5 },
+       { 0x21, KEY_6 },
+       { 0x24, KEY_7 },
+       { 0x18, KEY_8 },
+       { 0x2b, KEY_9 },
+       { 0x3b, KEY_AGAIN },    /* LOOP */
+       { 0x06, KEY_AUDIO },
+       { 0x31, KEY_PRINT },    /* PREVIEW */
+       { 0x3e, KEY_VIDEO },
+       { 0x10, KEY_CHANNELUP },
+       { 0x20, KEY_CHANNELDOWN },
+       { 0x0c, KEY_VOLUMEDOWN },
+       { 0x28, KEY_VOLUMEUP },
+       { 0x08, KEY_MUTE },
+       { 0x26, KEY_SEARCH },   /* SCAN */
+       { 0x3f, KEY_CAMERA },   /* SNAPSHOT */
+       { 0x12, KEY_RECORD },
+       { 0x32, KEY_STOP },
+       { 0x3c, KEY_PLAY },
+       { 0x1d, KEY_REWIND },
+       { 0x2d, KEY_PAUSE },
+       { 0x0d, KEY_FORWARD },
+       { 0x05, KEY_ZOOM },     /*FULL*/
+
+       { 0x2a, KEY_F21 },      /* LIVE TIMESHIFT */
+       { 0x0e, KEY_F22 },      /* MIN TIMESHIFT */
+       { 0x1e, KEY_TIME },     /* TIMESHIFT */
+       { 0x38, KEY_F24 },      /* NORMAL TIMESHIFT */
+};
+
+struct ir_scancode_table ir_codes_gotview7135_table = {
+       .scan = ir_codes_gotview7135,
+       .size = ARRAY_SIZE(ir_codes_gotview7135),
+};
+EXPORT_SYMBOL_GPL(ir_codes_gotview7135_table);
+
+static struct ir_scancode ir_codes_purpletv[] = {
+       { 0x03, KEY_POWER },
+       { 0x6f, KEY_MUTE },
+       { 0x10, KEY_BACKSPACE },        /* Recall */
+
+       { 0x11, KEY_0 },
+       { 0x04, KEY_1 },
+       { 0x05, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x08, KEY_4 },
+       { 0x09, KEY_5 },
+       { 0x0a, KEY_6 },
+       { 0x0c, KEY_7 },
+       { 0x0d, KEY_8 },
+       { 0x0e, KEY_9 },
+       { 0x12, KEY_DOT },      /* 100+ */
+
+       { 0x07, KEY_VOLUMEUP },
+       { 0x0b, KEY_VOLUMEDOWN },
+       { 0x1a, KEY_KPPLUS },
+       { 0x18, KEY_KPMINUS },
+       { 0x15, KEY_UP },
+       { 0x1d, KEY_DOWN },
+       { 0x0f, KEY_CHANNELUP },
+       { 0x13, KEY_CHANNELDOWN },
+       { 0x48, KEY_ZOOM },
+
+       { 0x1b, KEY_VIDEO },    /* Video source */
+       { 0x1f, KEY_CAMERA },   /* Snapshot */
+       { 0x49, KEY_LANGUAGE }, /* MTS Select */
+       { 0x19, KEY_SEARCH },   /* Auto Scan */
+
+       { 0x4b, KEY_RECORD },
+       { 0x46, KEY_PLAY },
+       { 0x45, KEY_PAUSE },    /* Pause */
+       { 0x44, KEY_STOP },
+       { 0x43, KEY_TIME },     /* Time Shift */
+       { 0x17, KEY_CHANNEL },  /* SURF CH */
+       { 0x40, KEY_FORWARD },  /* Forward ? */
+       { 0x42, KEY_REWIND },   /* Backward ? */
+
+};
+
+struct ir_scancode_table ir_codes_purpletv_table = {
+       .scan = ir_codes_purpletv,
+       .size = ARRAY_SIZE(ir_codes_purpletv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_purpletv_table);
+
+/* Mapping for the 28 key remote control as seen at
+   http://www.sednacomputer.com/photo/cardbus-tv.jpg
+   Pavel Mihaylov <bin@bash.info>
+   Also for the remote bundled with Kozumi KTV-01C card */
+static struct ir_scancode ir_codes_pctv_sedna[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_AGAIN },    /* Recall */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x0c, KEY_VOLUMEUP },
+       { 0x0d, KEY_MODE },     /* Stereo */
+       { 0x0e, KEY_STOP },
+       { 0x0f, KEY_PREVIOUSSONG },
+       { 0x10, KEY_ZOOM },
+       { 0x11, KEY_TUNER },    /* Source */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_MUTE },
+       { 0x15, KEY_CHANNELDOWN },
+       { 0x18, KEY_VOLUMEDOWN },
+       { 0x19, KEY_CAMERA },   /* Snapshot */
+       { 0x1a, KEY_NEXTSONG },
+       { 0x1b, KEY_TIME },     /* Time Shift */
+       { 0x1c, KEY_RADIO },    /* FM Radio */
+       { 0x1d, KEY_RECORD },
+       { 0x1e, KEY_PAUSE },
+       /* additional codes for Kozumi's remote */
+       { 0x14, KEY_INFO },     /* OSD */
+       { 0x16, KEY_OK },       /* OK */
+       { 0x17, KEY_DIGITS },   /* Plus */
+       { 0x1f, KEY_PLAY },     /* Play */
+};
+
+struct ir_scancode_table ir_codes_pctv_sedna_table = {
+       .scan = ir_codes_pctv_sedna,
+       .size = ARRAY_SIZE(ir_codes_pctv_sedna),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna_table);
+
+/* Mark Phalan <phalanm@o2.ie> */
+static struct ir_scancode ir_codes_pv951[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x12, KEY_POWER },
+       { 0x10, KEY_MUTE },
+       { 0x1f, KEY_VOLUMEDOWN },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x0e, KEY_PAGEUP },
+       { 0x1d, KEY_PAGEDOWN },
+       { 0x13, KEY_SOUND },
+
+       { 0x18, KEY_KPPLUSMINUS },      /* CH +/- */
+       { 0x16, KEY_SUBTITLE },         /* CC */
+       { 0x0d, KEY_TEXT },             /* TTX */
+       { 0x0b, KEY_TV },               /* AIR/CBL */
+       { 0x11, KEY_PC },               /* PC/TV */
+       { 0x17, KEY_OK },               /* CH RTN */
+       { 0x19, KEY_MODE },             /* FUNC */
+       { 0x0c, KEY_SEARCH },           /* AUTOSCAN */
+
+       /* Not sure what to do with these ones! */
+       { 0x0f, KEY_SELECT },           /* SOURCE */
+       { 0x0a, KEY_KPPLUS },           /* +100 */
+       { 0x14, KEY_EQUAL },            /* SYNC */
+       { 0x1c, KEY_MEDIA },            /* PC/TV */
+};
+
+struct ir_scancode_table ir_codes_pv951_table = {
+       .scan = ir_codes_pv951,
+       .size = ARRAY_SIZE(ir_codes_pv951),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pv951_table);
+
+/* generic RC5 keytable                                          */
+/* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
+/* used by old (black) Hauppauge remotes                         */
+static struct ir_scancode ir_codes_rc5_tv[] = {
+       /* Keys 0 to 9 */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0b, KEY_CHANNEL },          /* channel / program (japan: 11) */
+       { 0x0c, KEY_POWER },            /* standby */
+       { 0x0d, KEY_MUTE },             /* mute / demute */
+       { 0x0f, KEY_TV },               /* display */
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x12, KEY_BRIGHTNESSUP },
+       { 0x13, KEY_BRIGHTNESSDOWN },
+       { 0x1e, KEY_SEARCH },           /* search + */
+       { 0x20, KEY_CHANNELUP },        /* channel / program + */
+       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x22, KEY_CHANNEL },          /* alt / channel */
+       { 0x23, KEY_LANGUAGE },         /* 1st / 2nd language */
+       { 0x26, KEY_SLEEP },            /* sleeptimer */
+       { 0x2e, KEY_MENU },             /* 2nd controls (USA: menu) */
+       { 0x30, KEY_PAUSE },
+       { 0x32, KEY_REWIND },
+       { 0x33, KEY_GOTO },
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },           /* recording */
+       { 0x3c, KEY_TEXT },             /* teletext submode (Japan: 12) */
+       { 0x3d, KEY_SUSPEND },          /* system standby */
+
+};
+
+struct ir_scancode_table ir_codes_rc5_tv_table = {
+       .scan = ir_codes_rc5_tv,
+       .size = ARRAY_SIZE(ir_codes_rc5_tv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_rc5_tv_table);
+
+/* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
+static struct ir_scancode ir_codes_winfast[] = {
+       /* Keys 0 to 9 */
+       { 0x12, KEY_0 },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+
+       { 0x00, KEY_POWER },
+       { 0x1b, KEY_AUDIO },            /* Audio Source */
+       { 0x02, KEY_TUNER },            /* TV/FM, not on Y0400052 */
+       { 0x1e, KEY_VIDEO },            /* Video Source */
+       { 0x16, KEY_INFO },             /* Display information */
+       { 0x04, KEY_VOLUMEUP },
+       { 0x08, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_CHANNELUP },
+       { 0x10, KEY_CHANNELDOWN },
+       { 0x03, KEY_ZOOM },             /* fullscreen */
+       { 0x1f, KEY_TEXT },             /* closed caption/teletext */
+       { 0x20, KEY_SLEEP },
+       { 0x29, KEY_CLEAR },            /* boss key */
+       { 0x14, KEY_MUTE },
+       { 0x2b, KEY_RED },
+       { 0x2c, KEY_GREEN },
+       { 0x2d, KEY_YELLOW },
+       { 0x2e, KEY_BLUE },
+       { 0x18, KEY_KPPLUS },           /* fine tune + , not on Y040052 */
+       { 0x19, KEY_KPMINUS },          /* fine tune - , not on Y040052 */
+       { 0x2a, KEY_MEDIA },            /* PIP (Picture in picture */
+       { 0x21, KEY_DOT },
+       { 0x13, KEY_ENTER },
+       { 0x11, KEY_LAST },             /* Recall (last channel */
+       { 0x22, KEY_PREVIOUS },
+       { 0x23, KEY_PLAYPAUSE },
+       { 0x24, KEY_NEXT },
+       { 0x25, KEY_TIME },             /* Time Shifting */
+       { 0x26, KEY_STOP },
+       { 0x27, KEY_RECORD },
+       { 0x28, KEY_SAVE },             /* Screenshot */
+       { 0x2f, KEY_MENU },
+       { 0x30, KEY_CANCEL },
+       { 0x31, KEY_CHANNEL },          /* Channel Surf */
+       { 0x32, KEY_SUBTITLE },
+       { 0x33, KEY_LANGUAGE },
+       { 0x34, KEY_REWIND },
+       { 0x35, KEY_FASTFORWARD },
+       { 0x36, KEY_TV },
+       { 0x37, KEY_RADIO },            /* FM */
+       { 0x38, KEY_DVD },
+
+       { 0x1a, KEY_MODE},              /* change to MCE mode on Y04G0051 */
+       { 0x3e, KEY_F21 },              /* MCE +VOL, on Y04G0033 */
+       { 0x3a, KEY_F22 },              /* MCE -VOL, on Y04G0033 */
+       { 0x3b, KEY_F23 },              /* MCE +CH,  on Y04G0033 */
+       { 0x3f, KEY_F24 }               /* MCE -CH,  on Y04G0033 */
+};
+
+struct ir_scancode_table ir_codes_winfast_table = {
+       .scan = ir_codes_winfast,
+       .size = ARRAY_SIZE(ir_codes_winfast),
+};
+EXPORT_SYMBOL_GPL(ir_codes_winfast_table);
+
+static struct ir_scancode ir_codes_pinnacle_color[] = {
+       { 0x59, KEY_MUTE },
+       { 0x4a, KEY_POWER },
+
+       { 0x18, KEY_TEXT },
+       { 0x26, KEY_TV },
+       { 0x3d, KEY_PRINT },
+
+       { 0x48, KEY_RED },
+       { 0x04, KEY_GREEN },
+       { 0x11, KEY_YELLOW },
+       { 0x00, KEY_BLUE },
+
+       { 0x2d, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+
+       { 0x49, KEY_MENU },
+
+       { 0x16, KEY_CHANNELUP },
+       { 0x17, KEY_CHANNELDOWN },
+
+       { 0x20, KEY_UP },
+       { 0x21, KEY_DOWN },
+       { 0x22, KEY_LEFT },
+       { 0x23, KEY_RIGHT },
+       { 0x0d, KEY_SELECT },
+
+       { 0x08, KEY_BACK },
+       { 0x07, KEY_REFRESH },
+
+       { 0x2f, KEY_ZOOM },
+       { 0x29, KEY_RECORD },
+
+       { 0x4b, KEY_PAUSE },
+       { 0x4d, KEY_REWIND },
+       { 0x2e, KEY_PLAY },
+       { 0x4e, KEY_FORWARD },
+       { 0x53, KEY_PREVIOUS },
+       { 0x4c, KEY_STOP },
+       { 0x54, KEY_NEXT },
+
+       { 0x69, KEY_0 },
+       { 0x6a, KEY_1 },
+       { 0x6b, KEY_2 },
+       { 0x6c, KEY_3 },
+       { 0x6d, KEY_4 },
+       { 0x6e, KEY_5 },
+       { 0x6f, KEY_6 },
+       { 0x70, KEY_7 },
+       { 0x71, KEY_8 },
+       { 0x72, KEY_9 },
+
+       { 0x74, KEY_CHANNEL },
+       { 0x0a, KEY_BACKSPACE },
+};
+
+struct ir_scancode_table ir_codes_pinnacle_color_table = {
+       .scan = ir_codes_pinnacle_color,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_color),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_color_table);
+
+/* Hauppauge: the newer, gray remotes (seems there are multiple
+ * slightly different versions), shipped with cx88+ivtv cards.
+ * almost rc5 coding, but some non-standard keys */
+static struct ir_scancode ir_codes_hauppauge_new[] = {
+       /* Keys 0 to 9 */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_TEXT },             /* keypad asterisk as well */
+       { 0x0b, KEY_RED },              /* red button */
+       { 0x0c, KEY_RADIO },
+       { 0x0d, KEY_MENU },
+       { 0x0e, KEY_SUBTITLE },         /* also the # key */
+       { 0x0f, KEY_MUTE },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x12, KEY_PREVIOUS },         /* previous channel */
+       { 0x14, KEY_UP },
+       { 0x15, KEY_DOWN },
+       { 0x16, KEY_LEFT },
+       { 0x17, KEY_RIGHT },
+       { 0x18, KEY_VIDEO },            /* Videos */
+       { 0x19, KEY_AUDIO },            /* Music */
+       /* 0x1a: Pictures - presume this means
+          "Multimedia Home Platform" -
+          no "PICTURES" key in input.h
+        */
+       { 0x1a, KEY_MHP },
+
+       { 0x1b, KEY_EPG },              /* Guide */
+       { 0x1c, KEY_TV },
+       { 0x1e, KEY_NEXTSONG },         /* skip >| */
+       { 0x1f, KEY_EXIT },             /* back/exit */
+       { 0x20, KEY_CHANNELUP },        /* channel / program + */
+       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x22, KEY_CHANNEL },          /* source (old black remote) */
+       { 0x24, KEY_PREVIOUSSONG },     /* replay |< */
+       { 0x25, KEY_ENTER },            /* OK */
+       { 0x26, KEY_SLEEP },            /* minimize (old black remote) */
+       { 0x29, KEY_BLUE },             /* blue key */
+       { 0x2e, KEY_GREEN },            /* green button */
+       { 0x30, KEY_PAUSE },            /* pause */
+       { 0x32, KEY_REWIND },           /* backward << */
+       { 0x34, KEY_FASTFORWARD },      /* forward >> */
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },           /* recording */
+       { 0x38, KEY_YELLOW },           /* yellow key */
+       { 0x3b, KEY_SELECT },           /* top right button */
+       { 0x3c, KEY_ZOOM },             /* full */
+       { 0x3d, KEY_POWER },            /* system power (green button) */
+};
+
+struct ir_scancode_table ir_codes_hauppauge_new_table = {
+       .scan = ir_codes_hauppauge_new,
+       .size = ARRAY_SIZE(ir_codes_hauppauge_new),
+};
+EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new_table);
+
+static struct ir_scancode ir_codes_npgtech[] = {
+       { 0x1d, KEY_SWITCHVIDEOMODE },  /* switch inputs */
+       { 0x2a, KEY_FRONT },
+
+       { 0x3e, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x0a, KEY_4 },
+       { 0x0e, KEY_5 },
+       { 0x12, KEY_6 },
+       { 0x16, KEY_7 },
+       { 0x1a, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x3a, KEY_0 },
+       { 0x22, KEY_NUMLOCK },          /* -/-- */
+       { 0x20, KEY_REFRESH },
+
+       { 0x03, KEY_BRIGHTNESSDOWN },
+       { 0x28, KEY_AUDIO },
+       { 0x3c, KEY_CHANNELUP },
+       { 0x3f, KEY_VOLUMEDOWN },
+       { 0x2e, KEY_MUTE },
+       { 0x3b, KEY_VOLUMEUP },
+       { 0x00, KEY_CHANNELDOWN },
+       { 0x07, KEY_BRIGHTNESSUP },
+       { 0x2c, KEY_TEXT },
+
+       { 0x37, KEY_RECORD },
+       { 0x17, KEY_PLAY },
+       { 0x13, KEY_PAUSE },
+       { 0x26, KEY_STOP },
+       { 0x18, KEY_FASTFORWARD },
+       { 0x14, KEY_REWIND },
+       { 0x33, KEY_ZOOM },
+       { 0x32, KEY_KEYBOARD },
+       { 0x30, KEY_GOTO },             /* Pointing arrow */
+       { 0x36, KEY_MACRO },            /* Maximize/Minimize (yellow) */
+       { 0x0b, KEY_RADIO },
+       { 0x10, KEY_POWER },
+
+};
+
+struct ir_scancode_table ir_codes_npgtech_table = {
+       .scan = ir_codes_npgtech,
+       .size = ARRAY_SIZE(ir_codes_npgtech),
+};
+EXPORT_SYMBOL_GPL(ir_codes_npgtech_table);
+
+/* Norwood Micro (non-Pro) TV Tuner
+   By Peter Naulls <peter@chocky.org>
+   Key comments are the functions given in the manual */
+static struct ir_scancode ir_codes_norwood[] = {
+       /* Keys 0 to 9 */
+       { 0x20, KEY_0 },
+       { 0x21, KEY_1 },
+       { 0x22, KEY_2 },
+       { 0x23, KEY_3 },
+       { 0x24, KEY_4 },
+       { 0x25, KEY_5 },
+       { 0x26, KEY_6 },
+       { 0x27, KEY_7 },
+       { 0x28, KEY_8 },
+       { 0x29, KEY_9 },
+
+       { 0x78, KEY_TUNER },            /* Video Source        */
+       { 0x2c, KEY_EXIT },             /* Open/Close software */
+       { 0x2a, KEY_SELECT },           /* 2 Digit Select      */
+       { 0x69, KEY_AGAIN },            /* Recall              */
+
+       { 0x32, KEY_BRIGHTNESSUP },     /* Brightness increase */
+       { 0x33, KEY_BRIGHTNESSDOWN },   /* Brightness decrease */
+       { 0x6b, KEY_KPPLUS },           /* (not named >>>>>)   */
+       { 0x6c, KEY_KPMINUS },          /* (not named <<<<<)   */
+
+       { 0x2d, KEY_MUTE },             /* Mute                */
+       { 0x30, KEY_VOLUMEUP },         /* Volume up           */
+       { 0x31, KEY_VOLUMEDOWN },       /* Volume down         */
+       { 0x60, KEY_CHANNELUP },        /* Channel up          */
+       { 0x61, KEY_CHANNELDOWN },      /* Channel down        */
+
+       { 0x3f, KEY_RECORD },           /* Record              */
+       { 0x37, KEY_PLAY },             /* Play                */
+       { 0x36, KEY_PAUSE },            /* Pause               */
+       { 0x2b, KEY_STOP },             /* Stop                */
+       { 0x67, KEY_FASTFORWARD },      /* Foward              */
+       { 0x66, KEY_REWIND },           /* Rewind              */
+       { 0x3e, KEY_SEARCH },           /* Auto Scan           */
+       { 0x2e, KEY_CAMERA },           /* Capture Video       */
+       { 0x6d, KEY_MENU },             /* Show/Hide Control   */
+       { 0x2f, KEY_ZOOM },             /* Full Screen         */
+       { 0x34, KEY_RADIO },            /* FM                  */
+       { 0x65, KEY_POWER },            /* Computer power      */
+};
+
+struct ir_scancode_table ir_codes_norwood_table = {
+       .scan = ir_codes_norwood,
+       .size = ARRAY_SIZE(ir_codes_norwood),
+};
+EXPORT_SYMBOL_GPL(ir_codes_norwood_table);
+
+/* From reading the following remotes:
+ * Zenith Universal 7 / TV Mode 807 / VCR Mode 837
+ * Hauppauge (from NOVA-CI-s box product)
+ * This is a "middle of the road" approach, differences are noted
+ */
+static struct ir_scancode ir_codes_budget_ci_old[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_ENTER },
+       { 0x0b, KEY_RED },
+       { 0x0c, KEY_POWER },            /* RADIO on Hauppauge */
+       { 0x0d, KEY_MUTE },
+       { 0x0f, KEY_A },                /* TV on Hauppauge */
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x14, KEY_B },
+       { 0x1c, KEY_UP },
+       { 0x1d, KEY_DOWN },
+       { 0x1e, KEY_OPTION },           /* RESERVED on Hauppauge */
+       { 0x1f, KEY_BREAK },
+       { 0x20, KEY_CHANNELUP },
+       { 0x21, KEY_CHANNELDOWN },
+       { 0x22, KEY_PREVIOUS },         /* Prev Ch on Zenith, SOURCE on Hauppauge */
+       { 0x24, KEY_RESTART },
+       { 0x25, KEY_OK },
+       { 0x26, KEY_CYCLEWINDOWS },     /* MINIMIZE on Hauppauge */
+       { 0x28, KEY_ENTER },            /* VCR mode on Zenith */
+       { 0x29, KEY_PAUSE },
+       { 0x2b, KEY_RIGHT },
+       { 0x2c, KEY_LEFT },
+       { 0x2e, KEY_MENU },             /* FULL SCREEN on Hauppauge */
+       { 0x30, KEY_SLOW },
+       { 0x31, KEY_PREVIOUS },         /* VCR mode on Zenith */
+       { 0x32, KEY_REWIND },
+       { 0x34, KEY_FASTFORWARD },
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },
+       { 0x38, KEY_TUNER },            /* TV/VCR on Zenith */
+       { 0x3a, KEY_C },
+       { 0x3c, KEY_EXIT },
+       { 0x3d, KEY_POWER2 },
+       { 0x3e, KEY_TUNER },
+};
+
+struct ir_scancode_table ir_codes_budget_ci_old_table = {
+       .scan = ir_codes_budget_ci_old,
+       .size = ARRAY_SIZE(ir_codes_budget_ci_old),
+};
+EXPORT_SYMBOL_GPL(ir_codes_budget_ci_old_table);
+
+/*
+ * Marc Fargas <telenieko@telenieko.com>
+ * this is the remote control that comes with the asus p7131
+ * which has a label saying is "Model PC-39"
+ */
+static struct ir_scancode ir_codes_asus_pc39[] = {
+       /* Keys 0 to 9 */
+       { 0x15, KEY_0 },
+       { 0x29, KEY_1 },
+       { 0x2d, KEY_2 },
+       { 0x2b, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0d, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x31, KEY_7 },
+       { 0x35, KEY_8 },
+       { 0x33, KEY_9 },
+
+       { 0x3e, KEY_RADIO },            /* radio */
+       { 0x03, KEY_MENU },             /* dvd/menu */
+       { 0x2a, KEY_VOLUMEUP },
+       { 0x19, KEY_VOLUMEDOWN },
+       { 0x37, KEY_UP },
+       { 0x3b, KEY_DOWN },
+       { 0x27, KEY_LEFT },
+       { 0x2f, KEY_RIGHT },
+       { 0x25, KEY_VIDEO },            /* video */
+       { 0x39, KEY_AUDIO },            /* music */
+
+       { 0x21, KEY_TV },               /* tv */
+       { 0x1d, KEY_EXIT },             /* back */
+       { 0x0a, KEY_CHANNELUP },        /* channel / program + */
+       { 0x1b, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x1a, KEY_ENTER },            /* enter */
+
+       { 0x06, KEY_PAUSE },            /* play/pause */
+       { 0x1e, KEY_PREVIOUS },         /* rew */
+       { 0x26, KEY_NEXT },             /* forward */
+       { 0x0e, KEY_REWIND },           /* backward << */
+       { 0x3a, KEY_FASTFORWARD },      /* forward >> */
+       { 0x36, KEY_STOP },
+       { 0x2e, KEY_RECORD },           /* recording */
+       { 0x16, KEY_POWER },            /* the button that reads "close" */
+
+       { 0x11, KEY_ZOOM },             /* full screen */
+       { 0x13, KEY_MACRO },            /* recall */
+       { 0x23, KEY_HOME },             /* home */
+       { 0x05, KEY_PVR },              /* picture */
+       { 0x3d, KEY_MUTE },             /* mute */
+       { 0x01, KEY_DVD },              /* dvd */
+};
+
+struct ir_scancode_table ir_codes_asus_pc39_table = {
+       .scan = ir_codes_asus_pc39,
+       .size = ARRAY_SIZE(ir_codes_asus_pc39),
+};
+EXPORT_SYMBOL_GPL(ir_codes_asus_pc39_table);
+
+
+/* Encore ENLTV-FM  - black plastic, white front cover with white glowing buttons
+    Juan Pablo Sormani <sorman@gmail.com> */
+static struct ir_scancode ir_codes_encore_enltv[] = {
+
+       /* Power button does nothing, neither in Windows app,
+        although it sends data (used for BIOS wakeup?) */
+       { 0x0d, KEY_MUTE },
+
+       { 0x1e, KEY_TV },
+       { 0x00, KEY_VIDEO },
+       { 0x01, KEY_AUDIO },            /* music */
+       { 0x02, KEY_MHP },              /* picture */
+
+       { 0x1f, KEY_1 },
+       { 0x03, KEY_2 },
+       { 0x04, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x1c, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x1d, KEY_9 },
+       { 0x0a, KEY_0 },
+
+       { 0x09, KEY_LIST },             /* -/-- */
+       { 0x0b, KEY_LAST },             /* recall */
+
+       { 0x14, KEY_HOME },             /* win start menu */
+       { 0x15, KEY_EXIT },             /* exit */
+       { 0x16, KEY_CHANNELUP },        /* UP */
+       { 0x12, KEY_CHANNELDOWN },      /* DOWN */
+       { 0x0c, KEY_VOLUMEUP },         /* RIGHT */
+       { 0x17, KEY_VOLUMEDOWN },       /* LEFT */
+
+       { 0x18, KEY_ENTER },            /* OK */
+
+       { 0x0e, KEY_ESC },
+       { 0x13, KEY_CYCLEWINDOWS },     /* desktop */
+       { 0x11, KEY_TAB },
+       { 0x19, KEY_SWITCHVIDEOMODE },  /* switch */
+
+       { 0x1a, KEY_MENU },
+       { 0x1b, KEY_ZOOM },             /* fullscreen */
+       { 0x44, KEY_TIME },             /* time shift */
+       { 0x40, KEY_MODE },             /* source */
+
+       { 0x5a, KEY_RECORD },
+       { 0x42, KEY_PLAY },             /* play/pause */
+       { 0x45, KEY_STOP },
+       { 0x43, KEY_CAMERA },           /* camera icon */
+
+       { 0x48, KEY_REWIND },
+       { 0x4a, KEY_FASTFORWARD },
+       { 0x49, KEY_PREVIOUS },
+       { 0x4b, KEY_NEXT },
+
+       { 0x4c, KEY_FAVORITES },        /* tv wall */
+       { 0x4d, KEY_SOUND },            /* DVD sound */
+       { 0x4e, KEY_LANGUAGE },         /* DVD lang */
+       { 0x4f, KEY_TEXT },             /* DVD text */
+
+       { 0x50, KEY_SLEEP },            /* shutdown */
+       { 0x51, KEY_MODE },             /* stereo > main */
+       { 0x52, KEY_SELECT },           /* stereo > sap */
+       { 0x53, KEY_PROG1 },            /* teletext */
+
+
+       { 0x59, KEY_RED },              /* AP1 */
+       { 0x41, KEY_GREEN },            /* AP2 */
+       { 0x47, KEY_YELLOW },           /* AP3 */
+       { 0x57, KEY_BLUE },             /* AP4 */
+};
+
+struct ir_scancode_table ir_codes_encore_enltv_table = {
+       .scan = ir_codes_encore_enltv,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_table);
+
+/* Encore ENLTV2-FM  - silver plastic - "Wand Media" written at the botton
+    Mauro Carvalho Chehab <mchehab@infradead.org> */
+static struct ir_scancode ir_codes_encore_enltv2[] = {
+       { 0x4c, KEY_POWER2 },
+       { 0x4a, KEY_TUNER },
+       { 0x40, KEY_1 },
+       { 0x60, KEY_2 },
+       { 0x50, KEY_3 },
+       { 0x70, KEY_4 },
+       { 0x48, KEY_5 },
+       { 0x68, KEY_6 },
+       { 0x58, KEY_7 },
+       { 0x78, KEY_8 },
+       { 0x44, KEY_9 },
+       { 0x54, KEY_0 },
+
+       { 0x64, KEY_LAST },             /* +100 */
+       { 0x4e, KEY_AGAIN },            /* Recall */
+
+       { 0x6c, KEY_SWITCHVIDEOMODE },  /* Video Source */
+       { 0x5e, KEY_MENU },
+       { 0x56, KEY_SCREEN },
+       { 0x7a, KEY_SETUP },
+
+       { 0x46, KEY_MUTE },
+       { 0x5c, KEY_MODE },             /* Stereo */
+       { 0x74, KEY_INFO },
+       { 0x7c, KEY_CLEAR },
+
+       { 0x55, KEY_UP },
+       { 0x49, KEY_DOWN },
+       { 0x7e, KEY_LEFT },
+       { 0x59, KEY_RIGHT },
+       { 0x6a, KEY_ENTER },
+
+       { 0x42, KEY_VOLUMEUP },
+       { 0x62, KEY_VOLUMEDOWN },
+       { 0x52, KEY_CHANNELUP },
+       { 0x72, KEY_CHANNELDOWN },
+
+       { 0x41, KEY_RECORD },
+       { 0x51, KEY_CAMERA },           /* Snapshot */
+       { 0x75, KEY_TIME },             /* Timeshift */
+       { 0x71, KEY_TV2 },              /* PIP */
+
+       { 0x45, KEY_REWIND },
+       { 0x6f, KEY_PAUSE },
+       { 0x7d, KEY_FORWARD },
+       { 0x79, KEY_STOP },
+};
+
+struct ir_scancode_table ir_codes_encore_enltv2_table = {
+       .scan = ir_codes_encore_enltv2,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv2),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2_table);
+
+/* for the Technotrend 1500 bundled remotes (grey and black): */
+static struct ir_scancode ir_codes_tt_1500[] = {
+       { 0x01, KEY_POWER },
+       { 0x02, KEY_SHUFFLE },          /* ? double-arrow key */
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x06, KEY_4 },
+       { 0x07, KEY_5 },
+       { 0x08, KEY_6 },
+       { 0x09, KEY_7 },
+       { 0x0a, KEY_8 },
+       { 0x0b, KEY_9 },
+       { 0x0c, KEY_0 },
+       { 0x0d, KEY_UP },
+       { 0x0e, KEY_LEFT },
+       { 0x0f, KEY_OK },
+       { 0x10, KEY_RIGHT },
+       { 0x11, KEY_DOWN },
+       { 0x12, KEY_INFO },
+       { 0x13, KEY_EXIT },
+       { 0x14, KEY_RED },
+       { 0x15, KEY_GREEN },
+       { 0x16, KEY_YELLOW },
+       { 0x17, KEY_BLUE },
+       { 0x18, KEY_MUTE },
+       { 0x19, KEY_TEXT },
+       { 0x1a, KEY_MODE },             /* ? TV/Radio */
+       { 0x21, KEY_OPTION },
+       { 0x22, KEY_EPG },
+       { 0x23, KEY_CHANNELUP },
+       { 0x24, KEY_CHANNELDOWN },
+       { 0x25, KEY_VOLUMEUP },
+       { 0x26, KEY_VOLUMEDOWN },
+       { 0x27, KEY_SETUP },
+       { 0x3a, KEY_RECORD },           /* these keys are only in the black remote */
+       { 0x3b, KEY_PLAY },
+       { 0x3c, KEY_STOP },
+       { 0x3d, KEY_REWIND },
+       { 0x3e, KEY_PAUSE },
+       { 0x3f, KEY_FORWARD },
+};
+
+struct ir_scancode_table ir_codes_tt_1500_table = {
+       .scan = ir_codes_tt_1500,
+       .size = ARRAY_SIZE(ir_codes_tt_1500),
+};
+EXPORT_SYMBOL_GPL(ir_codes_tt_1500_table);
+
+/* DViCO FUSION HDTV MCE remote */
+static struct ir_scancode ir_codes_fusionhdtv_mce[] = {
+
+       { 0x0b, KEY_1 },
+       { 0x17, KEY_2 },
+       { 0x1b, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x50, KEY_5 },
+       { 0x54, KEY_6 },
+       { 0x48, KEY_7 },
+       { 0x4c, KEY_8 },
+       { 0x58, KEY_9 },
+       { 0x03, KEY_0 },
+
+       { 0x5e, KEY_OK },
+       { 0x51, KEY_UP },
+       { 0x53, KEY_DOWN },
+       { 0x5b, KEY_LEFT },
+       { 0x5f, KEY_RIGHT },
+
+       { 0x02, KEY_TV },               /* Labeled DTV on remote */
+       { 0x0e, KEY_MP3 },
+       { 0x1a, KEY_DVD },
+       { 0x1e, KEY_FAVORITES },        /* Labeled CPF on remote */
+       { 0x16, KEY_SETUP },
+       { 0x46, KEY_POWER2 },           /* TV On/Off button on remote */
+       { 0x0a, KEY_EPG },              /* Labeled Guide on remote */
+
+       { 0x49, KEY_BACK },
+       { 0x59, KEY_INFO },             /* Labeled MORE on remote */
+       { 0x4d, KEY_MENU },             /* Labeled DVDMENU on remote */
+       { 0x55, KEY_CYCLEWINDOWS },     /* Labeled ALT-TAB on remote */
+
+       { 0x0f, KEY_PREVIOUSSONG },     /* Labeled |<< REPLAY on remote */
+       { 0x12, KEY_NEXTSONG },         /* Labeled >>| SKIP on remote */
+       { 0x42, KEY_ENTER },            /* Labeled START with a green
+                                          MS windows logo on remote */
+
+       { 0x15, KEY_VOLUMEUP },
+       { 0x05, KEY_VOLUMEDOWN },
+       { 0x11, KEY_CHANNELUP },
+       { 0x09, KEY_CHANNELDOWN },
+
+       { 0x52, KEY_CAMERA },
+       { 0x5a, KEY_TUNER },
+       { 0x19, KEY_OPEN },
+
+       { 0x13, KEY_MODE },             /* 4:3 16:9 select */
+       { 0x1f, KEY_ZOOM },
+
+       { 0x43, KEY_REWIND },
+       { 0x47, KEY_PLAYPAUSE },
+       { 0x4f, KEY_FASTFORWARD },
+       { 0x57, KEY_MUTE },
+       { 0x0d, KEY_STOP },
+       { 0x01, KEY_RECORD },
+       { 0x4e, KEY_POWER },
+};
+
+struct ir_scancode_table ir_codes_fusionhdtv_mce_table = {
+       .scan = ir_codes_fusionhdtv_mce,
+       .size = ARRAY_SIZE(ir_codes_fusionhdtv_mce),
+};
+EXPORT_SYMBOL_GPL(ir_codes_fusionhdtv_mce_table);
+
+/* Pinnacle PCTV HD 800i mini remote */
+static struct ir_scancode ir_codes_pinnacle_pctv_hd[] = {
+
+       { 0x0f, KEY_1 },
+       { 0x15, KEY_2 },
+       { 0x10, KEY_3 },
+       { 0x18, KEY_4 },
+       { 0x1b, KEY_5 },
+       { 0x1e, KEY_6 },
+       { 0x11, KEY_7 },
+       { 0x21, KEY_8 },
+       { 0x12, KEY_9 },
+       { 0x27, KEY_0 },
+
+       { 0x24, KEY_ZOOM },
+       { 0x2a, KEY_SUBTITLE },
+
+       { 0x00, KEY_MUTE },
+       { 0x01, KEY_ENTER },    /* Pinnacle Logo */
+       { 0x39, KEY_POWER },
+
+       { 0x03, KEY_VOLUMEUP },
+       { 0x09, KEY_VOLUMEDOWN },
+       { 0x06, KEY_CHANNELUP },
+       { 0x0c, KEY_CHANNELDOWN },
+
+       { 0x2d, KEY_REWIND },
+       { 0x30, KEY_PLAYPAUSE },
+       { 0x33, KEY_FASTFORWARD },
+       { 0x3c, KEY_STOP },
+       { 0x36, KEY_RECORD },
+       { 0x3f, KEY_EPG },      /* Labeled "?" */
+};
+
+struct ir_scancode_table ir_codes_pinnacle_pctv_hd_table = {
+       .scan = ir_codes_pinnacle_pctv_hd,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_pctv_hd),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd_table);
+
+/*
+ * Igor Kuznetsov <igk72@ya.ru>
+ * Andrey J. Melnikov <temnota@kmv.ru>
+ *
+ * Keytable is used by BeholdTV 60x series, M6 series at
+ * least, and probably other cards too.
+ * The "ascii-art picture" below (in comments, first row
+ * is the keycode in hex, and subsequent row(s) shows
+ * the button labels (several variants when appropriate)
+ * helps to descide which keycodes to assign to the buttons.
+ */
+static struct ir_scancode ir_codes_behold[] = {
+
+       /*  0x1c            0x12  *
+        *  TV/FM          POWER  *
+        *                        */
+       { 0x1c, KEY_TUNER },    /* XXX KEY_TV / KEY_RADIO */
+       { 0x12, KEY_POWER },
+
+       /*  0x01    0x02    0x03  *
+        *   1       2       3    *
+        *                        *
+        *  0x04    0x05    0x06  *
+        *   4       5       6    *
+        *                        *
+        *  0x07    0x08    0x09  *
+        *   7       8       9    *
+        *                        */
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       /*  0x0a    0x00    0x17  *
+        * RECALL    0      MODE  *
+        *                        */
+       { 0x0a, KEY_AGAIN },
+       { 0x00, KEY_0 },
+       { 0x17, KEY_MODE },
+
+       /*  0x14          0x10    *
+        * ASPECT      FULLSCREEN *
+        *                        */
+       { 0x14, KEY_SCREEN },
+       { 0x10, KEY_ZOOM },
+
+       /*          0x0b          *
+        *           Up           *
+        *                        *
+        *  0x18    0x16    0x0c  *
+        *  Left     Ok     Right *
+        *                        *
+        *         0x015          *
+        *         Down           *
+        *                        */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x18, KEY_VOLUMEDOWN },
+       { 0x16, KEY_OK },               /* XXX KEY_ENTER */
+       { 0x0c, KEY_VOLUMEUP },
+       { 0x15, KEY_CHANNELDOWN },
+
+       /*  0x11            0x0d  *
+        *  MUTE            INFO  *
+        *                        */
+       { 0x11, KEY_MUTE },
+       { 0x0d, KEY_INFO },
+
+       /*  0x0f    0x1b    0x1a  *
+        * RECORD PLAY/PAUSE STOP *
+        *                        *
+        *  0x0e    0x1f    0x1e  *
+        *TELETEXT  AUDIO  SOURCE *
+        *           RED   YELLOW *
+        *                        */
+       { 0x0f, KEY_RECORD },
+       { 0x1b, KEY_PLAYPAUSE },
+       { 0x1a, KEY_STOP },
+       { 0x0e, KEY_TEXT },
+       { 0x1f, KEY_RED },      /*XXX KEY_AUDIO */
+       { 0x1e, KEY_YELLOW },   /*XXX KEY_SOURCE        */
+
+       /*  0x1d   0x13     0x19  *
+        * SLEEP  PREVIEW   DVB   *
+        *         GREEN    BLUE  *
+        *                        */
+       { 0x1d, KEY_SLEEP },
+       { 0x13, KEY_GREEN },
+       { 0x19, KEY_BLUE },     /* XXX KEY_SAT  */
+
+       /*  0x58           0x5c   *
+        * FREEZE        SNAPSHOT *
+        *                        */
+       { 0x58, KEY_SLOW },
+       { 0x5c, KEY_CAMERA },
+
+};
+
+struct ir_scancode_table ir_codes_behold_table = {
+       .scan = ir_codes_behold,
+       .size = ARRAY_SIZE(ir_codes_behold),
+};
+EXPORT_SYMBOL_GPL(ir_codes_behold_table);
+
+/* Beholder Intl. Ltd. 2008
+ * Dmitry Belimov d.belimov@google.com
+ * Keytable is used by BeholdTV Columbus
+ * The "ascii-art picture" below (in comments, first row
+ * is the keycode in hex, and subsequent row(s) shows
+ * the button labels (several variants when appropriate)
+ * helps to descide which keycodes to assign to the buttons.
+ */
+static struct ir_scancode ir_codes_behold_columbus[] = {
+
+       /*  0x13   0x11   0x1C   0x12  *
+        *  Mute  Source  TV/FM  Power *
+        *                             */
+
+       { 0x13, KEY_MUTE },
+       { 0x11, KEY_PROPS },
+       { 0x1C, KEY_TUNER },    /* KEY_TV/KEY_RADIO     */
+       { 0x12, KEY_POWER },
+
+       /*  0x01    0x02    0x03  0x0D    *
+        *   1       2       3   Stereo   *
+        *                                *
+        *  0x04    0x05    0x06  0x19    *
+        *   4       5       6   Snapshot *
+        *                                *
+        *  0x07    0x08    0x09  0x10    *
+        *   7       8       9    Zoom    *
+        *                                */
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x0D, KEY_SETUP },      /* Setup key */
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x19, KEY_CAMERA },   /* Snapshot key */
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x10, KEY_ZOOM },
+
+       /*  0x0A    0x00    0x0B       0x0C   *
+        * RECALL    0    ChannelUp  VolumeUp *
+        *                                    */
+       { 0x0A, KEY_AGAIN },
+       { 0x00, KEY_0 },
+       { 0x0B, KEY_CHANNELUP },
+       { 0x0C, KEY_VOLUMEUP },
+
+       /*   0x1B      0x1D      0x15        0x18     *
+        * Timeshift  Record  ChannelDown  VolumeDown *
+        *                                            */
+
+       { 0x1B, KEY_TIME },
+       { 0x1D, KEY_RECORD },
+       { 0x15, KEY_CHANNELDOWN },
+       { 0x18, KEY_VOLUMEDOWN },
+
+       /*   0x0E   0x1E     0x0F     0x1A  *
+        *   Stop   Pause  Previouse  Next  *
+        *                                  */
+
+       { 0x0E, KEY_STOP },
+       { 0x1E, KEY_PAUSE },
+       { 0x0F, KEY_PREVIOUS },
+       { 0x1A, KEY_NEXT },
+
+};
+
+struct ir_scancode_table ir_codes_behold_columbus_table = {
+       .scan = ir_codes_behold_columbus,
+       .size = ARRAY_SIZE(ir_codes_behold_columbus),
+};
+EXPORT_SYMBOL_GPL(ir_codes_behold_columbus_table);
+
+/*
+ * Remote control for the Genius TVGO A11MCE
+ * Adrian Pardini <pardo.bsso@gmail.com>
+ */
+static struct ir_scancode ir_codes_genius_tvgo_a11mce[] = {
+       /* Keys 0 to 9 */
+       { 0x48, KEY_0 },
+       { 0x09, KEY_1 },
+       { 0x1d, KEY_2 },
+       { 0x1f, KEY_3 },
+       { 0x19, KEY_4 },
+       { 0x1b, KEY_5 },
+       { 0x11, KEY_6 },
+       { 0x17, KEY_7 },
+       { 0x12, KEY_8 },
+       { 0x16, KEY_9 },
+
+       { 0x54, KEY_RECORD },           /* recording */
+       { 0x06, KEY_MUTE },             /* mute */
+       { 0x10, KEY_POWER },
+       { 0x40, KEY_LAST },             /* recall */
+       { 0x4c, KEY_CHANNELUP },        /* channel / program + */
+       { 0x00, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x0d, KEY_VOLUMEUP },
+       { 0x15, KEY_VOLUMEDOWN },
+       { 0x4d, KEY_OK },               /* also labeled as Pause */
+       { 0x1c, KEY_ZOOM },             /* full screen and Stop*/
+       { 0x02, KEY_MODE },             /* AV Source or Rewind*/
+       { 0x04, KEY_LIST },             /* -/-- */
+       /* small arrows above numbers */
+       { 0x1a, KEY_NEXT },             /* also Fast Forward */
+       { 0x0e, KEY_PREVIOUS },         /* also Rewind */
+       /* these are in a rather non standard layout and have
+       an alternate name written */
+       { 0x1e, KEY_UP },               /* Video Setting */
+       { 0x0a, KEY_DOWN },             /* Video Default */
+       { 0x05, KEY_CAMERA },           /* Snapshot */
+       { 0x0c, KEY_RIGHT },            /* Hide Panel */
+       /* Four buttons without label */
+       { 0x49, KEY_RED },
+       { 0x0b, KEY_GREEN },
+       { 0x13, KEY_YELLOW },
+       { 0x50, KEY_BLUE },
+};
+
+struct ir_scancode_table ir_codes_genius_tvgo_a11mce_table = {
+       .scan = ir_codes_genius_tvgo_a11mce,
+       .size = ARRAY_SIZE(ir_codes_genius_tvgo_a11mce),
+};
+EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce_table);
+
+/*
+ * Remote control for Powercolor Real Angel 330
+ * Daniel Fraga <fragabr@gmail.com>
+ */
+static struct ir_scancode ir_codes_powercolor_real_angel[] = {
+       { 0x38, KEY_SWITCHVIDEOMODE },  /* switch inputs */
+       { 0x0c, KEY_MEDIA },            /* Turn ON/OFF App */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_DIGITS },           /* single, double, tripple digit */
+       { 0x29, KEY_PREVIOUS },         /* previous channel */
+       { 0x12, KEY_BRIGHTNESSUP },
+       { 0x13, KEY_BRIGHTNESSDOWN },
+       { 0x2b, KEY_MODE },             /* stereo/mono */
+       { 0x2c, KEY_TEXT },             /* teletext */
+       { 0x20, KEY_CHANNELUP },        /* channel up */
+       { 0x21, KEY_CHANNELDOWN },      /* channel down */
+       { 0x10, KEY_VOLUMEUP },         /* volume up */
+       { 0x11, KEY_VOLUMEDOWN },       /* volume down */
+       { 0x0d, KEY_MUTE },
+       { 0x1f, KEY_RECORD },
+       { 0x17, KEY_PLAY },
+       { 0x16, KEY_PAUSE },
+       { 0x0b, KEY_STOP },
+       { 0x27, KEY_FASTFORWARD },
+       { 0x26, KEY_REWIND },
+       { 0x1e, KEY_SEARCH },           /* autoscan */
+       { 0x0e, KEY_CAMERA },           /* snapshot */
+       { 0x2d, KEY_SETUP },
+       { 0x0f, KEY_SCREEN },           /* full screen */
+       { 0x14, KEY_RADIO },            /* FM radio */
+       { 0x25, KEY_POWER },            /* power */
+};
+
+struct ir_scancode_table ir_codes_powercolor_real_angel_table = {
+       .scan = ir_codes_powercolor_real_angel,
+       .size = ARRAY_SIZE(ir_codes_powercolor_real_angel),
+};
+EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel_table);
+
+/* Kworld Plus TV Analog Lite PCI IR
+   Mauro Carvalho Chehab <mchehab@infradead.org>
+ */
+static struct ir_scancode ir_codes_kworld_plus_tv_analog[] = {
+       { 0x0c, KEY_PROG1 },            /* Kworld key */
+       { 0x16, KEY_CLOSECD },          /* -> ) */
+       { 0x1d, KEY_POWER2 },
+
+       { 0x00, KEY_1 },
+       { 0x01, KEY_2 },
+       { 0x02, KEY_3 },                /* Two keys have the same code: 3 and left */
+       { 0x03, KEY_4 },                /* Two keys have the same code: 3 and right */
+       { 0x04, KEY_5 },
+       { 0x05, KEY_6 },
+       { 0x06, KEY_7 },
+       { 0x07, KEY_8 },
+       { 0x08, KEY_9 },
+       { 0x0a, KEY_0 },
+
+       { 0x09, KEY_AGAIN },
+       { 0x14, KEY_MUTE },
+
+       { 0x20, KEY_UP },
+       { 0x21, KEY_DOWN },
+       { 0x0b, KEY_ENTER },
+
+       { 0x10, KEY_CHANNELUP },
+       { 0x11, KEY_CHANNELDOWN },
+
+       /* Couldn't map key left/key right since those
+          conflict with '3' and '4' scancodes
+          I dunno what the original driver does
+        */
+
+       { 0x13, KEY_VOLUMEUP },
+       { 0x12, KEY_VOLUMEDOWN },
+
+       /* The lower part of the IR
+          There are several duplicated keycodes there.
+          Most of them conflict with digits.
+          Add mappings just to the unused scancodes.
+          Somehow, the original driver has a way to know,
+          but this doesn't seem to be on some GPIO.
+          Also, it is not related to the time between keyup
+          and keydown.
+        */
+       { 0x19, KEY_TIME},              /* Timeshift */
+       { 0x1a, KEY_STOP},
+       { 0x1b, KEY_RECORD},
+
+       { 0x22, KEY_TEXT},
+
+       { 0x15, KEY_AUDIO},             /* ((*)) */
+       { 0x0f, KEY_ZOOM},
+       { 0x1c, KEY_CAMERA},            /* snapshot */
+
+       { 0x18, KEY_RED},               /* B */
+       { 0x23, KEY_GREEN},             /* C */
+};
+struct ir_scancode_table ir_codes_kworld_plus_tv_analog_table = {
+       .scan = ir_codes_kworld_plus_tv_analog,
+       .size = ARRAY_SIZE(ir_codes_kworld_plus_tv_analog),
+};
+EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog_table);
+
+/* Kaiomy TVnPC U2
+   Mauro Carvalho Chehab <mchehab@infradead.org>
+ */
+static struct ir_scancode ir_codes_kaiomy[] = {
+       { 0x43, KEY_POWER2},
+       { 0x01, KEY_LIST},
+       { 0x0b, KEY_ZOOM},
+       { 0x03, KEY_POWER},
+
+       { 0x04, KEY_1},
+       { 0x08, KEY_2},
+       { 0x02, KEY_3},
+
+       { 0x0f, KEY_4},
+       { 0x05, KEY_5},
+       { 0x06, KEY_6},
+
+       { 0x0c, KEY_7},
+       { 0x0d, KEY_8},
+       { 0x0a, KEY_9},
+
+       { 0x11, KEY_0},
+
+       { 0x09, KEY_CHANNELUP},
+       { 0x07, KEY_CHANNELDOWN},
+
+       { 0x0e, KEY_VOLUMEUP},
+       { 0x13, KEY_VOLUMEDOWN},
+
+       { 0x10, KEY_HOME},
+       { 0x12, KEY_ENTER},
+
+       { 0x14, KEY_RECORD},
+       { 0x15, KEY_STOP},
+       { 0x16, KEY_PLAY},
+       { 0x17, KEY_MUTE},
+
+       { 0x18, KEY_UP},
+       { 0x19, KEY_DOWN},
+       { 0x1a, KEY_LEFT},
+       { 0x1b, KEY_RIGHT},
+
+       { 0x1c, KEY_RED},
+       { 0x1d, KEY_GREEN},
+       { 0x1e, KEY_YELLOW},
+       { 0x1f, KEY_BLUE},
+};
+struct ir_scancode_table ir_codes_kaiomy_table = {
+       .scan = ir_codes_kaiomy,
+       .size = ARRAY_SIZE(ir_codes_kaiomy),
+};
+EXPORT_SYMBOL_GPL(ir_codes_kaiomy_table);
+
+static struct ir_scancode ir_codes_avermedia_a16d[] = {
+       { 0x20, KEY_LIST},
+       { 0x00, KEY_POWER},
+       { 0x28, KEY_1},
+       { 0x18, KEY_2},
+       { 0x38, KEY_3},
+       { 0x24, KEY_4},
+       { 0x14, KEY_5},
+       { 0x34, KEY_6},
+       { 0x2c, KEY_7},
+       { 0x1c, KEY_8},
+       { 0x3c, KEY_9},
+       { 0x12, KEY_SUBTITLE},
+       { 0x22, KEY_0},
+       { 0x32, KEY_REWIND},
+       { 0x3a, KEY_SHUFFLE},
+       { 0x02, KEY_PRINT},
+       { 0x11, KEY_CHANNELDOWN},
+       { 0x31, KEY_CHANNELUP},
+       { 0x0c, KEY_ZOOM},
+       { 0x1e, KEY_VOLUMEDOWN},
+       { 0x3e, KEY_VOLUMEUP},
+       { 0x0a, KEY_MUTE},
+       { 0x04, KEY_AUDIO},
+       { 0x26, KEY_RECORD},
+       { 0x06, KEY_PLAY},
+       { 0x36, KEY_STOP},
+       { 0x16, KEY_PAUSE},
+       { 0x2e, KEY_REWIND},
+       { 0x0e, KEY_FASTFORWARD},
+       { 0x30, KEY_TEXT},
+       { 0x21, KEY_GREEN},
+       { 0x01, KEY_BLUE},
+       { 0x08, KEY_EPG},
+       { 0x2a, KEY_MENU},
+};
+struct ir_scancode_table ir_codes_avermedia_a16d_table = {
+       .scan = ir_codes_avermedia_a16d,
+       .size = ARRAY_SIZE(ir_codes_avermedia_a16d),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d_table);
+
+/* Encore ENLTV-FM v5.3
+   Mauro Carvalho Chehab <mchehab@infradead.org>
+ */
+static struct ir_scancode ir_codes_encore_enltv_fm53[] = {
+       { 0x10, KEY_POWER2},
+       { 0x06, KEY_MUTE},
+
+       { 0x09, KEY_1},
+       { 0x1d, KEY_2},
+       { 0x1f, KEY_3},
+       { 0x19, KEY_4},
+       { 0x1b, KEY_5},
+       { 0x11, KEY_6},
+       { 0x17, KEY_7},
+       { 0x12, KEY_8},
+       { 0x16, KEY_9},
+       { 0x48, KEY_0},
+
+       { 0x04, KEY_LIST},              /* -/-- */
+       { 0x40, KEY_LAST},              /* recall */
+
+       { 0x02, KEY_MODE},              /* TV/AV */
+       { 0x05, KEY_CAMERA},            /* SNAPSHOT */
+
+       { 0x4c, KEY_CHANNELUP},         /* UP */
+       { 0x00, KEY_CHANNELDOWN},       /* DOWN */
+       { 0x0d, KEY_VOLUMEUP},          /* RIGHT */
+       { 0x15, KEY_VOLUMEDOWN},        /* LEFT */
+       { 0x49, KEY_ENTER},             /* OK */
+
+       { 0x54, KEY_RECORD},
+       { 0x4d, KEY_PLAY},              /* pause */
+
+       { 0x1e, KEY_MENU},              /* video setting */
+       { 0x0e, KEY_RIGHT},             /* <- */
+       { 0x1a, KEY_LEFT},              /* -> */
+
+       { 0x0a, KEY_CLEAR},             /* video default */
+       { 0x0c, KEY_ZOOM},              /* hide pannel */
+       { 0x47, KEY_SLEEP},             /* shutdown */
+};
+struct ir_scancode_table ir_codes_encore_enltv_fm53_table = {
+       .scan = ir_codes_encore_enltv_fm53,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv_fm53),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53_table);
+
+/* Zogis Real Audio 220 - 32 keys IR */
+static struct ir_scancode ir_codes_real_audio_220_32_keys[] = {
+       { 0x1c, KEY_RADIO},
+       { 0x12, KEY_POWER2},
+
+       { 0x01, KEY_1},
+       { 0x02, KEY_2},
+       { 0x03, KEY_3},
+       { 0x04, KEY_4},
+       { 0x05, KEY_5},
+       { 0x06, KEY_6},
+       { 0x07, KEY_7},
+       { 0x08, KEY_8},
+       { 0x09, KEY_9},
+       { 0x00, KEY_0},
+
+       { 0x0c, KEY_VOLUMEUP},
+       { 0x18, KEY_VOLUMEDOWN},
+       { 0x0b, KEY_CHANNELUP},
+       { 0x15, KEY_CHANNELDOWN},
+       { 0x16, KEY_ENTER},
+
+       { 0x11, KEY_LIST},              /* Source */
+       { 0x0d, KEY_AUDIO},             /* stereo */
+
+       { 0x0f, KEY_PREVIOUS},          /* Prev */
+       { 0x1b, KEY_TIME},              /* Timeshift */
+       { 0x1a, KEY_NEXT},              /* Next */
+
+       { 0x0e, KEY_STOP},
+       { 0x1f, KEY_PLAY},
+       { 0x1e, KEY_PLAYPAUSE},         /* Pause */
+
+       { 0x1d, KEY_RECORD},
+       { 0x13, KEY_MUTE},
+       { 0x19, KEY_CAMERA},            /* Snapshot */
+
+};
+struct ir_scancode_table ir_codes_real_audio_220_32_keys_table = {
+       .scan = ir_codes_real_audio_220_32_keys,
+       .size = ARRAY_SIZE(ir_codes_real_audio_220_32_keys),
+};
+EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys_table);
+
+/* ATI TV Wonder HD 600 USB
+   Devin Heitmueller <devin.heitmueller@gmail.com>
+ */
+static struct ir_scancode ir_codes_ati_tv_wonder_hd_600[] = {
+       { 0x00, KEY_RECORD},            /* Row 1 */
+       { 0x01, KEY_PLAYPAUSE},
+       { 0x02, KEY_STOP},
+       { 0x03, KEY_POWER},
+       { 0x04, KEY_PREVIOUS},  /* Row 2 */
+       { 0x05, KEY_REWIND},
+       { 0x06, KEY_FORWARD},
+       { 0x07, KEY_NEXT},
+       { 0x08, KEY_EPG},               /* Row 3 */
+       { 0x09, KEY_HOME},
+       { 0x0a, KEY_MENU},
+       { 0x0b, KEY_CHANNELUP},
+       { 0x0c, KEY_BACK},              /* Row 4 */
+       { 0x0d, KEY_UP},
+       { 0x0e, KEY_INFO},
+       { 0x0f, KEY_CHANNELDOWN},
+       { 0x10, KEY_LEFT},              /* Row 5 */
+       { 0x11, KEY_SELECT},
+       { 0x12, KEY_RIGHT},
+       { 0x13, KEY_VOLUMEUP},
+       { 0x14, KEY_LAST},              /* Row 6 */
+       { 0x15, KEY_DOWN},
+       { 0x16, KEY_MUTE},
+       { 0x17, KEY_VOLUMEDOWN},
+};
+struct ir_scancode_table ir_codes_ati_tv_wonder_hd_600_table = {
+       .scan = ir_codes_ati_tv_wonder_hd_600,
+       .size = ARRAY_SIZE(ir_codes_ati_tv_wonder_hd_600),
+};
+EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600_table);
+
+/* DVBWorld remotes
+   Igor M. Liplianin <liplianin@me.by>
+ */
+static struct ir_scancode ir_codes_dm1105_nec[] = {
+       { 0x0a, KEY_POWER2},            /* power */
+       { 0x0c, KEY_MUTE},              /* mute */
+       { 0x11, KEY_1},
+       { 0x12, KEY_2},
+       { 0x13, KEY_3},
+       { 0x14, KEY_4},
+       { 0x15, KEY_5},
+       { 0x16, KEY_6},
+       { 0x17, KEY_7},
+       { 0x18, KEY_8},
+       { 0x19, KEY_9},
+       { 0x10, KEY_0},
+       { 0x1c, KEY_CHANNELUP},         /* ch+ */
+       { 0x0f, KEY_CHANNELDOWN},       /* ch- */
+       { 0x1a, KEY_VOLUMEUP},          /* vol+ */
+       { 0x0e, KEY_VOLUMEDOWN},        /* vol- */
+       { 0x04, KEY_RECORD},            /* rec */
+       { 0x09, KEY_CHANNEL},           /* fav */
+       { 0x08, KEY_BACKSPACE},         /* rewind */
+       { 0x07, KEY_FASTFORWARD},       /* fast */
+       { 0x0b, KEY_PAUSE},             /* pause */
+       { 0x02, KEY_ESC},               /* cancel */
+       { 0x03, KEY_TAB},               /* tab */
+       { 0x00, KEY_UP},                /* up */
+       { 0x1f, KEY_ENTER},             /* ok */
+       { 0x01, KEY_DOWN},              /* down */
+       { 0x05, KEY_RECORD},            /* cap */
+       { 0x06, KEY_STOP},              /* stop */
+       { 0x40, KEY_ZOOM},              /* full */
+       { 0x1e, KEY_TV},                /* tvmode */
+       { 0x1b, KEY_B},                 /* recall */
+};
+struct ir_scancode_table ir_codes_dm1105_nec_table = {
+       .scan = ir_codes_dm1105_nec,
+       .size = ARRAY_SIZE(ir_codes_dm1105_nec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dm1105_nec_table);
+
+static struct ir_scancode ir_codes_tevii_nec[] = {
+       { 0x0a, KEY_POWER2},
+       { 0x0c, KEY_MUTE},
+       { 0x11, KEY_1},
+       { 0x12, KEY_2},
+       { 0x13, KEY_3},
+       { 0x14, KEY_4},
+       { 0x15, KEY_5},
+       { 0x16, KEY_6},
+       { 0x17, KEY_7},
+       { 0x18, KEY_8},
+       { 0x19, KEY_9},
+       { 0x10, KEY_0},
+       { 0x1c, KEY_MENU},
+       { 0x0f, KEY_VOLUMEDOWN},
+       { 0x1a, KEY_LAST},
+       { 0x0e, KEY_OPEN},
+       { 0x04, KEY_RECORD},
+       { 0x09, KEY_VOLUMEUP},
+       { 0x08, KEY_CHANNELUP},
+       { 0x07, KEY_PVR},
+       { 0x0b, KEY_TIME},
+       { 0x02, KEY_RIGHT},
+       { 0x03, KEY_LEFT},
+       { 0x00, KEY_UP},
+       { 0x1f, KEY_OK},
+       { 0x01, KEY_DOWN},
+       { 0x05, KEY_TUNER},
+       { 0x06, KEY_CHANNELDOWN},
+       { 0x40, KEY_PLAYPAUSE},
+       { 0x1e, KEY_REWIND},
+       { 0x1b, KEY_FAVORITES},
+       { 0x1d, KEY_BACK},
+       { 0x4d, KEY_FASTFORWARD},
+       { 0x44, KEY_EPG},
+       { 0x4c, KEY_INFO},
+       { 0x41, KEY_AB},
+       { 0x43, KEY_AUDIO},
+       { 0x45, KEY_SUBTITLE},
+       { 0x4a, KEY_LIST},
+       { 0x46, KEY_F1},
+       { 0x47, KEY_F2},
+       { 0x5e, KEY_F3},
+       { 0x5c, KEY_F4},
+       { 0x52, KEY_F5},
+       { 0x5a, KEY_F6},
+       { 0x56, KEY_MODE},
+       { 0x58, KEY_SWITCHVIDEOMODE},
+};
+struct ir_scancode_table ir_codes_tevii_nec_table = {
+       .scan = ir_codes_tevii_nec,
+       .size = ARRAY_SIZE(ir_codes_tevii_nec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_tevii_nec_table);
+
+static struct ir_scancode ir_codes_tbs_nec[] = {
+       { 0x04, KEY_POWER2},    /*power*/
+       { 0x14, KEY_MUTE},      /*mute*/
+       { 0x07, KEY_1},
+       { 0x06, KEY_2},
+       { 0x05, KEY_3},
+       { 0x0b, KEY_4},
+       { 0x0a, KEY_5},
+       { 0x09, KEY_6},
+       { 0x0f, KEY_7},
+       { 0x0e, KEY_8},
+       { 0x0d, KEY_9},
+       { 0x12, KEY_0},
+       { 0x16, KEY_CHANNELUP}, /*ch+*/
+       { 0x11, KEY_CHANNELDOWN},/*ch-*/
+       { 0x13, KEY_VOLUMEUP},  /*vol+*/
+       { 0x0c, KEY_VOLUMEDOWN},/*vol-*/
+       { 0x03, KEY_RECORD},    /*rec*/
+       { 0x18, KEY_PAUSE},     /*pause*/
+       { 0x19, KEY_OK},        /*ok*/
+       { 0x1a, KEY_CAMERA},    /* snapshot */
+       { 0x01, KEY_UP},
+       { 0x10, KEY_LEFT},
+       { 0x02, KEY_RIGHT},
+       { 0x08, KEY_DOWN},
+       { 0x15, KEY_FAVORITES},
+       { 0x17, KEY_SUBTITLE},
+       { 0x1d, KEY_ZOOM},
+       { 0x1f, KEY_EXIT},
+       { 0x1e, KEY_MENU},
+       { 0x1c, KEY_EPG},
+       { 0x00, KEY_PREVIOUS},
+       { 0x1b, KEY_MODE},
+};
+struct ir_scancode_table ir_codes_tbs_nec_table = {
+       .scan = ir_codes_tbs_nec,
+       .size = ARRAY_SIZE(ir_codes_tbs_nec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_tbs_nec_table);
+
+/* Terratec Cinergy Hybrid T USB XS
+   Devin Heitmueller <dheitmueller@linuxtv.org>
+ */
+static struct ir_scancode ir_codes_terratec_cinergy_xs[] = {
+       { 0x41, KEY_HOME},
+       { 0x01, KEY_POWER},
+       { 0x42, KEY_MENU},
+       { 0x02, KEY_1},
+       { 0x03, KEY_2},
+       { 0x04, KEY_3},
+       { 0x43, KEY_SUBTITLE},
+       { 0x05, KEY_4},
+       { 0x06, KEY_5},
+       { 0x07, KEY_6},
+       { 0x44, KEY_TEXT},
+       { 0x08, KEY_7},
+       { 0x09, KEY_8},
+       { 0x0a, KEY_9},
+       { 0x45, KEY_DELETE},
+       { 0x0b, KEY_TUNER},
+       { 0x0c, KEY_0},
+       { 0x0d, KEY_MODE},
+       { 0x46, KEY_TV},
+       { 0x47, KEY_DVD},
+       { 0x49, KEY_VIDEO},
+       { 0x4b, KEY_AUX},
+       { 0x10, KEY_UP},
+       { 0x11, KEY_LEFT},
+       { 0x12, KEY_OK},
+       { 0x13, KEY_RIGHT},
+       { 0x14, KEY_DOWN},
+       { 0x0f, KEY_EPG},
+       { 0x16, KEY_INFO},
+       { 0x4d, KEY_BACKSPACE},
+       { 0x1c, KEY_VOLUMEUP},
+       { 0x4c, KEY_PLAY},
+       { 0x1b, KEY_CHANNELUP},
+       { 0x1e, KEY_VOLUMEDOWN},
+       { 0x1d, KEY_MUTE},
+       { 0x1f, KEY_CHANNELDOWN},
+       { 0x17, KEY_RED},
+       { 0x18, KEY_GREEN},
+       { 0x19, KEY_YELLOW},
+       { 0x1a, KEY_BLUE},
+       { 0x58, KEY_RECORD},
+       { 0x48, KEY_STOP},
+       { 0x40, KEY_PAUSE},
+       { 0x54, KEY_LAST},
+       { 0x4e, KEY_REWIND},
+       { 0x4f, KEY_FASTFORWARD},
+       { 0x5c, KEY_NEXT},
+};
+struct ir_scancode_table ir_codes_terratec_cinergy_xs_table = {
+       .scan = ir_codes_terratec_cinergy_xs,
+       .size = ARRAY_SIZE(ir_codes_terratec_cinergy_xs),
+};
+EXPORT_SYMBOL_GPL(ir_codes_terratec_cinergy_xs_table);
+
+/* EVGA inDtube
+   Devin Heitmueller <devin.heitmueller@gmail.com>
+ */
+static struct ir_scancode ir_codes_evga_indtube[] = {
+       { 0x12, KEY_POWER},
+       { 0x02, KEY_MODE},      /* TV */
+       { 0x14, KEY_MUTE},
+       { 0x1a, KEY_CHANNELUP},
+       { 0x16, KEY_TV2},       /* PIP */
+       { 0x1d, KEY_VOLUMEUP},
+       { 0x05, KEY_CHANNELDOWN},
+       { 0x0f, KEY_PLAYPAUSE},
+       { 0x19, KEY_VOLUMEDOWN},
+       { 0x1c, KEY_REWIND},
+       { 0x0d, KEY_RECORD},
+       { 0x18, KEY_FORWARD},
+       { 0x1e, KEY_PREVIOUS},
+       { 0x1b, KEY_STOP},
+       { 0x1f, KEY_NEXT},
+       { 0x13, KEY_CAMERA},
+};
+struct ir_scancode_table ir_codes_evga_indtube_table = {
+       .scan = ir_codes_evga_indtube,
+       .size = ARRAY_SIZE(ir_codes_evga_indtube),
+};
+EXPORT_SYMBOL_GPL(ir_codes_evga_indtube_table);
+
+static struct ir_scancode ir_codes_videomate_s350[] = {
+       { 0x00, KEY_TV},
+       { 0x01, KEY_DVD},
+       { 0x04, KEY_RECORD},
+       { 0x05, KEY_VIDEO},     /* TV/Video */
+       { 0x07, KEY_STOP},
+       { 0x08, KEY_PLAYPAUSE},
+       { 0x0a, KEY_REWIND},
+       { 0x0f, KEY_FASTFORWARD},
+       { 0x10, KEY_CHANNELUP},
+       { 0x12, KEY_VOLUMEUP},
+       { 0x13, KEY_CHANNELDOWN},
+       { 0x14, KEY_MUTE},
+       { 0x15, KEY_VOLUMEDOWN},
+       { 0x16, KEY_1},
+       { 0x17, KEY_2},
+       { 0x18, KEY_3},
+       { 0x19, KEY_4},
+       { 0x1a, KEY_5},
+       { 0x1b, KEY_6},
+       { 0x1c, KEY_7},
+       { 0x1d, KEY_8},
+       { 0x1e, KEY_9},
+       { 0x1f, KEY_0},
+       { 0x21, KEY_SLEEP},
+       { 0x24, KEY_ZOOM},
+       { 0x25, KEY_LAST},      /* Recall */
+       { 0x26, KEY_SUBTITLE},  /* CC */
+       { 0x27, KEY_LANGUAGE},  /* MTS */
+       { 0x29, KEY_CHANNEL},   /* SURF */
+       { 0x2b, KEY_A},
+       { 0x2c, KEY_B},
+       { 0x2f, KEY_CAMERA},    /* Snapshot */
+       { 0x23, KEY_RADIO},
+       { 0x02, KEY_PREVIOUSSONG},
+       { 0x06, KEY_NEXTSONG},
+       { 0x03, KEY_EPG},
+       { 0x09, KEY_SETUP},
+       { 0x22, KEY_BACKSPACE},
+       { 0x0c, KEY_UP},
+       { 0x0e, KEY_DOWN},
+       { 0x0b, KEY_LEFT},
+       { 0x0d, KEY_RIGHT},
+       { 0x11, KEY_ENTER},
+       { 0x20, KEY_TEXT},
+};
+struct ir_scancode_table ir_codes_videomate_s350_table = {
+       .scan = ir_codes_videomate_s350,
+       .size = ARRAY_SIZE(ir_codes_videomate_s350),
+};
+EXPORT_SYMBOL_GPL(ir_codes_videomate_s350_table);
+
+/* GADMEI UTV330+ RM008Z remote
+   Shine Liu <shinel@foxmail.com>
+ */
+static struct ir_scancode ir_codes_gadmei_rm008z[] = {
+       { 0x14, KEY_POWER2},            /* POWER OFF */
+       { 0x0c, KEY_MUTE},              /* MUTE */
+
+       { 0x18, KEY_TV},                /* TV */
+       { 0x0e, KEY_VIDEO},             /* AV */
+       { 0x0b, KEY_AUDIO},             /* SV */
+       { 0x0f, KEY_RADIO},             /* FM */
+
+       { 0x00, KEY_1},
+       { 0x01, KEY_2},
+       { 0x02, KEY_3},
+       { 0x03, KEY_4},
+       { 0x04, KEY_5},
+       { 0x05, KEY_6},
+       { 0x06, KEY_7},
+       { 0x07, KEY_8},
+       { 0x08, KEY_9},
+       { 0x09, KEY_0},
+       { 0x0a, KEY_INFO},              /* OSD */
+       { 0x1c, KEY_BACKSPACE},         /* LAST */
+
+       { 0x0d, KEY_PLAY},              /* PLAY */
+       { 0x1e, KEY_CAMERA},            /* SNAPSHOT */
+       { 0x1a, KEY_RECORD},            /* RECORD */
+       { 0x17, KEY_STOP},              /* STOP */
+
+       { 0x1f, KEY_UP},                /* UP */
+       { 0x44, KEY_DOWN},              /* DOWN */
+       { 0x46, KEY_TAB},               /* BACK */
+       { 0x4a, KEY_ZOOM},              /* FULLSECREEN */
+
+       { 0x10, KEY_VOLUMEUP},          /* VOLUMEUP */
+       { 0x11, KEY_VOLUMEDOWN},        /* VOLUMEDOWN */
+       { 0x12, KEY_CHANNELUP},         /* CHANNELUP */
+       { 0x13, KEY_CHANNELDOWN},       /* CHANNELDOWN */
+       { 0x15, KEY_ENTER},             /* OK */
+};
+struct ir_scancode_table ir_codes_gadmei_rm008z_table = {
+       .scan = ir_codes_gadmei_rm008z,
+       .size = ARRAY_SIZE(ir_codes_gadmei_rm008z),
+};
+EXPORT_SYMBOL_GPL(ir_codes_gadmei_rm008z_table);
+
+/*************************************************************
+ *             COMPLETE SCANCODE TABLES
+ * Instead of just a partial scancode, the tables bellow
+ * contains the complete scancode and the receiver protocol
+ *************************************************************/
+
+/*
+ * Hauppauge:the newer, gray remotes (seems there are multiple
+ * slightly different versions), shipped with cx88+ivtv cards.
+ *
+ * This table contains the complete RC5 code, instead of just the data part
+ */
+static struct ir_scancode ir_codes_rc5_hauppauge_new[] = {
+       /* Keys 0 to 9 */
+       { 0x1e00, KEY_0 },
+       { 0x1e01, KEY_1 },
+       { 0x1e02, KEY_2 },
+       { 0x1e03, KEY_3 },
+       { 0x1e04, KEY_4 },
+       { 0x1e05, KEY_5 },
+       { 0x1e06, KEY_6 },
+       { 0x1e07, KEY_7 },
+       { 0x1e08, KEY_8 },
+       { 0x1e09, KEY_9 },
+
+       { 0x1e0a, KEY_TEXT },           /* keypad asterisk as well */
+       { 0x1e0b, KEY_RED },            /* red button */
+       { 0x1e0c, KEY_RADIO },
+       { 0x1e0d, KEY_MENU },
+       { 0x1e0e, KEY_SUBTITLE },               /* also the # key */
+       { 0x1e0f, KEY_MUTE },
+       { 0x1e10, KEY_VOLUMEUP },
+       { 0x1e11, KEY_VOLUMEDOWN },
+       { 0x1e12, KEY_PREVIOUS },               /* previous channel */
+       { 0x1e14, KEY_UP },
+       { 0x1e15, KEY_DOWN },
+       { 0x1e16, KEY_LEFT },
+       { 0x1e17, KEY_RIGHT },
+       { 0x1e18, KEY_VIDEO },          /* Videos */
+       { 0x1e19, KEY_AUDIO },          /* Music */
+       /* 0x1e1a: Pictures - presume this means
+          "Multimedia Home Platform" -
+          no "PICTURES" key in input.h
+        */
+       { 0x1e1a, KEY_MHP },
+
+       { 0x1e1b, KEY_EPG },            /* Guide */
+       { 0x1e1c, KEY_TV },
+       { 0x1e1e, KEY_NEXTSONG },               /* skip >| */
+       { 0x1e1f, KEY_EXIT },           /* back/exit */
+       { 0x1e20, KEY_CHANNELUP },      /* channel / program + */
+       { 0x1e21, KEY_CHANNELDOWN },    /* channel / program - */
+       { 0x1e22, KEY_CHANNEL },                /* source (old black remote) */
+       { 0x1e24, KEY_PREVIOUSSONG },   /* replay |< */
+       { 0x1e25, KEY_ENTER },          /* OK */
+       { 0x1e26, KEY_SLEEP },          /* minimize (old black remote) */
+       { 0x1e29, KEY_BLUE },           /* blue key */
+       { 0x1e2e, KEY_GREEN },          /* green button */
+       { 0x1e30, KEY_PAUSE },          /* pause */
+       { 0x1e32, KEY_REWIND },         /* backward << */
+       { 0x1e34, KEY_FASTFORWARD },    /* forward >> */
+       { 0x1e35, KEY_PLAY },
+       { 0x1e36, KEY_STOP },
+       { 0x1e37, KEY_RECORD },         /* recording */
+       { 0x1e38, KEY_YELLOW },         /* yellow key */
+       { 0x1e3b, KEY_SELECT },         /* top right button */
+       { 0x1e3c, KEY_ZOOM },           /* full */
+       { 0x1e3d, KEY_POWER },          /* system power (green button) */
+};
+
+struct ir_scancode_table ir_codes_rc5_hauppauge_new_table = {
+       .scan = ir_codes_rc5_hauppauge_new,
+       .size = ARRAY_SIZE(ir_codes_rc5_hauppauge_new),
+       .ir_type = IR_TYPE_RC5,
+};
+EXPORT_SYMBOL_GPL(ir_codes_rc5_hauppauge_new_table);
+
+/* Terratec Cinergy Hybrid T USB XS FM
+   Mauro Carvalho Chehab <mchehab@redhat.com>
+ */
+static struct ir_scancode ir_codes_nec_terratec_cinergy_xs[] = {
+       { 0x1441, KEY_HOME},
+       { 0x1401, KEY_POWER2},
+
+       { 0x1442, KEY_MENU},            /* DVD menu */
+       { 0x1443, KEY_SUBTITLE},
+       { 0x1444, KEY_TEXT},            /* Teletext */
+       { 0x1445, KEY_DELETE},
+
+       { 0x1402, KEY_1},
+       { 0x1403, KEY_2},
+       { 0x1404, KEY_3},
+       { 0x1405, KEY_4},
+       { 0x1406, KEY_5},
+       { 0x1407, KEY_6},
+       { 0x1408, KEY_7},
+       { 0x1409, KEY_8},
+       { 0x140a, KEY_9},
+       { 0x140c, KEY_0},
+
+       { 0x140b, KEY_TUNER},           /* AV */
+       { 0x140d, KEY_MODE},            /* A.B */
+
+       { 0x1446, KEY_TV},
+       { 0x1447, KEY_DVD},
+       { 0x1449, KEY_VIDEO},
+       { 0x144a, KEY_RADIO},           /* Music */
+       { 0x144b, KEY_CAMERA},          /* PIC */
+
+       { 0x1410, KEY_UP},
+       { 0x1411, KEY_LEFT},
+       { 0x1412, KEY_OK},
+       { 0x1413, KEY_RIGHT},
+       { 0x1414, KEY_DOWN},
+
+       { 0x140f, KEY_EPG},
+       { 0x1416, KEY_INFO},
+       { 0x144d, KEY_BACKSPACE},
+
+       { 0x141c, KEY_VOLUMEUP},
+       { 0x141e, KEY_VOLUMEDOWN},
+
+       { 0x144c, KEY_PLAY},
+       { 0x141d, KEY_MUTE},
+
+       { 0x141b, KEY_CHANNELUP},
+       { 0x141f, KEY_CHANNELDOWN},
+
+       { 0x1417, KEY_RED},
+       { 0x1418, KEY_GREEN},
+       { 0x1419, KEY_YELLOW},
+       { 0x141a, KEY_BLUE},
+
+       { 0x1458, KEY_RECORD},
+       { 0x1448, KEY_STOP},
+       { 0x1440, KEY_PAUSE},
+
+       { 0x1454, KEY_LAST},
+       { 0x144e, KEY_REWIND},
+       { 0x144f, KEY_FASTFORWARD},
+       { 0x145c, KEY_NEXT},
+};
+struct ir_scancode_table ir_codes_nec_terratec_cinergy_xs_table = {
+       .scan = ir_codes_nec_terratec_cinergy_xs,
+       .size = ARRAY_SIZE(ir_codes_nec_terratec_cinergy_xs),
+       .ir_type = IR_TYPE_NEC,
+};
+EXPORT_SYMBOL_GPL(ir_codes_nec_terratec_cinergy_xs_table);
+
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c
new file mode 100644 (file)
index 0000000..99ed2de
--- /dev/null
@@ -0,0 +1,433 @@
+/* ir-register.c - handle IR scancode->keycode tables
+ *
+ * Copyright (C) 2009 by Mauro Carvalho Chehab <mchehab@redhat.com>
+ */
+
+#include <linux/usb/input.h>
+
+#include <media/ir-common.h>
+
+#define IR_TAB_MIN_SIZE        32
+#define IR_TAB_MAX_SIZE        1024
+
+
+/**
+ * ir_seek_table() - returns the element order on the table
+ * @rc_tab:    the ir_scancode_table with the keymap to be used
+ * @scancode:  the scancode that we're seeking
+ *
+ * This routine is used by the input routines when a key is pressed at the
+ * IR. The scancode is received and needs to be converted into a keycode.
+ * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the
+ * corresponding keycode from the table.
+ */
+static int ir_seek_table(struct ir_scancode_table *rc_tab, u32 scancode)
+{
+       int rc;
+       unsigned long flags;
+       struct ir_scancode *keymap = rc_tab->scan;
+
+       spin_lock_irqsave(&rc_tab->lock, flags);
+
+       /* FIXME: replace it by a binary search */
+
+       for (rc = 0; rc < rc_tab->size; rc++)
+               if (keymap[rc].scancode == scancode)
+                       goto exit;
+
+       /* Not found */
+       rc = -EINVAL;
+
+exit:
+       spin_unlock_irqrestore(&rc_tab->lock, flags);
+       return rc;
+}
+
+/**
+ * ir_roundup_tablesize() - gets an optimum value for the table size
+ * @n_elems:           minimum number of entries to store keycodes
+ *
+ * This routine is used to choose the keycode table size.
+ *
+ * In order to have some empty space for new keycodes,
+ * and knowing in advance that kmalloc allocates only power of two
+ * segments, it optimizes the allocated space to have some spare space
+ * for those new keycodes by using the maximum number of entries that
+ * will be effectively be allocated by kmalloc.
+ * In order to reduce the quantity of table resizes, it has a minimum
+ * table size of IR_TAB_MIN_SIZE.
+ */
+int ir_roundup_tablesize(int n_elems)
+{
+       size_t size;
+
+       if (n_elems < IR_TAB_MIN_SIZE)
+               n_elems = IR_TAB_MIN_SIZE;
+
+       /*
+        * As kmalloc only allocates sizes of power of two, get as
+        * much entries as possible for the allocated memory segment
+        */
+       size = roundup_pow_of_two(n_elems * sizeof(struct ir_scancode));
+       n_elems = size / sizeof(struct ir_scancode);
+
+       return n_elems;
+}
+
+/**
+ * ir_copy_table() - copies a keytable, discarding the unused entries
+ * @destin:    destin table
+ * @origin:    origin table
+ *
+ * Copies all entries where the keycode is not KEY_UNKNOWN/KEY_RESERVED
+ */
+
+int ir_copy_table(struct ir_scancode_table *destin,
+                const struct ir_scancode_table *origin)
+{
+       int i, j = 0;
+
+       for (i = 0; i < origin->size; i++) {
+               if (origin->scan[i].keycode == KEY_UNKNOWN ||
+                  origin->scan[i].keycode == KEY_RESERVED)
+                       continue;
+
+               memcpy(&destin->scan[j], &origin->scan[i], sizeof(struct ir_scancode));
+               j++;
+       }
+       destin->size = j;
+
+       IR_dprintk(1, "Copied %d scancodes to the new keycode table\n", destin->size);
+
+       return 0;
+}
+
+/**
+ * ir_getkeycode() - get a keycode at the evdev scancode ->keycode table
+ * @dev:       the struct input_dev device descriptor
+ * @scancode:  the desired scancode
+ * @keycode:   the keycode to be retorned.
+ *
+ * This routine is used to handle evdev EVIOCGKEY ioctl.
+ * If the key is not found, returns -EINVAL, otherwise, returns 0.
+ */
+static int ir_getkeycode(struct input_dev *dev,
+                        int scancode, int *keycode)
+{
+       int elem;
+       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
+
+       elem = ir_seek_table(rc_tab, scancode);
+       if (elem >= 0) {
+               *keycode = rc_tab->scan[elem].keycode;
+               return 0;
+       }
+
+       /*
+        * Scancode not found and table can't be expanded
+        */
+       if (elem < 0 && rc_tab->size == IR_TAB_MAX_SIZE)
+               return -EINVAL;
+
+       /*
+        * If is there extra space, returns KEY_RESERVED,
+        * otherwise, input core won't let ir_setkeycode to work
+        */
+       *keycode = KEY_RESERVED;
+       return 0;
+}
+
+
+/**
+ * ir_is_resize_needed() - Check if the table needs rezise
+ * @table:             keycode table that may need to resize
+ * @n_elems:           minimum number of entries to store keycodes
+ *
+ * Considering that kmalloc uses power of two storage areas, this
+ * routine detects if the real alloced size will change. If not, it
+ * just returns without doing nothing. Otherwise, it will extend or
+ * reduce the table size to meet the new needs.
+ *
+ * It returns 0 if no resize is needed, 1 otherwise.
+ */
+static int ir_is_resize_needed(struct ir_scancode_table *table, int n_elems)
+{
+       int cur_size = ir_roundup_tablesize(table->size);
+       int new_size = ir_roundup_tablesize(n_elems);
+
+       if (cur_size == new_size)
+               return 0;
+
+       /* Resize is needed */
+       return 1;
+}
+
+/**
+ * ir_delete_key() - remove a keycode from the table
+ * @rc_tab:            keycode table
+ * @elem:              element to be removed
+ *
+ */
+static void ir_delete_key(struct ir_scancode_table *rc_tab, int elem)
+{
+       unsigned long flags = 0;
+       int newsize = rc_tab->size - 1;
+       int resize = ir_is_resize_needed(rc_tab, newsize);
+       struct ir_scancode *oldkeymap = rc_tab->scan;
+       struct ir_scancode *newkeymap;
+
+       if (resize) {
+               newkeymap = kzalloc(ir_roundup_tablesize(newsize) *
+                                   sizeof(*newkeymap), GFP_ATOMIC);
+
+               /* There's no memory for resize. Keep the old table */
+               if (!newkeymap)
+                       resize = 0;
+       }
+
+       if (!resize) {
+               newkeymap = oldkeymap;
+
+               /* We'll modify the live table. Lock it */
+               spin_lock_irqsave(&rc_tab->lock, flags);
+       }
+
+       /*
+        * Copy the elements before the one that will be deleted
+        * if (!resize), both oldkeymap and newkeymap points
+        * to the same place, so, there's no need to copy
+        */
+       if (resize && elem > 0)
+               memcpy(newkeymap, oldkeymap,
+                      elem * sizeof(*newkeymap));
+
+       /*
+        * Copy the other elements overwriting the element to be removed
+        * This operation applies to both resize and non-resize case
+        */
+       if (elem < newsize)
+               memcpy(&newkeymap[elem], &oldkeymap[elem + 1],
+                      (newsize - elem) * sizeof(*newkeymap));
+
+       if (resize) {
+               /*
+                * As the copy happened to a temporary table, only here
+                * it needs to lock while replacing the table pointers
+                * to use the new table
+                */
+               spin_lock_irqsave(&rc_tab->lock, flags);
+               rc_tab->size = newsize;
+               rc_tab->scan = newkeymap;
+               spin_unlock_irqrestore(&rc_tab->lock, flags);
+
+               /* Frees the old keytable */
+               kfree(oldkeymap);
+       } else {
+               rc_tab->size = newsize;
+               spin_unlock_irqrestore(&rc_tab->lock, flags);
+       }
+}
+
+/**
+ * ir_insert_key() - insert a keycode at the table
+ * @rc_tab:            keycode table
+ * @scancode:  the desired scancode
+ * @keycode:   the keycode to be retorned.
+ *
+ */
+static int ir_insert_key(struct ir_scancode_table *rc_tab,
+                         int scancode, int keycode)
+{
+       unsigned long flags;
+       int elem = rc_tab->size;
+       int newsize = rc_tab->size + 1;
+       int resize = ir_is_resize_needed(rc_tab, newsize);
+       struct ir_scancode *oldkeymap = rc_tab->scan;
+       struct ir_scancode *newkeymap;
+
+       if (resize) {
+               newkeymap = kzalloc(ir_roundup_tablesize(newsize) *
+                                   sizeof(*newkeymap), GFP_ATOMIC);
+               if (!newkeymap)
+                       return -ENOMEM;
+
+               memcpy(newkeymap, oldkeymap,
+                      rc_tab->size * sizeof(*newkeymap));
+       } else
+               newkeymap  = oldkeymap;
+
+       /* Stores the new code at the table */
+       IR_dprintk(1, "#%d: New scan 0x%04x with key 0x%04x\n",
+                  rc_tab->size, scancode, keycode);
+
+       spin_lock_irqsave(&rc_tab->lock, flags);
+       rc_tab->size = newsize;
+       if (resize) {
+               rc_tab->scan = newkeymap;
+               kfree(oldkeymap);
+       }
+       newkeymap[elem].scancode = scancode;
+       newkeymap[elem].keycode  = keycode;
+       spin_unlock_irqrestore(&rc_tab->lock, flags);
+
+       return 0;
+}
+
+/**
+ * ir_setkeycode() - set a keycode at the evdev scancode ->keycode table
+ * @dev:       the struct input_dev device descriptor
+ * @scancode:  the desired scancode
+ * @keycode:   the keycode to be retorned.
+ *
+ * This routine is used to handle evdev EVIOCSKEY ioctl.
+ * There's one caveat here: how can we increase the size of the table?
+ * If the key is not found, returns -EINVAL, otherwise, returns 0.
+ */
+static int ir_setkeycode(struct input_dev *dev,
+                        int scancode, int keycode)
+{
+       int rc = 0;
+       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
+       struct ir_scancode *keymap = rc_tab->scan;
+       unsigned long flags;
+
+       /*
+        * Handle keycode table deletions
+        *
+        * If userspace is adding a KEY_UNKNOWN or KEY_RESERVED,
+        * deal as a trial to remove an existing scancode attribution
+        * if table become too big, reduce it to save space
+        */
+       if (keycode == KEY_UNKNOWN || keycode == KEY_RESERVED) {
+               rc = ir_seek_table(rc_tab, scancode);
+               if (rc < 0)
+                       return 0;
+
+               IR_dprintk(1, "#%d: Deleting scan 0x%04x\n", rc, scancode);
+               clear_bit(keymap[rc].keycode, dev->keybit);
+               ir_delete_key(rc_tab, rc);
+
+               return 0;
+       }
+
+       /*
+        * Handle keycode replacements
+        *
+        * If the scancode exists, just replace by the new value
+        */
+       rc = ir_seek_table(rc_tab, scancode);
+       if (rc >= 0) {
+               IR_dprintk(1, "#%d: Replacing scan 0x%04x with key 0x%04x\n",
+                       rc, scancode, keycode);
+
+               clear_bit(keymap[rc].keycode, dev->keybit);
+
+               spin_lock_irqsave(&rc_tab->lock, flags);
+               keymap[rc].keycode = keycode;
+               spin_unlock_irqrestore(&rc_tab->lock, flags);
+
+               set_bit(keycode, dev->keybit);
+
+               return 0;
+       }
+
+       /*
+        * Handle new scancode inserts
+        *
+        * reallocate table if needed and insert a new keycode
+        */
+
+       /* Avoid growing the table indefinitely */
+       if (rc_tab->size + 1 > IR_TAB_MAX_SIZE)
+               return -EINVAL;
+
+       rc = ir_insert_key(rc_tab, scancode, keycode);
+       if (rc < 0)
+               return rc;
+       set_bit(keycode, dev->keybit);
+
+       return 0;
+}
+
+/**
+ * ir_g_keycode_from_table() - gets the keycode that corresponds to a scancode
+ * @input_dev: the struct input_dev descriptor of the device
+ * @scancode:  the scancode that we're seeking
+ *
+ * This routine is used by the input routines when a key is pressed at the
+ * IR. The scancode is received and needs to be converted into a keycode.
+ * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the
+ * corresponding keycode from the table.
+ */
+u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode)
+{
+       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
+       struct ir_scancode *keymap = rc_tab->scan;
+       int elem;
+
+       elem = ir_seek_table(rc_tab, scancode);
+       if (elem >= 0) {
+               IR_dprintk(1, "%s: scancode 0x%04x keycode 0x%02x\n",
+                          dev->name, scancode, keymap[elem].keycode);
+
+               return rc_tab->scan[elem].keycode;
+       }
+
+       printk(KERN_INFO "%s: unknown key for scancode 0x%04x\n",
+              dev->name, scancode);
+
+       /* Reports userspace that an unknown keycode were got */
+       return KEY_RESERVED;
+}
+
+/**
+ * ir_set_keycode_table() - sets the IR keycode table and add the handlers
+ *                         for keymap table get/set
+ * @input_dev: the struct input_dev descriptor of the device
+ * @rc_tab:    the struct ir_scancode_table table of scancode/keymap
+ *
+ * This routine is used to initialize the input infrastructure to work with
+ * an IR.
+ * It should be called before registering the IR device.
+ */
+int ir_set_keycode_table(struct input_dev *input_dev,
+                        struct ir_scancode_table *rc_tab)
+{
+       struct ir_scancode *keymap = rc_tab->scan;
+       int i;
+
+       spin_lock_init(&rc_tab->lock);
+
+       if (rc_tab->scan == NULL || !rc_tab->size)
+               return -EINVAL;
+
+       /* set the bits for the keys */
+       IR_dprintk(1, "key map size: %d\n", rc_tab->size);
+       for (i = 0; i < rc_tab->size; i++) {
+               IR_dprintk(1, "#%d: setting bit for keycode 0x%04x\n",
+                       i, keymap[i].keycode);
+               set_bit(keymap[i].keycode, input_dev->keybit);
+       }
+
+       input_dev->getkeycode = ir_getkeycode;
+       input_dev->setkeycode = ir_setkeycode;
+       input_set_drvdata(input_dev, rc_tab);
+
+       return 0;
+}
+
+void ir_input_free(struct input_dev *dev)
+{
+       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
+
+       if (!rc_tab)
+               return;
+
+       IR_dprintk(1, "Freed keycode table\n");
+
+       rc_tab->size = 0;
+       kfree(rc_tab->scan);
+       rc_tab->scan = NULL;
+}
+EXPORT_SYMBOL_GPL(ir_input_free);
+
index ba69beeb0e21a850aab9d1a49b11c409b332f44e..a28541b2b1a219e5a2804f20201191f1ff98c953 100644 (file)
@@ -99,6 +99,7 @@ config VIDEO_MEDIA
 comment "Multimedia drivers"
 
 source "drivers/media/common/Kconfig"
+source "drivers/media/IR/Kconfig"
 
 #
 # Tuner drivers for DVB and V4L
index 09a829d8a7e71a4b7b0b5de035f7034d1748e82d..499b0810d01984f465b23ac1d490abcb30258156 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the kernel multimedia device drivers.
 #
 
-obj-y += common/ video/
+obj-y += common/ IR/ video/
 
 obj-$(CONFIG_VIDEO_DEV) += radio/
 obj-$(CONFIG_DVB_CORE)  += dvb/
index 169b337b7c9df6c16083995129ec7ce20683aa0c..e3ec9639321b750ab10d953899e843687adc0cc3 100644 (file)
@@ -1,8 +1,6 @@
 saa7146-objs    := saa7146_i2c.o saa7146_core.o
 saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
-ir-common-objs  := ir-functions.o ir-keymaps.o ir-keytable.o
 
 obj-y += tuners/
 obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
 obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
-obj-$(CONFIG_VIDEO_IR) += ir-common.o
diff --git a/drivers/media/common/ir-functions.c b/drivers/media/common/ir-functions.c
deleted file mode 100644 (file)
index e616f62..0000000
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- *
- * some common structs and functions to handle infrared remotes via
- * input layer ...
- *
- * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/jiffies.h>
-#include <media/ir-common.h>
-
-/* -------------------------------------------------------------------------- */
-
-MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
-MODULE_LICENSE("GPL");
-
-static int repeat = 1;
-module_param(repeat, int, 0444);
-MODULE_PARM_DESC(repeat,"auto-repeat for IR keys (default: on)");
-
-int media_ir_debug;    /* media_ir_debug level (0,1,2) */
-module_param_named(debug, media_ir_debug, int, 0644);
-
-/* -------------------------------------------------------------------------- */
-
-static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
-{
-       if (KEY_RESERVED == ir->keycode) {
-               printk(KERN_INFO "%s: unknown key: key=0x%02x down=%d\n",
-                      dev->name, ir->ir_key, ir->keypressed);
-               return;
-       }
-       IR_dprintk(1,"%s: key event code=%d down=%d\n",
-               dev->name,ir->keycode,ir->keypressed);
-       input_report_key(dev,ir->keycode,ir->keypressed);
-       input_sync(dev);
-}
-
-/* -------------------------------------------------------------------------- */
-
-int ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
-                  int ir_type, struct ir_scancode_table *ir_codes)
-{
-       ir->ir_type = ir_type;
-
-       ir->keytable.size = ir_roundup_tablesize(ir_codes->size);
-       ir->keytable.scan = kzalloc(ir->keytable.size *
-                                   sizeof(struct ir_scancode), GFP_KERNEL);
-       if (!ir->keytable.scan)
-               return -ENOMEM;
-
-       IR_dprintk(1, "Allocated space for %d keycode entries (%zd bytes)\n",
-               ir->keytable.size,
-               ir->keytable.size * sizeof(ir->keytable.scan));
-
-       ir_copy_table(&ir->keytable, ir_codes);
-       ir_set_keycode_table(dev, &ir->keytable);
-
-       clear_bit(0, dev->keybit);
-       set_bit(EV_KEY, dev->evbit);
-       if (repeat)
-               set_bit(EV_REP, dev->evbit);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(ir_input_init);
-
-
-void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir)
-{
-       if (ir->keypressed) {
-               ir->keypressed = 0;
-               ir_input_key_event(dev,ir);
-       }
-}
-EXPORT_SYMBOL_GPL(ir_input_nokey);
-
-void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
-                     u32 ir_key)
-{
-       u32 keycode = ir_g_keycode_from_table(dev, ir_key);
-
-       if (ir->keypressed && ir->keycode != keycode) {
-               ir->keypressed = 0;
-               ir_input_key_event(dev,ir);
-       }
-       if (!ir->keypressed) {
-               ir->ir_key  = ir_key;
-               ir->keycode = keycode;
-               ir->keypressed = 1;
-               ir_input_key_event(dev,ir);
-       }
-}
-EXPORT_SYMBOL_GPL(ir_input_keydown);
-
-/* -------------------------------------------------------------------------- */
-/* extract mask bits out of data and pack them into the result */
-u32 ir_extract_bits(u32 data, u32 mask)
-{
-       u32 vbit = 1, value = 0;
-
-       do {
-           if (mask&1) {
-               if (data&1)
-                       value |= vbit;
-               vbit<<=1;
-           }
-           data>>=1;
-       } while (mask>>=1);
-
-       return value;
-}
-EXPORT_SYMBOL_GPL(ir_extract_bits);
-
-static int inline getbit(u32 *samples, int bit)
-{
-       return (samples[bit/32] & (1 << (31-(bit%32)))) ? 1 : 0;
-}
-
-/* sump raw samples for visual debugging ;) */
-int ir_dump_samples(u32 *samples, int count)
-{
-       int i, bit, start;
-
-       printk(KERN_DEBUG "ir samples: ");
-       start = 0;
-       for (i = 0; i < count * 32; i++) {
-               bit = getbit(samples,i);
-               if (bit)
-                       start = 1;
-               if (0 == start)
-                       continue;
-               printk("%s", bit ? "#" : "_");
-       }
-       printk("\n");
-       return 0;
-}
-EXPORT_SYMBOL_GPL(ir_dump_samples);
-
-/* decode raw samples, pulse distance coding used by NEC remotes */
-int ir_decode_pulsedistance(u32 *samples, int count, int low, int high)
-{
-       int i,last,bit,len;
-       u32 curBit;
-       u32 value;
-
-       /* find start burst */
-       for (i = len = 0; i < count * 32; i++) {
-               bit = getbit(samples,i);
-               if (bit) {
-                       len++;
-               } else {
-                       if (len >= 29)
-                               break;
-                       len = 0;
-               }
-       }
-
-       /* start burst to short */
-       if (len < 29)
-               return 0xffffffff;
-
-       /* find start silence */
-       for (len = 0; i < count * 32; i++) {
-               bit = getbit(samples,i);
-               if (bit) {
-                       break;
-               } else {
-                       len++;
-               }
-       }
-
-       /* silence to short */
-       if (len < 7)
-               return 0xffffffff;
-
-       /* go decoding */
-       len   = 0;
-       last = 1;
-       value = 0; curBit = 1;
-       for (; i < count * 32; i++) {
-               bit  = getbit(samples,i);
-               if (last) {
-                       if(bit) {
-                               continue;
-                       } else {
-                               len = 1;
-                       }
-               } else {
-                       if (bit) {
-                               if (len > (low + high) /2)
-                                       value |= curBit;
-                               curBit <<= 1;
-                               if (curBit == 1)
-                                       break;
-                       } else {
-                               len++;
-                       }
-               }
-               last = bit;
-       }
-
-       return value;
-}
-EXPORT_SYMBOL_GPL(ir_decode_pulsedistance);
-
-/* decode raw samples, biphase coding, used by rc5 for example */
-int ir_decode_biphase(u32 *samples, int count, int low, int high)
-{
-       int i,last,bit,len,flips;
-       u32 value;
-
-       /* find start bit (1) */
-       for (i = 0; i < 32; i++) {
-               bit = getbit(samples,i);
-               if (bit)
-                       break;
-       }
-
-       /* go decoding */
-       len   = 0;
-       flips = 0;
-       value = 1;
-       for (; i < count * 32; i++) {
-               if (len > high)
-                       break;
-               if (flips > 1)
-                       break;
-               last = bit;
-               bit  = getbit(samples,i);
-               if (last == bit) {
-                       len++;
-                       continue;
-               }
-               if (len < low) {
-                       len++;
-                       flips++;
-                       continue;
-               }
-               value <<= 1;
-               value |= bit;
-               flips = 0;
-               len   = 1;
-       }
-       return value;
-}
-EXPORT_SYMBOL_GPL(ir_decode_biphase);
-
-/* RC5 decoding stuff, moved from bttv-input.c to share it with
- * saa7134 */
-
-/* decode raw bit pattern to RC5 code */
-u32 ir_rc5_decode(unsigned int code)
-{
-       unsigned int org_code = code;
-       unsigned int pair;
-       unsigned int rc5 = 0;
-       int i;
-
-       for (i = 0; i < 14; ++i) {
-               pair = code & 0x3;
-               code >>= 2;
-
-               rc5 <<= 1;
-               switch (pair) {
-               case 0:
-               case 2:
-                       break;
-               case 1:
-                       rc5 |= 1;
-                       break;
-               case 3:
-                       IR_dprintk(1, "ir-common: ir_rc5_decode(%x) bad code\n", org_code);
-                       return 0;
-               }
-       }
-       IR_dprintk(1, "ir-common: code=%x, rc5=%x, start=%x, toggle=%x, address=%x, "
-               "instr=%x\n", rc5, org_code, RC5_START(rc5),
-               RC5_TOGGLE(rc5), RC5_ADDR(rc5), RC5_INSTR(rc5));
-       return rc5;
-}
-EXPORT_SYMBOL_GPL(ir_rc5_decode);
-
-void ir_rc5_timer_end(unsigned long data)
-{
-       struct card_ir *ir = (struct card_ir *)data;
-       struct timeval tv;
-       unsigned long current_jiffies, timeout;
-       u32 gap;
-       u32 rc5 = 0;
-
-       /* get time */
-       current_jiffies = jiffies;
-       do_gettimeofday(&tv);
-
-       /* avoid overflow with gap >1s */
-       if (tv.tv_sec - ir->base_time.tv_sec > 1) {
-               gap = 200000;
-       } else {
-               gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
-                   tv.tv_usec - ir->base_time.tv_usec;
-       }
-
-       /* signal we're ready to start a new code */
-       ir->active = 0;
-
-       /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */
-       if (gap < 28000) {
-               IR_dprintk(1, "ir-common: spurious timer_end\n");
-               return;
-       }
-
-       if (ir->last_bit < 20) {
-               /* ignore spurious codes (caused by light/other remotes) */
-               IR_dprintk(1, "ir-common: short code: %x\n", ir->code);
-       } else {
-               ir->code = (ir->code << ir->shift_by) | 1;
-               rc5 = ir_rc5_decode(ir->code);
-
-               /* two start bits? */
-               if (RC5_START(rc5) != ir->start) {
-                       IR_dprintk(1, "ir-common: rc5 start bits invalid: %u\n", RC5_START(rc5));
-
-                       /* right address? */
-               } else if (RC5_ADDR(rc5) == ir->addr) {
-                       u32 toggle = RC5_TOGGLE(rc5);
-                       u32 instr = RC5_INSTR(rc5);
-
-                       /* Good code, decide if repeat/repress */
-                       if (toggle != RC5_TOGGLE(ir->last_rc5) ||
-                           instr != RC5_INSTR(ir->last_rc5)) {
-                               IR_dprintk(1, "ir-common: instruction %x, toggle %x\n", instr,
-                                       toggle);
-                               ir_input_nokey(ir->dev, &ir->ir);
-                               ir_input_keydown(ir->dev, &ir->ir, instr);
-                       }
-
-                       /* Set/reset key-up timer */
-                       timeout = current_jiffies +
-                                 msecs_to_jiffies(ir->rc5_key_timeout);
-                       mod_timer(&ir->timer_keyup, timeout);
-
-                       /* Save code for repeat test */
-                       ir->last_rc5 = rc5;
-               }
-       }
-}
-EXPORT_SYMBOL_GPL(ir_rc5_timer_end);
-
-void ir_rc5_timer_keyup(unsigned long data)
-{
-       struct card_ir *ir = (struct card_ir *)data;
-
-       IR_dprintk(1, "ir-common: key released\n");
-       ir_input_nokey(ir->dev, &ir->ir);
-}
-EXPORT_SYMBOL_GPL(ir_rc5_timer_keyup);
diff --git a/drivers/media/common/ir-keymaps.c b/drivers/media/common/ir-keymaps.c
deleted file mode 100644 (file)
index 9bbe6b1..0000000
+++ /dev/null
@@ -1,3395 +0,0 @@
-/*
-    Keytables for supported remote controls, used on drivers/media
-    devices.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- * NOTICE FOR DEVELOPERS:
- *   The IR mappings should be as close as possible to what's
- *   specified at:
- *      http://linuxtv.org/wiki/index.php/Remote_Controllers
- */
-#include <linux/module.h>
-
-#include <linux/input.h>
-#include <media/ir-common.h>
-
-/* empty keytable, can be used as placeholder for not-yet created keytables */
-static struct ir_scancode ir_codes_empty[] = {
-       { 0x2a, KEY_COFFEE },
-};
-
-struct ir_scancode_table ir_codes_empty_table = {
-       .scan = ir_codes_empty,
-       .size = ARRAY_SIZE(ir_codes_empty),
-};
-EXPORT_SYMBOL_GPL(ir_codes_empty_table);
-
-/* Michal Majchrowicz <mmajchrowicz@gmail.com> */
-static struct ir_scancode ir_codes_proteus_2309[] = {
-       /* numeric */
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x5c, KEY_POWER },            /* power       */
-       { 0x20, KEY_ZOOM },             /* full screen */
-       { 0x0f, KEY_BACKSPACE },        /* recall      */
-       { 0x1b, KEY_ENTER },            /* mute        */
-       { 0x41, KEY_RECORD },           /* record      */
-       { 0x43, KEY_STOP },             /* stop        */
-       { 0x16, KEY_S },
-       { 0x1a, KEY_POWER2 },           /* off         */
-       { 0x2e, KEY_RED },
-       { 0x1f, KEY_CHANNELDOWN },      /* channel -   */
-       { 0x1c, KEY_CHANNELUP },        /* channel +   */
-       { 0x10, KEY_VOLUMEDOWN },       /* volume -    */
-       { 0x1e, KEY_VOLUMEUP },         /* volume +    */
-       { 0x14, KEY_F1 },
-};
-
-struct ir_scancode_table ir_codes_proteus_2309_table = {
-       .scan = ir_codes_proteus_2309,
-       .size = ARRAY_SIZE(ir_codes_proteus_2309),
-};
-EXPORT_SYMBOL_GPL(ir_codes_proteus_2309_table);
-
-/* Matt Jesson <dvb@jesson.eclipse.co.uk */
-static struct ir_scancode ir_codes_avermedia_dvbt[] = {
-       { 0x28, KEY_0 },                /* '0' / 'enter' */
-       { 0x22, KEY_1 },                /* '1' */
-       { 0x12, KEY_2 },                /* '2' / 'up arrow' */
-       { 0x32, KEY_3 },                /* '3' */
-       { 0x24, KEY_4 },                /* '4' / 'left arrow' */
-       { 0x14, KEY_5 },                /* '5' */
-       { 0x34, KEY_6 },                /* '6' / 'right arrow' */
-       { 0x26, KEY_7 },                /* '7' */
-       { 0x16, KEY_8 },                /* '8' / 'down arrow' */
-       { 0x36, KEY_9 },                /* '9' */
-
-       { 0x20, KEY_LIST },             /* 'source' */
-       { 0x10, KEY_TEXT },             /* 'teletext' */
-       { 0x00, KEY_POWER },            /* 'power' */
-       { 0x04, KEY_AUDIO },            /* 'audio' */
-       { 0x06, KEY_ZOOM },             /* 'full screen' */
-       { 0x18, KEY_VIDEO },            /* 'display' */
-       { 0x38, KEY_SEARCH },           /* 'loop' */
-       { 0x08, KEY_INFO },             /* 'preview' */
-       { 0x2a, KEY_REWIND },           /* 'backward <<' */
-       { 0x1a, KEY_FASTFORWARD },      /* 'forward >>' */
-       { 0x3a, KEY_RECORD },           /* 'capture' */
-       { 0x0a, KEY_MUTE },             /* 'mute' */
-       { 0x2c, KEY_RECORD },           /* 'record' */
-       { 0x1c, KEY_PAUSE },            /* 'pause' */
-       { 0x3c, KEY_STOP },             /* 'stop' */
-       { 0x0c, KEY_PLAY },             /* 'play' */
-       { 0x2e, KEY_RED },              /* 'red' */
-       { 0x01, KEY_BLUE },             /* 'blue' / 'cancel' */
-       { 0x0e, KEY_YELLOW },           /* 'yellow' / 'ok' */
-       { 0x21, KEY_GREEN },            /* 'green' */
-       { 0x11, KEY_CHANNELDOWN },      /* 'channel -' */
-       { 0x31, KEY_CHANNELUP },        /* 'channel +' */
-       { 0x1e, KEY_VOLUMEDOWN },       /* 'volume -' */
-       { 0x3e, KEY_VOLUMEUP },         /* 'volume +' */
-};
-
-struct ir_scancode_table ir_codes_avermedia_dvbt_table = {
-       .scan = ir_codes_avermedia_dvbt,
-       .size = ARRAY_SIZE(ir_codes_avermedia_dvbt),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt_table);
-
-/* Mauro Carvalho Chehab <mchehab@infradead.org> */
-static struct ir_scancode ir_codes_avermedia_m135a[] = {
-       { 0x00, KEY_POWER2 },
-       { 0x2e, KEY_DOT },              /* '.' */
-       { 0x01, KEY_MODE },             /* TV/FM */
-
-       { 0x05, KEY_1 },
-       { 0x06, KEY_2 },
-       { 0x07, KEY_3 },
-       { 0x09, KEY_4 },
-       { 0x0a, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x0d, KEY_7 },
-       { 0x0e, KEY_8 },
-       { 0x0f, KEY_9 },
-       { 0x11, KEY_0 },
-
-       { 0x13, KEY_RIGHT },            /* -> */
-       { 0x12, KEY_LEFT },             /* <- */
-
-       { 0x17, KEY_SLEEP },            /* Capturar Imagem */
-       { 0x10, KEY_SHUFFLE },          /* Amostra */
-
-       /* FIXME: The keys bellow aren't ok */
-
-       { 0x43, KEY_CHANNELUP },
-       { 0x42, KEY_CHANNELDOWN },
-       { 0x1f, KEY_VOLUMEUP },
-       { 0x1e, KEY_VOLUMEDOWN },
-       { 0x0c, KEY_ENTER },
-
-       { 0x14, KEY_MUTE },
-       { 0x08, KEY_AUDIO },
-
-       { 0x03, KEY_TEXT },
-       { 0x04, KEY_EPG },
-       { 0x2b, KEY_TV2 },              /* TV2 */
-
-       { 0x1d, KEY_RED },
-       { 0x1c, KEY_YELLOW },
-       { 0x41, KEY_GREEN },
-       { 0x40, KEY_BLUE },
-
-       { 0x1a, KEY_PLAYPAUSE },
-       { 0x19, KEY_RECORD },
-       { 0x18, KEY_PLAY },
-       { 0x1b, KEY_STOP },
-};
-
-struct ir_scancode_table ir_codes_avermedia_m135a_table = {
-       .scan = ir_codes_avermedia_m135a,
-       .size = ARRAY_SIZE(ir_codes_avermedia_m135a),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a_table);
-
-/* Oldrich Jedlicka <oldium.pro@seznam.cz> */
-static struct ir_scancode ir_codes_avermedia_cardbus[] = {
-       { 0x00, KEY_POWER },
-       { 0x01, KEY_TUNER },            /* TV/FM */
-       { 0x03, KEY_TEXT },             /* Teletext */
-       { 0x04, KEY_EPG },
-       { 0x05, KEY_1 },
-       { 0x06, KEY_2 },
-       { 0x07, KEY_3 },
-       { 0x08, KEY_AUDIO },
-       { 0x09, KEY_4 },
-       { 0x0a, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x0c, KEY_ZOOM },             /* Full screen */
-       { 0x0d, KEY_7 },
-       { 0x0e, KEY_8 },
-       { 0x0f, KEY_9 },
-       { 0x10, KEY_PAGEUP },           /* 16-CH PREV */
-       { 0x11, KEY_0 },
-       { 0x12, KEY_INFO },
-       { 0x13, KEY_AGAIN },            /* CH RTN - channel return */
-       { 0x14, KEY_MUTE },
-       { 0x15, KEY_EDIT },             /* Autoscan */
-       { 0x17, KEY_SAVE },             /* Screenshot */
-       { 0x18, KEY_PLAYPAUSE },
-       { 0x19, KEY_RECORD },
-       { 0x1a, KEY_PLAY },
-       { 0x1b, KEY_STOP },
-       { 0x1c, KEY_FASTFORWARD },
-       { 0x1d, KEY_REWIND },
-       { 0x1e, KEY_VOLUMEDOWN },
-       { 0x1f, KEY_VOLUMEUP },
-       { 0x22, KEY_SLEEP },            /* Sleep */
-       { 0x23, KEY_ZOOM },             /* Aspect */
-       { 0x26, KEY_SCREEN },           /* Pos */
-       { 0x27, KEY_ANGLE },            /* Size */
-       { 0x28, KEY_SELECT },           /* Select */
-       { 0x29, KEY_BLUE },             /* Blue/Picture */
-       { 0x2a, KEY_BACKSPACE },        /* Back */
-       { 0x2b, KEY_MEDIA },            /* PIP (Picture-in-picture) */
-       { 0x2c, KEY_DOWN },
-       { 0x2e, KEY_DOT },
-       { 0x2f, KEY_TV },               /* Live TV */
-       { 0x32, KEY_LEFT },
-       { 0x33, KEY_CLEAR },            /* Clear */
-       { 0x35, KEY_RED },              /* Red/TV */
-       { 0x36, KEY_UP },
-       { 0x37, KEY_HOME },             /* Home */
-       { 0x39, KEY_GREEN },            /* Green/Video */
-       { 0x3d, KEY_YELLOW },           /* Yellow/Music */
-       { 0x3e, KEY_OK },               /* Ok */
-       { 0x3f, KEY_RIGHT },
-       { 0x40, KEY_NEXT },             /* Next */
-       { 0x41, KEY_PREVIOUS },         /* Previous */
-       { 0x42, KEY_CHANNELDOWN },      /* Channel down */
-       { 0x43, KEY_CHANNELUP },        /* Channel up */
-};
-
-struct ir_scancode_table ir_codes_avermedia_cardbus_table = {
-       .scan = ir_codes_avermedia_cardbus,
-       .size = ARRAY_SIZE(ir_codes_avermedia_cardbus),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus_table);
-
-/* Attila Kondoros <attila.kondoros@chello.hu> */
-static struct ir_scancode ir_codes_apac_viewcomp[] = {
-
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-       { 0x00, KEY_0 },
-       { 0x17, KEY_LAST },             /* +100 */
-       { 0x0a, KEY_LIST },             /* recall */
-
-
-       { 0x1c, KEY_TUNER },            /* TV/FM */
-       { 0x15, KEY_SEARCH },           /* scan */
-       { 0x12, KEY_POWER },            /* power */
-       { 0x1f, KEY_VOLUMEDOWN },       /* vol up */
-       { 0x1b, KEY_VOLUMEUP },         /* vol down */
-       { 0x1e, KEY_CHANNELDOWN },      /* chn up */
-       { 0x1a, KEY_CHANNELUP },        /* chn down */
-
-       { 0x11, KEY_VIDEO },            /* video */
-       { 0x0f, KEY_ZOOM },             /* full screen */
-       { 0x13, KEY_MUTE },             /* mute/unmute */
-       { 0x10, KEY_TEXT },             /* min */
-
-       { 0x0d, KEY_STOP },             /* freeze */
-       { 0x0e, KEY_RECORD },           /* record */
-       { 0x1d, KEY_PLAYPAUSE },        /* stop */
-       { 0x19, KEY_PLAY },             /* play */
-
-       { 0x16, KEY_GOTO },             /* osd */
-       { 0x14, KEY_REFRESH },          /* default */
-       { 0x0c, KEY_KPPLUS },           /* fine tune >>>> */
-       { 0x18, KEY_KPMINUS },          /* fine tune <<<< */
-};
-
-struct ir_scancode_table ir_codes_apac_viewcomp_table = {
-       .scan = ir_codes_apac_viewcomp,
-       .size = ARRAY_SIZE(ir_codes_apac_viewcomp),
-};
-EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp_table);
-
-/* ---------------------------------------------------------------------- */
-
-static struct ir_scancode ir_codes_pixelview[] = {
-
-       { 0x1e, KEY_POWER },    /* power */
-       { 0x07, KEY_MEDIA },    /* source */
-       { 0x1c, KEY_SEARCH },   /* scan */
-
-
-       { 0x03, KEY_TUNER },            /* TV/FM */
-
-       { 0x00, KEY_RECORD },
-       { 0x08, KEY_STOP },
-       { 0x11, KEY_PLAY },
-
-       { 0x1a, KEY_PLAYPAUSE },        /* freeze */
-       { 0x19, KEY_ZOOM },             /* zoom */
-       { 0x0f, KEY_TEXT },             /* min */
-
-       { 0x01, KEY_1 },
-       { 0x0b, KEY_2 },
-       { 0x1b, KEY_3 },
-       { 0x05, KEY_4 },
-       { 0x09, KEY_5 },
-       { 0x15, KEY_6 },
-       { 0x06, KEY_7 },
-       { 0x0a, KEY_8 },
-       { 0x12, KEY_9 },
-       { 0x02, KEY_0 },
-       { 0x10, KEY_LAST },             /* +100 */
-       { 0x13, KEY_LIST },             /* recall */
-
-       { 0x1f, KEY_CHANNELUP },        /* chn down */
-       { 0x17, KEY_CHANNELDOWN },      /* chn up */
-       { 0x16, KEY_VOLUMEUP },         /* vol down */
-       { 0x14, KEY_VOLUMEDOWN },       /* vol up */
-
-       { 0x04, KEY_KPMINUS },          /* <<< */
-       { 0x0e, KEY_SETUP },            /* function */
-       { 0x0c, KEY_KPPLUS },           /* >>> */
-
-       { 0x0d, KEY_GOTO },             /* mts */
-       { 0x1d, KEY_REFRESH },          /* reset */
-       { 0x18, KEY_MUTE },             /* mute/unmute */
-};
-
-struct ir_scancode_table ir_codes_pixelview_table = {
-       .scan = ir_codes_pixelview,
-       .size = ARRAY_SIZE(ir_codes_pixelview),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pixelview_table);
-
-/*
-   Mauro Carvalho Chehab <mchehab@infradead.org>
-   present on PV MPEG 8000GT
- */
-static struct ir_scancode ir_codes_pixelview_new[] = {
-       { 0x3c, KEY_TIME },             /* Timeshift */
-       { 0x12, KEY_POWER },
-
-       { 0x3d, KEY_1 },
-       { 0x38, KEY_2 },
-       { 0x18, KEY_3 },
-       { 0x35, KEY_4 },
-       { 0x39, KEY_5 },
-       { 0x15, KEY_6 },
-       { 0x36, KEY_7 },
-       { 0x3a, KEY_8 },
-       { 0x1e, KEY_9 },
-       { 0x3e, KEY_0 },
-
-       { 0x1c, KEY_AGAIN },            /* LOOP */
-       { 0x3f, KEY_MEDIA },            /* Source */
-       { 0x1f, KEY_LAST },             /* +100 */
-       { 0x1b, KEY_MUTE },
-
-       { 0x17, KEY_CHANNELDOWN },
-       { 0x16, KEY_CHANNELUP },
-       { 0x10, KEY_VOLUMEUP },
-       { 0x14, KEY_VOLUMEDOWN },
-       { 0x13, KEY_ZOOM },
-
-       { 0x19, KEY_CAMERA },           /* SNAPSHOT */
-       { 0x1a, KEY_SEARCH },           /* scan */
-
-       { 0x37, KEY_REWIND },           /* << */
-       { 0x32, KEY_RECORD },           /* o (red) */
-       { 0x33, KEY_FORWARD },          /* >> */
-       { 0x11, KEY_STOP },             /* square */
-       { 0x3b, KEY_PLAY },             /* > */
-       { 0x30, KEY_PLAYPAUSE },        /* || */
-
-       { 0x31, KEY_TV },
-       { 0x34, KEY_RADIO },
-};
-
-struct ir_scancode_table ir_codes_pixelview_new_table = {
-       .scan = ir_codes_pixelview_new,
-       .size = ARRAY_SIZE(ir_codes_pixelview_new),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pixelview_new_table);
-
-static struct ir_scancode ir_codes_nebula[] = {
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-       { 0x0a, KEY_TV },
-       { 0x0b, KEY_AUX },
-       { 0x0c, KEY_DVD },
-       { 0x0d, KEY_POWER },
-       { 0x0e, KEY_MHP },      /* labelled 'Picture' */
-       { 0x0f, KEY_AUDIO },
-       { 0x10, KEY_INFO },
-       { 0x11, KEY_F13 },      /* 16:9 */
-       { 0x12, KEY_F14 },      /* 14:9 */
-       { 0x13, KEY_EPG },
-       { 0x14, KEY_EXIT },
-       { 0x15, KEY_MENU },
-       { 0x16, KEY_UP },
-       { 0x17, KEY_DOWN },
-       { 0x18, KEY_LEFT },
-       { 0x19, KEY_RIGHT },
-       { 0x1a, KEY_ENTER },
-       { 0x1b, KEY_CHANNELUP },
-       { 0x1c, KEY_CHANNELDOWN },
-       { 0x1d, KEY_VOLUMEUP },
-       { 0x1e, KEY_VOLUMEDOWN },
-       { 0x1f, KEY_RED },
-       { 0x20, KEY_GREEN },
-       { 0x21, KEY_YELLOW },
-       { 0x22, KEY_BLUE },
-       { 0x23, KEY_SUBTITLE },
-       { 0x24, KEY_F15 },      /* AD */
-       { 0x25, KEY_TEXT },
-       { 0x26, KEY_MUTE },
-       { 0x27, KEY_REWIND },
-       { 0x28, KEY_STOP },
-       { 0x29, KEY_PLAY },
-       { 0x2a, KEY_FASTFORWARD },
-       { 0x2b, KEY_F16 },      /* chapter */
-       { 0x2c, KEY_PAUSE },
-       { 0x2d, KEY_PLAY },
-       { 0x2e, KEY_RECORD },
-       { 0x2f, KEY_F17 },      /* picture in picture */
-       { 0x30, KEY_KPPLUS },   /* zoom in */
-       { 0x31, KEY_KPMINUS },  /* zoom out */
-       { 0x32, KEY_F18 },      /* capture */
-       { 0x33, KEY_F19 },      /* web */
-       { 0x34, KEY_EMAIL },
-       { 0x35, KEY_PHONE },
-       { 0x36, KEY_PC },
-};
-
-struct ir_scancode_table ir_codes_nebula_table = {
-       .scan = ir_codes_nebula,
-       .size = ARRAY_SIZE(ir_codes_nebula),
-};
-EXPORT_SYMBOL_GPL(ir_codes_nebula_table);
-
-/* DigitalNow DNTV Live DVB-T Remote */
-static struct ir_scancode ir_codes_dntv_live_dvb_t[] = {
-       { 0x00, KEY_ESC },              /* 'go up a level?' */
-       /* Keys 0 to 9 */
-       { 0x0a, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0b, KEY_TUNER },            /* tv/fm */
-       { 0x0c, KEY_SEARCH },           /* scan */
-       { 0x0d, KEY_STOP },
-       { 0x0e, KEY_PAUSE },
-       { 0x0f, KEY_LIST },             /* source */
-
-       { 0x10, KEY_MUTE },
-       { 0x11, KEY_REWIND },           /* backward << */
-       { 0x12, KEY_POWER },
-       { 0x13, KEY_CAMERA },           /* snap */
-       { 0x14, KEY_AUDIO },            /* stereo */
-       { 0x15, KEY_CLEAR },            /* reset */
-       { 0x16, KEY_PLAY },
-       { 0x17, KEY_ENTER },
-       { 0x18, KEY_ZOOM },             /* full screen */
-       { 0x19, KEY_FASTFORWARD },      /* forward >> */
-       { 0x1a, KEY_CHANNELUP },
-       { 0x1b, KEY_VOLUMEUP },
-       { 0x1c, KEY_INFO },             /* preview */
-       { 0x1d, KEY_RECORD },           /* record */
-       { 0x1e, KEY_CHANNELDOWN },
-       { 0x1f, KEY_VOLUMEDOWN },
-};
-
-struct ir_scancode_table ir_codes_dntv_live_dvb_t_table = {
-       .scan = ir_codes_dntv_live_dvb_t,
-       .size = ARRAY_SIZE(ir_codes_dntv_live_dvb_t),
-};
-EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* IO-DATA BCTV7E Remote */
-static struct ir_scancode ir_codes_iodata_bctv7e[] = {
-       { 0x40, KEY_TV },
-       { 0x20, KEY_RADIO },            /* FM */
-       { 0x60, KEY_EPG },
-       { 0x00, KEY_POWER },
-
-       /* Keys 0 to 9 */
-       { 0x44, KEY_0 },                /* 10 */
-       { 0x50, KEY_1 },
-       { 0x30, KEY_2 },
-       { 0x70, KEY_3 },
-       { 0x48, KEY_4 },
-       { 0x28, KEY_5 },
-       { 0x68, KEY_6 },
-       { 0x58, KEY_7 },
-       { 0x38, KEY_8 },
-       { 0x78, KEY_9 },
-
-       { 0x10, KEY_L },                /* Live */
-       { 0x08, KEY_TIME },             /* Time Shift */
-
-       { 0x18, KEY_PLAYPAUSE },        /* Play */
-
-       { 0x24, KEY_ENTER },            /* 11 */
-       { 0x64, KEY_ESC },              /* 12 */
-       { 0x04, KEY_M },                /* Multi */
-
-       { 0x54, KEY_VIDEO },
-       { 0x34, KEY_CHANNELUP },
-       { 0x74, KEY_VOLUMEUP },
-       { 0x14, KEY_MUTE },
-
-       { 0x4c, KEY_VCR },              /* SVIDEO */
-       { 0x2c, KEY_CHANNELDOWN },
-       { 0x6c, KEY_VOLUMEDOWN },
-       { 0x0c, KEY_ZOOM },
-
-       { 0x5c, KEY_PAUSE },
-       { 0x3c, KEY_RED },              /* || (red) */
-       { 0x7c, KEY_RECORD },           /* recording */
-       { 0x1c, KEY_STOP },
-
-       { 0x41, KEY_REWIND },           /* backward << */
-       { 0x21, KEY_PLAY },
-       { 0x61, KEY_FASTFORWARD },      /* forward >> */
-       { 0x01, KEY_NEXT },             /* skip >| */
-};
-
-struct ir_scancode_table ir_codes_iodata_bctv7e_table = {
-       .scan = ir_codes_iodata_bctv7e,
-       .size = ARRAY_SIZE(ir_codes_iodata_bctv7e),
-};
-EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* ADS Tech Instant TV DVB-T PCI Remote */
-static struct ir_scancode ir_codes_adstech_dvb_t_pci[] = {
-       /* Keys 0 to 9 */
-       { 0x4d, KEY_0 },
-       { 0x57, KEY_1 },
-       { 0x4f, KEY_2 },
-       { 0x53, KEY_3 },
-       { 0x56, KEY_4 },
-       { 0x4e, KEY_5 },
-       { 0x5e, KEY_6 },
-       { 0x54, KEY_7 },
-       { 0x4c, KEY_8 },
-       { 0x5c, KEY_9 },
-
-       { 0x5b, KEY_POWER },
-       { 0x5f, KEY_MUTE },
-       { 0x55, KEY_GOTO },
-       { 0x5d, KEY_SEARCH },
-       { 0x17, KEY_EPG },              /* Guide */
-       { 0x1f, KEY_MENU },
-       { 0x0f, KEY_UP },
-       { 0x46, KEY_DOWN },
-       { 0x16, KEY_LEFT },
-       { 0x1e, KEY_RIGHT },
-       { 0x0e, KEY_SELECT },           /* Enter */
-       { 0x5a, KEY_INFO },
-       { 0x52, KEY_EXIT },
-       { 0x59, KEY_PREVIOUS },
-       { 0x51, KEY_NEXT },
-       { 0x58, KEY_REWIND },
-       { 0x50, KEY_FORWARD },
-       { 0x44, KEY_PLAYPAUSE },
-       { 0x07, KEY_STOP },
-       { 0x1b, KEY_RECORD },
-       { 0x13, KEY_TUNER },            /* Live */
-       { 0x0a, KEY_A },
-       { 0x12, KEY_B },
-       { 0x03, KEY_PROG1 },            /* 1 */
-       { 0x01, KEY_PROG2 },            /* 2 */
-       { 0x00, KEY_PROG3 },            /* 3 */
-       { 0x06, KEY_DVD },
-       { 0x48, KEY_AUX },              /* Photo */
-       { 0x40, KEY_VIDEO },
-       { 0x19, KEY_AUDIO },            /* Music */
-       { 0x0b, KEY_CHANNELUP },
-       { 0x08, KEY_CHANNELDOWN },
-       { 0x15, KEY_VOLUMEUP },
-       { 0x1c, KEY_VOLUMEDOWN },
-};
-
-struct ir_scancode_table ir_codes_adstech_dvb_t_pci_table = {
-       .scan = ir_codes_adstech_dvb_t_pci,
-       .size = ARRAY_SIZE(ir_codes_adstech_dvb_t_pci),
-};
-EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* MSI TV@nywhere MASTER remote */
-
-static struct ir_scancode ir_codes_msi_tvanywhere[] = {
-       /* Keys 0 to 9 */
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0c, KEY_MUTE },
-       { 0x0f, KEY_SCREEN },           /* Full Screen */
-       { 0x10, KEY_FN },               /* Funtion */
-       { 0x11, KEY_TIME },             /* Time shift */
-       { 0x12, KEY_POWER },
-       { 0x13, KEY_MEDIA },            /* MTS */
-       { 0x14, KEY_SLOW },
-       { 0x16, KEY_REWIND },           /* backward << */
-       { 0x17, KEY_ENTER },            /* Return */
-       { 0x18, KEY_FASTFORWARD },      /* forward >> */
-       { 0x1a, KEY_CHANNELUP },
-       { 0x1b, KEY_VOLUMEUP },
-       { 0x1e, KEY_CHANNELDOWN },
-       { 0x1f, KEY_VOLUMEDOWN },
-};
-
-struct ir_scancode_table ir_codes_msi_tvanywhere_table = {
-       .scan = ir_codes_msi_tvanywhere,
-       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere),
-};
-EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_table);
-
-/* ---------------------------------------------------------------------- */
-
-/*
-  Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
-  is marked "KS003". The controller is I2C at address 0x30, but does not seem
-  to respond to probes until a read is performed from a valid device.
-  I don't know why...
-
-  Note: This remote may be of similar or identical design to the
-  Pixelview remote (?).  The raw codes and duplicate button codes
-  appear to be the same.
-
-  Henry Wong <henry@stuffedcow.net>
-  Some changes to formatting and keycodes by Mark Schultz <n9xmj@yahoo.com>
-
-*/
-
-static struct ir_scancode ir_codes_msi_tvanywhere_plus[] = {
-
-/*  ---- Remote Button Layout ----
-
-    POWER   SOURCE  SCAN    MUTE
-    TV/FM   1       2       3
-    |>      4       5       6
-    <|      7       8       9
-    ^^UP    0       +       RECALL
-    vvDN    RECORD  STOP    PLAY
-
-       MINIMIZE          ZOOM
-
-                 CH+
-      VOL-                   VOL+
-                 CH-
-
-       SNAPSHOT           MTS
-
-     <<      FUNC    >>     RESET
-*/
-
-       { 0x01, KEY_1 },                /* 1 */
-       { 0x0b, KEY_2 },                /* 2 */
-       { 0x1b, KEY_3 },                /* 3 */
-       { 0x05, KEY_4 },                /* 4 */
-       { 0x09, KEY_5 },                /* 5 */
-       { 0x15, KEY_6 },                /* 6 */
-       { 0x06, KEY_7 },                /* 7 */
-       { 0x0a, KEY_8 },                /* 8 */
-       { 0x12, KEY_9 },                /* 9 */
-       { 0x02, KEY_0 },                /* 0 */
-       { 0x10, KEY_KPPLUS },           /* + */
-       { 0x13, KEY_AGAIN },            /* Recall */
-
-       { 0x1e, KEY_POWER },            /* Power */
-       { 0x07, KEY_TUNER },            /* Source */
-       { 0x1c, KEY_SEARCH },           /* Scan */
-       { 0x18, KEY_MUTE },             /* Mute */
-
-       { 0x03, KEY_RADIO },            /* TV/FM */
-       /* The next four keys are duplicates that appear to send the
-          same IR code as Ch+, Ch-, >>, and << .  The raw code assigned
-          to them is the actual code + 0x20 - they will never be
-          detected as such unless some way is discovered to distinguish
-          these buttons from those that have the same code. */
-       { 0x3f, KEY_RIGHT },            /* |> and Ch+ */
-       { 0x37, KEY_LEFT },             /* <| and Ch- */
-       { 0x2c, KEY_UP },               /* ^^Up and >> */
-       { 0x24, KEY_DOWN },             /* vvDn and << */
-
-       { 0x00, KEY_RECORD },           /* Record */
-       { 0x08, KEY_STOP },             /* Stop */
-       { 0x11, KEY_PLAY },             /* Play */
-
-       { 0x0f, KEY_CLOSE },            /* Minimize */
-       { 0x19, KEY_ZOOM },             /* Zoom */
-       { 0x1a, KEY_CAMERA },           /* Snapshot */
-       { 0x0d, KEY_LANGUAGE },         /* MTS */
-
-       { 0x14, KEY_VOLUMEDOWN },       /* Vol- */
-       { 0x16, KEY_VOLUMEUP },         /* Vol+ */
-       { 0x17, KEY_CHANNELDOWN },      /* Ch- */
-       { 0x1f, KEY_CHANNELUP },        /* Ch+ */
-
-       { 0x04, KEY_REWIND },           /* << */
-       { 0x0e, KEY_MENU },             /* Function */
-       { 0x0c, KEY_FASTFORWARD },      /* >> */
-       { 0x1d, KEY_RESTART },          /* Reset */
-};
-
-struct ir_scancode_table ir_codes_msi_tvanywhere_plus_table = {
-       .scan = ir_codes_msi_tvanywhere_plus,
-       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere_plus),
-};
-EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* Cinergy 1400 DVB-T */
-static struct ir_scancode ir_codes_cinergy_1400[] = {
-       { 0x01, KEY_POWER },
-       { 0x02, KEY_1 },
-       { 0x03, KEY_2 },
-       { 0x04, KEY_3 },
-       { 0x05, KEY_4 },
-       { 0x06, KEY_5 },
-       { 0x07, KEY_6 },
-       { 0x08, KEY_7 },
-       { 0x09, KEY_8 },
-       { 0x0a, KEY_9 },
-       { 0x0c, KEY_0 },
-
-       { 0x0b, KEY_VIDEO },
-       { 0x0d, KEY_REFRESH },
-       { 0x0e, KEY_SELECT },
-       { 0x0f, KEY_EPG },
-       { 0x10, KEY_UP },
-       { 0x11, KEY_LEFT },
-       { 0x12, KEY_OK },
-       { 0x13, KEY_RIGHT },
-       { 0x14, KEY_DOWN },
-       { 0x15, KEY_TEXT },
-       { 0x16, KEY_INFO },
-
-       { 0x17, KEY_RED },
-       { 0x18, KEY_GREEN },
-       { 0x19, KEY_YELLOW },
-       { 0x1a, KEY_BLUE },
-
-       { 0x1b, KEY_CHANNELUP },
-       { 0x1c, KEY_VOLUMEUP },
-       { 0x1d, KEY_MUTE },
-       { 0x1e, KEY_VOLUMEDOWN },
-       { 0x1f, KEY_CHANNELDOWN },
-
-       { 0x40, KEY_PAUSE },
-       { 0x4c, KEY_PLAY },
-       { 0x58, KEY_RECORD },
-       { 0x54, KEY_PREVIOUS },
-       { 0x48, KEY_STOP },
-       { 0x5c, KEY_NEXT },
-};
-
-struct ir_scancode_table ir_codes_cinergy_1400_table = {
-       .scan = ir_codes_cinergy_1400,
-       .size = ARRAY_SIZE(ir_codes_cinergy_1400),
-};
-EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* AVERTV STUDIO 303 Remote */
-static struct ir_scancode ir_codes_avertv_303[] = {
-       { 0x2a, KEY_1 },
-       { 0x32, KEY_2 },
-       { 0x3a, KEY_3 },
-       { 0x4a, KEY_4 },
-       { 0x52, KEY_5 },
-       { 0x5a, KEY_6 },
-       { 0x6a, KEY_7 },
-       { 0x72, KEY_8 },
-       { 0x7a, KEY_9 },
-       { 0x0e, KEY_0 },
-
-       { 0x02, KEY_POWER },
-       { 0x22, KEY_VIDEO },
-       { 0x42, KEY_AUDIO },
-       { 0x62, KEY_ZOOM },
-       { 0x0a, KEY_TV },
-       { 0x12, KEY_CD },
-       { 0x1a, KEY_TEXT },
-
-       { 0x16, KEY_SUBTITLE },
-       { 0x1e, KEY_REWIND },
-       { 0x06, KEY_PRINT },
-
-       { 0x2e, KEY_SEARCH },
-       { 0x36, KEY_SLEEP },
-       { 0x3e, KEY_SHUFFLE },
-       { 0x26, KEY_MUTE },
-
-       { 0x4e, KEY_RECORD },
-       { 0x56, KEY_PAUSE },
-       { 0x5e, KEY_STOP },
-       { 0x46, KEY_PLAY },
-
-       { 0x6e, KEY_RED },
-       { 0x0b, KEY_GREEN },
-       { 0x66, KEY_YELLOW },
-       { 0x03, KEY_BLUE },
-
-       { 0x76, KEY_LEFT },
-       { 0x7e, KEY_RIGHT },
-       { 0x13, KEY_DOWN },
-       { 0x1b, KEY_UP },
-};
-
-struct ir_scancode_table ir_codes_avertv_303_table = {
-       .scan = ir_codes_avertv_303,
-       .size = ARRAY_SIZE(ir_codes_avertv_303),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avertv_303_table);
-
-/* ---------------------------------------------------------------------- */
-
-/* DigitalNow DNTV Live! DVB-T Pro Remote */
-static struct ir_scancode ir_codes_dntv_live_dvbt_pro[] = {
-       { 0x16, KEY_POWER },
-       { 0x5b, KEY_HOME },
-
-       { 0x55, KEY_TV },               /* live tv */
-       { 0x58, KEY_TUNER },            /* digital Radio */
-       { 0x5a, KEY_RADIO },            /* FM radio */
-       { 0x59, KEY_DVD },              /* dvd menu */
-       { 0x03, KEY_1 },
-       { 0x01, KEY_2 },
-       { 0x06, KEY_3 },
-       { 0x09, KEY_4 },
-       { 0x1d, KEY_5 },
-       { 0x1f, KEY_6 },
-       { 0x0d, KEY_7 },
-       { 0x19, KEY_8 },
-       { 0x1b, KEY_9 },
-       { 0x0c, KEY_CANCEL },
-       { 0x15, KEY_0 },
-       { 0x4a, KEY_CLEAR },
-       { 0x13, KEY_BACK },
-       { 0x00, KEY_TAB },
-       { 0x4b, KEY_UP },
-       { 0x4e, KEY_LEFT },
-       { 0x4f, KEY_OK },
-       { 0x52, KEY_RIGHT },
-       { 0x51, KEY_DOWN },
-       { 0x1e, KEY_VOLUMEUP },
-       { 0x0a, KEY_VOLUMEDOWN },
-       { 0x02, KEY_CHANNELDOWN },
-       { 0x05, KEY_CHANNELUP },
-       { 0x11, KEY_RECORD },
-       { 0x14, KEY_PLAY },
-       { 0x4c, KEY_PAUSE },
-       { 0x1a, KEY_STOP },
-       { 0x40, KEY_REWIND },
-       { 0x12, KEY_FASTFORWARD },
-       { 0x41, KEY_PREVIOUSSONG },     /* replay |< */
-       { 0x42, KEY_NEXTSONG },         /* skip >| */
-       { 0x54, KEY_CAMERA },           /* capture */
-       { 0x50, KEY_LANGUAGE },         /* sap */
-       { 0x47, KEY_TV2 },              /* pip */
-       { 0x4d, KEY_SCREEN },
-       { 0x43, KEY_SUBTITLE },
-       { 0x10, KEY_MUTE },
-       { 0x49, KEY_AUDIO },            /* l/r */
-       { 0x07, KEY_SLEEP },
-       { 0x08, KEY_VIDEO },            /* a/v */
-       { 0x0e, KEY_PREVIOUS },         /* recall */
-       { 0x45, KEY_ZOOM },             /* zoom + */
-       { 0x46, KEY_ANGLE },            /* zoom - */
-       { 0x56, KEY_RED },
-       { 0x57, KEY_GREEN },
-       { 0x5c, KEY_YELLOW },
-       { 0x5d, KEY_BLUE },
-};
-
-struct ir_scancode_table ir_codes_dntv_live_dvbt_pro_table = {
-       .scan = ir_codes_dntv_live_dvbt_pro,
-       .size = ARRAY_SIZE(ir_codes_dntv_live_dvbt_pro),
-};
-EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro_table);
-
-static struct ir_scancode ir_codes_em_terratec[] = {
-       { 0x01, KEY_CHANNEL },
-       { 0x02, KEY_SELECT },
-       { 0x03, KEY_MUTE },
-       { 0x04, KEY_POWER },
-       { 0x05, KEY_1 },
-       { 0x06, KEY_2 },
-       { 0x07, KEY_3 },
-       { 0x08, KEY_CHANNELUP },
-       { 0x09, KEY_4 },
-       { 0x0a, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x0c, KEY_CHANNELDOWN },
-       { 0x0d, KEY_7 },
-       { 0x0e, KEY_8 },
-       { 0x0f, KEY_9 },
-       { 0x10, KEY_VOLUMEUP },
-       { 0x11, KEY_0 },
-       { 0x12, KEY_MENU },
-       { 0x13, KEY_PRINT },
-       { 0x14, KEY_VOLUMEDOWN },
-       { 0x16, KEY_PAUSE },
-       { 0x18, KEY_RECORD },
-       { 0x19, KEY_REWIND },
-       { 0x1a, KEY_PLAY },
-       { 0x1b, KEY_FORWARD },
-       { 0x1c, KEY_BACKSPACE },
-       { 0x1e, KEY_STOP },
-       { 0x40, KEY_ZOOM },
-};
-
-struct ir_scancode_table ir_codes_em_terratec_table = {
-       .scan = ir_codes_em_terratec,
-       .size = ARRAY_SIZE(ir_codes_em_terratec),
-};
-EXPORT_SYMBOL_GPL(ir_codes_em_terratec_table);
-
-static struct ir_scancode ir_codes_pinnacle_grey[] = {
-       { 0x3a, KEY_0 },
-       { 0x31, KEY_1 },
-       { 0x32, KEY_2 },
-       { 0x33, KEY_3 },
-       { 0x34, KEY_4 },
-       { 0x35, KEY_5 },
-       { 0x36, KEY_6 },
-       { 0x37, KEY_7 },
-       { 0x38, KEY_8 },
-       { 0x39, KEY_9 },
-
-       { 0x2f, KEY_POWER },
-
-       { 0x2e, KEY_P },
-       { 0x1f, KEY_L },
-       { 0x2b, KEY_I },
-
-       { 0x2d, KEY_SCREEN },
-       { 0x1e, KEY_ZOOM },
-       { 0x1b, KEY_VOLUMEUP },
-       { 0x0f, KEY_VOLUMEDOWN },
-       { 0x17, KEY_CHANNELUP },
-       { 0x1c, KEY_CHANNELDOWN },
-       { 0x25, KEY_INFO },
-
-       { 0x3c, KEY_MUTE },
-
-       { 0x3d, KEY_LEFT },
-       { 0x3b, KEY_RIGHT },
-
-       { 0x3f, KEY_UP },
-       { 0x3e, KEY_DOWN },
-       { 0x1a, KEY_ENTER },
-
-       { 0x1d, KEY_MENU },
-       { 0x19, KEY_AGAIN },
-       { 0x16, KEY_PREVIOUSSONG },
-       { 0x13, KEY_NEXTSONG },
-       { 0x15, KEY_PAUSE },
-       { 0x0e, KEY_REWIND },
-       { 0x0d, KEY_PLAY },
-       { 0x0b, KEY_STOP },
-       { 0x07, KEY_FORWARD },
-       { 0x27, KEY_RECORD },
-       { 0x26, KEY_TUNER },
-       { 0x29, KEY_TEXT },
-       { 0x2a, KEY_MEDIA },
-       { 0x18, KEY_EPG },
-};
-
-struct ir_scancode_table ir_codes_pinnacle_grey_table = {
-       .scan = ir_codes_pinnacle_grey,
-       .size = ARRAY_SIZE(ir_codes_pinnacle_grey),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_grey_table);
-
-static struct ir_scancode ir_codes_flyvideo[] = {
-       { 0x0f, KEY_0 },
-       { 0x03, KEY_1 },
-       { 0x04, KEY_2 },
-       { 0x05, KEY_3 },
-       { 0x07, KEY_4 },
-       { 0x08, KEY_5 },
-       { 0x09, KEY_6 },
-       { 0x0b, KEY_7 },
-       { 0x0c, KEY_8 },
-       { 0x0d, KEY_9 },
-
-       { 0x0e, KEY_MODE },     /* Air/Cable */
-       { 0x11, KEY_VIDEO },    /* Video */
-       { 0x15, KEY_AUDIO },    /* Audio */
-       { 0x00, KEY_POWER },    /* Power */
-       { 0x18, KEY_TUNER },    /* AV Source */
-       { 0x02, KEY_ZOOM },     /* Fullscreen */
-       { 0x1a, KEY_LANGUAGE }, /* Stereo */
-       { 0x1b, KEY_MUTE },     /* Mute */
-       { 0x14, KEY_VOLUMEUP }, /* Volume + */
-       { 0x17, KEY_VOLUMEDOWN },/* Volume - */
-       { 0x12, KEY_CHANNELUP },/* Channel + */
-       { 0x13, KEY_CHANNELDOWN },/* Channel - */
-       { 0x06, KEY_AGAIN },    /* Recall */
-       { 0x10, KEY_ENTER },    /* Enter */
-
-       { 0x19, KEY_BACK },     /* Rewind  ( <<< ) */
-       { 0x1f, KEY_FORWARD },  /* Forward ( >>> ) */
-       { 0x0a, KEY_ANGLE },    /* no label, may be used as the PAUSE button */
-};
-
-struct ir_scancode_table ir_codes_flyvideo_table = {
-       .scan = ir_codes_flyvideo,
-       .size = ARRAY_SIZE(ir_codes_flyvideo),
-};
-EXPORT_SYMBOL_GPL(ir_codes_flyvideo_table);
-
-static struct ir_scancode ir_codes_flydvb[] = {
-       { 0x01, KEY_ZOOM },             /* Full Screen */
-       { 0x00, KEY_POWER },            /* Power */
-
-       { 0x03, KEY_1 },
-       { 0x04, KEY_2 },
-       { 0x05, KEY_3 },
-       { 0x07, KEY_4 },
-       { 0x08, KEY_5 },
-       { 0x09, KEY_6 },
-       { 0x0b, KEY_7 },
-       { 0x0c, KEY_8 },
-       { 0x0d, KEY_9 },
-       { 0x06, KEY_AGAIN },            /* Recall */
-       { 0x0f, KEY_0 },
-       { 0x10, KEY_MUTE },             /* Mute */
-       { 0x02, KEY_RADIO },            /* TV/Radio */
-       { 0x1b, KEY_LANGUAGE },         /* SAP (Second Audio Program) */
-
-       { 0x14, KEY_VOLUMEUP },         /* VOL+ */
-       { 0x17, KEY_VOLUMEDOWN },       /* VOL- */
-       { 0x12, KEY_CHANNELUP },        /* CH+ */
-       { 0x13, KEY_CHANNELDOWN },      /* CH- */
-       { 0x1d, KEY_ENTER },            /* Enter */
-
-       { 0x1a, KEY_MODE },             /* PIP */
-       { 0x18, KEY_TUNER },            /* Source */
-
-       { 0x1e, KEY_RECORD },           /* Record/Pause */
-       { 0x15, KEY_ANGLE },            /* Swap (no label on key) */
-       { 0x1c, KEY_PAUSE },            /* Timeshift/Pause */
-       { 0x19, KEY_BACK },             /* Rewind << */
-       { 0x0a, KEY_PLAYPAUSE },        /* Play/Pause */
-       { 0x1f, KEY_FORWARD },          /* Forward >> */
-       { 0x16, KEY_PREVIOUS },         /* Back |<< */
-       { 0x11, KEY_STOP },             /* Stop */
-       { 0x0e, KEY_NEXT },             /* End >>| */
-};
-
-struct ir_scancode_table ir_codes_flydvb_table = {
-       .scan = ir_codes_flydvb,
-       .size = ARRAY_SIZE(ir_codes_flydvb),
-};
-EXPORT_SYMBOL_GPL(ir_codes_flydvb_table);
-
-static struct ir_scancode ir_codes_cinergy[] = {
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0a, KEY_POWER },
-       { 0x0b, KEY_PROG1 },            /* app */
-       { 0x0c, KEY_ZOOM },             /* zoom/fullscreen */
-       { 0x0d, KEY_CHANNELUP },        /* channel */
-       { 0x0e, KEY_CHANNELDOWN },      /* channel- */
-       { 0x0f, KEY_VOLUMEUP },
-       { 0x10, KEY_VOLUMEDOWN },
-       { 0x11, KEY_TUNER },            /* AV */
-       { 0x12, KEY_NUMLOCK },          /* -/-- */
-       { 0x13, KEY_AUDIO },            /* audio */
-       { 0x14, KEY_MUTE },
-       { 0x15, KEY_UP },
-       { 0x16, KEY_DOWN },
-       { 0x17, KEY_LEFT },
-       { 0x18, KEY_RIGHT },
-       { 0x19, BTN_LEFT, },
-       { 0x1a, BTN_RIGHT, },
-       { 0x1b, KEY_WWW },              /* text */
-       { 0x1c, KEY_REWIND },
-       { 0x1d, KEY_FORWARD },
-       { 0x1e, KEY_RECORD },
-       { 0x1f, KEY_PLAY },
-       { 0x20, KEY_PREVIOUSSONG },
-       { 0x21, KEY_NEXTSONG },
-       { 0x22, KEY_PAUSE },
-       { 0x23, KEY_STOP },
-};
-
-struct ir_scancode_table ir_codes_cinergy_table = {
-       .scan = ir_codes_cinergy,
-       .size = ARRAY_SIZE(ir_codes_cinergy),
-};
-EXPORT_SYMBOL_GPL(ir_codes_cinergy_table);
-
-/* Alfons Geser <a.geser@cox.net>
- * updates from Job D. R. Borges <jobdrb@ig.com.br> */
-static struct ir_scancode ir_codes_eztv[] = {
-       { 0x12, KEY_POWER },
-       { 0x01, KEY_TV },       /* DVR */
-       { 0x15, KEY_DVD },      /* DVD */
-       { 0x17, KEY_AUDIO },    /* music */
-                               /* DVR mode / DVD mode / music mode */
-
-       { 0x1b, KEY_MUTE },     /* mute */
-       { 0x02, KEY_LANGUAGE }, /* MTS/SAP / audio / autoseek */
-       { 0x1e, KEY_SUBTITLE }, /* closed captioning / subtitle / seek */
-       { 0x16, KEY_ZOOM },     /* full screen */
-       { 0x1c, KEY_VIDEO },    /* video source / eject / delall */
-       { 0x1d, KEY_RESTART },  /* playback / angle / del */
-       { 0x2f, KEY_SEARCH },   /* scan / menu / playlist */
-       { 0x30, KEY_CHANNEL },  /* CH surfing / bookmark / memo */
-
-       { 0x31, KEY_HELP },     /* help */
-       { 0x32, KEY_MODE },     /* num/memo */
-       { 0x33, KEY_ESC },      /* cancel */
-
-       { 0x0c, KEY_UP },       /* up */
-       { 0x10, KEY_DOWN },     /* down */
-       { 0x08, KEY_LEFT },     /* left */
-       { 0x04, KEY_RIGHT },    /* right */
-       { 0x03, KEY_SELECT },   /* select */
-
-       { 0x1f, KEY_REWIND },   /* rewind */
-       { 0x20, KEY_PLAYPAUSE },/* play/pause */
-       { 0x29, KEY_FORWARD },  /* forward */
-       { 0x14, KEY_AGAIN },    /* repeat */
-       { 0x2b, KEY_RECORD },   /* recording */
-       { 0x2c, KEY_STOP },     /* stop */
-       { 0x2d, KEY_PLAY },     /* play */
-       { 0x2e, KEY_CAMERA },   /* snapshot / shuffle */
-
-       { 0x00, KEY_0 },
-       { 0x05, KEY_1 },
-       { 0x06, KEY_2 },
-       { 0x07, KEY_3 },
-       { 0x09, KEY_4 },
-       { 0x0a, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x0d, KEY_7 },
-       { 0x0e, KEY_8 },
-       { 0x0f, KEY_9 },
-
-       { 0x2a, KEY_VOLUMEUP },
-       { 0x11, KEY_VOLUMEDOWN },
-       { 0x18, KEY_CHANNELUP },/* CH.tracking up */
-       { 0x19, KEY_CHANNELDOWN },/* CH.tracking down */
-
-       { 0x13, KEY_ENTER },    /* enter */
-       { 0x21, KEY_DOT },      /* . (decimal dot) */
-};
-
-struct ir_scancode_table ir_codes_eztv_table = {
-       .scan = ir_codes_eztv,
-       .size = ARRAY_SIZE(ir_codes_eztv),
-};
-EXPORT_SYMBOL_GPL(ir_codes_eztv_table);
-
-/* Alex Hermann <gaaf@gmx.net> */
-static struct ir_scancode ir_codes_avermedia[] = {
-       { 0x28, KEY_1 },
-       { 0x18, KEY_2 },
-       { 0x38, KEY_3 },
-       { 0x24, KEY_4 },
-       { 0x14, KEY_5 },
-       { 0x34, KEY_6 },
-       { 0x2c, KEY_7 },
-       { 0x1c, KEY_8 },
-       { 0x3c, KEY_9 },
-       { 0x22, KEY_0 },
-
-       { 0x20, KEY_TV },               /* TV/FM */
-       { 0x10, KEY_CD },               /* CD */
-       { 0x30, KEY_TEXT },             /* TELETEXT */
-       { 0x00, KEY_POWER },            /* POWER */
-
-       { 0x08, KEY_VIDEO },            /* VIDEO */
-       { 0x04, KEY_AUDIO },            /* AUDIO */
-       { 0x0c, KEY_ZOOM },             /* FULL SCREEN */
-
-       { 0x12, KEY_SUBTITLE },         /* DISPLAY */
-       { 0x32, KEY_REWIND },           /* LOOP */
-       { 0x02, KEY_PRINT },            /* PREVIEW */
-
-       { 0x2a, KEY_SEARCH },           /* AUTOSCAN */
-       { 0x1a, KEY_SLEEP },            /* FREEZE */
-       { 0x3a, KEY_CAMERA },           /* SNAPSHOT */
-       { 0x0a, KEY_MUTE },             /* MUTE */
-
-       { 0x26, KEY_RECORD },           /* RECORD */
-       { 0x16, KEY_PAUSE },            /* PAUSE */
-       { 0x36, KEY_STOP },             /* STOP */
-       { 0x06, KEY_PLAY },             /* PLAY */
-
-       { 0x2e, KEY_RED },              /* RED */
-       { 0x21, KEY_GREEN },            /* GREEN */
-       { 0x0e, KEY_YELLOW },           /* YELLOW */
-       { 0x01, KEY_BLUE },             /* BLUE */
-
-       { 0x1e, KEY_VOLUMEDOWN },       /* VOLUME- */
-       { 0x3e, KEY_VOLUMEUP },         /* VOLUME+ */
-       { 0x11, KEY_CHANNELDOWN },      /* CHANNEL/PAGE- */
-       { 0x31, KEY_CHANNELUP }         /* CHANNEL/PAGE+ */
-};
-
-struct ir_scancode_table ir_codes_avermedia_table = {
-       .scan = ir_codes_avermedia,
-       .size = ARRAY_SIZE(ir_codes_avermedia),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_table);
-
-static struct ir_scancode ir_codes_videomate_tv_pvr[] = {
-       { 0x14, KEY_MUTE },
-       { 0x24, KEY_ZOOM },
-
-       { 0x01, KEY_DVD },
-       { 0x23, KEY_RADIO },
-       { 0x00, KEY_TV },
-
-       { 0x0a, KEY_REWIND },
-       { 0x08, KEY_PLAYPAUSE },
-       { 0x0f, KEY_FORWARD },
-
-       { 0x02, KEY_PREVIOUS },
-       { 0x07, KEY_STOP },
-       { 0x06, KEY_NEXT },
-
-       { 0x0c, KEY_UP },
-       { 0x0e, KEY_DOWN },
-       { 0x0b, KEY_LEFT },
-       { 0x0d, KEY_RIGHT },
-       { 0x11, KEY_OK },
-
-       { 0x03, KEY_MENU },
-       { 0x09, KEY_SETUP },
-       { 0x05, KEY_VIDEO },
-       { 0x22, KEY_CHANNEL },
-
-       { 0x12, KEY_VOLUMEUP },
-       { 0x15, KEY_VOLUMEDOWN },
-       { 0x10, KEY_CHANNELUP },
-       { 0x13, KEY_CHANNELDOWN },
-
-       { 0x04, KEY_RECORD },
-
-       { 0x16, KEY_1 },
-       { 0x17, KEY_2 },
-       { 0x18, KEY_3 },
-       { 0x19, KEY_4 },
-       { 0x1a, KEY_5 },
-       { 0x1b, KEY_6 },
-       { 0x1c, KEY_7 },
-       { 0x1d, KEY_8 },
-       { 0x1e, KEY_9 },
-       { 0x1f, KEY_0 },
-
-       { 0x20, KEY_LANGUAGE },
-       { 0x21, KEY_SLEEP },
-};
-
-struct ir_scancode_table ir_codes_videomate_tv_pvr_table = {
-       .scan = ir_codes_videomate_tv_pvr,
-       .size = ARRAY_SIZE(ir_codes_videomate_tv_pvr),
-};
-EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr_table);
-
-/* Michael Tokarev <mjt@tls.msk.ru>
-   http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
-   keytable is used by MANLI MTV00[0x0c] and BeholdTV 40[13] at
-   least, and probably other cards too.
-   The "ascii-art picture" below (in comments, first row
-   is the keycode in hex, and subsequent row(s) shows
-   the button labels (several variants when appropriate)
-   helps to descide which keycodes to assign to the buttons.
- */
-static struct ir_scancode ir_codes_manli[] = {
-
-       /*  0x1c            0x12  *
-        * FUNCTION         POWER *
-        *   FM              (|)  *
-        *                        */
-       { 0x1c, KEY_RADIO },    /*XXX*/
-       { 0x12, KEY_POWER },
-
-       /*  0x01    0x02    0x03  *
-        *   1       2       3    *
-        *                        *
-        *  0x04    0x05    0x06  *
-        *   4       5       6    *
-        *                        *
-        *  0x07    0x08    0x09  *
-        *   7       8       9    *
-        *                        */
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       /*  0x0a    0x00    0x17  *
-        * RECALL    0      +100  *
-        *                  PLUS  *
-        *                        */
-       { 0x0a, KEY_AGAIN },    /*XXX KEY_REWIND? */
-       { 0x00, KEY_0 },
-       { 0x17, KEY_DIGITS },   /*XXX*/
-
-       /*  0x14            0x10  *
-        *  MENU            INFO  *
-        *  OSD                   */
-       { 0x14, KEY_MENU },
-       { 0x10, KEY_INFO },
-
-       /*          0x0b          *
-        *           Up           *
-        *                        *
-        *  0x18    0x16    0x0c  *
-        *  Left     Ok     Right *
-        *                        *
-        *         0x015          *
-        *         Down           *
-        *                        */
-       { 0x0b, KEY_UP },
-       { 0x18, KEY_LEFT },
-       { 0x16, KEY_OK },       /*XXX KEY_SELECT? KEY_ENTER? */
-       { 0x0c, KEY_RIGHT },
-       { 0x15, KEY_DOWN },
-
-       /*  0x11            0x0d  *
-        *  TV/AV           MODE  *
-        *  SOURCE         STEREO *
-        *                        */
-       { 0x11, KEY_TV },       /*XXX*/
-       { 0x0d, KEY_MODE },     /*XXX there's no KEY_STEREO     */
-
-       /*  0x0f    0x1b    0x1a  *
-        *  AUDIO   Vol+    Chan+ *
-        *        TIMESHIFT???    *
-        *                        *
-        *  0x0e    0x1f    0x1e  *
-        *  SLEEP   Vol-    Chan- *
-        *                        */
-       { 0x0f, KEY_AUDIO },
-       { 0x1b, KEY_VOLUMEUP },
-       { 0x1a, KEY_CHANNELUP },
-       { 0x0e, KEY_TIME },
-       { 0x1f, KEY_VOLUMEDOWN },
-       { 0x1e, KEY_CHANNELDOWN },
-
-       /*         0x13     0x19  *
-        *         MUTE   SNAPSHOT*
-        *                        */
-       { 0x13, KEY_MUTE },
-       { 0x19, KEY_CAMERA },
-
-       /* 0x1d unused ? */
-};
-
-struct ir_scancode_table ir_codes_manli_table = {
-       .scan = ir_codes_manli,
-       .size = ARRAY_SIZE(ir_codes_manli),
-};
-EXPORT_SYMBOL_GPL(ir_codes_manli_table);
-
-/* Mike Baikov <mike@baikov.com> */
-static struct ir_scancode ir_codes_gotview7135[] = {
-
-       { 0x11, KEY_POWER },
-       { 0x35, KEY_TV },
-       { 0x1b, KEY_0 },
-       { 0x29, KEY_1 },
-       { 0x19, KEY_2 },
-       { 0x39, KEY_3 },
-       { 0x1f, KEY_4 },
-       { 0x2c, KEY_5 },
-       { 0x21, KEY_6 },
-       { 0x24, KEY_7 },
-       { 0x18, KEY_8 },
-       { 0x2b, KEY_9 },
-       { 0x3b, KEY_AGAIN },    /* LOOP */
-       { 0x06, KEY_AUDIO },
-       { 0x31, KEY_PRINT },    /* PREVIEW */
-       { 0x3e, KEY_VIDEO },
-       { 0x10, KEY_CHANNELUP },
-       { 0x20, KEY_CHANNELDOWN },
-       { 0x0c, KEY_VOLUMEDOWN },
-       { 0x28, KEY_VOLUMEUP },
-       { 0x08, KEY_MUTE },
-       { 0x26, KEY_SEARCH },   /* SCAN */
-       { 0x3f, KEY_CAMERA },   /* SNAPSHOT */
-       { 0x12, KEY_RECORD },
-       { 0x32, KEY_STOP },
-       { 0x3c, KEY_PLAY },
-       { 0x1d, KEY_REWIND },
-       { 0x2d, KEY_PAUSE },
-       { 0x0d, KEY_FORWARD },
-       { 0x05, KEY_ZOOM },     /*FULL*/
-
-       { 0x2a, KEY_F21 },      /* LIVE TIMESHIFT */
-       { 0x0e, KEY_F22 },      /* MIN TIMESHIFT */
-       { 0x1e, KEY_TIME },     /* TIMESHIFT */
-       { 0x38, KEY_F24 },      /* NORMAL TIMESHIFT */
-};
-
-struct ir_scancode_table ir_codes_gotview7135_table = {
-       .scan = ir_codes_gotview7135,
-       .size = ARRAY_SIZE(ir_codes_gotview7135),
-};
-EXPORT_SYMBOL_GPL(ir_codes_gotview7135_table);
-
-static struct ir_scancode ir_codes_purpletv[] = {
-       { 0x03, KEY_POWER },
-       { 0x6f, KEY_MUTE },
-       { 0x10, KEY_BACKSPACE },        /* Recall */
-
-       { 0x11, KEY_0 },
-       { 0x04, KEY_1 },
-       { 0x05, KEY_2 },
-       { 0x06, KEY_3 },
-       { 0x08, KEY_4 },
-       { 0x09, KEY_5 },
-       { 0x0a, KEY_6 },
-       { 0x0c, KEY_7 },
-       { 0x0d, KEY_8 },
-       { 0x0e, KEY_9 },
-       { 0x12, KEY_DOT },      /* 100+ */
-
-       { 0x07, KEY_VOLUMEUP },
-       { 0x0b, KEY_VOLUMEDOWN },
-       { 0x1a, KEY_KPPLUS },
-       { 0x18, KEY_KPMINUS },
-       { 0x15, KEY_UP },
-       { 0x1d, KEY_DOWN },
-       { 0x0f, KEY_CHANNELUP },
-       { 0x13, KEY_CHANNELDOWN },
-       { 0x48, KEY_ZOOM },
-
-       { 0x1b, KEY_VIDEO },    /* Video source */
-       { 0x1f, KEY_CAMERA },   /* Snapshot */
-       { 0x49, KEY_LANGUAGE }, /* MTS Select */
-       { 0x19, KEY_SEARCH },   /* Auto Scan */
-
-       { 0x4b, KEY_RECORD },
-       { 0x46, KEY_PLAY },
-       { 0x45, KEY_PAUSE },    /* Pause */
-       { 0x44, KEY_STOP },
-       { 0x43, KEY_TIME },     /* Time Shift */
-       { 0x17, KEY_CHANNEL },  /* SURF CH */
-       { 0x40, KEY_FORWARD },  /* Forward ? */
-       { 0x42, KEY_REWIND },   /* Backward ? */
-
-};
-
-struct ir_scancode_table ir_codes_purpletv_table = {
-       .scan = ir_codes_purpletv,
-       .size = ARRAY_SIZE(ir_codes_purpletv),
-};
-EXPORT_SYMBOL_GPL(ir_codes_purpletv_table);
-
-/* Mapping for the 28 key remote control as seen at
-   http://www.sednacomputer.com/photo/cardbus-tv.jpg
-   Pavel Mihaylov <bin@bash.info>
-   Also for the remote bundled with Kozumi KTV-01C card */
-static struct ir_scancode ir_codes_pctv_sedna[] = {
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0a, KEY_AGAIN },    /* Recall */
-       { 0x0b, KEY_CHANNELUP },
-       { 0x0c, KEY_VOLUMEUP },
-       { 0x0d, KEY_MODE },     /* Stereo */
-       { 0x0e, KEY_STOP },
-       { 0x0f, KEY_PREVIOUSSONG },
-       { 0x10, KEY_ZOOM },
-       { 0x11, KEY_TUNER },    /* Source */
-       { 0x12, KEY_POWER },
-       { 0x13, KEY_MUTE },
-       { 0x15, KEY_CHANNELDOWN },
-       { 0x18, KEY_VOLUMEDOWN },
-       { 0x19, KEY_CAMERA },   /* Snapshot */
-       { 0x1a, KEY_NEXTSONG },
-       { 0x1b, KEY_TIME },     /* Time Shift */
-       { 0x1c, KEY_RADIO },    /* FM Radio */
-       { 0x1d, KEY_RECORD },
-       { 0x1e, KEY_PAUSE },
-       /* additional codes for Kozumi's remote */
-       { 0x14, KEY_INFO },     /* OSD */
-       { 0x16, KEY_OK },       /* OK */
-       { 0x17, KEY_DIGITS },   /* Plus */
-       { 0x1f, KEY_PLAY },     /* Play */
-};
-
-struct ir_scancode_table ir_codes_pctv_sedna_table = {
-       .scan = ir_codes_pctv_sedna,
-       .size = ARRAY_SIZE(ir_codes_pctv_sedna),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna_table);
-
-/* Mark Phalan <phalanm@o2.ie> */
-static struct ir_scancode ir_codes_pv951[] = {
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x12, KEY_POWER },
-       { 0x10, KEY_MUTE },
-       { 0x1f, KEY_VOLUMEDOWN },
-       { 0x1b, KEY_VOLUMEUP },
-       { 0x1a, KEY_CHANNELUP },
-       { 0x1e, KEY_CHANNELDOWN },
-       { 0x0e, KEY_PAGEUP },
-       { 0x1d, KEY_PAGEDOWN },
-       { 0x13, KEY_SOUND },
-
-       { 0x18, KEY_KPPLUSMINUS },      /* CH +/- */
-       { 0x16, KEY_SUBTITLE },         /* CC */
-       { 0x0d, KEY_TEXT },             /* TTX */
-       { 0x0b, KEY_TV },               /* AIR/CBL */
-       { 0x11, KEY_PC },               /* PC/TV */
-       { 0x17, KEY_OK },               /* CH RTN */
-       { 0x19, KEY_MODE },             /* FUNC */
-       { 0x0c, KEY_SEARCH },           /* AUTOSCAN */
-
-       /* Not sure what to do with these ones! */
-       { 0x0f, KEY_SELECT },           /* SOURCE */
-       { 0x0a, KEY_KPPLUS },           /* +100 */
-       { 0x14, KEY_EQUAL },            /* SYNC */
-       { 0x1c, KEY_MEDIA },            /* PC/TV */
-};
-
-struct ir_scancode_table ir_codes_pv951_table = {
-       .scan = ir_codes_pv951,
-       .size = ARRAY_SIZE(ir_codes_pv951),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pv951_table);
-
-/* generic RC5 keytable                                          */
-/* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
-/* used by old (black) Hauppauge remotes                         */
-static struct ir_scancode ir_codes_rc5_tv[] = {
-       /* Keys 0 to 9 */
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0b, KEY_CHANNEL },          /* channel / program (japan: 11) */
-       { 0x0c, KEY_POWER },            /* standby */
-       { 0x0d, KEY_MUTE },             /* mute / demute */
-       { 0x0f, KEY_TV },               /* display */
-       { 0x10, KEY_VOLUMEUP },
-       { 0x11, KEY_VOLUMEDOWN },
-       { 0x12, KEY_BRIGHTNESSUP },
-       { 0x13, KEY_BRIGHTNESSDOWN },
-       { 0x1e, KEY_SEARCH },           /* search + */
-       { 0x20, KEY_CHANNELUP },        /* channel / program + */
-       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
-       { 0x22, KEY_CHANNEL },          /* alt / channel */
-       { 0x23, KEY_LANGUAGE },         /* 1st / 2nd language */
-       { 0x26, KEY_SLEEP },            /* sleeptimer */
-       { 0x2e, KEY_MENU },             /* 2nd controls (USA: menu) */
-       { 0x30, KEY_PAUSE },
-       { 0x32, KEY_REWIND },
-       { 0x33, KEY_GOTO },
-       { 0x35, KEY_PLAY },
-       { 0x36, KEY_STOP },
-       { 0x37, KEY_RECORD },           /* recording */
-       { 0x3c, KEY_TEXT },             /* teletext submode (Japan: 12) */
-       { 0x3d, KEY_SUSPEND },          /* system standby */
-
-};
-
-struct ir_scancode_table ir_codes_rc5_tv_table = {
-       .scan = ir_codes_rc5_tv,
-       .size = ARRAY_SIZE(ir_codes_rc5_tv),
-};
-EXPORT_SYMBOL_GPL(ir_codes_rc5_tv_table);
-
-/* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
-static struct ir_scancode ir_codes_winfast[] = {
-       /* Keys 0 to 9 */
-       { 0x12, KEY_0 },
-       { 0x05, KEY_1 },
-       { 0x06, KEY_2 },
-       { 0x07, KEY_3 },
-       { 0x09, KEY_4 },
-       { 0x0a, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x0d, KEY_7 },
-       { 0x0e, KEY_8 },
-       { 0x0f, KEY_9 },
-
-       { 0x00, KEY_POWER },
-       { 0x1b, KEY_AUDIO },            /* Audio Source */
-       { 0x02, KEY_TUNER },            /* TV/FM, not on Y0400052 */
-       { 0x1e, KEY_VIDEO },            /* Video Source */
-       { 0x16, KEY_INFO },             /* Display information */
-       { 0x04, KEY_VOLUMEUP },
-       { 0x08, KEY_VOLUMEDOWN },
-       { 0x0c, KEY_CHANNELUP },
-       { 0x10, KEY_CHANNELDOWN },
-       { 0x03, KEY_ZOOM },             /* fullscreen */
-       { 0x1f, KEY_TEXT },             /* closed caption/teletext */
-       { 0x20, KEY_SLEEP },
-       { 0x29, KEY_CLEAR },            /* boss key */
-       { 0x14, KEY_MUTE },
-       { 0x2b, KEY_RED },
-       { 0x2c, KEY_GREEN },
-       { 0x2d, KEY_YELLOW },
-       { 0x2e, KEY_BLUE },
-       { 0x18, KEY_KPPLUS },           /* fine tune + , not on Y040052 */
-       { 0x19, KEY_KPMINUS },          /* fine tune - , not on Y040052 */
-       { 0x2a, KEY_MEDIA },            /* PIP (Picture in picture */
-       { 0x21, KEY_DOT },
-       { 0x13, KEY_ENTER },
-       { 0x11, KEY_LAST },             /* Recall (last channel */
-       { 0x22, KEY_PREVIOUS },
-       { 0x23, KEY_PLAYPAUSE },
-       { 0x24, KEY_NEXT },
-       { 0x25, KEY_TIME },             /* Time Shifting */
-       { 0x26, KEY_STOP },
-       { 0x27, KEY_RECORD },
-       { 0x28, KEY_SAVE },             /* Screenshot */
-       { 0x2f, KEY_MENU },
-       { 0x30, KEY_CANCEL },
-       { 0x31, KEY_CHANNEL },          /* Channel Surf */
-       { 0x32, KEY_SUBTITLE },
-       { 0x33, KEY_LANGUAGE },
-       { 0x34, KEY_REWIND },
-       { 0x35, KEY_FASTFORWARD },
-       { 0x36, KEY_TV },
-       { 0x37, KEY_RADIO },            /* FM */
-       { 0x38, KEY_DVD },
-
-       { 0x1a, KEY_MODE},              /* change to MCE mode on Y04G0051 */
-       { 0x3e, KEY_F21 },              /* MCE +VOL, on Y04G0033 */
-       { 0x3a, KEY_F22 },              /* MCE -VOL, on Y04G0033 */
-       { 0x3b, KEY_F23 },              /* MCE +CH,  on Y04G0033 */
-       { 0x3f, KEY_F24 }               /* MCE -CH,  on Y04G0033 */
-};
-
-struct ir_scancode_table ir_codes_winfast_table = {
-       .scan = ir_codes_winfast,
-       .size = ARRAY_SIZE(ir_codes_winfast),
-};
-EXPORT_SYMBOL_GPL(ir_codes_winfast_table);
-
-static struct ir_scancode ir_codes_pinnacle_color[] = {
-       { 0x59, KEY_MUTE },
-       { 0x4a, KEY_POWER },
-
-       { 0x18, KEY_TEXT },
-       { 0x26, KEY_TV },
-       { 0x3d, KEY_PRINT },
-
-       { 0x48, KEY_RED },
-       { 0x04, KEY_GREEN },
-       { 0x11, KEY_YELLOW },
-       { 0x00, KEY_BLUE },
-
-       { 0x2d, KEY_VOLUMEUP },
-       { 0x1e, KEY_VOLUMEDOWN },
-
-       { 0x49, KEY_MENU },
-
-       { 0x16, KEY_CHANNELUP },
-       { 0x17, KEY_CHANNELDOWN },
-
-       { 0x20, KEY_UP },
-       { 0x21, KEY_DOWN },
-       { 0x22, KEY_LEFT },
-       { 0x23, KEY_RIGHT },
-       { 0x0d, KEY_SELECT },
-
-       { 0x08, KEY_BACK },
-       { 0x07, KEY_REFRESH },
-
-       { 0x2f, KEY_ZOOM },
-       { 0x29, KEY_RECORD },
-
-       { 0x4b, KEY_PAUSE },
-       { 0x4d, KEY_REWIND },
-       { 0x2e, KEY_PLAY },
-       { 0x4e, KEY_FORWARD },
-       { 0x53, KEY_PREVIOUS },
-       { 0x4c, KEY_STOP },
-       { 0x54, KEY_NEXT },
-
-       { 0x69, KEY_0 },
-       { 0x6a, KEY_1 },
-       { 0x6b, KEY_2 },
-       { 0x6c, KEY_3 },
-       { 0x6d, KEY_4 },
-       { 0x6e, KEY_5 },
-       { 0x6f, KEY_6 },
-       { 0x70, KEY_7 },
-       { 0x71, KEY_8 },
-       { 0x72, KEY_9 },
-
-       { 0x74, KEY_CHANNEL },
-       { 0x0a, KEY_BACKSPACE },
-};
-
-struct ir_scancode_table ir_codes_pinnacle_color_table = {
-       .scan = ir_codes_pinnacle_color,
-       .size = ARRAY_SIZE(ir_codes_pinnacle_color),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_color_table);
-
-/* Hauppauge: the newer, gray remotes (seems there are multiple
- * slightly different versions), shipped with cx88+ivtv cards.
- * almost rc5 coding, but some non-standard keys */
-static struct ir_scancode ir_codes_hauppauge_new[] = {
-       /* Keys 0 to 9 */
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       { 0x0a, KEY_TEXT },             /* keypad asterisk as well */
-       { 0x0b, KEY_RED },              /* red button */
-       { 0x0c, KEY_RADIO },
-       { 0x0d, KEY_MENU },
-       { 0x0e, KEY_SUBTITLE },         /* also the # key */
-       { 0x0f, KEY_MUTE },
-       { 0x10, KEY_VOLUMEUP },
-       { 0x11, KEY_VOLUMEDOWN },
-       { 0x12, KEY_PREVIOUS },         /* previous channel */
-       { 0x14, KEY_UP },
-       { 0x15, KEY_DOWN },
-       { 0x16, KEY_LEFT },
-       { 0x17, KEY_RIGHT },
-       { 0x18, KEY_VIDEO },            /* Videos */
-       { 0x19, KEY_AUDIO },            /* Music */
-       /* 0x1a: Pictures - presume this means
-          "Multimedia Home Platform" -
-          no "PICTURES" key in input.h
-        */
-       { 0x1a, KEY_MHP },
-
-       { 0x1b, KEY_EPG },              /* Guide */
-       { 0x1c, KEY_TV },
-       { 0x1e, KEY_NEXTSONG },         /* skip >| */
-       { 0x1f, KEY_EXIT },             /* back/exit */
-       { 0x20, KEY_CHANNELUP },        /* channel / program + */
-       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
-       { 0x22, KEY_CHANNEL },          /* source (old black remote) */
-       { 0x24, KEY_PREVIOUSSONG },     /* replay |< */
-       { 0x25, KEY_ENTER },            /* OK */
-       { 0x26, KEY_SLEEP },            /* minimize (old black remote) */
-       { 0x29, KEY_BLUE },             /* blue key */
-       { 0x2e, KEY_GREEN },            /* green button */
-       { 0x30, KEY_PAUSE },            /* pause */
-       { 0x32, KEY_REWIND },           /* backward << */
-       { 0x34, KEY_FASTFORWARD },      /* forward >> */
-       { 0x35, KEY_PLAY },
-       { 0x36, KEY_STOP },
-       { 0x37, KEY_RECORD },           /* recording */
-       { 0x38, KEY_YELLOW },           /* yellow key */
-       { 0x3b, KEY_SELECT },           /* top right button */
-       { 0x3c, KEY_ZOOM },             /* full */
-       { 0x3d, KEY_POWER },            /* system power (green button) */
-};
-
-struct ir_scancode_table ir_codes_hauppauge_new_table = {
-       .scan = ir_codes_hauppauge_new,
-       .size = ARRAY_SIZE(ir_codes_hauppauge_new),
-};
-EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new_table);
-
-static struct ir_scancode ir_codes_npgtech[] = {
-       { 0x1d, KEY_SWITCHVIDEOMODE },  /* switch inputs */
-       { 0x2a, KEY_FRONT },
-
-       { 0x3e, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x06, KEY_3 },
-       { 0x0a, KEY_4 },
-       { 0x0e, KEY_5 },
-       { 0x12, KEY_6 },
-       { 0x16, KEY_7 },
-       { 0x1a, KEY_8 },
-       { 0x1e, KEY_9 },
-       { 0x3a, KEY_0 },
-       { 0x22, KEY_NUMLOCK },          /* -/-- */
-       { 0x20, KEY_REFRESH },
-
-       { 0x03, KEY_BRIGHTNESSDOWN },
-       { 0x28, KEY_AUDIO },
-       { 0x3c, KEY_CHANNELUP },
-       { 0x3f, KEY_VOLUMEDOWN },
-       { 0x2e, KEY_MUTE },
-       { 0x3b, KEY_VOLUMEUP },
-       { 0x00, KEY_CHANNELDOWN },
-       { 0x07, KEY_BRIGHTNESSUP },
-       { 0x2c, KEY_TEXT },
-
-       { 0x37, KEY_RECORD },
-       { 0x17, KEY_PLAY },
-       { 0x13, KEY_PAUSE },
-       { 0x26, KEY_STOP },
-       { 0x18, KEY_FASTFORWARD },
-       { 0x14, KEY_REWIND },
-       { 0x33, KEY_ZOOM },
-       { 0x32, KEY_KEYBOARD },
-       { 0x30, KEY_GOTO },             /* Pointing arrow */
-       { 0x36, KEY_MACRO },            /* Maximize/Minimize (yellow) */
-       { 0x0b, KEY_RADIO },
-       { 0x10, KEY_POWER },
-
-};
-
-struct ir_scancode_table ir_codes_npgtech_table = {
-       .scan = ir_codes_npgtech,
-       .size = ARRAY_SIZE(ir_codes_npgtech),
-};
-EXPORT_SYMBOL_GPL(ir_codes_npgtech_table);
-
-/* Norwood Micro (non-Pro) TV Tuner
-   By Peter Naulls <peter@chocky.org>
-   Key comments are the functions given in the manual */
-static struct ir_scancode ir_codes_norwood[] = {
-       /* Keys 0 to 9 */
-       { 0x20, KEY_0 },
-       { 0x21, KEY_1 },
-       { 0x22, KEY_2 },
-       { 0x23, KEY_3 },
-       { 0x24, KEY_4 },
-       { 0x25, KEY_5 },
-       { 0x26, KEY_6 },
-       { 0x27, KEY_7 },
-       { 0x28, KEY_8 },
-       { 0x29, KEY_9 },
-
-       { 0x78, KEY_TUNER },            /* Video Source        */
-       { 0x2c, KEY_EXIT },             /* Open/Close software */
-       { 0x2a, KEY_SELECT },           /* 2 Digit Select      */
-       { 0x69, KEY_AGAIN },            /* Recall              */
-
-       { 0x32, KEY_BRIGHTNESSUP },     /* Brightness increase */
-       { 0x33, KEY_BRIGHTNESSDOWN },   /* Brightness decrease */
-       { 0x6b, KEY_KPPLUS },           /* (not named >>>>>)   */
-       { 0x6c, KEY_KPMINUS },          /* (not named <<<<<)   */
-
-       { 0x2d, KEY_MUTE },             /* Mute                */
-       { 0x30, KEY_VOLUMEUP },         /* Volume up           */
-       { 0x31, KEY_VOLUMEDOWN },       /* Volume down         */
-       { 0x60, KEY_CHANNELUP },        /* Channel up          */
-       { 0x61, KEY_CHANNELDOWN },      /* Channel down        */
-
-       { 0x3f, KEY_RECORD },           /* Record              */
-       { 0x37, KEY_PLAY },             /* Play                */
-       { 0x36, KEY_PAUSE },            /* Pause               */
-       { 0x2b, KEY_STOP },             /* Stop                */
-       { 0x67, KEY_FASTFORWARD },      /* Foward              */
-       { 0x66, KEY_REWIND },           /* Rewind              */
-       { 0x3e, KEY_SEARCH },           /* Auto Scan           */
-       { 0x2e, KEY_CAMERA },           /* Capture Video       */
-       { 0x6d, KEY_MENU },             /* Show/Hide Control   */
-       { 0x2f, KEY_ZOOM },             /* Full Screen         */
-       { 0x34, KEY_RADIO },            /* FM                  */
-       { 0x65, KEY_POWER },            /* Computer power      */
-};
-
-struct ir_scancode_table ir_codes_norwood_table = {
-       .scan = ir_codes_norwood,
-       .size = ARRAY_SIZE(ir_codes_norwood),
-};
-EXPORT_SYMBOL_GPL(ir_codes_norwood_table);
-
-/* From reading the following remotes:
- * Zenith Universal 7 / TV Mode 807 / VCR Mode 837
- * Hauppauge (from NOVA-CI-s box product)
- * This is a "middle of the road" approach, differences are noted
- */
-static struct ir_scancode ir_codes_budget_ci_old[] = {
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-       { 0x0a, KEY_ENTER },
-       { 0x0b, KEY_RED },
-       { 0x0c, KEY_POWER },            /* RADIO on Hauppauge */
-       { 0x0d, KEY_MUTE },
-       { 0x0f, KEY_A },                /* TV on Hauppauge */
-       { 0x10, KEY_VOLUMEUP },
-       { 0x11, KEY_VOLUMEDOWN },
-       { 0x14, KEY_B },
-       { 0x1c, KEY_UP },
-       { 0x1d, KEY_DOWN },
-       { 0x1e, KEY_OPTION },           /* RESERVED on Hauppauge */
-       { 0x1f, KEY_BREAK },
-       { 0x20, KEY_CHANNELUP },
-       { 0x21, KEY_CHANNELDOWN },
-       { 0x22, KEY_PREVIOUS },         /* Prev Ch on Zenith, SOURCE on Hauppauge */
-       { 0x24, KEY_RESTART },
-       { 0x25, KEY_OK },
-       { 0x26, KEY_CYCLEWINDOWS },     /* MINIMIZE on Hauppauge */
-       { 0x28, KEY_ENTER },            /* VCR mode on Zenith */
-       { 0x29, KEY_PAUSE },
-       { 0x2b, KEY_RIGHT },
-       { 0x2c, KEY_LEFT },
-       { 0x2e, KEY_MENU },             /* FULL SCREEN on Hauppauge */
-       { 0x30, KEY_SLOW },
-       { 0x31, KEY_PREVIOUS },         /* VCR mode on Zenith */
-       { 0x32, KEY_REWIND },
-       { 0x34, KEY_FASTFORWARD },
-       { 0x35, KEY_PLAY },
-       { 0x36, KEY_STOP },
-       { 0x37, KEY_RECORD },
-       { 0x38, KEY_TUNER },            /* TV/VCR on Zenith */
-       { 0x3a, KEY_C },
-       { 0x3c, KEY_EXIT },
-       { 0x3d, KEY_POWER2 },
-       { 0x3e, KEY_TUNER },
-};
-
-struct ir_scancode_table ir_codes_budget_ci_old_table = {
-       .scan = ir_codes_budget_ci_old,
-       .size = ARRAY_SIZE(ir_codes_budget_ci_old),
-};
-EXPORT_SYMBOL_GPL(ir_codes_budget_ci_old_table);
-
-/*
- * Marc Fargas <telenieko@telenieko.com>
- * this is the remote control that comes with the asus p7131
- * which has a label saying is "Model PC-39"
- */
-static struct ir_scancode ir_codes_asus_pc39[] = {
-       /* Keys 0 to 9 */
-       { 0x15, KEY_0 },
-       { 0x29, KEY_1 },
-       { 0x2d, KEY_2 },
-       { 0x2b, KEY_3 },
-       { 0x09, KEY_4 },
-       { 0x0d, KEY_5 },
-       { 0x0b, KEY_6 },
-       { 0x31, KEY_7 },
-       { 0x35, KEY_8 },
-       { 0x33, KEY_9 },
-
-       { 0x3e, KEY_RADIO },            /* radio */
-       { 0x03, KEY_MENU },             /* dvd/menu */
-       { 0x2a, KEY_VOLUMEUP },
-       { 0x19, KEY_VOLUMEDOWN },
-       { 0x37, KEY_UP },
-       { 0x3b, KEY_DOWN },
-       { 0x27, KEY_LEFT },
-       { 0x2f, KEY_RIGHT },
-       { 0x25, KEY_VIDEO },            /* video */
-       { 0x39, KEY_AUDIO },            /* music */
-
-       { 0x21, KEY_TV },               /* tv */
-       { 0x1d, KEY_EXIT },             /* back */
-       { 0x0a, KEY_CHANNELUP },        /* channel / program + */
-       { 0x1b, KEY_CHANNELDOWN },      /* channel / program - */
-       { 0x1a, KEY_ENTER },            /* enter */
-
-       { 0x06, KEY_PAUSE },            /* play/pause */
-       { 0x1e, KEY_PREVIOUS },         /* rew */
-       { 0x26, KEY_NEXT },             /* forward */
-       { 0x0e, KEY_REWIND },           /* backward << */
-       { 0x3a, KEY_FASTFORWARD },      /* forward >> */
-       { 0x36, KEY_STOP },
-       { 0x2e, KEY_RECORD },           /* recording */
-       { 0x16, KEY_POWER },            /* the button that reads "close" */
-
-       { 0x11, KEY_ZOOM },             /* full screen */
-       { 0x13, KEY_MACRO },            /* recall */
-       { 0x23, KEY_HOME },             /* home */
-       { 0x05, KEY_PVR },              /* picture */
-       { 0x3d, KEY_MUTE },             /* mute */
-       { 0x01, KEY_DVD },              /* dvd */
-};
-
-struct ir_scancode_table ir_codes_asus_pc39_table = {
-       .scan = ir_codes_asus_pc39,
-       .size = ARRAY_SIZE(ir_codes_asus_pc39),
-};
-EXPORT_SYMBOL_GPL(ir_codes_asus_pc39_table);
-
-
-/* Encore ENLTV-FM  - black plastic, white front cover with white glowing buttons
-    Juan Pablo Sormani <sorman@gmail.com> */
-static struct ir_scancode ir_codes_encore_enltv[] = {
-
-       /* Power button does nothing, neither in Windows app,
-        although it sends data (used for BIOS wakeup?) */
-       { 0x0d, KEY_MUTE },
-
-       { 0x1e, KEY_TV },
-       { 0x00, KEY_VIDEO },
-       { 0x01, KEY_AUDIO },            /* music */
-       { 0x02, KEY_MHP },              /* picture */
-
-       { 0x1f, KEY_1 },
-       { 0x03, KEY_2 },
-       { 0x04, KEY_3 },
-       { 0x05, KEY_4 },
-       { 0x1c, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x1d, KEY_9 },
-       { 0x0a, KEY_0 },
-
-       { 0x09, KEY_LIST },             /* -/-- */
-       { 0x0b, KEY_LAST },             /* recall */
-
-       { 0x14, KEY_HOME },             /* win start menu */
-       { 0x15, KEY_EXIT },             /* exit */
-       { 0x16, KEY_CHANNELUP },        /* UP */
-       { 0x12, KEY_CHANNELDOWN },      /* DOWN */
-       { 0x0c, KEY_VOLUMEUP },         /* RIGHT */
-       { 0x17, KEY_VOLUMEDOWN },       /* LEFT */
-
-       { 0x18, KEY_ENTER },            /* OK */
-
-       { 0x0e, KEY_ESC },
-       { 0x13, KEY_CYCLEWINDOWS },     /* desktop */
-       { 0x11, KEY_TAB },
-       { 0x19, KEY_SWITCHVIDEOMODE },  /* switch */
-
-       { 0x1a, KEY_MENU },
-       { 0x1b, KEY_ZOOM },             /* fullscreen */
-       { 0x44, KEY_TIME },             /* time shift */
-       { 0x40, KEY_MODE },             /* source */
-
-       { 0x5a, KEY_RECORD },
-       { 0x42, KEY_PLAY },             /* play/pause */
-       { 0x45, KEY_STOP },
-       { 0x43, KEY_CAMERA },           /* camera icon */
-
-       { 0x48, KEY_REWIND },
-       { 0x4a, KEY_FASTFORWARD },
-       { 0x49, KEY_PREVIOUS },
-       { 0x4b, KEY_NEXT },
-
-       { 0x4c, KEY_FAVORITES },        /* tv wall */
-       { 0x4d, KEY_SOUND },            /* DVD sound */
-       { 0x4e, KEY_LANGUAGE },         /* DVD lang */
-       { 0x4f, KEY_TEXT },             /* DVD text */
-
-       { 0x50, KEY_SLEEP },            /* shutdown */
-       { 0x51, KEY_MODE },             /* stereo > main */
-       { 0x52, KEY_SELECT },           /* stereo > sap */
-       { 0x53, KEY_PROG1 },            /* teletext */
-
-
-       { 0x59, KEY_RED },              /* AP1 */
-       { 0x41, KEY_GREEN },            /* AP2 */
-       { 0x47, KEY_YELLOW },           /* AP3 */
-       { 0x57, KEY_BLUE },             /* AP4 */
-};
-
-struct ir_scancode_table ir_codes_encore_enltv_table = {
-       .scan = ir_codes_encore_enltv,
-       .size = ARRAY_SIZE(ir_codes_encore_enltv),
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_table);
-
-/* Encore ENLTV2-FM  - silver plastic - "Wand Media" written at the botton
-    Mauro Carvalho Chehab <mchehab@infradead.org> */
-static struct ir_scancode ir_codes_encore_enltv2[] = {
-       { 0x4c, KEY_POWER2 },
-       { 0x4a, KEY_TUNER },
-       { 0x40, KEY_1 },
-       { 0x60, KEY_2 },
-       { 0x50, KEY_3 },
-       { 0x70, KEY_4 },
-       { 0x48, KEY_5 },
-       { 0x68, KEY_6 },
-       { 0x58, KEY_7 },
-       { 0x78, KEY_8 },
-       { 0x44, KEY_9 },
-       { 0x54, KEY_0 },
-
-       { 0x64, KEY_LAST },             /* +100 */
-       { 0x4e, KEY_AGAIN },            /* Recall */
-
-       { 0x6c, KEY_SWITCHVIDEOMODE },  /* Video Source */
-       { 0x5e, KEY_MENU },
-       { 0x56, KEY_SCREEN },
-       { 0x7a, KEY_SETUP },
-
-       { 0x46, KEY_MUTE },
-       { 0x5c, KEY_MODE },             /* Stereo */
-       { 0x74, KEY_INFO },
-       { 0x7c, KEY_CLEAR },
-
-       { 0x55, KEY_UP },
-       { 0x49, KEY_DOWN },
-       { 0x7e, KEY_LEFT },
-       { 0x59, KEY_RIGHT },
-       { 0x6a, KEY_ENTER },
-
-       { 0x42, KEY_VOLUMEUP },
-       { 0x62, KEY_VOLUMEDOWN },
-       { 0x52, KEY_CHANNELUP },
-       { 0x72, KEY_CHANNELDOWN },
-
-       { 0x41, KEY_RECORD },
-       { 0x51, KEY_CAMERA },           /* Snapshot */
-       { 0x75, KEY_TIME },             /* Timeshift */
-       { 0x71, KEY_TV2 },              /* PIP */
-
-       { 0x45, KEY_REWIND },
-       { 0x6f, KEY_PAUSE },
-       { 0x7d, KEY_FORWARD },
-       { 0x79, KEY_STOP },
-};
-
-struct ir_scancode_table ir_codes_encore_enltv2_table = {
-       .scan = ir_codes_encore_enltv2,
-       .size = ARRAY_SIZE(ir_codes_encore_enltv2),
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2_table);
-
-/* for the Technotrend 1500 bundled remotes (grey and black): */
-static struct ir_scancode ir_codes_tt_1500[] = {
-       { 0x01, KEY_POWER },
-       { 0x02, KEY_SHUFFLE },          /* ? double-arrow key */
-       { 0x03, KEY_1 },
-       { 0x04, KEY_2 },
-       { 0x05, KEY_3 },
-       { 0x06, KEY_4 },
-       { 0x07, KEY_5 },
-       { 0x08, KEY_6 },
-       { 0x09, KEY_7 },
-       { 0x0a, KEY_8 },
-       { 0x0b, KEY_9 },
-       { 0x0c, KEY_0 },
-       { 0x0d, KEY_UP },
-       { 0x0e, KEY_LEFT },
-       { 0x0f, KEY_OK },
-       { 0x10, KEY_RIGHT },
-       { 0x11, KEY_DOWN },
-       { 0x12, KEY_INFO },
-       { 0x13, KEY_EXIT },
-       { 0x14, KEY_RED },
-       { 0x15, KEY_GREEN },
-       { 0x16, KEY_YELLOW },
-       { 0x17, KEY_BLUE },
-       { 0x18, KEY_MUTE },
-       { 0x19, KEY_TEXT },
-       { 0x1a, KEY_MODE },             /* ? TV/Radio */
-       { 0x21, KEY_OPTION },
-       { 0x22, KEY_EPG },
-       { 0x23, KEY_CHANNELUP },
-       { 0x24, KEY_CHANNELDOWN },
-       { 0x25, KEY_VOLUMEUP },
-       { 0x26, KEY_VOLUMEDOWN },
-       { 0x27, KEY_SETUP },
-       { 0x3a, KEY_RECORD },           /* these keys are only in the black remote */
-       { 0x3b, KEY_PLAY },
-       { 0x3c, KEY_STOP },
-       { 0x3d, KEY_REWIND },
-       { 0x3e, KEY_PAUSE },
-       { 0x3f, KEY_FORWARD },
-};
-
-struct ir_scancode_table ir_codes_tt_1500_table = {
-       .scan = ir_codes_tt_1500,
-       .size = ARRAY_SIZE(ir_codes_tt_1500),
-};
-EXPORT_SYMBOL_GPL(ir_codes_tt_1500_table);
-
-/* DViCO FUSION HDTV MCE remote */
-static struct ir_scancode ir_codes_fusionhdtv_mce[] = {
-
-       { 0x0b, KEY_1 },
-       { 0x17, KEY_2 },
-       { 0x1b, KEY_3 },
-       { 0x07, KEY_4 },
-       { 0x50, KEY_5 },
-       { 0x54, KEY_6 },
-       { 0x48, KEY_7 },
-       { 0x4c, KEY_8 },
-       { 0x58, KEY_9 },
-       { 0x03, KEY_0 },
-
-       { 0x5e, KEY_OK },
-       { 0x51, KEY_UP },
-       { 0x53, KEY_DOWN },
-       { 0x5b, KEY_LEFT },
-       { 0x5f, KEY_RIGHT },
-
-       { 0x02, KEY_TV },               /* Labeled DTV on remote */
-       { 0x0e, KEY_MP3 },
-       { 0x1a, KEY_DVD },
-       { 0x1e, KEY_FAVORITES },        /* Labeled CPF on remote */
-       { 0x16, KEY_SETUP },
-       { 0x46, KEY_POWER2 },           /* TV On/Off button on remote */
-       { 0x0a, KEY_EPG },              /* Labeled Guide on remote */
-
-       { 0x49, KEY_BACK },
-       { 0x59, KEY_INFO },             /* Labeled MORE on remote */
-       { 0x4d, KEY_MENU },             /* Labeled DVDMENU on remote */
-       { 0x55, KEY_CYCLEWINDOWS },     /* Labeled ALT-TAB on remote */
-
-       { 0x0f, KEY_PREVIOUSSONG },     /* Labeled |<< REPLAY on remote */
-       { 0x12, KEY_NEXTSONG },         /* Labeled >>| SKIP on remote */
-       { 0x42, KEY_ENTER },            /* Labeled START with a green
-                                          MS windows logo on remote */
-
-       { 0x15, KEY_VOLUMEUP },
-       { 0x05, KEY_VOLUMEDOWN },
-       { 0x11, KEY_CHANNELUP },
-       { 0x09, KEY_CHANNELDOWN },
-
-       { 0x52, KEY_CAMERA },
-       { 0x5a, KEY_TUNER },
-       { 0x19, KEY_OPEN },
-
-       { 0x13, KEY_MODE },             /* 4:3 16:9 select */
-       { 0x1f, KEY_ZOOM },
-
-       { 0x43, KEY_REWIND },
-       { 0x47, KEY_PLAYPAUSE },
-       { 0x4f, KEY_FASTFORWARD },
-       { 0x57, KEY_MUTE },
-       { 0x0d, KEY_STOP },
-       { 0x01, KEY_RECORD },
-       { 0x4e, KEY_POWER },
-};
-
-struct ir_scancode_table ir_codes_fusionhdtv_mce_table = {
-       .scan = ir_codes_fusionhdtv_mce,
-       .size = ARRAY_SIZE(ir_codes_fusionhdtv_mce),
-};
-EXPORT_SYMBOL_GPL(ir_codes_fusionhdtv_mce_table);
-
-/* Pinnacle PCTV HD 800i mini remote */
-static struct ir_scancode ir_codes_pinnacle_pctv_hd[] = {
-
-       { 0x0f, KEY_1 },
-       { 0x15, KEY_2 },
-       { 0x10, KEY_3 },
-       { 0x18, KEY_4 },
-       { 0x1b, KEY_5 },
-       { 0x1e, KEY_6 },
-       { 0x11, KEY_7 },
-       { 0x21, KEY_8 },
-       { 0x12, KEY_9 },
-       { 0x27, KEY_0 },
-
-       { 0x24, KEY_ZOOM },
-       { 0x2a, KEY_SUBTITLE },
-
-       { 0x00, KEY_MUTE },
-       { 0x01, KEY_ENTER },    /* Pinnacle Logo */
-       { 0x39, KEY_POWER },
-
-       { 0x03, KEY_VOLUMEUP },
-       { 0x09, KEY_VOLUMEDOWN },
-       { 0x06, KEY_CHANNELUP },
-       { 0x0c, KEY_CHANNELDOWN },
-
-       { 0x2d, KEY_REWIND },
-       { 0x30, KEY_PLAYPAUSE },
-       { 0x33, KEY_FASTFORWARD },
-       { 0x3c, KEY_STOP },
-       { 0x36, KEY_RECORD },
-       { 0x3f, KEY_EPG },      /* Labeled "?" */
-};
-
-struct ir_scancode_table ir_codes_pinnacle_pctv_hd_table = {
-       .scan = ir_codes_pinnacle_pctv_hd,
-       .size = ARRAY_SIZE(ir_codes_pinnacle_pctv_hd),
-};
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd_table);
-
-/*
- * Igor Kuznetsov <igk72@ya.ru>
- * Andrey J. Melnikov <temnota@kmv.ru>
- *
- * Keytable is used by BeholdTV 60x series, M6 series at
- * least, and probably other cards too.
- * The "ascii-art picture" below (in comments, first row
- * is the keycode in hex, and subsequent row(s) shows
- * the button labels (several variants when appropriate)
- * helps to descide which keycodes to assign to the buttons.
- */
-static struct ir_scancode ir_codes_behold[] = {
-
-       /*  0x1c            0x12  *
-        *  TV/FM          POWER  *
-        *                        */
-       { 0x1c, KEY_TUNER },    /* XXX KEY_TV / KEY_RADIO */
-       { 0x12, KEY_POWER },
-
-       /*  0x01    0x02    0x03  *
-        *   1       2       3    *
-        *                        *
-        *  0x04    0x05    0x06  *
-        *   4       5       6    *
-        *                        *
-        *  0x07    0x08    0x09  *
-        *   7       8       9    *
-        *                        */
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-
-       /*  0x0a    0x00    0x17  *
-        * RECALL    0      MODE  *
-        *                        */
-       { 0x0a, KEY_AGAIN },
-       { 0x00, KEY_0 },
-       { 0x17, KEY_MODE },
-
-       /*  0x14          0x10    *
-        * ASPECT      FULLSCREEN *
-        *                        */
-       { 0x14, KEY_SCREEN },
-       { 0x10, KEY_ZOOM },
-
-       /*          0x0b          *
-        *           Up           *
-        *                        *
-        *  0x18    0x16    0x0c  *
-        *  Left     Ok     Right *
-        *                        *
-        *         0x015          *
-        *         Down           *
-        *                        */
-       { 0x0b, KEY_CHANNELUP },
-       { 0x18, KEY_VOLUMEDOWN },
-       { 0x16, KEY_OK },               /* XXX KEY_ENTER */
-       { 0x0c, KEY_VOLUMEUP },
-       { 0x15, KEY_CHANNELDOWN },
-
-       /*  0x11            0x0d  *
-        *  MUTE            INFO  *
-        *                        */
-       { 0x11, KEY_MUTE },
-       { 0x0d, KEY_INFO },
-
-       /*  0x0f    0x1b    0x1a  *
-        * RECORD PLAY/PAUSE STOP *
-        *                        *
-        *  0x0e    0x1f    0x1e  *
-        *TELETEXT  AUDIO  SOURCE *
-        *           RED   YELLOW *
-        *                        */
-       { 0x0f, KEY_RECORD },
-       { 0x1b, KEY_PLAYPAUSE },
-       { 0x1a, KEY_STOP },
-       { 0x0e, KEY_TEXT },
-       { 0x1f, KEY_RED },      /*XXX KEY_AUDIO */
-       { 0x1e, KEY_YELLOW },   /*XXX KEY_SOURCE        */
-
-       /*  0x1d   0x13     0x19  *
-        * SLEEP  PREVIEW   DVB   *
-        *         GREEN    BLUE  *
-        *                        */
-       { 0x1d, KEY_SLEEP },
-       { 0x13, KEY_GREEN },
-       { 0x19, KEY_BLUE },     /* XXX KEY_SAT  */
-
-       /*  0x58           0x5c   *
-        * FREEZE        SNAPSHOT *
-        *                        */
-       { 0x58, KEY_SLOW },
-       { 0x5c, KEY_CAMERA },
-
-};
-
-struct ir_scancode_table ir_codes_behold_table = {
-       .scan = ir_codes_behold,
-       .size = ARRAY_SIZE(ir_codes_behold),
-};
-EXPORT_SYMBOL_GPL(ir_codes_behold_table);
-
-/* Beholder Intl. Ltd. 2008
- * Dmitry Belimov d.belimov@google.com
- * Keytable is used by BeholdTV Columbus
- * The "ascii-art picture" below (in comments, first row
- * is the keycode in hex, and subsequent row(s) shows
- * the button labels (several variants when appropriate)
- * helps to descide which keycodes to assign to the buttons.
- */
-static struct ir_scancode ir_codes_behold_columbus[] = {
-
-       /*  0x13   0x11   0x1C   0x12  *
-        *  Mute  Source  TV/FM  Power *
-        *                             */
-
-       { 0x13, KEY_MUTE },
-       { 0x11, KEY_PROPS },
-       { 0x1C, KEY_TUNER },    /* KEY_TV/KEY_RADIO     */
-       { 0x12, KEY_POWER },
-
-       /*  0x01    0x02    0x03  0x0D    *
-        *   1       2       3   Stereo   *
-        *                                *
-        *  0x04    0x05    0x06  0x19    *
-        *   4       5       6   Snapshot *
-        *                                *
-        *  0x07    0x08    0x09  0x10    *
-        *   7       8       9    Zoom    *
-        *                                */
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x0D, KEY_SETUP },      /* Setup key */
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x19, KEY_CAMERA },   /* Snapshot key */
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-       { 0x10, KEY_ZOOM },
-
-       /*  0x0A    0x00    0x0B       0x0C   *
-        * RECALL    0    ChannelUp  VolumeUp *
-        *                                    */
-       { 0x0A, KEY_AGAIN },
-       { 0x00, KEY_0 },
-       { 0x0B, KEY_CHANNELUP },
-       { 0x0C, KEY_VOLUMEUP },
-
-       /*   0x1B      0x1D      0x15        0x18     *
-        * Timeshift  Record  ChannelDown  VolumeDown *
-        *                                            */
-
-       { 0x1B, KEY_TIME },
-       { 0x1D, KEY_RECORD },
-       { 0x15, KEY_CHANNELDOWN },
-       { 0x18, KEY_VOLUMEDOWN },
-
-       /*   0x0E   0x1E     0x0F     0x1A  *
-        *   Stop   Pause  Previouse  Next  *
-        *                                  */
-
-       { 0x0E, KEY_STOP },
-       { 0x1E, KEY_PAUSE },
-       { 0x0F, KEY_PREVIOUS },
-       { 0x1A, KEY_NEXT },
-
-};
-
-struct ir_scancode_table ir_codes_behold_columbus_table = {
-       .scan = ir_codes_behold_columbus,
-       .size = ARRAY_SIZE(ir_codes_behold_columbus),
-};
-EXPORT_SYMBOL_GPL(ir_codes_behold_columbus_table);
-
-/*
- * Remote control for the Genius TVGO A11MCE
- * Adrian Pardini <pardo.bsso@gmail.com>
- */
-static struct ir_scancode ir_codes_genius_tvgo_a11mce[] = {
-       /* Keys 0 to 9 */
-       { 0x48, KEY_0 },
-       { 0x09, KEY_1 },
-       { 0x1d, KEY_2 },
-       { 0x1f, KEY_3 },
-       { 0x19, KEY_4 },
-       { 0x1b, KEY_5 },
-       { 0x11, KEY_6 },
-       { 0x17, KEY_7 },
-       { 0x12, KEY_8 },
-       { 0x16, KEY_9 },
-
-       { 0x54, KEY_RECORD },           /* recording */
-       { 0x06, KEY_MUTE },             /* mute */
-       { 0x10, KEY_POWER },
-       { 0x40, KEY_LAST },             /* recall */
-       { 0x4c, KEY_CHANNELUP },        /* channel / program + */
-       { 0x00, KEY_CHANNELDOWN },      /* channel / program - */
-       { 0x0d, KEY_VOLUMEUP },
-       { 0x15, KEY_VOLUMEDOWN },
-       { 0x4d, KEY_OK },               /* also labeled as Pause */
-       { 0x1c, KEY_ZOOM },             /* full screen and Stop*/
-       { 0x02, KEY_MODE },             /* AV Source or Rewind*/
-       { 0x04, KEY_LIST },             /* -/-- */
-       /* small arrows above numbers */
-       { 0x1a, KEY_NEXT },             /* also Fast Forward */
-       { 0x0e, KEY_PREVIOUS },         /* also Rewind */
-       /* these are in a rather non standard layout and have
-       an alternate name written */
-       { 0x1e, KEY_UP },               /* Video Setting */
-       { 0x0a, KEY_DOWN },             /* Video Default */
-       { 0x05, KEY_CAMERA },           /* Snapshot */
-       { 0x0c, KEY_RIGHT },            /* Hide Panel */
-       /* Four buttons without label */
-       { 0x49, KEY_RED },
-       { 0x0b, KEY_GREEN },
-       { 0x13, KEY_YELLOW },
-       { 0x50, KEY_BLUE },
-};
-
-struct ir_scancode_table ir_codes_genius_tvgo_a11mce_table = {
-       .scan = ir_codes_genius_tvgo_a11mce,
-       .size = ARRAY_SIZE(ir_codes_genius_tvgo_a11mce),
-};
-EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce_table);
-
-/*
- * Remote control for Powercolor Real Angel 330
- * Daniel Fraga <fragabr@gmail.com>
- */
-static struct ir_scancode ir_codes_powercolor_real_angel[] = {
-       { 0x38, KEY_SWITCHVIDEOMODE },  /* switch inputs */
-       { 0x0c, KEY_MEDIA },            /* Turn ON/OFF App */
-       { 0x00, KEY_0 },
-       { 0x01, KEY_1 },
-       { 0x02, KEY_2 },
-       { 0x03, KEY_3 },
-       { 0x04, KEY_4 },
-       { 0x05, KEY_5 },
-       { 0x06, KEY_6 },
-       { 0x07, KEY_7 },
-       { 0x08, KEY_8 },
-       { 0x09, KEY_9 },
-       { 0x0a, KEY_DIGITS },           /* single, double, tripple digit */
-       { 0x29, KEY_PREVIOUS },         /* previous channel */
-       { 0x12, KEY_BRIGHTNESSUP },
-       { 0x13, KEY_BRIGHTNESSDOWN },
-       { 0x2b, KEY_MODE },             /* stereo/mono */
-       { 0x2c, KEY_TEXT },             /* teletext */
-       { 0x20, KEY_CHANNELUP },        /* channel up */
-       { 0x21, KEY_CHANNELDOWN },      /* channel down */
-       { 0x10, KEY_VOLUMEUP },         /* volume up */
-       { 0x11, KEY_VOLUMEDOWN },       /* volume down */
-       { 0x0d, KEY_MUTE },
-       { 0x1f, KEY_RECORD },
-       { 0x17, KEY_PLAY },
-       { 0x16, KEY_PAUSE },
-       { 0x0b, KEY_STOP },
-       { 0x27, KEY_FASTFORWARD },
-       { 0x26, KEY_REWIND },
-       { 0x1e, KEY_SEARCH },           /* autoscan */
-       { 0x0e, KEY_CAMERA },           /* snapshot */
-       { 0x2d, KEY_SETUP },
-       { 0x0f, KEY_SCREEN },           /* full screen */
-       { 0x14, KEY_RADIO },            /* FM radio */
-       { 0x25, KEY_POWER },            /* power */
-};
-
-struct ir_scancode_table ir_codes_powercolor_real_angel_table = {
-       .scan = ir_codes_powercolor_real_angel,
-       .size = ARRAY_SIZE(ir_codes_powercolor_real_angel),
-};
-EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel_table);
-
-/* Kworld Plus TV Analog Lite PCI IR
-   Mauro Carvalho Chehab <mchehab@infradead.org>
- */
-static struct ir_scancode ir_codes_kworld_plus_tv_analog[] = {
-       { 0x0c, KEY_PROG1 },            /* Kworld key */
-       { 0x16, KEY_CLOSECD },          /* -> ) */
-       { 0x1d, KEY_POWER2 },
-
-       { 0x00, KEY_1 },
-       { 0x01, KEY_2 },
-       { 0x02, KEY_3 },                /* Two keys have the same code: 3 and left */
-       { 0x03, KEY_4 },                /* Two keys have the same code: 3 and right */
-       { 0x04, KEY_5 },
-       { 0x05, KEY_6 },
-       { 0x06, KEY_7 },
-       { 0x07, KEY_8 },
-       { 0x08, KEY_9 },
-       { 0x0a, KEY_0 },
-
-       { 0x09, KEY_AGAIN },
-       { 0x14, KEY_MUTE },
-
-       { 0x20, KEY_UP },
-       { 0x21, KEY_DOWN },
-       { 0x0b, KEY_ENTER },
-
-       { 0x10, KEY_CHANNELUP },
-       { 0x11, KEY_CHANNELDOWN },
-
-       /* Couldn't map key left/key right since those
-          conflict with '3' and '4' scancodes
-          I dunno what the original driver does
-        */
-
-       { 0x13, KEY_VOLUMEUP },
-       { 0x12, KEY_VOLUMEDOWN },
-
-       /* The lower part of the IR
-          There are several duplicated keycodes there.
-          Most of them conflict with digits.
-          Add mappings just to the unused scancodes.
-          Somehow, the original driver has a way to know,
-          but this doesn't seem to be on some GPIO.
-          Also, it is not related to the time between keyup
-          and keydown.
-        */
-       { 0x19, KEY_TIME},              /* Timeshift */
-       { 0x1a, KEY_STOP},
-       { 0x1b, KEY_RECORD},
-
-       { 0x22, KEY_TEXT},
-
-       { 0x15, KEY_AUDIO},             /* ((*)) */
-       { 0x0f, KEY_ZOOM},
-       { 0x1c, KEY_CAMERA},            /* snapshot */
-
-       { 0x18, KEY_RED},               /* B */
-       { 0x23, KEY_GREEN},             /* C */
-};
-struct ir_scancode_table ir_codes_kworld_plus_tv_analog_table = {
-       .scan = ir_codes_kworld_plus_tv_analog,
-       .size = ARRAY_SIZE(ir_codes_kworld_plus_tv_analog),
-};
-EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog_table);
-
-/* Kaiomy TVnPC U2
-   Mauro Carvalho Chehab <mchehab@infradead.org>
- */
-static struct ir_scancode ir_codes_kaiomy[] = {
-       { 0x43, KEY_POWER2},
-       { 0x01, KEY_LIST},
-       { 0x0b, KEY_ZOOM},
-       { 0x03, KEY_POWER},
-
-       { 0x04, KEY_1},
-       { 0x08, KEY_2},
-       { 0x02, KEY_3},
-
-       { 0x0f, KEY_4},
-       { 0x05, KEY_5},
-       { 0x06, KEY_6},
-
-       { 0x0c, KEY_7},
-       { 0x0d, KEY_8},
-       { 0x0a, KEY_9},
-
-       { 0x11, KEY_0},
-
-       { 0x09, KEY_CHANNELUP},
-       { 0x07, KEY_CHANNELDOWN},
-
-       { 0x0e, KEY_VOLUMEUP},
-       { 0x13, KEY_VOLUMEDOWN},
-
-       { 0x10, KEY_HOME},
-       { 0x12, KEY_ENTER},
-
-       { 0x14, KEY_RECORD},
-       { 0x15, KEY_STOP},
-       { 0x16, KEY_PLAY},
-       { 0x17, KEY_MUTE},
-
-       { 0x18, KEY_UP},
-       { 0x19, KEY_DOWN},
-       { 0x1a, KEY_LEFT},
-       { 0x1b, KEY_RIGHT},
-
-       { 0x1c, KEY_RED},
-       { 0x1d, KEY_GREEN},
-       { 0x1e, KEY_YELLOW},
-       { 0x1f, KEY_BLUE},
-};
-struct ir_scancode_table ir_codes_kaiomy_table = {
-       .scan = ir_codes_kaiomy,
-       .size = ARRAY_SIZE(ir_codes_kaiomy),
-};
-EXPORT_SYMBOL_GPL(ir_codes_kaiomy_table);
-
-static struct ir_scancode ir_codes_avermedia_a16d[] = {
-       { 0x20, KEY_LIST},
-       { 0x00, KEY_POWER},
-       { 0x28, KEY_1},
-       { 0x18, KEY_2},
-       { 0x38, KEY_3},
-       { 0x24, KEY_4},
-       { 0x14, KEY_5},
-       { 0x34, KEY_6},
-       { 0x2c, KEY_7},
-       { 0x1c, KEY_8},
-       { 0x3c, KEY_9},
-       { 0x12, KEY_SUBTITLE},
-       { 0x22, KEY_0},
-       { 0x32, KEY_REWIND},
-       { 0x3a, KEY_SHUFFLE},
-       { 0x02, KEY_PRINT},
-       { 0x11, KEY_CHANNELDOWN},
-       { 0x31, KEY_CHANNELUP},
-       { 0x0c, KEY_ZOOM},
-       { 0x1e, KEY_VOLUMEDOWN},
-       { 0x3e, KEY_VOLUMEUP},
-       { 0x0a, KEY_MUTE},
-       { 0x04, KEY_AUDIO},
-       { 0x26, KEY_RECORD},
-       { 0x06, KEY_PLAY},
-       { 0x36, KEY_STOP},
-       { 0x16, KEY_PAUSE},
-       { 0x2e, KEY_REWIND},
-       { 0x0e, KEY_FASTFORWARD},
-       { 0x30, KEY_TEXT},
-       { 0x21, KEY_GREEN},
-       { 0x01, KEY_BLUE},
-       { 0x08, KEY_EPG},
-       { 0x2a, KEY_MENU},
-};
-struct ir_scancode_table ir_codes_avermedia_a16d_table = {
-       .scan = ir_codes_avermedia_a16d,
-       .size = ARRAY_SIZE(ir_codes_avermedia_a16d),
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d_table);
-
-/* Encore ENLTV-FM v5.3
-   Mauro Carvalho Chehab <mchehab@infradead.org>
- */
-static struct ir_scancode ir_codes_encore_enltv_fm53[] = {
-       { 0x10, KEY_POWER2},
-       { 0x06, KEY_MUTE},
-
-       { 0x09, KEY_1},
-       { 0x1d, KEY_2},
-       { 0x1f, KEY_3},
-       { 0x19, KEY_4},
-       { 0x1b, KEY_5},
-       { 0x11, KEY_6},
-       { 0x17, KEY_7},
-       { 0x12, KEY_8},
-       { 0x16, KEY_9},
-       { 0x48, KEY_0},
-
-       { 0x04, KEY_LIST},              /* -/-- */
-       { 0x40, KEY_LAST},              /* recall */
-
-       { 0x02, KEY_MODE},              /* TV/AV */
-       { 0x05, KEY_CAMERA},            /* SNAPSHOT */
-
-       { 0x4c, KEY_CHANNELUP},         /* UP */
-       { 0x00, KEY_CHANNELDOWN},       /* DOWN */
-       { 0x0d, KEY_VOLUMEUP},          /* RIGHT */
-       { 0x15, KEY_VOLUMEDOWN},        /* LEFT */
-       { 0x49, KEY_ENTER},             /* OK */
-
-       { 0x54, KEY_RECORD},
-       { 0x4d, KEY_PLAY},              /* pause */
-
-       { 0x1e, KEY_MENU},              /* video setting */
-       { 0x0e, KEY_RIGHT},             /* <- */
-       { 0x1a, KEY_LEFT},              /* -> */
-
-       { 0x0a, KEY_CLEAR},             /* video default */
-       { 0x0c, KEY_ZOOM},              /* hide pannel */
-       { 0x47, KEY_SLEEP},             /* shutdown */
-};
-struct ir_scancode_table ir_codes_encore_enltv_fm53_table = {
-       .scan = ir_codes_encore_enltv_fm53,
-       .size = ARRAY_SIZE(ir_codes_encore_enltv_fm53),
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53_table);
-
-/* Zogis Real Audio 220 - 32 keys IR */
-static struct ir_scancode ir_codes_real_audio_220_32_keys[] = {
-       { 0x1c, KEY_RADIO},
-       { 0x12, KEY_POWER2},
-
-       { 0x01, KEY_1},
-       { 0x02, KEY_2},
-       { 0x03, KEY_3},
-       { 0x04, KEY_4},
-       { 0x05, KEY_5},
-       { 0x06, KEY_6},
-       { 0x07, KEY_7},
-       { 0x08, KEY_8},
-       { 0x09, KEY_9},
-       { 0x00, KEY_0},
-
-       { 0x0c, KEY_VOLUMEUP},
-       { 0x18, KEY_VOLUMEDOWN},
-       { 0x0b, KEY_CHANNELUP},
-       { 0x15, KEY_CHANNELDOWN},
-       { 0x16, KEY_ENTER},
-
-       { 0x11, KEY_LIST},              /* Source */
-       { 0x0d, KEY_AUDIO},             /* stereo */
-
-       { 0x0f, KEY_PREVIOUS},          /* Prev */
-       { 0x1b, KEY_TIME},              /* Timeshift */
-       { 0x1a, KEY_NEXT},              /* Next */
-
-       { 0x0e, KEY_STOP},
-       { 0x1f, KEY_PLAY},
-       { 0x1e, KEY_PLAYPAUSE},         /* Pause */
-
-       { 0x1d, KEY_RECORD},
-       { 0x13, KEY_MUTE},
-       { 0x19, KEY_CAMERA},            /* Snapshot */
-
-};
-struct ir_scancode_table ir_codes_real_audio_220_32_keys_table = {
-       .scan = ir_codes_real_audio_220_32_keys,
-       .size = ARRAY_SIZE(ir_codes_real_audio_220_32_keys),
-};
-EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys_table);
-
-/* ATI TV Wonder HD 600 USB
-   Devin Heitmueller <devin.heitmueller@gmail.com>
- */
-static struct ir_scancode ir_codes_ati_tv_wonder_hd_600[] = {
-       { 0x00, KEY_RECORD},            /* Row 1 */
-       { 0x01, KEY_PLAYPAUSE},
-       { 0x02, KEY_STOP},
-       { 0x03, KEY_POWER},
-       { 0x04, KEY_PREVIOUS},  /* Row 2 */
-       { 0x05, KEY_REWIND},
-       { 0x06, KEY_FORWARD},
-       { 0x07, KEY_NEXT},
-       { 0x08, KEY_EPG},               /* Row 3 */
-       { 0x09, KEY_HOME},
-       { 0x0a, KEY_MENU},
-       { 0x0b, KEY_CHANNELUP},
-       { 0x0c, KEY_BACK},              /* Row 4 */
-       { 0x0d, KEY_UP},
-       { 0x0e, KEY_INFO},
-       { 0x0f, KEY_CHANNELDOWN},
-       { 0x10, KEY_LEFT},              /* Row 5 */
-       { 0x11, KEY_SELECT},
-       { 0x12, KEY_RIGHT},
-       { 0x13, KEY_VOLUMEUP},
-       { 0x14, KEY_LAST},              /* Row 6 */
-       { 0x15, KEY_DOWN},
-       { 0x16, KEY_MUTE},
-       { 0x17, KEY_VOLUMEDOWN},
-};
-struct ir_scancode_table ir_codes_ati_tv_wonder_hd_600_table = {
-       .scan = ir_codes_ati_tv_wonder_hd_600,
-       .size = ARRAY_SIZE(ir_codes_ati_tv_wonder_hd_600),
-};
-EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600_table);
-
-/* DVBWorld remotes
-   Igor M. Liplianin <liplianin@me.by>
- */
-static struct ir_scancode ir_codes_dm1105_nec[] = {
-       { 0x0a, KEY_POWER2},            /* power */
-       { 0x0c, KEY_MUTE},              /* mute */
-       { 0x11, KEY_1},
-       { 0x12, KEY_2},
-       { 0x13, KEY_3},
-       { 0x14, KEY_4},
-       { 0x15, KEY_5},
-       { 0x16, KEY_6},
-       { 0x17, KEY_7},
-       { 0x18, KEY_8},
-       { 0x19, KEY_9},
-       { 0x10, KEY_0},
-       { 0x1c, KEY_CHANNELUP},         /* ch+ */
-       { 0x0f, KEY_CHANNELDOWN},       /* ch- */
-       { 0x1a, KEY_VOLUMEUP},          /* vol+ */
-       { 0x0e, KEY_VOLUMEDOWN},        /* vol- */
-       { 0x04, KEY_RECORD},            /* rec */
-       { 0x09, KEY_CHANNEL},           /* fav */
-       { 0x08, KEY_BACKSPACE},         /* rewind */
-       { 0x07, KEY_FASTFORWARD},       /* fast */
-       { 0x0b, KEY_PAUSE},             /* pause */
-       { 0x02, KEY_ESC},               /* cancel */
-       { 0x03, KEY_TAB},               /* tab */
-       { 0x00, KEY_UP},                /* up */
-       { 0x1f, KEY_ENTER},             /* ok */
-       { 0x01, KEY_DOWN},              /* down */
-       { 0x05, KEY_RECORD},            /* cap */
-       { 0x06, KEY_STOP},              /* stop */
-       { 0x40, KEY_ZOOM},              /* full */
-       { 0x1e, KEY_TV},                /* tvmode */
-       { 0x1b, KEY_B},                 /* recall */
-};
-struct ir_scancode_table ir_codes_dm1105_nec_table = {
-       .scan = ir_codes_dm1105_nec,
-       .size = ARRAY_SIZE(ir_codes_dm1105_nec),
-};
-EXPORT_SYMBOL_GPL(ir_codes_dm1105_nec_table);
-
-static struct ir_scancode ir_codes_tevii_nec[] = {
-       { 0x0a, KEY_POWER2},
-       { 0x0c, KEY_MUTE},
-       { 0x11, KEY_1},
-       { 0x12, KEY_2},
-       { 0x13, KEY_3},
-       { 0x14, KEY_4},
-       { 0x15, KEY_5},
-       { 0x16, KEY_6},
-       { 0x17, KEY_7},
-       { 0x18, KEY_8},
-       { 0x19, KEY_9},
-       { 0x10, KEY_0},
-       { 0x1c, KEY_MENU},
-       { 0x0f, KEY_VOLUMEDOWN},
-       { 0x1a, KEY_LAST},
-       { 0x0e, KEY_OPEN},
-       { 0x04, KEY_RECORD},
-       { 0x09, KEY_VOLUMEUP},
-       { 0x08, KEY_CHANNELUP},
-       { 0x07, KEY_PVR},
-       { 0x0b, KEY_TIME},
-       { 0x02, KEY_RIGHT},
-       { 0x03, KEY_LEFT},
-       { 0x00, KEY_UP},
-       { 0x1f, KEY_OK},
-       { 0x01, KEY_DOWN},
-       { 0x05, KEY_TUNER},
-       { 0x06, KEY_CHANNELDOWN},
-       { 0x40, KEY_PLAYPAUSE},
-       { 0x1e, KEY_REWIND},
-       { 0x1b, KEY_FAVORITES},
-       { 0x1d, KEY_BACK},
-       { 0x4d, KEY_FASTFORWARD},
-       { 0x44, KEY_EPG},
-       { 0x4c, KEY_INFO},
-       { 0x41, KEY_AB},
-       { 0x43, KEY_AUDIO},
-       { 0x45, KEY_SUBTITLE},
-       { 0x4a, KEY_LIST},
-       { 0x46, KEY_F1},
-       { 0x47, KEY_F2},
-       { 0x5e, KEY_F3},
-       { 0x5c, KEY_F4},
-       { 0x52, KEY_F5},
-       { 0x5a, KEY_F6},
-       { 0x56, KEY_MODE},
-       { 0x58, KEY_SWITCHVIDEOMODE},
-};
-struct ir_scancode_table ir_codes_tevii_nec_table = {
-       .scan = ir_codes_tevii_nec,
-       .size = ARRAY_SIZE(ir_codes_tevii_nec),
-};
-EXPORT_SYMBOL_GPL(ir_codes_tevii_nec_table);
-
-static struct ir_scancode ir_codes_tbs_nec[] = {
-       { 0x04, KEY_POWER2},    /*power*/
-       { 0x14, KEY_MUTE},      /*mute*/
-       { 0x07, KEY_1},
-       { 0x06, KEY_2},
-       { 0x05, KEY_3},
-       { 0x0b, KEY_4},
-       { 0x0a, KEY_5},
-       { 0x09, KEY_6},
-       { 0x0f, KEY_7},
-       { 0x0e, KEY_8},
-       { 0x0d, KEY_9},
-       { 0x12, KEY_0},
-       { 0x16, KEY_CHANNELUP}, /*ch+*/
-       { 0x11, KEY_CHANNELDOWN},/*ch-*/
-       { 0x13, KEY_VOLUMEUP},  /*vol+*/
-       { 0x0c, KEY_VOLUMEDOWN},/*vol-*/
-       { 0x03, KEY_RECORD},    /*rec*/
-       { 0x18, KEY_PAUSE},     /*pause*/
-       { 0x19, KEY_OK},        /*ok*/
-       { 0x1a, KEY_CAMERA},    /* snapshot */
-       { 0x01, KEY_UP},
-       { 0x10, KEY_LEFT},
-       { 0x02, KEY_RIGHT},
-       { 0x08, KEY_DOWN},
-       { 0x15, KEY_FAVORITES},
-       { 0x17, KEY_SUBTITLE},
-       { 0x1d, KEY_ZOOM},
-       { 0x1f, KEY_EXIT},
-       { 0x1e, KEY_MENU},
-       { 0x1c, KEY_EPG},
-       { 0x00, KEY_PREVIOUS},
-       { 0x1b, KEY_MODE},
-};
-struct ir_scancode_table ir_codes_tbs_nec_table = {
-       .scan = ir_codes_tbs_nec,
-       .size = ARRAY_SIZE(ir_codes_tbs_nec),
-};
-EXPORT_SYMBOL_GPL(ir_codes_tbs_nec_table);
-
-/* Terratec Cinergy Hybrid T USB XS
-   Devin Heitmueller <dheitmueller@linuxtv.org>
- */
-static struct ir_scancode ir_codes_terratec_cinergy_xs[] = {
-       { 0x41, KEY_HOME},
-       { 0x01, KEY_POWER},
-       { 0x42, KEY_MENU},
-       { 0x02, KEY_1},
-       { 0x03, KEY_2},
-       { 0x04, KEY_3},
-       { 0x43, KEY_SUBTITLE},
-       { 0x05, KEY_4},
-       { 0x06, KEY_5},
-       { 0x07, KEY_6},
-       { 0x44, KEY_TEXT},
-       { 0x08, KEY_7},
-       { 0x09, KEY_8},
-       { 0x0a, KEY_9},
-       { 0x45, KEY_DELETE},
-       { 0x0b, KEY_TUNER},
-       { 0x0c, KEY_0},
-       { 0x0d, KEY_MODE},
-       { 0x46, KEY_TV},
-       { 0x47, KEY_DVD},
-       { 0x49, KEY_VIDEO},
-       { 0x4b, KEY_AUX},
-       { 0x10, KEY_UP},
-       { 0x11, KEY_LEFT},
-       { 0x12, KEY_OK},
-       { 0x13, KEY_RIGHT},
-       { 0x14, KEY_DOWN},
-       { 0x0f, KEY_EPG},
-       { 0x16, KEY_INFO},
-       { 0x4d, KEY_BACKSPACE},
-       { 0x1c, KEY_VOLUMEUP},
-       { 0x4c, KEY_PLAY},
-       { 0x1b, KEY_CHANNELUP},
-       { 0x1e, KEY_VOLUMEDOWN},
-       { 0x1d, KEY_MUTE},
-       { 0x1f, KEY_CHANNELDOWN},
-       { 0x17, KEY_RED},
-       { 0x18, KEY_GREEN},
-       { 0x19, KEY_YELLOW},
-       { 0x1a, KEY_BLUE},
-       { 0x58, KEY_RECORD},
-       { 0x48, KEY_STOP},
-       { 0x40, KEY_PAUSE},
-       { 0x54, KEY_LAST},
-       { 0x4e, KEY_REWIND},
-       { 0x4f, KEY_FASTFORWARD},
-       { 0x5c, KEY_NEXT},
-};
-struct ir_scancode_table ir_codes_terratec_cinergy_xs_table = {
-       .scan = ir_codes_terratec_cinergy_xs,
-       .size = ARRAY_SIZE(ir_codes_terratec_cinergy_xs),
-};
-EXPORT_SYMBOL_GPL(ir_codes_terratec_cinergy_xs_table);
-
-/* EVGA inDtube
-   Devin Heitmueller <devin.heitmueller@gmail.com>
- */
-static struct ir_scancode ir_codes_evga_indtube[] = {
-       { 0x12, KEY_POWER},
-       { 0x02, KEY_MODE},      /* TV */
-       { 0x14, KEY_MUTE},
-       { 0x1a, KEY_CHANNELUP},
-       { 0x16, KEY_TV2},       /* PIP */
-       { 0x1d, KEY_VOLUMEUP},
-       { 0x05, KEY_CHANNELDOWN},
-       { 0x0f, KEY_PLAYPAUSE},
-       { 0x19, KEY_VOLUMEDOWN},
-       { 0x1c, KEY_REWIND},
-       { 0x0d, KEY_RECORD},
-       { 0x18, KEY_FORWARD},
-       { 0x1e, KEY_PREVIOUS},
-       { 0x1b, KEY_STOP},
-       { 0x1f, KEY_NEXT},
-       { 0x13, KEY_CAMERA},
-};
-struct ir_scancode_table ir_codes_evga_indtube_table = {
-       .scan = ir_codes_evga_indtube,
-       .size = ARRAY_SIZE(ir_codes_evga_indtube),
-};
-EXPORT_SYMBOL_GPL(ir_codes_evga_indtube_table);
-
-static struct ir_scancode ir_codes_videomate_s350[] = {
-       { 0x00, KEY_TV},
-       { 0x01, KEY_DVD},
-       { 0x04, KEY_RECORD},
-       { 0x05, KEY_VIDEO},     /* TV/Video */
-       { 0x07, KEY_STOP},
-       { 0x08, KEY_PLAYPAUSE},
-       { 0x0a, KEY_REWIND},
-       { 0x0f, KEY_FASTFORWARD},
-       { 0x10, KEY_CHANNELUP},
-       { 0x12, KEY_VOLUMEUP},
-       { 0x13, KEY_CHANNELDOWN},
-       { 0x14, KEY_MUTE},
-       { 0x15, KEY_VOLUMEDOWN},
-       { 0x16, KEY_1},
-       { 0x17, KEY_2},
-       { 0x18, KEY_3},
-       { 0x19, KEY_4},
-       { 0x1a, KEY_5},
-       { 0x1b, KEY_6},
-       { 0x1c, KEY_7},
-       { 0x1d, KEY_8},
-       { 0x1e, KEY_9},
-       { 0x1f, KEY_0},
-       { 0x21, KEY_SLEEP},
-       { 0x24, KEY_ZOOM},
-       { 0x25, KEY_LAST},      /* Recall */
-       { 0x26, KEY_SUBTITLE},  /* CC */
-       { 0x27, KEY_LANGUAGE},  /* MTS */
-       { 0x29, KEY_CHANNEL},   /* SURF */
-       { 0x2b, KEY_A},
-       { 0x2c, KEY_B},
-       { 0x2f, KEY_CAMERA},    /* Snapshot */
-       { 0x23, KEY_RADIO},
-       { 0x02, KEY_PREVIOUSSONG},
-       { 0x06, KEY_NEXTSONG},
-       { 0x03, KEY_EPG},
-       { 0x09, KEY_SETUP},
-       { 0x22, KEY_BACKSPACE},
-       { 0x0c, KEY_UP},
-       { 0x0e, KEY_DOWN},
-       { 0x0b, KEY_LEFT},
-       { 0x0d, KEY_RIGHT},
-       { 0x11, KEY_ENTER},
-       { 0x20, KEY_TEXT},
-};
-struct ir_scancode_table ir_codes_videomate_s350_table = {
-       .scan = ir_codes_videomate_s350,
-       .size = ARRAY_SIZE(ir_codes_videomate_s350),
-};
-EXPORT_SYMBOL_GPL(ir_codes_videomate_s350_table);
-
-/* GADMEI UTV330+ RM008Z remote
-   Shine Liu <shinel@foxmail.com>
- */
-static struct ir_scancode ir_codes_gadmei_rm008z[] = {
-       { 0x14, KEY_POWER2},            /* POWER OFF */
-       { 0x0c, KEY_MUTE},              /* MUTE */
-
-       { 0x18, KEY_TV},                /* TV */
-       { 0x0e, KEY_VIDEO},             /* AV */
-       { 0x0b, KEY_AUDIO},             /* SV */
-       { 0x0f, KEY_RADIO},             /* FM */
-
-       { 0x00, KEY_1},
-       { 0x01, KEY_2},
-       { 0x02, KEY_3},
-       { 0x03, KEY_4},
-       { 0x04, KEY_5},
-       { 0x05, KEY_6},
-       { 0x06, KEY_7},
-       { 0x07, KEY_8},
-       { 0x08, KEY_9},
-       { 0x09, KEY_0},
-       { 0x0a, KEY_INFO},              /* OSD */
-       { 0x1c, KEY_BACKSPACE},         /* LAST */
-
-       { 0x0d, KEY_PLAY},              /* PLAY */
-       { 0x1e, KEY_CAMERA},            /* SNAPSHOT */
-       { 0x1a, KEY_RECORD},            /* RECORD */
-       { 0x17, KEY_STOP},              /* STOP */
-
-       { 0x1f, KEY_UP},                /* UP */
-       { 0x44, KEY_DOWN},              /* DOWN */
-       { 0x46, KEY_TAB},               /* BACK */
-       { 0x4a, KEY_ZOOM},              /* FULLSECREEN */
-
-       { 0x10, KEY_VOLUMEUP},          /* VOLUMEUP */
-       { 0x11, KEY_VOLUMEDOWN},        /* VOLUMEDOWN */
-       { 0x12, KEY_CHANNELUP},         /* CHANNELUP */
-       { 0x13, KEY_CHANNELDOWN},       /* CHANNELDOWN */
-       { 0x15, KEY_ENTER},             /* OK */
-};
-struct ir_scancode_table ir_codes_gadmei_rm008z_table = {
-       .scan = ir_codes_gadmei_rm008z,
-       .size = ARRAY_SIZE(ir_codes_gadmei_rm008z),
-};
-EXPORT_SYMBOL_GPL(ir_codes_gadmei_rm008z_table);
-
-/*************************************************************
- *             COMPLETE SCANCODE TABLES
- * Instead of just a partial scancode, the tables bellow
- * contains the complete scancode and the receiver protocol
- *************************************************************/
-
-/*
- * Hauppauge:the newer, gray remotes (seems there are multiple
- * slightly different versions), shipped with cx88+ivtv cards.
- *
- * This table contains the complete RC5 code, instead of just the data part
- */
-static struct ir_scancode ir_codes_rc5_hauppauge_new[] = {
-       /* Keys 0 to 9 */
-       { 0x1e00, KEY_0 },
-       { 0x1e01, KEY_1 },
-       { 0x1e02, KEY_2 },
-       { 0x1e03, KEY_3 },
-       { 0x1e04, KEY_4 },
-       { 0x1e05, KEY_5 },
-       { 0x1e06, KEY_6 },
-       { 0x1e07, KEY_7 },
-       { 0x1e08, KEY_8 },
-       { 0x1e09, KEY_9 },
-
-       { 0x1e0a, KEY_TEXT },           /* keypad asterisk as well */
-       { 0x1e0b, KEY_RED },            /* red button */
-       { 0x1e0c, KEY_RADIO },
-       { 0x1e0d, KEY_MENU },
-       { 0x1e0e, KEY_SUBTITLE },               /* also the # key */
-       { 0x1e0f, KEY_MUTE },
-       { 0x1e10, KEY_VOLUMEUP },
-       { 0x1e11, KEY_VOLUMEDOWN },
-       { 0x1e12, KEY_PREVIOUS },               /* previous channel */
-       { 0x1e14, KEY_UP },
-       { 0x1e15, KEY_DOWN },
-       { 0x1e16, KEY_LEFT },
-       { 0x1e17, KEY_RIGHT },
-       { 0x1e18, KEY_VIDEO },          /* Videos */
-       { 0x1e19, KEY_AUDIO },          /* Music */
-       /* 0x1e1a: Pictures - presume this means
-          "Multimedia Home Platform" -
-          no "PICTURES" key in input.h
-        */
-       { 0x1e1a, KEY_MHP },
-
-       { 0x1e1b, KEY_EPG },            /* Guide */
-       { 0x1e1c, KEY_TV },
-       { 0x1e1e, KEY_NEXTSONG },               /* skip >| */
-       { 0x1e1f, KEY_EXIT },           /* back/exit */
-       { 0x1e20, KEY_CHANNELUP },      /* channel / program + */
-       { 0x1e21, KEY_CHANNELDOWN },    /* channel / program - */
-       { 0x1e22, KEY_CHANNEL },                /* source (old black remote) */
-       { 0x1e24, KEY_PREVIOUSSONG },   /* replay |< */
-       { 0x1e25, KEY_ENTER },          /* OK */
-       { 0x1e26, KEY_SLEEP },          /* minimize (old black remote) */
-       { 0x1e29, KEY_BLUE },           /* blue key */
-       { 0x1e2e, KEY_GREEN },          /* green button */
-       { 0x1e30, KEY_PAUSE },          /* pause */
-       { 0x1e32, KEY_REWIND },         /* backward << */
-       { 0x1e34, KEY_FASTFORWARD },    /* forward >> */
-       { 0x1e35, KEY_PLAY },
-       { 0x1e36, KEY_STOP },
-       { 0x1e37, KEY_RECORD },         /* recording */
-       { 0x1e38, KEY_YELLOW },         /* yellow key */
-       { 0x1e3b, KEY_SELECT },         /* top right button */
-       { 0x1e3c, KEY_ZOOM },           /* full */
-       { 0x1e3d, KEY_POWER },          /* system power (green button) */
-};
-
-struct ir_scancode_table ir_codes_rc5_hauppauge_new_table = {
-       .scan = ir_codes_rc5_hauppauge_new,
-       .size = ARRAY_SIZE(ir_codes_rc5_hauppauge_new),
-       .ir_type = IR_TYPE_RC5,
-};
-EXPORT_SYMBOL_GPL(ir_codes_rc5_hauppauge_new_table);
-
-/* Terratec Cinergy Hybrid T USB XS FM
-   Mauro Carvalho Chehab <mchehab@redhat.com>
- */
-static struct ir_scancode ir_codes_nec_terratec_cinergy_xs[] = {
-       { 0x1441, KEY_HOME},
-       { 0x1401, KEY_POWER2},
-
-       { 0x1442, KEY_MENU},            /* DVD menu */
-       { 0x1443, KEY_SUBTITLE},
-       { 0x1444, KEY_TEXT},            /* Teletext */
-       { 0x1445, KEY_DELETE},
-
-       { 0x1402, KEY_1},
-       { 0x1403, KEY_2},
-       { 0x1404, KEY_3},
-       { 0x1405, KEY_4},
-       { 0x1406, KEY_5},
-       { 0x1407, KEY_6},
-       { 0x1408, KEY_7},
-       { 0x1409, KEY_8},
-       { 0x140a, KEY_9},
-       { 0x140c, KEY_0},
-
-       { 0x140b, KEY_TUNER},           /* AV */
-       { 0x140d, KEY_MODE},            /* A.B */
-
-       { 0x1446, KEY_TV},
-       { 0x1447, KEY_DVD},
-       { 0x1449, KEY_VIDEO},
-       { 0x144a, KEY_RADIO},           /* Music */
-       { 0x144b, KEY_CAMERA},          /* PIC */
-
-       { 0x1410, KEY_UP},
-       { 0x1411, KEY_LEFT},
-       { 0x1412, KEY_OK},
-       { 0x1413, KEY_RIGHT},
-       { 0x1414, KEY_DOWN},
-
-       { 0x140f, KEY_EPG},
-       { 0x1416, KEY_INFO},
-       { 0x144d, KEY_BACKSPACE},
-
-       { 0x141c, KEY_VOLUMEUP},
-       { 0x141e, KEY_VOLUMEDOWN},
-
-       { 0x144c, KEY_PLAY},
-       { 0x141d, KEY_MUTE},
-
-       { 0x141b, KEY_CHANNELUP},
-       { 0x141f, KEY_CHANNELDOWN},
-
-       { 0x1417, KEY_RED},
-       { 0x1418, KEY_GREEN},
-       { 0x1419, KEY_YELLOW},
-       { 0x141a, KEY_BLUE},
-
-       { 0x1458, KEY_RECORD},
-       { 0x1448, KEY_STOP},
-       { 0x1440, KEY_PAUSE},
-
-       { 0x1454, KEY_LAST},
-       { 0x144e, KEY_REWIND},
-       { 0x144f, KEY_FASTFORWARD},
-       { 0x145c, KEY_NEXT},
-};
-struct ir_scancode_table ir_codes_nec_terratec_cinergy_xs_table = {
-       .scan = ir_codes_nec_terratec_cinergy_xs,
-       .size = ARRAY_SIZE(ir_codes_nec_terratec_cinergy_xs),
-       .ir_type = IR_TYPE_NEC,
-};
-EXPORT_SYMBOL_GPL(ir_codes_nec_terratec_cinergy_xs_table);
-
diff --git a/drivers/media/common/ir-keytable.c b/drivers/media/common/ir-keytable.c
deleted file mode 100644 (file)
index ceef0e8..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/* ir-register.c - handle IR scancode->keycode tables
- *
- * Copyright (C) 2009 by Mauro Carvalho Chehab <mchehab@redhat.com>
- */
-
-#include <linux/usb/input.h>
-
-#include <media/ir-common.h>
-
-#define IR_TAB_MIN_SIZE        32
-#define IR_TAB_MAX_SIZE        1024
-
-/**
- * ir_seek_table() - returns the element order on the table
- * @rc_tab:    the ir_scancode_table with the keymap to be used
- * @scancode:  the scancode that we're seeking
- *
- * This routine is used by the input routines when a key is pressed at the
- * IR. The scancode is received and needs to be converted into a keycode.
- * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the
- * corresponding keycode from the table.
- */
-static int ir_seek_table(struct ir_scancode_table *rc_tab, u32 scancode)
-{
-       int rc;
-       unsigned long flags;
-       struct ir_scancode *keymap = rc_tab->scan;
-
-       spin_lock_irqsave(&rc_tab->lock, flags);
-
-       /* FIXME: replace it by a binary search */
-
-       for (rc = 0; rc < rc_tab->size; rc++)
-               if (keymap[rc].scancode == scancode)
-                       goto exit;
-
-       /* Not found */
-       rc = -EINVAL;
-
-exit:
-       spin_unlock_irqrestore(&rc_tab->lock, flags);
-       return rc;
-}
-
-/**
- * ir_roundup_tablesize() - gets an optimum value for the table size
- * @n_elems:           minimum number of entries to store keycodes
- *
- * This routine is used to choose the keycode table size.
- *
- * In order to have some empty space for new keycodes,
- * and knowing in advance that kmalloc allocates only power of two
- * segments, it optimizes the allocated space to have some spare space
- * for those new keycodes by using the maximum number of entries that
- * will be effectively be allocated by kmalloc.
- * In order to reduce the quantity of table resizes, it has a minimum
- * table size of IR_TAB_MIN_SIZE.
- */
-int ir_roundup_tablesize(int n_elems)
-{
-       size_t size;
-
-       if (n_elems < IR_TAB_MIN_SIZE)
-               n_elems = IR_TAB_MIN_SIZE;
-
-       /*
-        * As kmalloc only allocates sizes of power of two, get as
-        * much entries as possible for the allocated memory segment
-        */
-       size = roundup_pow_of_two(n_elems * sizeof(struct ir_scancode));
-       n_elems = size / sizeof(struct ir_scancode);
-
-       return n_elems;
-}
-
-/**
- * ir_copy_table() - copies a keytable, discarding the unused entries
- * @destin:    destin table
- * @origin:    origin table
- *
- * Copies all entries where the keycode is not KEY_UNKNOWN/KEY_RESERVED
- */
-
-int ir_copy_table(struct ir_scancode_table *destin,
-                const struct ir_scancode_table *origin)
-{
-       int i, j = 0;
-
-       for (i = 0; i < origin->size; i++) {
-               if (origin->scan[i].keycode == KEY_UNKNOWN ||
-                  origin->scan[i].keycode == KEY_RESERVED)
-                       continue;
-
-               memcpy(&destin->scan[j], &origin->scan[i], sizeof(struct ir_scancode));
-               j++;
-       }
-       destin->size = j;
-
-       IR_dprintk(1, "Copied %d scancodes to the new keycode table\n", destin->size);
-
-       return 0;
-}
-
-/**
- * ir_getkeycode() - get a keycode at the evdev scancode ->keycode table
- * @dev:       the struct input_dev device descriptor
- * @scancode:  the desired scancode
- * @keycode:   the keycode to be retorned.
- *
- * This routine is used to handle evdev EVIOCGKEY ioctl.
- * If the key is not found, returns -EINVAL, otherwise, returns 0.
- */
-static int ir_getkeycode(struct input_dev *dev,
-                        int scancode, int *keycode)
-{
-       int elem;
-       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
-
-       elem = ir_seek_table(rc_tab, scancode);
-       if (elem >= 0) {
-               *keycode = rc_tab->scan[elem].keycode;
-               return 0;
-       }
-
-       /*
-        * Scancode not found and table can't be expanded
-        */
-       if (elem < 0 && rc_tab->size == IR_TAB_MAX_SIZE)
-               return -EINVAL;
-
-       /*
-        * If is there extra space, returns KEY_RESERVED,
-        * otherwise, input core won't let ir_setkeycode to work
-        */
-       *keycode = KEY_RESERVED;
-       return 0;
-}
-
-
-/**
- * ir_is_resize_needed() - Check if the table needs rezise
- * @table:             keycode table that may need to resize
- * @n_elems:           minimum number of entries to store keycodes
- *
- * Considering that kmalloc uses power of two storage areas, this
- * routine detects if the real alloced size will change. If not, it
- * just returns without doing nothing. Otherwise, it will extend or
- * reduce the table size to meet the new needs.
- *
- * It returns 0 if no resize is needed, 1 otherwise.
- */
-static int ir_is_resize_needed(struct ir_scancode_table *table, int n_elems)
-{
-       int cur_size = ir_roundup_tablesize(table->size);
-       int new_size = ir_roundup_tablesize(n_elems);
-
-       if (cur_size == new_size)
-               return 0;
-
-       /* Resize is needed */
-       return 1;
-}
-
-/**
- * ir_delete_key() - remove a keycode from the table
- * @rc_tab:            keycode table
- * @elem:              element to be removed
- *
- */
-static void ir_delete_key(struct ir_scancode_table *rc_tab, int elem)
-{
-       unsigned long flags = 0;
-       int newsize = rc_tab->size - 1;
-       int resize = ir_is_resize_needed(rc_tab, newsize);
-       struct ir_scancode *oldkeymap = rc_tab->scan;
-       struct ir_scancode *newkeymap;
-
-       if (resize) {
-               newkeymap = kzalloc(ir_roundup_tablesize(newsize) *
-                                   sizeof(*newkeymap), GFP_ATOMIC);
-
-               /* There's no memory for resize. Keep the old table */
-               if (!newkeymap)
-                       resize = 0;
-       }
-
-       if (!resize) {
-               newkeymap = oldkeymap;
-
-               /* We'll modify the live table. Lock it */
-               spin_lock_irqsave(&rc_tab->lock, flags);
-       }
-
-       /*
-        * Copy the elements before the one that will be deleted
-        * if (!resize), both oldkeymap and newkeymap points
-        * to the same place, so, there's no need to copy
-        */
-       if (resize && elem > 0)
-               memcpy(newkeymap, oldkeymap,
-                      elem * sizeof(*newkeymap));
-
-       /*
-        * Copy the other elements overwriting the element to be removed
-        * This operation applies to both resize and non-resize case
-        */
-       if (elem < newsize)
-               memcpy(&newkeymap[elem], &oldkeymap[elem + 1],
-                      (newsize - elem) * sizeof(*newkeymap));
-
-       if (resize) {
-               /*
-                * As the copy happened to a temporary table, only here
-                * it needs to lock while replacing the table pointers
-                * to use the new table
-                */
-               spin_lock_irqsave(&rc_tab->lock, flags);
-               rc_tab->size = newsize;
-               rc_tab->scan = newkeymap;
-               spin_unlock_irqrestore(&rc_tab->lock, flags);
-
-               /* Frees the old keytable */
-               kfree(oldkeymap);
-       } else {
-               rc_tab->size = newsize;
-               spin_unlock_irqrestore(&rc_tab->lock, flags);
-       }
-}
-
-/**
- * ir_insert_key() - insert a keycode at the table
- * @rc_tab:            keycode table
- * @scancode:  the desired scancode
- * @keycode:   the keycode to be retorned.
- *
- */
-static int ir_insert_key(struct ir_scancode_table *rc_tab,
-                         int scancode, int keycode)
-{
-       unsigned long flags;
-       int elem = rc_tab->size;
-       int newsize = rc_tab->size + 1;
-       int resize = ir_is_resize_needed(rc_tab, newsize);
-       struct ir_scancode *oldkeymap = rc_tab->scan;
-       struct ir_scancode *newkeymap;
-
-       if (resize) {
-               newkeymap = kzalloc(ir_roundup_tablesize(newsize) *
-                                   sizeof(*newkeymap), GFP_ATOMIC);
-               if (!newkeymap)
-                       return -ENOMEM;
-
-               memcpy(newkeymap, oldkeymap,
-                      rc_tab->size * sizeof(*newkeymap));
-       } else
-               newkeymap  = oldkeymap;
-
-       /* Stores the new code at the table */
-       IR_dprintk(1, "#%d: New scan 0x%04x with key 0x%04x\n",
-                  rc_tab->size, scancode, keycode);
-
-       spin_lock_irqsave(&rc_tab->lock, flags);
-       rc_tab->size = newsize;
-       if (resize) {
-               rc_tab->scan = newkeymap;
-               kfree(oldkeymap);
-       }
-       newkeymap[elem].scancode = scancode;
-       newkeymap[elem].keycode  = keycode;
-       spin_unlock_irqrestore(&rc_tab->lock, flags);
-
-       return 0;
-}
-
-/**
- * ir_setkeycode() - set a keycode at the evdev scancode ->keycode table
- * @dev:       the struct input_dev device descriptor
- * @scancode:  the desired scancode
- * @keycode:   the keycode to be retorned.
- *
- * This routine is used to handle evdev EVIOCSKEY ioctl.
- * There's one caveat here: how can we increase the size of the table?
- * If the key is not found, returns -EINVAL, otherwise, returns 0.
- */
-static int ir_setkeycode(struct input_dev *dev,
-                        int scancode, int keycode)
-{
-       int rc = 0;
-       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
-       struct ir_scancode *keymap = rc_tab->scan;
-       unsigned long flags;
-
-       /*
-        * Handle keycode table deletions
-        *
-        * If userspace is adding a KEY_UNKNOWN or KEY_RESERVED,
-        * deal as a trial to remove an existing scancode attribution
-        * if table become too big, reduce it to save space
-        */
-       if (keycode == KEY_UNKNOWN || keycode == KEY_RESERVED) {
-               rc = ir_seek_table(rc_tab, scancode);
-               if (rc < 0)
-                       return 0;
-
-               IR_dprintk(1, "#%d: Deleting scan 0x%04x\n", rc, scancode);
-               clear_bit(keymap[rc].keycode, dev->keybit);
-               ir_delete_key(rc_tab, rc);
-
-               return 0;
-       }
-
-       /*
-        * Handle keycode replacements
-        *
-        * If the scancode exists, just replace by the new value
-        */
-       rc = ir_seek_table(rc_tab, scancode);
-       if (rc >= 0) {
-               IR_dprintk(1, "#%d: Replacing scan 0x%04x with key 0x%04x\n",
-                       rc, scancode, keycode);
-
-               clear_bit(keymap[rc].keycode, dev->keybit);
-
-               spin_lock_irqsave(&rc_tab->lock, flags);
-               keymap[rc].keycode = keycode;
-               spin_unlock_irqrestore(&rc_tab->lock, flags);
-
-               set_bit(keycode, dev->keybit);
-
-               return 0;
-       }
-
-       /*
-        * Handle new scancode inserts
-        *
-        * reallocate table if needed and insert a new keycode
-        */
-
-       /* Avoid growing the table indefinitely */
-       if (rc_tab->size + 1 > IR_TAB_MAX_SIZE)
-               return -EINVAL;
-
-       rc = ir_insert_key(rc_tab, scancode, keycode);
-       if (rc < 0)
-               return rc;
-       set_bit(keycode, dev->keybit);
-
-       return 0;
-}
-
-/**
- * ir_g_keycode_from_table() - gets the keycode that corresponds to a scancode
- * @input_dev: the struct input_dev descriptor of the device
- * @scancode:  the scancode that we're seeking
- *
- * This routine is used by the input routines when a key is pressed at the
- * IR. The scancode is received and needs to be converted into a keycode.
- * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the
- * corresponding keycode from the table.
- */
-u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode)
-{
-       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
-       struct ir_scancode *keymap = rc_tab->scan;
-       int elem;
-
-       elem = ir_seek_table(rc_tab, scancode);
-       if (elem >= 0) {
-               IR_dprintk(1, "%s: scancode 0x%04x keycode 0x%02x\n",
-                          dev->name, scancode, keymap[elem].keycode);
-
-               return rc_tab->scan[elem].keycode;
-       }
-
-       printk(KERN_INFO "%s: unknown key for scancode 0x%04x\n",
-              dev->name, scancode);
-
-       /* Reports userspace that an unknown keycode were got */
-       return KEY_RESERVED;
-}
-
-/**
- * ir_set_keycode_table() - sets the IR keycode table and add the handlers
- *                         for keymap table get/set
- * @input_dev: the struct input_dev descriptor of the device
- * @rc_tab:    the struct ir_scancode_table table of scancode/keymap
- *
- * This routine is used to initialize the input infrastructure to work with
- * an IR.
- * It should be called before registering the IR device.
- */
-int ir_set_keycode_table(struct input_dev *input_dev,
-                        struct ir_scancode_table *rc_tab)
-{
-       struct ir_scancode *keymap = rc_tab->scan;
-       int i;
-
-       spin_lock_init(&rc_tab->lock);
-
-       if (rc_tab->scan == NULL || !rc_tab->size)
-               return -EINVAL;
-
-       /* set the bits for the keys */
-       IR_dprintk(1, "key map size: %d\n", rc_tab->size);
-       for (i = 0; i < rc_tab->size; i++) {
-               IR_dprintk(1, "#%d: setting bit for keycode 0x%04x\n",
-                       i, keymap[i].keycode);
-               set_bit(keymap[i].keycode, input_dev->keybit);
-       }
-
-       input_dev->getkeycode = ir_getkeycode;
-       input_dev->setkeycode = ir_setkeycode;
-       input_set_drvdata(input_dev, rc_tab);
-
-       return 0;
-}
-
-void ir_input_free(struct input_dev *dev)
-{
-       struct ir_scancode_table *rc_tab = input_get_drvdata(dev);
-
-       if (!rc_tab)
-               return;
-
-       IR_dprintk(1, "Freed keycode table\n");
-
-       rc_tab->size = 0;
-       kfree(rc_tab->scan);
-       rc_tab->scan = NULL;
-}
-EXPORT_SYMBOL_GPL(ir_input_free);
-
index 9dc74c93bf245e29657b16852ed59169bb3f6695..f63909d9c70bec2bebc0861444067f960a50d2e0 100644 (file)
@@ -37,10 +37,6 @@ config VIDEO_BTCX
        depends on PCI
        tristate
 
-config VIDEO_IR
-       tristate
-       depends on INPUT
-
 config VIDEO_TVEEPROM
        tristate
        depends on I2C