Linux-libre 2.6.32.6-gnu1
[librecmc/linux-libre.git] / drivers / media / common / ir-keymaps.c
1 /*
2     Keytables for supported remote controls, used on drivers/media
3     devices.
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 /*
21  * NOTICE FOR DEVELOPERS:
22  *   The IR mappings should be as close as possible to what's
23  *   specified at:
24  *      http://linuxtv.org/wiki/index.php/Remote_Controllers
25  */
26 #include <linux/module.h>
27
28 #include <linux/input.h>
29 #include <media/ir-common.h>
30
31 /* empty keytable, can be used as placeholder for not-yet created keytables */
32 static struct ir_scancode ir_codes_empty[] = {
33         { 0x2a, KEY_COFFEE },
34 };
35
36 struct ir_scancode_table ir_codes_empty_table = {
37         .scan = ir_codes_empty,
38         .size = ARRAY_SIZE(ir_codes_empty),
39 };
40 EXPORT_SYMBOL_GPL(ir_codes_empty_table);
41
42 /* Michal Majchrowicz <mmajchrowicz@gmail.com> */
43 static struct ir_scancode ir_codes_proteus_2309[] = {
44         /* numeric */
45         { 0x00, KEY_0 },
46         { 0x01, KEY_1 },
47         { 0x02, KEY_2 },
48         { 0x03, KEY_3 },
49         { 0x04, KEY_4 },
50         { 0x05, KEY_5 },
51         { 0x06, KEY_6 },
52         { 0x07, KEY_7 },
53         { 0x08, KEY_8 },
54         { 0x09, KEY_9 },
55
56         { 0x5c, KEY_POWER },            /* power       */
57         { 0x20, KEY_ZOOM },             /* full screen */
58         { 0x0f, KEY_BACKSPACE },        /* recall      */
59         { 0x1b, KEY_ENTER },            /* mute        */
60         { 0x41, KEY_RECORD },           /* record      */
61         { 0x43, KEY_STOP },             /* stop        */
62         { 0x16, KEY_S },
63         { 0x1a, KEY_POWER2 },           /* off         */
64         { 0x2e, KEY_RED },
65         { 0x1f, KEY_CHANNELDOWN },      /* channel -   */
66         { 0x1c, KEY_CHANNELUP },        /* channel +   */
67         { 0x10, KEY_VOLUMEDOWN },       /* volume -    */
68         { 0x1e, KEY_VOLUMEUP },         /* volume +    */
69         { 0x14, KEY_F1 },
70 };
71
72 struct ir_scancode_table ir_codes_proteus_2309_table = {
73         .scan = ir_codes_proteus_2309,
74         .size = ARRAY_SIZE(ir_codes_proteus_2309),
75 };
76 EXPORT_SYMBOL_GPL(ir_codes_proteus_2309_table);
77
78 /* Matt Jesson <dvb@jesson.eclipse.co.uk */
79 static struct ir_scancode ir_codes_avermedia_dvbt[] = {
80         { 0x28, KEY_0 },                /* '0' / 'enter' */
81         { 0x22, KEY_1 },                /* '1' */
82         { 0x12, KEY_2 },                /* '2' / 'up arrow' */
83         { 0x32, KEY_3 },                /* '3' */
84         { 0x24, KEY_4 },                /* '4' / 'left arrow' */
85         { 0x14, KEY_5 },                /* '5' */
86         { 0x34, KEY_6 },                /* '6' / 'right arrow' */
87         { 0x26, KEY_7 },                /* '7' */
88         { 0x16, KEY_8 },                /* '8' / 'down arrow' */
89         { 0x36, KEY_9 },                /* '9' */
90
91         { 0x20, KEY_LIST },             /* 'source' */
92         { 0x10, KEY_TEXT },             /* 'teletext' */
93         { 0x00, KEY_POWER },            /* 'power' */
94         { 0x04, KEY_AUDIO },            /* 'audio' */
95         { 0x06, KEY_ZOOM },             /* 'full screen' */
96         { 0x18, KEY_VIDEO },            /* 'display' */
97         { 0x38, KEY_SEARCH },           /* 'loop' */
98         { 0x08, KEY_INFO },             /* 'preview' */
99         { 0x2a, KEY_REWIND },           /* 'backward <<' */
100         { 0x1a, KEY_FASTFORWARD },      /* 'forward >>' */
101         { 0x3a, KEY_RECORD },           /* 'capture' */
102         { 0x0a, KEY_MUTE },             /* 'mute' */
103         { 0x2c, KEY_RECORD },           /* 'record' */
104         { 0x1c, KEY_PAUSE },            /* 'pause' */
105         { 0x3c, KEY_STOP },             /* 'stop' */
106         { 0x0c, KEY_PLAY },             /* 'play' */
107         { 0x2e, KEY_RED },              /* 'red' */
108         { 0x01, KEY_BLUE },             /* 'blue' / 'cancel' */
109         { 0x0e, KEY_YELLOW },           /* 'yellow' / 'ok' */
110         { 0x21, KEY_GREEN },            /* 'green' */
111         { 0x11, KEY_CHANNELDOWN },      /* 'channel -' */
112         { 0x31, KEY_CHANNELUP },        /* 'channel +' */
113         { 0x1e, KEY_VOLUMEDOWN },       /* 'volume -' */
114         { 0x3e, KEY_VOLUMEUP },         /* 'volume +' */
115 };
116
117 struct ir_scancode_table ir_codes_avermedia_dvbt_table = {
118         .scan = ir_codes_avermedia_dvbt,
119         .size = ARRAY_SIZE(ir_codes_avermedia_dvbt),
120 };
121 EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt_table);
122
123 /* Mauro Carvalho Chehab <mchehab@infradead.org> */
124 static struct ir_scancode ir_codes_avermedia_m135a[] = {
125         { 0x00, KEY_POWER2 },
126         { 0x2e, KEY_DOT },              /* '.' */
127         { 0x01, KEY_MODE },             /* TV/FM */
128
129         { 0x05, KEY_1 },
130         { 0x06, KEY_2 },
131         { 0x07, KEY_3 },
132         { 0x09, KEY_4 },
133         { 0x0a, KEY_5 },
134         { 0x0b, KEY_6 },
135         { 0x0d, KEY_7 },
136         { 0x0e, KEY_8 },
137         { 0x0f, KEY_9 },
138         { 0x11, KEY_0 },
139
140         { 0x13, KEY_RIGHT },            /* -> */
141         { 0x12, KEY_LEFT },             /* <- */
142
143         { 0x17, KEY_SLEEP },            /* Capturar Imagem */
144         { 0x10, KEY_SHUFFLE },          /* Amostra */
145
146         /* FIXME: The keys bellow aren't ok */
147
148         { 0x43, KEY_CHANNELUP },
149         { 0x42, KEY_CHANNELDOWN },
150         { 0x1f, KEY_VOLUMEUP },
151         { 0x1e, KEY_VOLUMEDOWN },
152         { 0x0c, KEY_ENTER },
153
154         { 0x14, KEY_MUTE },
155         { 0x08, KEY_AUDIO },
156
157         { 0x03, KEY_TEXT },
158         { 0x04, KEY_EPG },
159         { 0x2b, KEY_TV2 },              /* TV2 */
160
161         { 0x1d, KEY_RED },
162         { 0x1c, KEY_YELLOW },
163         { 0x41, KEY_GREEN },
164         { 0x40, KEY_BLUE },
165
166         { 0x1a, KEY_PLAYPAUSE },
167         { 0x19, KEY_RECORD },
168         { 0x18, KEY_PLAY },
169         { 0x1b, KEY_STOP },
170 };
171
172 struct ir_scancode_table ir_codes_avermedia_m135a_table = {
173         .scan = ir_codes_avermedia_m135a,
174         .size = ARRAY_SIZE(ir_codes_avermedia_m135a),
175 };
176 EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a_table);
177
178 /* Oldrich Jedlicka <oldium.pro@seznam.cz> */
179 static struct ir_scancode ir_codes_avermedia_cardbus[] = {
180         { 0x00, KEY_POWER },
181         { 0x01, KEY_TUNER },            /* TV/FM */
182         { 0x03, KEY_TEXT },             /* Teletext */
183         { 0x04, KEY_EPG },
184         { 0x05, KEY_1 },
185         { 0x06, KEY_2 },
186         { 0x07, KEY_3 },
187         { 0x08, KEY_AUDIO },
188         { 0x09, KEY_4 },
189         { 0x0a, KEY_5 },
190         { 0x0b, KEY_6 },
191         { 0x0c, KEY_ZOOM },             /* Full screen */
192         { 0x0d, KEY_7 },
193         { 0x0e, KEY_8 },
194         { 0x0f, KEY_9 },
195         { 0x10, KEY_PAGEUP },           /* 16-CH PREV */
196         { 0x11, KEY_0 },
197         { 0x12, KEY_INFO },
198         { 0x13, KEY_AGAIN },            /* CH RTN - channel return */
199         { 0x14, KEY_MUTE },
200         { 0x15, KEY_EDIT },             /* Autoscan */
201         { 0x17, KEY_SAVE },             /* Screenshot */
202         { 0x18, KEY_PLAYPAUSE },
203         { 0x19, KEY_RECORD },
204         { 0x1a, KEY_PLAY },
205         { 0x1b, KEY_STOP },
206         { 0x1c, KEY_FASTFORWARD },
207         { 0x1d, KEY_REWIND },
208         { 0x1e, KEY_VOLUMEDOWN },
209         { 0x1f, KEY_VOLUMEUP },
210         { 0x22, KEY_SLEEP },            /* Sleep */
211         { 0x23, KEY_ZOOM },             /* Aspect */
212         { 0x26, KEY_SCREEN },           /* Pos */
213         { 0x27, KEY_ANGLE },            /* Size */
214         { 0x28, KEY_SELECT },           /* Select */
215         { 0x29, KEY_BLUE },             /* Blue/Picture */
216         { 0x2a, KEY_BACKSPACE },        /* Back */
217         { 0x2b, KEY_MEDIA },            /* PIP (Picture-in-picture) */
218         { 0x2c, KEY_DOWN },
219         { 0x2e, KEY_DOT },
220         { 0x2f, KEY_TV },               /* Live TV */
221         { 0x32, KEY_LEFT },
222         { 0x33, KEY_CLEAR },            /* Clear */
223         { 0x35, KEY_RED },              /* Red/TV */
224         { 0x36, KEY_UP },
225         { 0x37, KEY_HOME },             /* Home */
226         { 0x39, KEY_GREEN },            /* Green/Video */
227         { 0x3d, KEY_YELLOW },           /* Yellow/Music */
228         { 0x3e, KEY_OK },               /* Ok */
229         { 0x3f, KEY_RIGHT },
230         { 0x40, KEY_NEXT },             /* Next */
231         { 0x41, KEY_PREVIOUS },         /* Previous */
232         { 0x42, KEY_CHANNELDOWN },      /* Channel down */
233         { 0x43, KEY_CHANNELUP },        /* Channel up */
234 };
235
236 struct ir_scancode_table ir_codes_avermedia_cardbus_table = {
237         .scan = ir_codes_avermedia_cardbus,
238         .size = ARRAY_SIZE(ir_codes_avermedia_cardbus),
239 };
240 EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus_table);
241
242 /* Attila Kondoros <attila.kondoros@chello.hu> */
243 static struct ir_scancode ir_codes_apac_viewcomp[] = {
244
245         { 0x01, KEY_1 },
246         { 0x02, KEY_2 },
247         { 0x03, KEY_3 },
248         { 0x04, KEY_4 },
249         { 0x05, KEY_5 },
250         { 0x06, KEY_6 },
251         { 0x07, KEY_7 },
252         { 0x08, KEY_8 },
253         { 0x09, KEY_9 },
254         { 0x00, KEY_0 },
255         { 0x17, KEY_LAST },             /* +100 */
256         { 0x0a, KEY_LIST },             /* recall */
257
258
259         { 0x1c, KEY_TUNER },            /* TV/FM */
260         { 0x15, KEY_SEARCH },           /* scan */
261         { 0x12, KEY_POWER },            /* power */
262         { 0x1f, KEY_VOLUMEDOWN },       /* vol up */
263         { 0x1b, KEY_VOLUMEUP },         /* vol down */
264         { 0x1e, KEY_CHANNELDOWN },      /* chn up */
265         { 0x1a, KEY_CHANNELUP },        /* chn down */
266
267         { 0x11, KEY_VIDEO },            /* video */
268         { 0x0f, KEY_ZOOM },             /* full screen */
269         { 0x13, KEY_MUTE },             /* mute/unmute */
270         { 0x10, KEY_TEXT },             /* min */
271
272         { 0x0d, KEY_STOP },             /* freeze */
273         { 0x0e, KEY_RECORD },           /* record */
274         { 0x1d, KEY_PLAYPAUSE },        /* stop */
275         { 0x19, KEY_PLAY },             /* play */
276
277         { 0x16, KEY_GOTO },             /* osd */
278         { 0x14, KEY_REFRESH },          /* default */
279         { 0x0c, KEY_KPPLUS },           /* fine tune >>>> */
280         { 0x18, KEY_KPMINUS },          /* fine tune <<<< */
281 };
282
283 struct ir_scancode_table ir_codes_apac_viewcomp_table = {
284         .scan = ir_codes_apac_viewcomp,
285         .size = ARRAY_SIZE(ir_codes_apac_viewcomp),
286 };
287 EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp_table);
288
289 /* ---------------------------------------------------------------------- */
290
291 static struct ir_scancode ir_codes_pixelview[] = {
292
293         { 0x1e, KEY_POWER },    /* power */
294         { 0x07, KEY_MEDIA },    /* source */
295         { 0x1c, KEY_SEARCH },   /* scan */
296
297
298         { 0x03, KEY_TUNER },            /* TV/FM */
299
300         { 0x00, KEY_RECORD },
301         { 0x08, KEY_STOP },
302         { 0x11, KEY_PLAY },
303
304         { 0x1a, KEY_PLAYPAUSE },        /* freeze */
305         { 0x19, KEY_ZOOM },             /* zoom */
306         { 0x0f, KEY_TEXT },             /* min */
307
308         { 0x01, KEY_1 },
309         { 0x0b, KEY_2 },
310         { 0x1b, KEY_3 },
311         { 0x05, KEY_4 },
312         { 0x09, KEY_5 },
313         { 0x15, KEY_6 },
314         { 0x06, KEY_7 },
315         { 0x0a, KEY_8 },
316         { 0x12, KEY_9 },
317         { 0x02, KEY_0 },
318         { 0x10, KEY_LAST },             /* +100 */
319         { 0x13, KEY_LIST },             /* recall */
320
321         { 0x1f, KEY_CHANNELUP },        /* chn down */
322         { 0x17, KEY_CHANNELDOWN },      /* chn up */
323         { 0x16, KEY_VOLUMEUP },         /* vol down */
324         { 0x14, KEY_VOLUMEDOWN },       /* vol up */
325
326         { 0x04, KEY_KPMINUS },          /* <<< */
327         { 0x0e, KEY_SETUP },            /* function */
328         { 0x0c, KEY_KPPLUS },           /* >>> */
329
330         { 0x0d, KEY_GOTO },             /* mts */
331         { 0x1d, KEY_REFRESH },          /* reset */
332         { 0x18, KEY_MUTE },             /* mute/unmute */
333 };
334
335 struct ir_scancode_table ir_codes_pixelview_table = {
336         .scan = ir_codes_pixelview,
337         .size = ARRAY_SIZE(ir_codes_pixelview),
338 };
339 EXPORT_SYMBOL_GPL(ir_codes_pixelview_table);
340
341 /*
342    Mauro Carvalho Chehab <mchehab@infradead.org>
343    present on PV MPEG 8000GT
344  */
345 static struct ir_scancode ir_codes_pixelview_new[] = {
346         { 0x3c, KEY_TIME },             /* Timeshift */
347         { 0x12, KEY_POWER },
348
349         { 0x3d, KEY_1 },
350         { 0x38, KEY_2 },
351         { 0x18, KEY_3 },
352         { 0x35, KEY_4 },
353         { 0x39, KEY_5 },
354         { 0x15, KEY_6 },
355         { 0x36, KEY_7 },
356         { 0x3a, KEY_8 },
357         { 0x1e, KEY_9 },
358         { 0x3e, KEY_0 },
359
360         { 0x1c, KEY_AGAIN },            /* LOOP */
361         { 0x3f, KEY_MEDIA },            /* Source */
362         { 0x1f, KEY_LAST },             /* +100 */
363         { 0x1b, KEY_MUTE },
364
365         { 0x17, KEY_CHANNELDOWN },
366         { 0x16, KEY_CHANNELUP },
367         { 0x10, KEY_VOLUMEUP },
368         { 0x14, KEY_VOLUMEDOWN },
369         { 0x13, KEY_ZOOM },
370
371         { 0x19, KEY_CAMERA },           /* SNAPSHOT */
372         { 0x1a, KEY_SEARCH },           /* scan */
373
374         { 0x37, KEY_REWIND },           /* << */
375         { 0x32, KEY_RECORD },           /* o (red) */
376         { 0x33, KEY_FORWARD },          /* >> */
377         { 0x11, KEY_STOP },             /* square */
378         { 0x3b, KEY_PLAY },             /* > */
379         { 0x30, KEY_PLAYPAUSE },        /* || */
380
381         { 0x31, KEY_TV },
382         { 0x34, KEY_RADIO },
383 };
384
385 struct ir_scancode_table ir_codes_pixelview_new_table = {
386         .scan = ir_codes_pixelview_new,
387         .size = ARRAY_SIZE(ir_codes_pixelview_new),
388 };
389 EXPORT_SYMBOL_GPL(ir_codes_pixelview_new_table);
390
391 static struct ir_scancode ir_codes_nebula[] = {
392         { 0x00, KEY_0 },
393         { 0x01, KEY_1 },
394         { 0x02, KEY_2 },
395         { 0x03, KEY_3 },
396         { 0x04, KEY_4 },
397         { 0x05, KEY_5 },
398         { 0x06, KEY_6 },
399         { 0x07, KEY_7 },
400         { 0x08, KEY_8 },
401         { 0x09, KEY_9 },
402         { 0x0a, KEY_TV },
403         { 0x0b, KEY_AUX },
404         { 0x0c, KEY_DVD },
405         { 0x0d, KEY_POWER },
406         { 0x0e, KEY_MHP },      /* labelled 'Picture' */
407         { 0x0f, KEY_AUDIO },
408         { 0x10, KEY_INFO },
409         { 0x11, KEY_F13 },      /* 16:9 */
410         { 0x12, KEY_F14 },      /* 14:9 */
411         { 0x13, KEY_EPG },
412         { 0x14, KEY_EXIT },
413         { 0x15, KEY_MENU },
414         { 0x16, KEY_UP },
415         { 0x17, KEY_DOWN },
416         { 0x18, KEY_LEFT },
417         { 0x19, KEY_RIGHT },
418         { 0x1a, KEY_ENTER },
419         { 0x1b, KEY_CHANNELUP },
420         { 0x1c, KEY_CHANNELDOWN },
421         { 0x1d, KEY_VOLUMEUP },
422         { 0x1e, KEY_VOLUMEDOWN },
423         { 0x1f, KEY_RED },
424         { 0x20, KEY_GREEN },
425         { 0x21, KEY_YELLOW },
426         { 0x22, KEY_BLUE },
427         { 0x23, KEY_SUBTITLE },
428         { 0x24, KEY_F15 },      /* AD */
429         { 0x25, KEY_TEXT },
430         { 0x26, KEY_MUTE },
431         { 0x27, KEY_REWIND },
432         { 0x28, KEY_STOP },
433         { 0x29, KEY_PLAY },
434         { 0x2a, KEY_FASTFORWARD },
435         { 0x2b, KEY_F16 },      /* chapter */
436         { 0x2c, KEY_PAUSE },
437         { 0x2d, KEY_PLAY },
438         { 0x2e, KEY_RECORD },
439         { 0x2f, KEY_F17 },      /* picture in picture */
440         { 0x30, KEY_KPPLUS },   /* zoom in */
441         { 0x31, KEY_KPMINUS },  /* zoom out */
442         { 0x32, KEY_F18 },      /* capture */
443         { 0x33, KEY_F19 },      /* web */
444         { 0x34, KEY_EMAIL },
445         { 0x35, KEY_PHONE },
446         { 0x36, KEY_PC },
447 };
448
449 struct ir_scancode_table ir_codes_nebula_table = {
450         .scan = ir_codes_nebula,
451         .size = ARRAY_SIZE(ir_codes_nebula),
452 };
453 EXPORT_SYMBOL_GPL(ir_codes_nebula_table);
454
455 /* DigitalNow DNTV Live DVB-T Remote */
456 static struct ir_scancode ir_codes_dntv_live_dvb_t[] = {
457         { 0x00, KEY_ESC },              /* 'go up a level?' */
458         /* Keys 0 to 9 */
459         { 0x0a, KEY_0 },
460         { 0x01, KEY_1 },
461         { 0x02, KEY_2 },
462         { 0x03, KEY_3 },
463         { 0x04, KEY_4 },
464         { 0x05, KEY_5 },
465         { 0x06, KEY_6 },
466         { 0x07, KEY_7 },
467         { 0x08, KEY_8 },
468         { 0x09, KEY_9 },
469
470         { 0x0b, KEY_TUNER },            /* tv/fm */
471         { 0x0c, KEY_SEARCH },           /* scan */
472         { 0x0d, KEY_STOP },
473         { 0x0e, KEY_PAUSE },
474         { 0x0f, KEY_LIST },             /* source */
475
476         { 0x10, KEY_MUTE },
477         { 0x11, KEY_REWIND },           /* backward << */
478         { 0x12, KEY_POWER },
479         { 0x13, KEY_CAMERA },           /* snap */
480         { 0x14, KEY_AUDIO },            /* stereo */
481         { 0x15, KEY_CLEAR },            /* reset */
482         { 0x16, KEY_PLAY },
483         { 0x17, KEY_ENTER },
484         { 0x18, KEY_ZOOM },             /* full screen */
485         { 0x19, KEY_FASTFORWARD },      /* forward >> */
486         { 0x1a, KEY_CHANNELUP },
487         { 0x1b, KEY_VOLUMEUP },
488         { 0x1c, KEY_INFO },             /* preview */
489         { 0x1d, KEY_RECORD },           /* record */
490         { 0x1e, KEY_CHANNELDOWN },
491         { 0x1f, KEY_VOLUMEDOWN },
492 };
493
494 struct ir_scancode_table ir_codes_dntv_live_dvb_t_table = {
495         .scan = ir_codes_dntv_live_dvb_t,
496         .size = ARRAY_SIZE(ir_codes_dntv_live_dvb_t),
497 };
498 EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t_table);
499
500 /* ---------------------------------------------------------------------- */
501
502 /* IO-DATA BCTV7E Remote */
503 static struct ir_scancode ir_codes_iodata_bctv7e[] = {
504         { 0x40, KEY_TV },
505         { 0x20, KEY_RADIO },            /* FM */
506         { 0x60, KEY_EPG },
507         { 0x00, KEY_POWER },
508
509         /* Keys 0 to 9 */
510         { 0x44, KEY_0 },                /* 10 */
511         { 0x50, KEY_1 },
512         { 0x30, KEY_2 },
513         { 0x70, KEY_3 },
514         { 0x48, KEY_4 },
515         { 0x28, KEY_5 },
516         { 0x68, KEY_6 },
517         { 0x58, KEY_7 },
518         { 0x38, KEY_8 },
519         { 0x78, KEY_9 },
520
521         { 0x10, KEY_L },                /* Live */
522         { 0x08, KEY_TIME },             /* Time Shift */
523
524         { 0x18, KEY_PLAYPAUSE },        /* Play */
525
526         { 0x24, KEY_ENTER },            /* 11 */
527         { 0x64, KEY_ESC },              /* 12 */
528         { 0x04, KEY_M },                /* Multi */
529
530         { 0x54, KEY_VIDEO },
531         { 0x34, KEY_CHANNELUP },
532         { 0x74, KEY_VOLUMEUP },
533         { 0x14, KEY_MUTE },
534
535         { 0x4c, KEY_VCR },              /* SVIDEO */
536         { 0x2c, KEY_CHANNELDOWN },
537         { 0x6c, KEY_VOLUMEDOWN },
538         { 0x0c, KEY_ZOOM },
539
540         { 0x5c, KEY_PAUSE },
541         { 0x3c, KEY_RED },              /* || (red) */
542         { 0x7c, KEY_RECORD },           /* recording */
543         { 0x1c, KEY_STOP },
544
545         { 0x41, KEY_REWIND },           /* backward << */
546         { 0x21, KEY_PLAY },
547         { 0x61, KEY_FASTFORWARD },      /* forward >> */
548         { 0x01, KEY_NEXT },             /* skip >| */
549 };
550
551 struct ir_scancode_table ir_codes_iodata_bctv7e_table = {
552         .scan = ir_codes_iodata_bctv7e,
553         .size = ARRAY_SIZE(ir_codes_iodata_bctv7e),
554 };
555 EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e_table);
556
557 /* ---------------------------------------------------------------------- */
558
559 /* ADS Tech Instant TV DVB-T PCI Remote */
560 static struct ir_scancode ir_codes_adstech_dvb_t_pci[] = {
561         /* Keys 0 to 9 */
562         { 0x4d, KEY_0 },
563         { 0x57, KEY_1 },
564         { 0x4f, KEY_2 },
565         { 0x53, KEY_3 },
566         { 0x56, KEY_4 },
567         { 0x4e, KEY_5 },
568         { 0x5e, KEY_6 },
569         { 0x54, KEY_7 },
570         { 0x4c, KEY_8 },
571         { 0x5c, KEY_9 },
572
573         { 0x5b, KEY_POWER },
574         { 0x5f, KEY_MUTE },
575         { 0x55, KEY_GOTO },
576         { 0x5d, KEY_SEARCH },
577         { 0x17, KEY_EPG },              /* Guide */
578         { 0x1f, KEY_MENU },
579         { 0x0f, KEY_UP },
580         { 0x46, KEY_DOWN },
581         { 0x16, KEY_LEFT },
582         { 0x1e, KEY_RIGHT },
583         { 0x0e, KEY_SELECT },           /* Enter */
584         { 0x5a, KEY_INFO },
585         { 0x52, KEY_EXIT },
586         { 0x59, KEY_PREVIOUS },
587         { 0x51, KEY_NEXT },
588         { 0x58, KEY_REWIND },
589         { 0x50, KEY_FORWARD },
590         { 0x44, KEY_PLAYPAUSE },
591         { 0x07, KEY_STOP },
592         { 0x1b, KEY_RECORD },
593         { 0x13, KEY_TUNER },            /* Live */
594         { 0x0a, KEY_A },
595         { 0x12, KEY_B },
596         { 0x03, KEY_PROG1 },            /* 1 */
597         { 0x01, KEY_PROG2 },            /* 2 */
598         { 0x00, KEY_PROG3 },            /* 3 */
599         { 0x06, KEY_DVD },
600         { 0x48, KEY_AUX },              /* Photo */
601         { 0x40, KEY_VIDEO },
602         { 0x19, KEY_AUDIO },            /* Music */
603         { 0x0b, KEY_CHANNELUP },
604         { 0x08, KEY_CHANNELDOWN },
605         { 0x15, KEY_VOLUMEUP },
606         { 0x1c, KEY_VOLUMEDOWN },
607 };
608
609 struct ir_scancode_table ir_codes_adstech_dvb_t_pci_table = {
610         .scan = ir_codes_adstech_dvb_t_pci,
611         .size = ARRAY_SIZE(ir_codes_adstech_dvb_t_pci),
612 };
613 EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci_table);
614
615 /* ---------------------------------------------------------------------- */
616
617 /* MSI TV@nywhere MASTER remote */
618
619 static struct ir_scancode ir_codes_msi_tvanywhere[] = {
620         /* Keys 0 to 9 */
621         { 0x00, KEY_0 },
622         { 0x01, KEY_1 },
623         { 0x02, KEY_2 },
624         { 0x03, KEY_3 },
625         { 0x04, KEY_4 },
626         { 0x05, KEY_5 },
627         { 0x06, KEY_6 },
628         { 0x07, KEY_7 },
629         { 0x08, KEY_8 },
630         { 0x09, KEY_9 },
631
632         { 0x0c, KEY_MUTE },
633         { 0x0f, KEY_SCREEN },           /* Full Screen */
634         { 0x10, KEY_FN },               /* Funtion */
635         { 0x11, KEY_TIME },             /* Time shift */
636         { 0x12, KEY_POWER },
637         { 0x13, KEY_MEDIA },            /* MTS */
638         { 0x14, KEY_SLOW },
639         { 0x16, KEY_REWIND },           /* backward << */
640         { 0x17, KEY_ENTER },            /* Return */
641         { 0x18, KEY_FASTFORWARD },      /* forward >> */
642         { 0x1a, KEY_CHANNELUP },
643         { 0x1b, KEY_VOLUMEUP },
644         { 0x1e, KEY_CHANNELDOWN },
645         { 0x1f, KEY_VOLUMEDOWN },
646 };
647
648 struct ir_scancode_table ir_codes_msi_tvanywhere_table = {
649         .scan = ir_codes_msi_tvanywhere,
650         .size = ARRAY_SIZE(ir_codes_msi_tvanywhere),
651 };
652 EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_table);
653
654 /* ---------------------------------------------------------------------- */
655
656 /*
657   Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
658   is marked "KS003". The controller is I2C at address 0x30, but does not seem
659   to respond to probes until a read is performed from a valid device.
660   I don't know why...
661
662   Note: This remote may be of similar or identical design to the
663   Pixelview remote (?).  The raw codes and duplicate button codes
664   appear to be the same.
665
666   Henry Wong <henry@stuffedcow.net>
667   Some changes to formatting and keycodes by Mark Schultz <n9xmj@yahoo.com>
668
669 */
670
671 static struct ir_scancode ir_codes_msi_tvanywhere_plus[] = {
672
673 /*  ---- Remote Button Layout ----
674
675     POWER   SOURCE  SCAN    MUTE
676     TV/FM   1       2       3
677     |>      4       5       6
678     <|      7       8       9
679     ^^UP    0       +       RECALL
680     vvDN    RECORD  STOP    PLAY
681
682         MINIMIZE          ZOOM
683
684                   CH+
685       VOL-                   VOL+
686                   CH-
687
688         SNAPSHOT           MTS
689
690      <<      FUNC    >>     RESET
691 */
692
693         { 0x01, KEY_1 },                /* 1 */
694         { 0x0b, KEY_2 },                /* 2 */
695         { 0x1b, KEY_3 },                /* 3 */
696         { 0x05, KEY_4 },                /* 4 */
697         { 0x09, KEY_5 },                /* 5 */
698         { 0x15, KEY_6 },                /* 6 */
699         { 0x06, KEY_7 },                /* 7 */
700         { 0x0a, KEY_8 },                /* 8 */
701         { 0x12, KEY_9 },                /* 9 */
702         { 0x02, KEY_0 },                /* 0 */
703         { 0x10, KEY_KPPLUS },           /* + */
704         { 0x13, KEY_AGAIN },            /* Recall */
705
706         { 0x1e, KEY_POWER },            /* Power */
707         { 0x07, KEY_TUNER },            /* Source */
708         { 0x1c, KEY_SEARCH },           /* Scan */
709         { 0x18, KEY_MUTE },             /* Mute */
710
711         { 0x03, KEY_RADIO },            /* TV/FM */
712         /* The next four keys are duplicates that appear to send the
713            same IR code as Ch+, Ch-, >>, and << .  The raw code assigned
714            to them is the actual code + 0x20 - they will never be
715            detected as such unless some way is discovered to distinguish
716            these buttons from those that have the same code. */
717         { 0x3f, KEY_RIGHT },            /* |> and Ch+ */
718         { 0x37, KEY_LEFT },             /* <| and Ch- */
719         { 0x2c, KEY_UP },               /* ^^Up and >> */
720         { 0x24, KEY_DOWN },             /* vvDn and << */
721
722         { 0x00, KEY_RECORD },           /* Record */
723         { 0x08, KEY_STOP },             /* Stop */
724         { 0x11, KEY_PLAY },             /* Play */
725
726         { 0x0f, KEY_CLOSE },            /* Minimize */
727         { 0x19, KEY_ZOOM },             /* Zoom */
728         { 0x1a, KEY_CAMERA },           /* Snapshot */
729         { 0x0d, KEY_LANGUAGE },         /* MTS */
730
731         { 0x14, KEY_VOLUMEDOWN },       /* Vol- */
732         { 0x16, KEY_VOLUMEUP },         /* Vol+ */
733         { 0x17, KEY_CHANNELDOWN },      /* Ch- */
734         { 0x1f, KEY_CHANNELUP },        /* Ch+ */
735
736         { 0x04, KEY_REWIND },           /* << */
737         { 0x0e, KEY_MENU },             /* Function */
738         { 0x0c, KEY_FASTFORWARD },      /* >> */
739         { 0x1d, KEY_RESTART },          /* Reset */
740 };
741
742 struct ir_scancode_table ir_codes_msi_tvanywhere_plus_table = {
743         .scan = ir_codes_msi_tvanywhere_plus,
744         .size = ARRAY_SIZE(ir_codes_msi_tvanywhere_plus),
745 };
746 EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus_table);
747
748 /* ---------------------------------------------------------------------- */
749
750 /* Cinergy 1400 DVB-T */
751 static struct ir_scancode ir_codes_cinergy_1400[] = {
752         { 0x01, KEY_POWER },
753         { 0x02, KEY_1 },
754         { 0x03, KEY_2 },
755         { 0x04, KEY_3 },
756         { 0x05, KEY_4 },
757         { 0x06, KEY_5 },
758         { 0x07, KEY_6 },
759         { 0x08, KEY_7 },
760         { 0x09, KEY_8 },
761         { 0x0a, KEY_9 },
762         { 0x0c, KEY_0 },
763
764         { 0x0b, KEY_VIDEO },
765         { 0x0d, KEY_REFRESH },
766         { 0x0e, KEY_SELECT },
767         { 0x0f, KEY_EPG },
768         { 0x10, KEY_UP },
769         { 0x11, KEY_LEFT },
770         { 0x12, KEY_OK },
771         { 0x13, KEY_RIGHT },
772         { 0x14, KEY_DOWN },
773         { 0x15, KEY_TEXT },
774         { 0x16, KEY_INFO },
775
776         { 0x17, KEY_RED },
777         { 0x18, KEY_GREEN },
778         { 0x19, KEY_YELLOW },
779         { 0x1a, KEY_BLUE },
780
781         { 0x1b, KEY_CHANNELUP },
782         { 0x1c, KEY_VOLUMEUP },
783         { 0x1d, KEY_MUTE },
784         { 0x1e, KEY_VOLUMEDOWN },
785         { 0x1f, KEY_CHANNELDOWN },
786
787         { 0x40, KEY_PAUSE },
788         { 0x4c, KEY_PLAY },
789         { 0x58, KEY_RECORD },
790         { 0x54, KEY_PREVIOUS },
791         { 0x48, KEY_STOP },
792         { 0x5c, KEY_NEXT },
793 };
794
795 struct ir_scancode_table ir_codes_cinergy_1400_table = {
796         .scan = ir_codes_cinergy_1400,
797         .size = ARRAY_SIZE(ir_codes_cinergy_1400),
798 };
799 EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400_table);
800
801 /* ---------------------------------------------------------------------- */
802
803 /* AVERTV STUDIO 303 Remote */
804 static struct ir_scancode ir_codes_avertv_303[] = {
805         { 0x2a, KEY_1 },
806         { 0x32, KEY_2 },
807         { 0x3a, KEY_3 },
808         { 0x4a, KEY_4 },
809         { 0x52, KEY_5 },
810         { 0x5a, KEY_6 },
811         { 0x6a, KEY_7 },
812         { 0x72, KEY_8 },
813         { 0x7a, KEY_9 },
814         { 0x0e, KEY_0 },
815
816         { 0x02, KEY_POWER },
817         { 0x22, KEY_VIDEO },
818         { 0x42, KEY_AUDIO },
819         { 0x62, KEY_ZOOM },
820         { 0x0a, KEY_TV },
821         { 0x12, KEY_CD },
822         { 0x1a, KEY_TEXT },
823
824         { 0x16, KEY_SUBTITLE },
825         { 0x1e, KEY_REWIND },
826         { 0x06, KEY_PRINT },
827
828         { 0x2e, KEY_SEARCH },
829         { 0x36, KEY_SLEEP },
830         { 0x3e, KEY_SHUFFLE },
831         { 0x26, KEY_MUTE },
832
833         { 0x4e, KEY_RECORD },
834         { 0x56, KEY_PAUSE },
835         { 0x5e, KEY_STOP },
836         { 0x46, KEY_PLAY },
837
838         { 0x6e, KEY_RED },
839         { 0x0b, KEY_GREEN },
840         { 0x66, KEY_YELLOW },
841         { 0x03, KEY_BLUE },
842
843         { 0x76, KEY_LEFT },
844         { 0x7e, KEY_RIGHT },
845         { 0x13, KEY_DOWN },
846         { 0x1b, KEY_UP },
847 };
848
849 struct ir_scancode_table ir_codes_avertv_303_table = {
850         .scan = ir_codes_avertv_303,
851         .size = ARRAY_SIZE(ir_codes_avertv_303),
852 };
853 EXPORT_SYMBOL_GPL(ir_codes_avertv_303_table);
854
855 /* ---------------------------------------------------------------------- */
856
857 /* DigitalNow DNTV Live! DVB-T Pro Remote */
858 static struct ir_scancode ir_codes_dntv_live_dvbt_pro[] = {
859         { 0x16, KEY_POWER },
860         { 0x5b, KEY_HOME },
861
862         { 0x55, KEY_TV },               /* live tv */
863         { 0x58, KEY_TUNER },            /* digital Radio */
864         { 0x5a, KEY_RADIO },            /* FM radio */
865         { 0x59, KEY_DVD },              /* dvd menu */
866         { 0x03, KEY_1 },
867         { 0x01, KEY_2 },
868         { 0x06, KEY_3 },
869         { 0x09, KEY_4 },
870         { 0x1d, KEY_5 },
871         { 0x1f, KEY_6 },
872         { 0x0d, KEY_7 },
873         { 0x19, KEY_8 },
874         { 0x1b, KEY_9 },
875         { 0x0c, KEY_CANCEL },
876         { 0x15, KEY_0 },
877         { 0x4a, KEY_CLEAR },
878         { 0x13, KEY_BACK },
879         { 0x00, KEY_TAB },
880         { 0x4b, KEY_UP },
881         { 0x4e, KEY_LEFT },
882         { 0x4f, KEY_OK },
883         { 0x52, KEY_RIGHT },
884         { 0x51, KEY_DOWN },
885         { 0x1e, KEY_VOLUMEUP },
886         { 0x0a, KEY_VOLUMEDOWN },
887         { 0x02, KEY_CHANNELDOWN },
888         { 0x05, KEY_CHANNELUP },
889         { 0x11, KEY_RECORD },
890         { 0x14, KEY_PLAY },
891         { 0x4c, KEY_PAUSE },
892         { 0x1a, KEY_STOP },
893         { 0x40, KEY_REWIND },
894         { 0x12, KEY_FASTFORWARD },
895         { 0x41, KEY_PREVIOUSSONG },     /* replay |< */
896         { 0x42, KEY_NEXTSONG },         /* skip >| */
897         { 0x54, KEY_CAMERA },           /* capture */
898         { 0x50, KEY_LANGUAGE },         /* sap */
899         { 0x47, KEY_TV2 },              /* pip */
900         { 0x4d, KEY_SCREEN },
901         { 0x43, KEY_SUBTITLE },
902         { 0x10, KEY_MUTE },
903         { 0x49, KEY_AUDIO },            /* l/r */
904         { 0x07, KEY_SLEEP },
905         { 0x08, KEY_VIDEO },            /* a/v */
906         { 0x0e, KEY_PREVIOUS },         /* recall */
907         { 0x45, KEY_ZOOM },             /* zoom + */
908         { 0x46, KEY_ANGLE },            /* zoom - */
909         { 0x56, KEY_RED },
910         { 0x57, KEY_GREEN },
911         { 0x5c, KEY_YELLOW },
912         { 0x5d, KEY_BLUE },
913 };
914
915 struct ir_scancode_table ir_codes_dntv_live_dvbt_pro_table = {
916         .scan = ir_codes_dntv_live_dvbt_pro,
917         .size = ARRAY_SIZE(ir_codes_dntv_live_dvbt_pro),
918 };
919 EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro_table);
920
921 static struct ir_scancode ir_codes_em_terratec[] = {
922         { 0x01, KEY_CHANNEL },
923         { 0x02, KEY_SELECT },
924         { 0x03, KEY_MUTE },
925         { 0x04, KEY_POWER },
926         { 0x05, KEY_1 },
927         { 0x06, KEY_2 },
928         { 0x07, KEY_3 },
929         { 0x08, KEY_CHANNELUP },
930         { 0x09, KEY_4 },
931         { 0x0a, KEY_5 },
932         { 0x0b, KEY_6 },
933         { 0x0c, KEY_CHANNELDOWN },
934         { 0x0d, KEY_7 },
935         { 0x0e, KEY_8 },
936         { 0x0f, KEY_9 },
937         { 0x10, KEY_VOLUMEUP },
938         { 0x11, KEY_0 },
939         { 0x12, KEY_MENU },
940         { 0x13, KEY_PRINT },
941         { 0x14, KEY_VOLUMEDOWN },
942         { 0x16, KEY_PAUSE },
943         { 0x18, KEY_RECORD },
944         { 0x19, KEY_REWIND },
945         { 0x1a, KEY_PLAY },
946         { 0x1b, KEY_FORWARD },
947         { 0x1c, KEY_BACKSPACE },
948         { 0x1e, KEY_STOP },
949         { 0x40, KEY_ZOOM },
950 };
951
952 struct ir_scancode_table ir_codes_em_terratec_table = {
953         .scan = ir_codes_em_terratec,
954         .size = ARRAY_SIZE(ir_codes_em_terratec),
955 };
956 EXPORT_SYMBOL_GPL(ir_codes_em_terratec_table);
957
958 static struct ir_scancode ir_codes_pinnacle_grey[] = {
959         { 0x3a, KEY_0 },
960         { 0x31, KEY_1 },
961         { 0x32, KEY_2 },
962         { 0x33, KEY_3 },
963         { 0x34, KEY_4 },
964         { 0x35, KEY_5 },
965         { 0x36, KEY_6 },
966         { 0x37, KEY_7 },
967         { 0x38, KEY_8 },
968         { 0x39, KEY_9 },
969
970         { 0x2f, KEY_POWER },
971
972         { 0x2e, KEY_P },
973         { 0x1f, KEY_L },
974         { 0x2b, KEY_I },
975
976         { 0x2d, KEY_SCREEN },
977         { 0x1e, KEY_ZOOM },
978         { 0x1b, KEY_VOLUMEUP },
979         { 0x0f, KEY_VOLUMEDOWN },
980         { 0x17, KEY_CHANNELUP },
981         { 0x1c, KEY_CHANNELDOWN },
982         { 0x25, KEY_INFO },
983
984         { 0x3c, KEY_MUTE },
985
986         { 0x3d, KEY_LEFT },
987         { 0x3b, KEY_RIGHT },
988
989         { 0x3f, KEY_UP },
990         { 0x3e, KEY_DOWN },
991         { 0x1a, KEY_ENTER },
992
993         { 0x1d, KEY_MENU },
994         { 0x19, KEY_AGAIN },
995         { 0x16, KEY_PREVIOUSSONG },
996         { 0x13, KEY_NEXTSONG },
997         { 0x15, KEY_PAUSE },
998         { 0x0e, KEY_REWIND },
999         { 0x0d, KEY_PLAY },
1000         { 0x0b, KEY_STOP },
1001         { 0x07, KEY_FORWARD },
1002         { 0x27, KEY_RECORD },
1003         { 0x26, KEY_TUNER },
1004         { 0x29, KEY_TEXT },
1005         { 0x2a, KEY_MEDIA },
1006         { 0x18, KEY_EPG },
1007 };
1008
1009 struct ir_scancode_table ir_codes_pinnacle_grey_table = {
1010         .scan = ir_codes_pinnacle_grey,
1011         .size = ARRAY_SIZE(ir_codes_pinnacle_grey),
1012 };
1013 EXPORT_SYMBOL_GPL(ir_codes_pinnacle_grey_table);
1014
1015 static struct ir_scancode ir_codes_flyvideo[] = {
1016         { 0x0f, KEY_0 },
1017         { 0x03, KEY_1 },
1018         { 0x04, KEY_2 },
1019         { 0x05, KEY_3 },
1020         { 0x07, KEY_4 },
1021         { 0x08, KEY_5 },
1022         { 0x09, KEY_6 },
1023         { 0x0b, KEY_7 },
1024         { 0x0c, KEY_8 },
1025         { 0x0d, KEY_9 },
1026
1027         { 0x0e, KEY_MODE },     /* Air/Cable */
1028         { 0x11, KEY_VIDEO },    /* Video */
1029         { 0x15, KEY_AUDIO },    /* Audio */
1030         { 0x00, KEY_POWER },    /* Power */
1031         { 0x18, KEY_TUNER },    /* AV Source */
1032         { 0x02, KEY_ZOOM },     /* Fullscreen */
1033         { 0x1a, KEY_LANGUAGE }, /* Stereo */
1034         { 0x1b, KEY_MUTE },     /* Mute */
1035         { 0x14, KEY_VOLUMEUP }, /* Volume + */
1036         { 0x17, KEY_VOLUMEDOWN },/* Volume - */
1037         { 0x12, KEY_CHANNELUP },/* Channel + */
1038         { 0x13, KEY_CHANNELDOWN },/* Channel - */
1039         { 0x06, KEY_AGAIN },    /* Recall */
1040         { 0x10, KEY_ENTER },    /* Enter */
1041
1042         { 0x19, KEY_BACK },     /* Rewind  ( <<< ) */
1043         { 0x1f, KEY_FORWARD },  /* Forward ( >>> ) */
1044         { 0x0a, KEY_ANGLE },    /* no label, may be used as the PAUSE button */
1045 };
1046
1047 struct ir_scancode_table ir_codes_flyvideo_table = {
1048         .scan = ir_codes_flyvideo,
1049         .size = ARRAY_SIZE(ir_codes_flyvideo),
1050 };
1051 EXPORT_SYMBOL_GPL(ir_codes_flyvideo_table);
1052
1053 static struct ir_scancode ir_codes_flydvb[] = {
1054         { 0x01, KEY_ZOOM },             /* Full Screen */
1055         { 0x00, KEY_POWER },            /* Power */
1056
1057         { 0x03, KEY_1 },
1058         { 0x04, KEY_2 },
1059         { 0x05, KEY_3 },
1060         { 0x07, KEY_4 },
1061         { 0x08, KEY_5 },
1062         { 0x09, KEY_6 },
1063         { 0x0b, KEY_7 },
1064         { 0x0c, KEY_8 },
1065         { 0x0d, KEY_9 },
1066         { 0x06, KEY_AGAIN },            /* Recall */
1067         { 0x0f, KEY_0 },
1068         { 0x10, KEY_MUTE },             /* Mute */
1069         { 0x02, KEY_RADIO },            /* TV/Radio */
1070         { 0x1b, KEY_LANGUAGE },         /* SAP (Second Audio Program) */
1071
1072         { 0x14, KEY_VOLUMEUP },         /* VOL+ */
1073         { 0x17, KEY_VOLUMEDOWN },       /* VOL- */
1074         { 0x12, KEY_CHANNELUP },        /* CH+ */
1075         { 0x13, KEY_CHANNELDOWN },      /* CH- */
1076         { 0x1d, KEY_ENTER },            /* Enter */
1077
1078         { 0x1a, KEY_MODE },             /* PIP */
1079         { 0x18, KEY_TUNER },            /* Source */
1080
1081         { 0x1e, KEY_RECORD },           /* Record/Pause */
1082         { 0x15, KEY_ANGLE },            /* Swap (no label on key) */
1083         { 0x1c, KEY_PAUSE },            /* Timeshift/Pause */
1084         { 0x19, KEY_BACK },             /* Rewind << */
1085         { 0x0a, KEY_PLAYPAUSE },        /* Play/Pause */
1086         { 0x1f, KEY_FORWARD },          /* Forward >> */
1087         { 0x16, KEY_PREVIOUS },         /* Back |<< */
1088         { 0x11, KEY_STOP },             /* Stop */
1089         { 0x0e, KEY_NEXT },             /* End >>| */
1090 };
1091
1092 struct ir_scancode_table ir_codes_flydvb_table = {
1093         .scan = ir_codes_flydvb,
1094         .size = ARRAY_SIZE(ir_codes_flydvb),
1095 };
1096 EXPORT_SYMBOL_GPL(ir_codes_flydvb_table);
1097
1098 static struct ir_scancode ir_codes_cinergy[] = {
1099         { 0x00, KEY_0 },
1100         { 0x01, KEY_1 },
1101         { 0x02, KEY_2 },
1102         { 0x03, KEY_3 },
1103         { 0x04, KEY_4 },
1104         { 0x05, KEY_5 },
1105         { 0x06, KEY_6 },
1106         { 0x07, KEY_7 },
1107         { 0x08, KEY_8 },
1108         { 0x09, KEY_9 },
1109
1110         { 0x0a, KEY_POWER },
1111         { 0x0b, KEY_PROG1 },            /* app */
1112         { 0x0c, KEY_ZOOM },             /* zoom/fullscreen */
1113         { 0x0d, KEY_CHANNELUP },        /* channel */
1114         { 0x0e, KEY_CHANNELDOWN },      /* channel- */
1115         { 0x0f, KEY_VOLUMEUP },
1116         { 0x10, KEY_VOLUMEDOWN },
1117         { 0x11, KEY_TUNER },            /* AV */
1118         { 0x12, KEY_NUMLOCK },          /* -/-- */
1119         { 0x13, KEY_AUDIO },            /* audio */
1120         { 0x14, KEY_MUTE },
1121         { 0x15, KEY_UP },
1122         { 0x16, KEY_DOWN },
1123         { 0x17, KEY_LEFT },
1124         { 0x18, KEY_RIGHT },
1125         { 0x19, BTN_LEFT, },
1126         { 0x1a, BTN_RIGHT, },
1127         { 0x1b, KEY_WWW },              /* text */
1128         { 0x1c, KEY_REWIND },
1129         { 0x1d, KEY_FORWARD },
1130         { 0x1e, KEY_RECORD },
1131         { 0x1f, KEY_PLAY },
1132         { 0x20, KEY_PREVIOUSSONG },
1133         { 0x21, KEY_NEXTSONG },
1134         { 0x22, KEY_PAUSE },
1135         { 0x23, KEY_STOP },
1136 };
1137
1138 struct ir_scancode_table ir_codes_cinergy_table = {
1139         .scan = ir_codes_cinergy,
1140         .size = ARRAY_SIZE(ir_codes_cinergy),
1141 };
1142 EXPORT_SYMBOL_GPL(ir_codes_cinergy_table);
1143
1144 /* Alfons Geser <a.geser@cox.net>
1145  * updates from Job D. R. Borges <jobdrb@ig.com.br> */
1146 static struct ir_scancode ir_codes_eztv[] = {
1147         { 0x12, KEY_POWER },
1148         { 0x01, KEY_TV },       /* DVR */
1149         { 0x15, KEY_DVD },      /* DVD */
1150         { 0x17, KEY_AUDIO },    /* music */
1151                                 /* DVR mode / DVD mode / music mode */
1152
1153         { 0x1b, KEY_MUTE },     /* mute */
1154         { 0x02, KEY_LANGUAGE }, /* MTS/SAP / audio / autoseek */
1155         { 0x1e, KEY_SUBTITLE }, /* closed captioning / subtitle / seek */
1156         { 0x16, KEY_ZOOM },     /* full screen */
1157         { 0x1c, KEY_VIDEO },    /* video source / eject / delall */
1158         { 0x1d, KEY_RESTART },  /* playback / angle / del */
1159         { 0x2f, KEY_SEARCH },   /* scan / menu / playlist */
1160         { 0x30, KEY_CHANNEL },  /* CH surfing / bookmark / memo */
1161
1162         { 0x31, KEY_HELP },     /* help */
1163         { 0x32, KEY_MODE },     /* num/memo */
1164         { 0x33, KEY_ESC },      /* cancel */
1165
1166         { 0x0c, KEY_UP },       /* up */
1167         { 0x10, KEY_DOWN },     /* down */
1168         { 0x08, KEY_LEFT },     /* left */
1169         { 0x04, KEY_RIGHT },    /* right */
1170         { 0x03, KEY_SELECT },   /* select */
1171
1172         { 0x1f, KEY_REWIND },   /* rewind */
1173         { 0x20, KEY_PLAYPAUSE },/* play/pause */
1174         { 0x29, KEY_FORWARD },  /* forward */
1175         { 0x14, KEY_AGAIN },    /* repeat */
1176         { 0x2b, KEY_RECORD },   /* recording */
1177         { 0x2c, KEY_STOP },     /* stop */
1178         { 0x2d, KEY_PLAY },     /* play */
1179         { 0x2e, KEY_CAMERA },   /* snapshot / shuffle */
1180
1181         { 0x00, KEY_0 },
1182         { 0x05, KEY_1 },
1183         { 0x06, KEY_2 },
1184         { 0x07, KEY_3 },
1185         { 0x09, KEY_4 },
1186         { 0x0a, KEY_5 },
1187         { 0x0b, KEY_6 },
1188         { 0x0d, KEY_7 },
1189         { 0x0e, KEY_8 },
1190         { 0x0f, KEY_9 },
1191
1192         { 0x2a, KEY_VOLUMEUP },
1193         { 0x11, KEY_VOLUMEDOWN },
1194         { 0x18, KEY_CHANNELUP },/* CH.tracking up */
1195         { 0x19, KEY_CHANNELDOWN },/* CH.tracking down */
1196
1197         { 0x13, KEY_ENTER },    /* enter */
1198         { 0x21, KEY_DOT },      /* . (decimal dot) */
1199 };
1200
1201 struct ir_scancode_table ir_codes_eztv_table = {
1202         .scan = ir_codes_eztv,
1203         .size = ARRAY_SIZE(ir_codes_eztv),
1204 };
1205 EXPORT_SYMBOL_GPL(ir_codes_eztv_table);
1206
1207 /* Alex Hermann <gaaf@gmx.net> */
1208 static struct ir_scancode ir_codes_avermedia[] = {
1209         { 0x28, KEY_1 },
1210         { 0x18, KEY_2 },
1211         { 0x38, KEY_3 },
1212         { 0x24, KEY_4 },
1213         { 0x14, KEY_5 },
1214         { 0x34, KEY_6 },
1215         { 0x2c, KEY_7 },
1216         { 0x1c, KEY_8 },
1217         { 0x3c, KEY_9 },
1218         { 0x22, KEY_0 },
1219
1220         { 0x20, KEY_TV },               /* TV/FM */
1221         { 0x10, KEY_CD },               /* CD */
1222         { 0x30, KEY_TEXT },             /* TELETEXT */
1223         { 0x00, KEY_POWER },            /* POWER */
1224
1225         { 0x08, KEY_VIDEO },            /* VIDEO */
1226         { 0x04, KEY_AUDIO },            /* AUDIO */
1227         { 0x0c, KEY_ZOOM },             /* FULL SCREEN */
1228
1229         { 0x12, KEY_SUBTITLE },         /* DISPLAY */
1230         { 0x32, KEY_REWIND },           /* LOOP */
1231         { 0x02, KEY_PRINT },            /* PREVIEW */
1232
1233         { 0x2a, KEY_SEARCH },           /* AUTOSCAN */
1234         { 0x1a, KEY_SLEEP },            /* FREEZE */
1235         { 0x3a, KEY_CAMERA },           /* SNAPSHOT */
1236         { 0x0a, KEY_MUTE },             /* MUTE */
1237
1238         { 0x26, KEY_RECORD },           /* RECORD */
1239         { 0x16, KEY_PAUSE },            /* PAUSE */
1240         { 0x36, KEY_STOP },             /* STOP */
1241         { 0x06, KEY_PLAY },             /* PLAY */
1242
1243         { 0x2e, KEY_RED },              /* RED */
1244         { 0x21, KEY_GREEN },            /* GREEN */
1245         { 0x0e, KEY_YELLOW },           /* YELLOW */
1246         { 0x01, KEY_BLUE },             /* BLUE */
1247
1248         { 0x1e, KEY_VOLUMEDOWN },       /* VOLUME- */
1249         { 0x3e, KEY_VOLUMEUP },         /* VOLUME+ */
1250         { 0x11, KEY_CHANNELDOWN },      /* CHANNEL/PAGE- */
1251         { 0x31, KEY_CHANNELUP }         /* CHANNEL/PAGE+ */
1252 };
1253
1254 struct ir_scancode_table ir_codes_avermedia_table = {
1255         .scan = ir_codes_avermedia,
1256         .size = ARRAY_SIZE(ir_codes_avermedia),
1257 };
1258 EXPORT_SYMBOL_GPL(ir_codes_avermedia_table);
1259
1260 static struct ir_scancode ir_codes_videomate_tv_pvr[] = {
1261         { 0x14, KEY_MUTE },
1262         { 0x24, KEY_ZOOM },
1263
1264         { 0x01, KEY_DVD },
1265         { 0x23, KEY_RADIO },
1266         { 0x00, KEY_TV },
1267
1268         { 0x0a, KEY_REWIND },
1269         { 0x08, KEY_PLAYPAUSE },
1270         { 0x0f, KEY_FORWARD },
1271
1272         { 0x02, KEY_PREVIOUS },
1273         { 0x07, KEY_STOP },
1274         { 0x06, KEY_NEXT },
1275
1276         { 0x0c, KEY_UP },
1277         { 0x0e, KEY_DOWN },
1278         { 0x0b, KEY_LEFT },
1279         { 0x0d, KEY_RIGHT },
1280         { 0x11, KEY_OK },
1281
1282         { 0x03, KEY_MENU },
1283         { 0x09, KEY_SETUP },
1284         { 0x05, KEY_VIDEO },
1285         { 0x22, KEY_CHANNEL },
1286
1287         { 0x12, KEY_VOLUMEUP },
1288         { 0x15, KEY_VOLUMEDOWN },
1289         { 0x10, KEY_CHANNELUP },
1290         { 0x13, KEY_CHANNELDOWN },
1291
1292         { 0x04, KEY_RECORD },
1293
1294         { 0x16, KEY_1 },
1295         { 0x17, KEY_2 },
1296         { 0x18, KEY_3 },
1297         { 0x19, KEY_4 },
1298         { 0x1a, KEY_5 },
1299         { 0x1b, KEY_6 },
1300         { 0x1c, KEY_7 },
1301         { 0x1d, KEY_8 },
1302         { 0x1e, KEY_9 },
1303         { 0x1f, KEY_0 },
1304
1305         { 0x20, KEY_LANGUAGE },
1306         { 0x21, KEY_SLEEP },
1307 };
1308
1309 struct ir_scancode_table ir_codes_videomate_tv_pvr_table = {
1310         .scan = ir_codes_videomate_tv_pvr,
1311         .size = ARRAY_SIZE(ir_codes_videomate_tv_pvr),
1312 };
1313 EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr_table);
1314
1315 /* Michael Tokarev <mjt@tls.msk.ru>
1316    http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
1317    keytable is used by MANLI MTV00[0x0c] and BeholdTV 40[13] at
1318    least, and probably other cards too.
1319    The "ascii-art picture" below (in comments, first row
1320    is the keycode in hex, and subsequent row(s) shows
1321    the button labels (several variants when appropriate)
1322    helps to descide which keycodes to assign to the buttons.
1323  */
1324 static struct ir_scancode ir_codes_manli[] = {
1325
1326         /*  0x1c            0x12  *
1327          * FUNCTION         POWER *
1328          *   FM              (|)  *
1329          *                        */
1330         { 0x1c, KEY_RADIO },    /*XXX*/
1331         { 0x12, KEY_POWER },
1332
1333         /*  0x01    0x02    0x03  *
1334          *   1       2       3    *
1335          *                        *
1336          *  0x04    0x05    0x06  *
1337          *   4       5       6    *
1338          *                        *
1339          *  0x07    0x08    0x09  *
1340          *   7       8       9    *
1341          *                        */
1342         { 0x01, KEY_1 },
1343         { 0x02, KEY_2 },
1344         { 0x03, KEY_3 },
1345         { 0x04, KEY_4 },
1346         { 0x05, KEY_5 },
1347         { 0x06, KEY_6 },
1348         { 0x07, KEY_7 },
1349         { 0x08, KEY_8 },
1350         { 0x09, KEY_9 },
1351
1352         /*  0x0a    0x00    0x17  *
1353          * RECALL    0      +100  *
1354          *                  PLUS  *
1355          *                        */
1356         { 0x0a, KEY_AGAIN },    /*XXX KEY_REWIND? */
1357         { 0x00, KEY_0 },
1358         { 0x17, KEY_DIGITS },   /*XXX*/
1359
1360         /*  0x14            0x10  *
1361          *  MENU            INFO  *
1362          *  OSD                   */
1363         { 0x14, KEY_MENU },
1364         { 0x10, KEY_INFO },
1365
1366         /*          0x0b          *
1367          *           Up           *
1368          *                        *
1369          *  0x18    0x16    0x0c  *
1370          *  Left     Ok     Right *
1371          *                        *
1372          *         0x015          *
1373          *         Down           *
1374          *                        */
1375         { 0x0b, KEY_UP },
1376         { 0x18, KEY_LEFT },
1377         { 0x16, KEY_OK },       /*XXX KEY_SELECT? KEY_ENTER? */
1378         { 0x0c, KEY_RIGHT },
1379         { 0x15, KEY_DOWN },
1380
1381         /*  0x11            0x0d  *
1382          *  TV/AV           MODE  *
1383          *  SOURCE         STEREO *
1384          *                        */
1385         { 0x11, KEY_TV },       /*XXX*/
1386         { 0x0d, KEY_MODE },     /*XXX there's no KEY_STEREO     */
1387
1388         /*  0x0f    0x1b    0x1a  *
1389          *  AUDIO   Vol+    Chan+ *
1390          *        TIMESHIFT???    *
1391          *                        *
1392          *  0x0e    0x1f    0x1e  *
1393          *  SLEEP   Vol-    Chan- *
1394          *                        */
1395         { 0x0f, KEY_AUDIO },
1396         { 0x1b, KEY_VOLUMEUP },
1397         { 0x1a, KEY_CHANNELUP },
1398         { 0x0e, KEY_TIME },
1399         { 0x1f, KEY_VOLUMEDOWN },
1400         { 0x1e, KEY_CHANNELDOWN },
1401
1402         /*         0x13     0x19  *
1403          *         MUTE   SNAPSHOT*
1404          *                        */
1405         { 0x13, KEY_MUTE },
1406         { 0x19, KEY_CAMERA },
1407
1408         /* 0x1d unused ? */
1409 };
1410
1411 struct ir_scancode_table ir_codes_manli_table = {
1412         .scan = ir_codes_manli,
1413         .size = ARRAY_SIZE(ir_codes_manli),
1414 };
1415 EXPORT_SYMBOL_GPL(ir_codes_manli_table);
1416
1417 /* Mike Baikov <mike@baikov.com> */
1418 static struct ir_scancode ir_codes_gotview7135[] = {
1419
1420         { 0x11, KEY_POWER },
1421         { 0x35, KEY_TV },
1422         { 0x1b, KEY_0 },
1423         { 0x29, KEY_1 },
1424         { 0x19, KEY_2 },
1425         { 0x39, KEY_3 },
1426         { 0x1f, KEY_4 },
1427         { 0x2c, KEY_5 },
1428         { 0x21, KEY_6 },
1429         { 0x24, KEY_7 },
1430         { 0x18, KEY_8 },
1431         { 0x2b, KEY_9 },
1432         { 0x3b, KEY_AGAIN },    /* LOOP */
1433         { 0x06, KEY_AUDIO },
1434         { 0x31, KEY_PRINT },    /* PREVIEW */
1435         { 0x3e, KEY_VIDEO },
1436         { 0x10, KEY_CHANNELUP },
1437         { 0x20, KEY_CHANNELDOWN },
1438         { 0x0c, KEY_VOLUMEDOWN },
1439         { 0x28, KEY_VOLUMEUP },
1440         { 0x08, KEY_MUTE },
1441         { 0x26, KEY_SEARCH },   /* SCAN */
1442         { 0x3f, KEY_CAMERA },   /* SNAPSHOT */
1443         { 0x12, KEY_RECORD },
1444         { 0x32, KEY_STOP },
1445         { 0x3c, KEY_PLAY },
1446         { 0x1d, KEY_REWIND },
1447         { 0x2d, KEY_PAUSE },
1448         { 0x0d, KEY_FORWARD },
1449         { 0x05, KEY_ZOOM },     /*FULL*/
1450
1451         { 0x2a, KEY_F21 },      /* LIVE TIMESHIFT */
1452         { 0x0e, KEY_F22 },      /* MIN TIMESHIFT */
1453         { 0x1e, KEY_TIME },     /* TIMESHIFT */
1454         { 0x38, KEY_F24 },      /* NORMAL TIMESHIFT */
1455 };
1456
1457 struct ir_scancode_table ir_codes_gotview7135_table = {
1458         .scan = ir_codes_gotview7135,
1459         .size = ARRAY_SIZE(ir_codes_gotview7135),
1460 };
1461 EXPORT_SYMBOL_GPL(ir_codes_gotview7135_table);
1462
1463 static struct ir_scancode ir_codes_purpletv[] = {
1464         { 0x03, KEY_POWER },
1465         { 0x6f, KEY_MUTE },
1466         { 0x10, KEY_BACKSPACE },        /* Recall */
1467
1468         { 0x11, KEY_0 },
1469         { 0x04, KEY_1 },
1470         { 0x05, KEY_2 },
1471         { 0x06, KEY_3 },
1472         { 0x08, KEY_4 },
1473         { 0x09, KEY_5 },
1474         { 0x0a, KEY_6 },
1475         { 0x0c, KEY_7 },
1476         { 0x0d, KEY_8 },
1477         { 0x0e, KEY_9 },
1478         { 0x12, KEY_DOT },      /* 100+ */
1479
1480         { 0x07, KEY_VOLUMEUP },
1481         { 0x0b, KEY_VOLUMEDOWN },
1482         { 0x1a, KEY_KPPLUS },
1483         { 0x18, KEY_KPMINUS },
1484         { 0x15, KEY_UP },
1485         { 0x1d, KEY_DOWN },
1486         { 0x0f, KEY_CHANNELUP },
1487         { 0x13, KEY_CHANNELDOWN },
1488         { 0x48, KEY_ZOOM },
1489
1490         { 0x1b, KEY_VIDEO },    /* Video source */
1491         { 0x1f, KEY_CAMERA },   /* Snapshot */
1492         { 0x49, KEY_LANGUAGE }, /* MTS Select */
1493         { 0x19, KEY_SEARCH },   /* Auto Scan */
1494
1495         { 0x4b, KEY_RECORD },
1496         { 0x46, KEY_PLAY },
1497         { 0x45, KEY_PAUSE },    /* Pause */
1498         { 0x44, KEY_STOP },
1499         { 0x43, KEY_TIME },     /* Time Shift */
1500         { 0x17, KEY_CHANNEL },  /* SURF CH */
1501         { 0x40, KEY_FORWARD },  /* Forward ? */
1502         { 0x42, KEY_REWIND },   /* Backward ? */
1503
1504 };
1505
1506 struct ir_scancode_table ir_codes_purpletv_table = {
1507         .scan = ir_codes_purpletv,
1508         .size = ARRAY_SIZE(ir_codes_purpletv),
1509 };
1510 EXPORT_SYMBOL_GPL(ir_codes_purpletv_table);
1511
1512 /* Mapping for the 28 key remote control as seen at
1513    http://www.sednacomputer.com/photo/cardbus-tv.jpg
1514    Pavel Mihaylov <bin@bash.info>
1515    Also for the remote bundled with Kozumi KTV-01C card */
1516 static struct ir_scancode ir_codes_pctv_sedna[] = {
1517         { 0x00, KEY_0 },
1518         { 0x01, KEY_1 },
1519         { 0x02, KEY_2 },
1520         { 0x03, KEY_3 },
1521         { 0x04, KEY_4 },
1522         { 0x05, KEY_5 },
1523         { 0x06, KEY_6 },
1524         { 0x07, KEY_7 },
1525         { 0x08, KEY_8 },
1526         { 0x09, KEY_9 },
1527
1528         { 0x0a, KEY_AGAIN },    /* Recall */
1529         { 0x0b, KEY_CHANNELUP },
1530         { 0x0c, KEY_VOLUMEUP },
1531         { 0x0d, KEY_MODE },     /* Stereo */
1532         { 0x0e, KEY_STOP },
1533         { 0x0f, KEY_PREVIOUSSONG },
1534         { 0x10, KEY_ZOOM },
1535         { 0x11, KEY_TUNER },    /* Source */
1536         { 0x12, KEY_POWER },
1537         { 0x13, KEY_MUTE },
1538         { 0x15, KEY_CHANNELDOWN },
1539         { 0x18, KEY_VOLUMEDOWN },
1540         { 0x19, KEY_CAMERA },   /* Snapshot */
1541         { 0x1a, KEY_NEXTSONG },
1542         { 0x1b, KEY_TIME },     /* Time Shift */
1543         { 0x1c, KEY_RADIO },    /* FM Radio */
1544         { 0x1d, KEY_RECORD },
1545         { 0x1e, KEY_PAUSE },
1546         /* additional codes for Kozumi's remote */
1547         { 0x14, KEY_INFO },     /* OSD */
1548         { 0x16, KEY_OK },       /* OK */
1549         { 0x17, KEY_DIGITS },   /* Plus */
1550         { 0x1f, KEY_PLAY },     /* Play */
1551 };
1552
1553 struct ir_scancode_table ir_codes_pctv_sedna_table = {
1554         .scan = ir_codes_pctv_sedna,
1555         .size = ARRAY_SIZE(ir_codes_pctv_sedna),
1556 };
1557 EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna_table);
1558
1559 /* Mark Phalan <phalanm@o2.ie> */
1560 static struct ir_scancode ir_codes_pv951[] = {
1561         { 0x00, KEY_0 },
1562         { 0x01, KEY_1 },
1563         { 0x02, KEY_2 },
1564         { 0x03, KEY_3 },
1565         { 0x04, KEY_4 },
1566         { 0x05, KEY_5 },
1567         { 0x06, KEY_6 },
1568         { 0x07, KEY_7 },
1569         { 0x08, KEY_8 },
1570         { 0x09, KEY_9 },
1571
1572         { 0x12, KEY_POWER },
1573         { 0x10, KEY_MUTE },
1574         { 0x1f, KEY_VOLUMEDOWN },
1575         { 0x1b, KEY_VOLUMEUP },
1576         { 0x1a, KEY_CHANNELUP },
1577         { 0x1e, KEY_CHANNELDOWN },
1578         { 0x0e, KEY_PAGEUP },
1579         { 0x1d, KEY_PAGEDOWN },
1580         { 0x13, KEY_SOUND },
1581
1582         { 0x18, KEY_KPPLUSMINUS },      /* CH +/- */
1583         { 0x16, KEY_SUBTITLE },         /* CC */
1584         { 0x0d, KEY_TEXT },             /* TTX */
1585         { 0x0b, KEY_TV },               /* AIR/CBL */
1586         { 0x11, KEY_PC },               /* PC/TV */
1587         { 0x17, KEY_OK },               /* CH RTN */
1588         { 0x19, KEY_MODE },             /* FUNC */
1589         { 0x0c, KEY_SEARCH },           /* AUTOSCAN */
1590
1591         /* Not sure what to do with these ones! */
1592         { 0x0f, KEY_SELECT },           /* SOURCE */
1593         { 0x0a, KEY_KPPLUS },           /* +100 */
1594         { 0x14, KEY_EQUAL },            /* SYNC */
1595         { 0x1c, KEY_MEDIA },            /* PC/TV */
1596 };
1597
1598 struct ir_scancode_table ir_codes_pv951_table = {
1599         .scan = ir_codes_pv951,
1600         .size = ARRAY_SIZE(ir_codes_pv951),
1601 };
1602 EXPORT_SYMBOL_GPL(ir_codes_pv951_table);
1603
1604 /* generic RC5 keytable                                          */
1605 /* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
1606 /* used by old (black) Hauppauge remotes                         */
1607 static struct ir_scancode ir_codes_rc5_tv[] = {
1608         /* Keys 0 to 9 */
1609         { 0x00, KEY_0 },
1610         { 0x01, KEY_1 },
1611         { 0x02, KEY_2 },
1612         { 0x03, KEY_3 },
1613         { 0x04, KEY_4 },
1614         { 0x05, KEY_5 },
1615         { 0x06, KEY_6 },
1616         { 0x07, KEY_7 },
1617         { 0x08, KEY_8 },
1618         { 0x09, KEY_9 },
1619
1620         { 0x0b, KEY_CHANNEL },          /* channel / program (japan: 11) */
1621         { 0x0c, KEY_POWER },            /* standby */
1622         { 0x0d, KEY_MUTE },             /* mute / demute */
1623         { 0x0f, KEY_TV },               /* display */
1624         { 0x10, KEY_VOLUMEUP },
1625         { 0x11, KEY_VOLUMEDOWN },
1626         { 0x12, KEY_BRIGHTNESSUP },
1627         { 0x13, KEY_BRIGHTNESSDOWN },
1628         { 0x1e, KEY_SEARCH },           /* search + */
1629         { 0x20, KEY_CHANNELUP },        /* channel / program + */
1630         { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
1631         { 0x22, KEY_CHANNEL },          /* alt / channel */
1632         { 0x23, KEY_LANGUAGE },         /* 1st / 2nd language */
1633         { 0x26, KEY_SLEEP },            /* sleeptimer */
1634         { 0x2e, KEY_MENU },             /* 2nd controls (USA: menu) */
1635         { 0x30, KEY_PAUSE },
1636         { 0x32, KEY_REWIND },
1637         { 0x33, KEY_GOTO },
1638         { 0x35, KEY_PLAY },
1639         { 0x36, KEY_STOP },
1640         { 0x37, KEY_RECORD },           /* recording */
1641         { 0x3c, KEY_TEXT },             /* teletext submode (Japan: 12) */
1642         { 0x3d, KEY_SUSPEND },          /* system standby */
1643
1644 };
1645
1646 struct ir_scancode_table ir_codes_rc5_tv_table = {
1647         .scan = ir_codes_rc5_tv,
1648         .size = ARRAY_SIZE(ir_codes_rc5_tv),
1649 };
1650 EXPORT_SYMBOL_GPL(ir_codes_rc5_tv_table);
1651
1652 /* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
1653 static struct ir_scancode ir_codes_winfast[] = {
1654         /* Keys 0 to 9 */
1655         { 0x12, KEY_0 },
1656         { 0x05, KEY_1 },
1657         { 0x06, KEY_2 },
1658         { 0x07, KEY_3 },
1659         { 0x09, KEY_4 },
1660         { 0x0a, KEY_5 },
1661         { 0x0b, KEY_6 },
1662         { 0x0d, KEY_7 },
1663         { 0x0e, KEY_8 },
1664         { 0x0f, KEY_9 },
1665
1666         { 0x00, KEY_POWER },
1667         { 0x1b, KEY_AUDIO },            /* Audio Source */
1668         { 0x02, KEY_TUNER },            /* TV/FM, not on Y0400052 */
1669         { 0x1e, KEY_VIDEO },            /* Video Source */
1670         { 0x16, KEY_INFO },             /* Display information */
1671         { 0x04, KEY_VOLUMEUP },
1672         { 0x08, KEY_VOLUMEDOWN },
1673         { 0x0c, KEY_CHANNELUP },
1674         { 0x10, KEY_CHANNELDOWN },
1675         { 0x03, KEY_ZOOM },             /* fullscreen */
1676         { 0x1f, KEY_TEXT },             /* closed caption/teletext */
1677         { 0x20, KEY_SLEEP },
1678         { 0x29, KEY_CLEAR },            /* boss key */
1679         { 0x14, KEY_MUTE },
1680         { 0x2b, KEY_RED },
1681         { 0x2c, KEY_GREEN },
1682         { 0x2d, KEY_YELLOW },
1683         { 0x2e, KEY_BLUE },
1684         { 0x18, KEY_KPPLUS },           /* fine tune + , not on Y040052 */
1685         { 0x19, KEY_KPMINUS },          /* fine tune - , not on Y040052 */
1686         { 0x2a, KEY_MEDIA },            /* PIP (Picture in picture */
1687         { 0x21, KEY_DOT },
1688         { 0x13, KEY_ENTER },
1689         { 0x11, KEY_LAST },             /* Recall (last channel */
1690         { 0x22, KEY_PREVIOUS },
1691         { 0x23, KEY_PLAYPAUSE },
1692         { 0x24, KEY_NEXT },
1693         { 0x25, KEY_TIME },             /* Time Shifting */
1694         { 0x26, KEY_STOP },
1695         { 0x27, KEY_RECORD },
1696         { 0x28, KEY_SAVE },             /* Screenshot */
1697         { 0x2f, KEY_MENU },
1698         { 0x30, KEY_CANCEL },
1699         { 0x31, KEY_CHANNEL },          /* Channel Surf */
1700         { 0x32, KEY_SUBTITLE },
1701         { 0x33, KEY_LANGUAGE },
1702         { 0x34, KEY_REWIND },
1703         { 0x35, KEY_FASTFORWARD },
1704         { 0x36, KEY_TV },
1705         { 0x37, KEY_RADIO },            /* FM */
1706         { 0x38, KEY_DVD },
1707
1708         { 0x3e, KEY_F21 },              /* MCE +VOL, on Y04G0033 */
1709         { 0x3a, KEY_F22 },              /* MCE -VOL, on Y04G0033 */
1710         { 0x3b, KEY_F23 },              /* MCE +CH,  on Y04G0033 */
1711         { 0x3f, KEY_F24 }               /* MCE -CH,  on Y04G0033 */
1712 };
1713
1714 struct ir_scancode_table ir_codes_winfast_table = {
1715         .scan = ir_codes_winfast,
1716         .size = ARRAY_SIZE(ir_codes_winfast),
1717 };
1718 EXPORT_SYMBOL_GPL(ir_codes_winfast_table);
1719
1720 static struct ir_scancode ir_codes_pinnacle_color[] = {
1721         { 0x59, KEY_MUTE },
1722         { 0x4a, KEY_POWER },
1723
1724         { 0x18, KEY_TEXT },
1725         { 0x26, KEY_TV },
1726         { 0x3d, KEY_PRINT },
1727
1728         { 0x48, KEY_RED },
1729         { 0x04, KEY_GREEN },
1730         { 0x11, KEY_YELLOW },
1731         { 0x00, KEY_BLUE },
1732
1733         { 0x2d, KEY_VOLUMEUP },
1734         { 0x1e, KEY_VOLUMEDOWN },
1735
1736         { 0x49, KEY_MENU },
1737
1738         { 0x16, KEY_CHANNELUP },
1739         { 0x17, KEY_CHANNELDOWN },
1740
1741         { 0x20, KEY_UP },
1742         { 0x21, KEY_DOWN },
1743         { 0x22, KEY_LEFT },
1744         { 0x23, KEY_RIGHT },
1745         { 0x0d, KEY_SELECT },
1746
1747         { 0x08, KEY_BACK },
1748         { 0x07, KEY_REFRESH },
1749
1750         { 0x2f, KEY_ZOOM },
1751         { 0x29, KEY_RECORD },
1752
1753         { 0x4b, KEY_PAUSE },
1754         { 0x4d, KEY_REWIND },
1755         { 0x2e, KEY_PLAY },
1756         { 0x4e, KEY_FORWARD },
1757         { 0x53, KEY_PREVIOUS },
1758         { 0x4c, KEY_STOP },
1759         { 0x54, KEY_NEXT },
1760
1761         { 0x69, KEY_0 },
1762         { 0x6a, KEY_1 },
1763         { 0x6b, KEY_2 },
1764         { 0x6c, KEY_3 },
1765         { 0x6d, KEY_4 },
1766         { 0x6e, KEY_5 },
1767         { 0x6f, KEY_6 },
1768         { 0x70, KEY_7 },
1769         { 0x71, KEY_8 },
1770         { 0x72, KEY_9 },
1771
1772         { 0x74, KEY_CHANNEL },
1773         { 0x0a, KEY_BACKSPACE },
1774 };
1775
1776 struct ir_scancode_table ir_codes_pinnacle_color_table = {
1777         .scan = ir_codes_pinnacle_color,
1778         .size = ARRAY_SIZE(ir_codes_pinnacle_color),
1779 };
1780 EXPORT_SYMBOL_GPL(ir_codes_pinnacle_color_table);
1781
1782 /* Hauppauge: the newer, gray remotes (seems there are multiple
1783  * slightly different versions), shipped with cx88+ivtv cards.
1784  * almost rc5 coding, but some non-standard keys */
1785 static struct ir_scancode ir_codes_hauppauge_new[] = {
1786         /* Keys 0 to 9 */
1787         { 0x00, KEY_0 },
1788         { 0x01, KEY_1 },
1789         { 0x02, KEY_2 },
1790         { 0x03, KEY_3 },
1791         { 0x04, KEY_4 },
1792         { 0x05, KEY_5 },
1793         { 0x06, KEY_6 },
1794         { 0x07, KEY_7 },
1795         { 0x08, KEY_8 },
1796         { 0x09, KEY_9 },
1797
1798         { 0x0a, KEY_TEXT },             /* keypad asterisk as well */
1799         { 0x0b, KEY_RED },              /* red button */
1800         { 0x0c, KEY_RADIO },
1801         { 0x0d, KEY_MENU },
1802         { 0x0e, KEY_SUBTITLE },         /* also the # key */
1803         { 0x0f, KEY_MUTE },
1804         { 0x10, KEY_VOLUMEUP },
1805         { 0x11, KEY_VOLUMEDOWN },
1806         { 0x12, KEY_PREVIOUS },         /* previous channel */
1807         { 0x14, KEY_UP },
1808         { 0x15, KEY_DOWN },
1809         { 0x16, KEY_LEFT },
1810         { 0x17, KEY_RIGHT },
1811         { 0x18, KEY_VIDEO },            /* Videos */
1812         { 0x19, KEY_AUDIO },            /* Music */
1813         /* 0x1a: Pictures - presume this means
1814            "Multimedia Home Platform" -
1815            no "PICTURES" key in input.h
1816          */
1817         { 0x1a, KEY_MHP },
1818
1819         { 0x1b, KEY_EPG },              /* Guide */
1820         { 0x1c, KEY_TV },
1821         { 0x1e, KEY_NEXTSONG },         /* skip >| */
1822         { 0x1f, KEY_EXIT },             /* back/exit */
1823         { 0x20, KEY_CHANNELUP },        /* channel / program + */
1824         { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
1825         { 0x22, KEY_CHANNEL },          /* source (old black remote) */
1826         { 0x24, KEY_PREVIOUSSONG },     /* replay |< */
1827         { 0x25, KEY_ENTER },            /* OK */
1828         { 0x26, KEY_SLEEP },            /* minimize (old black remote) */
1829         { 0x29, KEY_BLUE },             /* blue key */
1830         { 0x2e, KEY_GREEN },            /* green button */
1831         { 0x30, KEY_PAUSE },            /* pause */
1832         { 0x32, KEY_REWIND },           /* backward << */
1833         { 0x34, KEY_FASTFORWARD },      /* forward >> */
1834         { 0x35, KEY_PLAY },
1835         { 0x36, KEY_STOP },
1836         { 0x37, KEY_RECORD },           /* recording */
1837         { 0x38, KEY_YELLOW },           /* yellow key */
1838         { 0x3b, KEY_SELECT },           /* top right button */
1839         { 0x3c, KEY_ZOOM },             /* full */
1840         { 0x3d, KEY_POWER },            /* system power (green button) */
1841 };
1842
1843 struct ir_scancode_table ir_codes_hauppauge_new_table = {
1844         .scan = ir_codes_hauppauge_new,
1845         .size = ARRAY_SIZE(ir_codes_hauppauge_new),
1846 };
1847 EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new_table);
1848
1849 static struct ir_scancode ir_codes_npgtech[] = {
1850         { 0x1d, KEY_SWITCHVIDEOMODE },  /* switch inputs */
1851         { 0x2a, KEY_FRONT },
1852
1853         { 0x3e, KEY_1 },
1854         { 0x02, KEY_2 },
1855         { 0x06, KEY_3 },
1856         { 0x0a, KEY_4 },
1857         { 0x0e, KEY_5 },
1858         { 0x12, KEY_6 },
1859         { 0x16, KEY_7 },
1860         { 0x1a, KEY_8 },
1861         { 0x1e, KEY_9 },
1862         { 0x3a, KEY_0 },
1863         { 0x22, KEY_NUMLOCK },          /* -/-- */
1864         { 0x20, KEY_REFRESH },
1865
1866         { 0x03, KEY_BRIGHTNESSDOWN },
1867         { 0x28, KEY_AUDIO },
1868         { 0x3c, KEY_CHANNELUP },
1869         { 0x3f, KEY_VOLUMEDOWN },
1870         { 0x2e, KEY_MUTE },
1871         { 0x3b, KEY_VOLUMEUP },
1872         { 0x00, KEY_CHANNELDOWN },
1873         { 0x07, KEY_BRIGHTNESSUP },
1874         { 0x2c, KEY_TEXT },
1875
1876         { 0x37, KEY_RECORD },
1877         { 0x17, KEY_PLAY },
1878         { 0x13, KEY_PAUSE },
1879         { 0x26, KEY_STOP },
1880         { 0x18, KEY_FASTFORWARD },
1881         { 0x14, KEY_REWIND },
1882         { 0x33, KEY_ZOOM },
1883         { 0x32, KEY_KEYBOARD },
1884         { 0x30, KEY_GOTO },             /* Pointing arrow */
1885         { 0x36, KEY_MACRO },            /* Maximize/Minimize (yellow) */
1886         { 0x0b, KEY_RADIO },
1887         { 0x10, KEY_POWER },
1888
1889 };
1890
1891 struct ir_scancode_table ir_codes_npgtech_table = {
1892         .scan = ir_codes_npgtech,
1893         .size = ARRAY_SIZE(ir_codes_npgtech),
1894 };
1895 EXPORT_SYMBOL_GPL(ir_codes_npgtech_table);
1896
1897 /* Norwood Micro (non-Pro) TV Tuner
1898    By Peter Naulls <peter@chocky.org>
1899    Key comments are the functions given in the manual */
1900 static struct ir_scancode ir_codes_norwood[] = {
1901         /* Keys 0 to 9 */
1902         { 0x20, KEY_0 },
1903         { 0x21, KEY_1 },
1904         { 0x22, KEY_2 },
1905         { 0x23, KEY_3 },
1906         { 0x24, KEY_4 },
1907         { 0x25, KEY_5 },
1908         { 0x26, KEY_6 },
1909         { 0x27, KEY_7 },
1910         { 0x28, KEY_8 },
1911         { 0x29, KEY_9 },
1912
1913         { 0x78, KEY_TUNER },            /* Video Source        */
1914         { 0x2c, KEY_EXIT },             /* Open/Close software */
1915         { 0x2a, KEY_SELECT },           /* 2 Digit Select      */
1916         { 0x69, KEY_AGAIN },            /* Recall              */
1917
1918         { 0x32, KEY_BRIGHTNESSUP },     /* Brightness increase */
1919         { 0x33, KEY_BRIGHTNESSDOWN },   /* Brightness decrease */
1920         { 0x6b, KEY_KPPLUS },           /* (not named >>>>>)   */
1921         { 0x6c, KEY_KPMINUS },          /* (not named <<<<<)   */
1922
1923         { 0x2d, KEY_MUTE },             /* Mute                */
1924         { 0x30, KEY_VOLUMEUP },         /* Volume up           */
1925         { 0x31, KEY_VOLUMEDOWN },       /* Volume down         */
1926         { 0x60, KEY_CHANNELUP },        /* Channel up          */
1927         { 0x61, KEY_CHANNELDOWN },      /* Channel down        */
1928
1929         { 0x3f, KEY_RECORD },           /* Record              */
1930         { 0x37, KEY_PLAY },             /* Play                */
1931         { 0x36, KEY_PAUSE },            /* Pause               */
1932         { 0x2b, KEY_STOP },             /* Stop                */
1933         { 0x67, KEY_FASTFORWARD },      /* Foward              */
1934         { 0x66, KEY_REWIND },           /* Rewind              */
1935         { 0x3e, KEY_SEARCH },           /* Auto Scan           */
1936         { 0x2e, KEY_CAMERA },           /* Capture Video       */
1937         { 0x6d, KEY_MENU },             /* Show/Hide Control   */
1938         { 0x2f, KEY_ZOOM },             /* Full Screen         */
1939         { 0x34, KEY_RADIO },            /* FM                  */
1940         { 0x65, KEY_POWER },            /* Computer power      */
1941 };
1942
1943 struct ir_scancode_table ir_codes_norwood_table = {
1944         .scan = ir_codes_norwood,
1945         .size = ARRAY_SIZE(ir_codes_norwood),
1946 };
1947 EXPORT_SYMBOL_GPL(ir_codes_norwood_table);
1948
1949 /* From reading the following remotes:
1950  * Zenith Universal 7 / TV Mode 807 / VCR Mode 837
1951  * Hauppauge (from NOVA-CI-s box product)
1952  * This is a "middle of the road" approach, differences are noted
1953  */
1954 static struct ir_scancode ir_codes_budget_ci_old[] = {
1955         { 0x00, KEY_0 },
1956         { 0x01, KEY_1 },
1957         { 0x02, KEY_2 },
1958         { 0x03, KEY_3 },
1959         { 0x04, KEY_4 },
1960         { 0x05, KEY_5 },
1961         { 0x06, KEY_6 },
1962         { 0x07, KEY_7 },
1963         { 0x08, KEY_8 },
1964         { 0x09, KEY_9 },
1965         { 0x0a, KEY_ENTER },
1966         { 0x0b, KEY_RED },
1967         { 0x0c, KEY_POWER },            /* RADIO on Hauppauge */
1968         { 0x0d, KEY_MUTE },
1969         { 0x0f, KEY_A },                /* TV on Hauppauge */
1970         { 0x10, KEY_VOLUMEUP },
1971         { 0x11, KEY_VOLUMEDOWN },
1972         { 0x14, KEY_B },
1973         { 0x1c, KEY_UP },
1974         { 0x1d, KEY_DOWN },
1975         { 0x1e, KEY_OPTION },           /* RESERVED on Hauppauge */
1976         { 0x1f, KEY_BREAK },
1977         { 0x20, KEY_CHANNELUP },
1978         { 0x21, KEY_CHANNELDOWN },
1979         { 0x22, KEY_PREVIOUS },         /* Prev Ch on Zenith, SOURCE on Hauppauge */
1980         { 0x24, KEY_RESTART },
1981         { 0x25, KEY_OK },
1982         { 0x26, KEY_CYCLEWINDOWS },     /* MINIMIZE on Hauppauge */
1983         { 0x28, KEY_ENTER },            /* VCR mode on Zenith */
1984         { 0x29, KEY_PAUSE },
1985         { 0x2b, KEY_RIGHT },
1986         { 0x2c, KEY_LEFT },
1987         { 0x2e, KEY_MENU },             /* FULL SCREEN on Hauppauge */
1988         { 0x30, KEY_SLOW },
1989         { 0x31, KEY_PREVIOUS },         /* VCR mode on Zenith */
1990         { 0x32, KEY_REWIND },
1991         { 0x34, KEY_FASTFORWARD },
1992         { 0x35, KEY_PLAY },
1993         { 0x36, KEY_STOP },
1994         { 0x37, KEY_RECORD },
1995         { 0x38, KEY_TUNER },            /* TV/VCR on Zenith */
1996         { 0x3a, KEY_C },
1997         { 0x3c, KEY_EXIT },
1998         { 0x3d, KEY_POWER2 },
1999         { 0x3e, KEY_TUNER },
2000 };
2001
2002 struct ir_scancode_table ir_codes_budget_ci_old_table = {
2003         .scan = ir_codes_budget_ci_old,
2004         .size = ARRAY_SIZE(ir_codes_budget_ci_old),
2005 };
2006 EXPORT_SYMBOL_GPL(ir_codes_budget_ci_old_table);
2007
2008 /*
2009  * Marc Fargas <telenieko@telenieko.com>
2010  * this is the remote control that comes with the asus p7131
2011  * which has a label saying is "Model PC-39"
2012  */
2013 static struct ir_scancode ir_codes_asus_pc39[] = {
2014         /* Keys 0 to 9 */
2015         { 0x15, KEY_0 },
2016         { 0x29, KEY_1 },
2017         { 0x2d, KEY_2 },
2018         { 0x2b, KEY_3 },
2019         { 0x09, KEY_4 },
2020         { 0x0d, KEY_5 },
2021         { 0x0b, KEY_6 },
2022         { 0x31, KEY_7 },
2023         { 0x35, KEY_8 },
2024         { 0x33, KEY_9 },
2025
2026         { 0x3e, KEY_RADIO },            /* radio */
2027         { 0x03, KEY_MENU },             /* dvd/menu */
2028         { 0x2a, KEY_VOLUMEUP },
2029         { 0x19, KEY_VOLUMEDOWN },
2030         { 0x37, KEY_UP },
2031         { 0x3b, KEY_DOWN },
2032         { 0x27, KEY_LEFT },
2033         { 0x2f, KEY_RIGHT },
2034         { 0x25, KEY_VIDEO },            /* video */
2035         { 0x39, KEY_AUDIO },            /* music */
2036
2037         { 0x21, KEY_TV },               /* tv */
2038         { 0x1d, KEY_EXIT },             /* back */
2039         { 0x0a, KEY_CHANNELUP },        /* channel / program + */
2040         { 0x1b, KEY_CHANNELDOWN },      /* channel / program - */
2041         { 0x1a, KEY_ENTER },            /* enter */
2042
2043         { 0x06, KEY_PAUSE },            /* play/pause */
2044         { 0x1e, KEY_PREVIOUS },         /* rew */
2045         { 0x26, KEY_NEXT },             /* forward */
2046         { 0x0e, KEY_REWIND },           /* backward << */
2047         { 0x3a, KEY_FASTFORWARD },      /* forward >> */
2048         { 0x36, KEY_STOP },
2049         { 0x2e, KEY_RECORD },           /* recording */
2050         { 0x16, KEY_POWER },            /* the button that reads "close" */
2051
2052         { 0x11, KEY_ZOOM },             /* full screen */
2053         { 0x13, KEY_MACRO },            /* recall */
2054         { 0x23, KEY_HOME },             /* home */
2055         { 0x05, KEY_PVR },              /* picture */
2056         { 0x3d, KEY_MUTE },             /* mute */
2057         { 0x01, KEY_DVD },              /* dvd */
2058 };
2059
2060 struct ir_scancode_table ir_codes_asus_pc39_table = {
2061         .scan = ir_codes_asus_pc39,
2062         .size = ARRAY_SIZE(ir_codes_asus_pc39),
2063 };
2064 EXPORT_SYMBOL_GPL(ir_codes_asus_pc39_table);
2065
2066
2067 /* Encore ENLTV-FM  - black plastic, white front cover with white glowing buttons
2068     Juan Pablo Sormani <sorman@gmail.com> */
2069 static struct ir_scancode ir_codes_encore_enltv[] = {
2070
2071         /* Power button does nothing, neither in Windows app,
2072          although it sends data (used for BIOS wakeup?) */
2073         { 0x0d, KEY_MUTE },
2074
2075         { 0x1e, KEY_TV },
2076         { 0x00, KEY_VIDEO },
2077         { 0x01, KEY_AUDIO },            /* music */
2078         { 0x02, KEY_MHP },              /* picture */
2079
2080         { 0x1f, KEY_1 },
2081         { 0x03, KEY_2 },
2082         { 0x04, KEY_3 },
2083         { 0x05, KEY_4 },
2084         { 0x1c, KEY_5 },
2085         { 0x06, KEY_6 },
2086         { 0x07, KEY_7 },
2087         { 0x08, KEY_8 },
2088         { 0x1d, KEY_9 },
2089         { 0x0a, KEY_0 },
2090
2091         { 0x09, KEY_LIST },             /* -/-- */
2092         { 0x0b, KEY_LAST },             /* recall */
2093
2094         { 0x14, KEY_HOME },             /* win start menu */
2095         { 0x15, KEY_EXIT },             /* exit */
2096         { 0x16, KEY_CHANNELUP },        /* UP */
2097         { 0x12, KEY_CHANNELDOWN },      /* DOWN */
2098         { 0x0c, KEY_VOLUMEUP },         /* RIGHT */
2099         { 0x17, KEY_VOLUMEDOWN },       /* LEFT */
2100
2101         { 0x18, KEY_ENTER },            /* OK */
2102
2103         { 0x0e, KEY_ESC },
2104         { 0x13, KEY_CYCLEWINDOWS },     /* desktop */
2105         { 0x11, KEY_TAB },
2106         { 0x19, KEY_SWITCHVIDEOMODE },  /* switch */
2107
2108         { 0x1a, KEY_MENU },
2109         { 0x1b, KEY_ZOOM },             /* fullscreen */
2110         { 0x44, KEY_TIME },             /* time shift */
2111         { 0x40, KEY_MODE },             /* source */
2112
2113         { 0x5a, KEY_RECORD },
2114         { 0x42, KEY_PLAY },             /* play/pause */
2115         { 0x45, KEY_STOP },
2116         { 0x43, KEY_CAMERA },           /* camera icon */
2117
2118         { 0x48, KEY_REWIND },
2119         { 0x4a, KEY_FASTFORWARD },
2120         { 0x49, KEY_PREVIOUS },
2121         { 0x4b, KEY_NEXT },
2122
2123         { 0x4c, KEY_FAVORITES },        /* tv wall */
2124         { 0x4d, KEY_SOUND },            /* DVD sound */
2125         { 0x4e, KEY_LANGUAGE },         /* DVD lang */
2126         { 0x4f, KEY_TEXT },             /* DVD text */
2127
2128         { 0x50, KEY_SLEEP },            /* shutdown */
2129         { 0x51, KEY_MODE },             /* stereo > main */
2130         { 0x52, KEY_SELECT },           /* stereo > sap */
2131         { 0x53, KEY_PROG1 },            /* teletext */
2132
2133
2134         { 0x59, KEY_RED },              /* AP1 */
2135         { 0x41, KEY_GREEN },            /* AP2 */
2136         { 0x47, KEY_YELLOW },           /* AP3 */
2137         { 0x57, KEY_BLUE },             /* AP4 */
2138 };
2139
2140 struct ir_scancode_table ir_codes_encore_enltv_table = {
2141         .scan = ir_codes_encore_enltv,
2142         .size = ARRAY_SIZE(ir_codes_encore_enltv),
2143 };
2144 EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_table);
2145
2146 /* Encore ENLTV2-FM  - silver plastic - "Wand Media" written at the botton
2147     Mauro Carvalho Chehab <mchehab@infradead.org> */
2148 static struct ir_scancode ir_codes_encore_enltv2[] = {
2149         { 0x4c, KEY_POWER2 },
2150         { 0x4a, KEY_TUNER },
2151         { 0x40, KEY_1 },
2152         { 0x60, KEY_2 },
2153         { 0x50, KEY_3 },
2154         { 0x70, KEY_4 },
2155         { 0x48, KEY_5 },
2156         { 0x68, KEY_6 },
2157         { 0x58, KEY_7 },
2158         { 0x78, KEY_8 },
2159         { 0x44, KEY_9 },
2160         { 0x54, KEY_0 },
2161
2162         { 0x64, KEY_LAST },             /* +100 */
2163         { 0x4e, KEY_AGAIN },            /* Recall */
2164
2165         { 0x6c, KEY_SWITCHVIDEOMODE },  /* Video Source */
2166         { 0x5e, KEY_MENU },
2167         { 0x56, KEY_SCREEN },
2168         { 0x7a, KEY_SETUP },
2169
2170         { 0x46, KEY_MUTE },
2171         { 0x5c, KEY_MODE },             /* Stereo */
2172         { 0x74, KEY_INFO },
2173         { 0x7c, KEY_CLEAR },
2174
2175         { 0x55, KEY_UP },
2176         { 0x49, KEY_DOWN },
2177         { 0x7e, KEY_LEFT },
2178         { 0x59, KEY_RIGHT },
2179         { 0x6a, KEY_ENTER },
2180
2181         { 0x42, KEY_VOLUMEUP },
2182         { 0x62, KEY_VOLUMEDOWN },
2183         { 0x52, KEY_CHANNELUP },
2184         { 0x72, KEY_CHANNELDOWN },
2185
2186         { 0x41, KEY_RECORD },
2187         { 0x51, KEY_CAMERA },           /* Snapshot */
2188         { 0x75, KEY_TIME },             /* Timeshift */
2189         { 0x71, KEY_TV2 },              /* PIP */
2190
2191         { 0x45, KEY_REWIND },
2192         { 0x6f, KEY_PAUSE },
2193         { 0x7d, KEY_FORWARD },
2194         { 0x79, KEY_STOP },
2195 };
2196
2197 struct ir_scancode_table ir_codes_encore_enltv2_table = {
2198         .scan = ir_codes_encore_enltv2,
2199         .size = ARRAY_SIZE(ir_codes_encore_enltv2),
2200 };
2201 EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2_table);
2202
2203 /* for the Technotrend 1500 bundled remotes (grey and black): */
2204 static struct ir_scancode ir_codes_tt_1500[] = {
2205         { 0x01, KEY_POWER },
2206         { 0x02, KEY_SHUFFLE },          /* ? double-arrow key */
2207         { 0x03, KEY_1 },
2208         { 0x04, KEY_2 },
2209         { 0x05, KEY_3 },
2210         { 0x06, KEY_4 },
2211         { 0x07, KEY_5 },
2212         { 0x08, KEY_6 },
2213         { 0x09, KEY_7 },
2214         { 0x0a, KEY_8 },
2215         { 0x0b, KEY_9 },
2216         { 0x0c, KEY_0 },
2217         { 0x0d, KEY_UP },
2218         { 0x0e, KEY_LEFT },
2219         { 0x0f, KEY_OK },
2220         { 0x10, KEY_RIGHT },
2221         { 0x11, KEY_DOWN },
2222         { 0x12, KEY_INFO },
2223         { 0x13, KEY_EXIT },
2224         { 0x14, KEY_RED },
2225         { 0x15, KEY_GREEN },
2226         { 0x16, KEY_YELLOW },
2227         { 0x17, KEY_BLUE },
2228         { 0x18, KEY_MUTE },
2229         { 0x19, KEY_TEXT },
2230         { 0x1a, KEY_MODE },             /* ? TV/Radio */
2231         { 0x21, KEY_OPTION },
2232         { 0x22, KEY_EPG },
2233         { 0x23, KEY_CHANNELUP },
2234         { 0x24, KEY_CHANNELDOWN },
2235         { 0x25, KEY_VOLUMEUP },
2236         { 0x26, KEY_VOLUMEDOWN },
2237         { 0x27, KEY_SETUP },
2238         { 0x3a, KEY_RECORD },           /* these keys are only in the black remote */
2239         { 0x3b, KEY_PLAY },
2240         { 0x3c, KEY_STOP },
2241         { 0x3d, KEY_REWIND },
2242         { 0x3e, KEY_PAUSE },
2243         { 0x3f, KEY_FORWARD },
2244 };
2245
2246 struct ir_scancode_table ir_codes_tt_1500_table = {
2247         .scan = ir_codes_tt_1500,
2248         .size = ARRAY_SIZE(ir_codes_tt_1500),
2249 };
2250 EXPORT_SYMBOL_GPL(ir_codes_tt_1500_table);
2251
2252 /* DViCO FUSION HDTV MCE remote */
2253 static struct ir_scancode ir_codes_fusionhdtv_mce[] = {
2254
2255         { 0x0b, KEY_1 },
2256         { 0x17, KEY_2 },
2257         { 0x1b, KEY_3 },
2258         { 0x07, KEY_4 },
2259         { 0x50, KEY_5 },
2260         { 0x54, KEY_6 },
2261         { 0x48, KEY_7 },
2262         { 0x4c, KEY_8 },
2263         { 0x58, KEY_9 },
2264         { 0x03, KEY_0 },
2265
2266         { 0x5e, KEY_OK },
2267         { 0x51, KEY_UP },
2268         { 0x53, KEY_DOWN },
2269         { 0x5b, KEY_LEFT },
2270         { 0x5f, KEY_RIGHT },
2271
2272         { 0x02, KEY_TV },               /* Labeled DTV on remote */
2273         { 0x0e, KEY_MP3 },
2274         { 0x1a, KEY_DVD },
2275         { 0x1e, KEY_FAVORITES },        /* Labeled CPF on remote */
2276         { 0x16, KEY_SETUP },
2277         { 0x46, KEY_POWER2 },           /* TV On/Off button on remote */
2278         { 0x0a, KEY_EPG },              /* Labeled Guide on remote */
2279
2280         { 0x49, KEY_BACK },
2281         { 0x59, KEY_INFO },             /* Labeled MORE on remote */
2282         { 0x4d, KEY_MENU },             /* Labeled DVDMENU on remote */
2283         { 0x55, KEY_CYCLEWINDOWS },     /* Labeled ALT-TAB on remote */
2284
2285         { 0x0f, KEY_PREVIOUSSONG },     /* Labeled |<< REPLAY on remote */
2286         { 0x12, KEY_NEXTSONG },         /* Labeled >>| SKIP on remote */
2287         { 0x42, KEY_ENTER },            /* Labeled START with a green
2288                                            MS windows logo on remote */
2289
2290         { 0x15, KEY_VOLUMEUP },
2291         { 0x05, KEY_VOLUMEDOWN },
2292         { 0x11, KEY_CHANNELUP },
2293         { 0x09, KEY_CHANNELDOWN },
2294
2295         { 0x52, KEY_CAMERA },
2296         { 0x5a, KEY_TUNER },
2297         { 0x19, KEY_OPEN },
2298
2299         { 0x13, KEY_MODE },             /* 4:3 16:9 select */
2300         { 0x1f, KEY_ZOOM },
2301
2302         { 0x43, KEY_REWIND },
2303         { 0x47, KEY_PLAYPAUSE },
2304         { 0x4f, KEY_FASTFORWARD },
2305         { 0x57, KEY_MUTE },
2306         { 0x0d, KEY_STOP },
2307         { 0x01, KEY_RECORD },
2308         { 0x4e, KEY_POWER },
2309 };
2310
2311 struct ir_scancode_table ir_codes_fusionhdtv_mce_table = {
2312         .scan = ir_codes_fusionhdtv_mce,
2313         .size = ARRAY_SIZE(ir_codes_fusionhdtv_mce),
2314 };
2315 EXPORT_SYMBOL_GPL(ir_codes_fusionhdtv_mce_table);
2316
2317 /* Pinnacle PCTV HD 800i mini remote */
2318 static struct ir_scancode ir_codes_pinnacle_pctv_hd[] = {
2319
2320         { 0x0f, KEY_1 },
2321         { 0x15, KEY_2 },
2322         { 0x10, KEY_3 },
2323         { 0x18, KEY_4 },
2324         { 0x1b, KEY_5 },
2325         { 0x1e, KEY_6 },
2326         { 0x11, KEY_7 },
2327         { 0x21, KEY_8 },
2328         { 0x12, KEY_9 },
2329         { 0x27, KEY_0 },
2330
2331         { 0x24, KEY_ZOOM },
2332         { 0x2a, KEY_SUBTITLE },
2333
2334         { 0x00, KEY_MUTE },
2335         { 0x01, KEY_ENTER },    /* Pinnacle Logo */
2336         { 0x39, KEY_POWER },
2337
2338         { 0x03, KEY_VOLUMEUP },
2339         { 0x09, KEY_VOLUMEDOWN },
2340         { 0x06, KEY_CHANNELUP },
2341         { 0x0c, KEY_CHANNELDOWN },
2342
2343         { 0x2d, KEY_REWIND },
2344         { 0x30, KEY_PLAYPAUSE },
2345         { 0x33, KEY_FASTFORWARD },
2346         { 0x3c, KEY_STOP },
2347         { 0x36, KEY_RECORD },
2348         { 0x3f, KEY_EPG },      /* Labeled "?" */
2349 };
2350
2351 struct ir_scancode_table ir_codes_pinnacle_pctv_hd_table = {
2352         .scan = ir_codes_pinnacle_pctv_hd,
2353         .size = ARRAY_SIZE(ir_codes_pinnacle_pctv_hd),
2354 };
2355 EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd_table);
2356
2357 /*
2358  * Igor Kuznetsov <igk72@ya.ru>
2359  * Andrey J. Melnikov <temnota@kmv.ru>
2360  *
2361  * Keytable is used by BeholdTV 60x series, M6 series at
2362  * least, and probably other cards too.
2363  * The "ascii-art picture" below (in comments, first row
2364  * is the keycode in hex, and subsequent row(s) shows
2365  * the button labels (several variants when appropriate)
2366  * helps to descide which keycodes to assign to the buttons.
2367  */
2368 static struct ir_scancode ir_codes_behold[] = {
2369
2370         /*  0x1c            0x12  *
2371          *  TV/FM          POWER  *
2372          *                        */
2373         { 0x1c, KEY_TUNER },    /* XXX KEY_TV / KEY_RADIO */
2374         { 0x12, KEY_POWER },
2375
2376         /*  0x01    0x02    0x03  *
2377          *   1       2       3    *
2378          *                        *
2379          *  0x04    0x05    0x06  *
2380          *   4       5       6    *
2381          *                        *
2382          *  0x07    0x08    0x09  *
2383          *   7       8       9    *
2384          *                        */
2385         { 0x01, KEY_1 },
2386         { 0x02, KEY_2 },
2387         { 0x03, KEY_3 },
2388         { 0x04, KEY_4 },
2389         { 0x05, KEY_5 },
2390         { 0x06, KEY_6 },
2391         { 0x07, KEY_7 },
2392         { 0x08, KEY_8 },
2393         { 0x09, KEY_9 },
2394
2395         /*  0x0a    0x00    0x17  *
2396          * RECALL    0      MODE  *
2397          *                        */
2398         { 0x0a, KEY_AGAIN },
2399         { 0x00, KEY_0 },
2400         { 0x17, KEY_MODE },
2401
2402         /*  0x14          0x10    *
2403          * ASPECT      FULLSCREEN *
2404          *                        */
2405         { 0x14, KEY_SCREEN },
2406         { 0x10, KEY_ZOOM },
2407
2408         /*          0x0b          *
2409          *           Up           *
2410          *                        *
2411          *  0x18    0x16    0x0c  *
2412          *  Left     Ok     Right *
2413          *                        *
2414          *         0x015          *
2415          *         Down           *
2416          *                        */
2417         { 0x0b, KEY_CHANNELUP },
2418         { 0x18, KEY_VOLUMEDOWN },
2419         { 0x16, KEY_OK },               /* XXX KEY_ENTER */
2420         { 0x0c, KEY_VOLUMEUP },
2421         { 0x15, KEY_CHANNELDOWN },
2422
2423         /*  0x11            0x0d  *
2424          *  MUTE            INFO  *
2425          *                        */
2426         { 0x11, KEY_MUTE },
2427         { 0x0d, KEY_INFO },
2428
2429         /*  0x0f    0x1b    0x1a  *
2430          * RECORD PLAY/PAUSE STOP *
2431          *                        *
2432          *  0x0e    0x1f    0x1e  *
2433          *TELETEXT  AUDIO  SOURCE *
2434          *           RED   YELLOW *
2435          *                        */
2436         { 0x0f, KEY_RECORD },
2437         { 0x1b, KEY_PLAYPAUSE },
2438         { 0x1a, KEY_STOP },
2439         { 0x0e, KEY_TEXT },
2440         { 0x1f, KEY_RED },      /*XXX KEY_AUDIO */
2441         { 0x1e, KEY_YELLOW },   /*XXX KEY_SOURCE        */
2442
2443         /*  0x1d   0x13     0x19  *
2444          * SLEEP  PREVIEW   DVB   *
2445          *         GREEN    BLUE  *
2446          *                        */
2447         { 0x1d, KEY_SLEEP },
2448         { 0x13, KEY_GREEN },
2449         { 0x19, KEY_BLUE },     /* XXX KEY_SAT  */
2450
2451         /*  0x58           0x5c   *
2452          * FREEZE        SNAPSHOT *
2453          *                        */
2454         { 0x58, KEY_SLOW },
2455         { 0x5c, KEY_CAMERA },
2456
2457 };
2458
2459 struct ir_scancode_table ir_codes_behold_table = {
2460         .scan = ir_codes_behold,
2461         .size = ARRAY_SIZE(ir_codes_behold),
2462 };
2463 EXPORT_SYMBOL_GPL(ir_codes_behold_table);
2464
2465 /* Beholder Intl. Ltd. 2008
2466  * Dmitry Belimov d.belimov@google.com
2467  * Keytable is used by BeholdTV Columbus
2468  * The "ascii-art picture" below (in comments, first row
2469  * is the keycode in hex, and subsequent row(s) shows
2470  * the button labels (several variants when appropriate)
2471  * helps to descide which keycodes to assign to the buttons.
2472  */
2473 static struct ir_scancode ir_codes_behold_columbus[] = {
2474
2475         /*  0x13   0x11   0x1C   0x12  *
2476          *  Mute  Source  TV/FM  Power *
2477          *                             */
2478
2479         { 0x13, KEY_MUTE },
2480         { 0x11, KEY_PROPS },
2481         { 0x1C, KEY_TUNER },    /* KEY_TV/KEY_RADIO     */
2482         { 0x12, KEY_POWER },
2483
2484         /*  0x01    0x02    0x03  0x0D    *
2485          *   1       2       3   Stereo   *
2486          *                                *
2487          *  0x04    0x05    0x06  0x19    *
2488          *   4       5       6   Snapshot *
2489          *                                *
2490          *  0x07    0x08    0x09  0x10    *
2491          *   7       8       9    Zoom    *
2492          *                                */
2493         { 0x01, KEY_1 },
2494         { 0x02, KEY_2 },
2495         { 0x03, KEY_3 },
2496         { 0x0D, KEY_SETUP },      /* Setup key */
2497         { 0x04, KEY_4 },
2498         { 0x05, KEY_5 },
2499         { 0x06, KEY_6 },
2500         { 0x19, KEY_CAMERA },   /* Snapshot key */
2501         { 0x07, KEY_7 },
2502         { 0x08, KEY_8 },
2503         { 0x09, KEY_9 },
2504         { 0x10, KEY_ZOOM },
2505
2506         /*  0x0A    0x00    0x0B       0x0C   *
2507          * RECALL    0    ChannelUp  VolumeUp *
2508          *                                    */
2509         { 0x0A, KEY_AGAIN },
2510         { 0x00, KEY_0 },
2511         { 0x0B, KEY_CHANNELUP },
2512         { 0x0C, KEY_VOLUMEUP },
2513
2514         /*   0x1B      0x1D      0x15        0x18     *
2515          * Timeshift  Record  ChannelDown  VolumeDown *
2516          *                                            */
2517
2518         { 0x1B, KEY_TIME },
2519         { 0x1D, KEY_RECORD },
2520         { 0x15, KEY_CHANNELDOWN },
2521         { 0x18, KEY_VOLUMEDOWN },
2522
2523         /*   0x0E   0x1E     0x0F     0x1A  *
2524          *   Stop   Pause  Previouse  Next  *
2525          *                                  */
2526
2527         { 0x0E, KEY_STOP },
2528         { 0x1E, KEY_PAUSE },
2529         { 0x0F, KEY_PREVIOUS },
2530         { 0x1A, KEY_NEXT },
2531
2532 };
2533
2534 struct ir_scancode_table ir_codes_behold_columbus_table = {
2535         .scan = ir_codes_behold_columbus,
2536         .size = ARRAY_SIZE(ir_codes_behold_columbus),
2537 };
2538 EXPORT_SYMBOL_GPL(ir_codes_behold_columbus_table);
2539
2540 /*
2541  * Remote control for the Genius TVGO A11MCE
2542  * Adrian Pardini <pardo.bsso@gmail.com>
2543  */
2544 static struct ir_scancode ir_codes_genius_tvgo_a11mce[] = {
2545         /* Keys 0 to 9 */
2546         { 0x48, KEY_0 },
2547         { 0x09, KEY_1 },
2548         { 0x1d, KEY_2 },
2549         { 0x1f, KEY_3 },
2550         { 0x19, KEY_4 },
2551         { 0x1b, KEY_5 },
2552         { 0x11, KEY_6 },
2553         { 0x17, KEY_7 },
2554         { 0x12, KEY_8 },
2555         { 0x16, KEY_9 },
2556
2557         { 0x54, KEY_RECORD },           /* recording */
2558         { 0x06, KEY_MUTE },             /* mute */
2559         { 0x10, KEY_POWER },
2560         { 0x40, KEY_LAST },             /* recall */
2561         { 0x4c, KEY_CHANNELUP },        /* channel / program + */
2562         { 0x00, KEY_CHANNELDOWN },      /* channel / program - */
2563         { 0x0d, KEY_VOLUMEUP },
2564         { 0x15, KEY_VOLUMEDOWN },
2565         { 0x4d, KEY_OK },               /* also labeled as Pause */
2566         { 0x1c, KEY_ZOOM },             /* full screen and Stop*/
2567         { 0x02, KEY_MODE },             /* AV Source or Rewind*/
2568         { 0x04, KEY_LIST },             /* -/-- */
2569         /* small arrows above numbers */
2570         { 0x1a, KEY_NEXT },             /* also Fast Forward */
2571         { 0x0e, KEY_PREVIOUS },         /* also Rewind */
2572         /* these are in a rather non standard layout and have
2573         an alternate name written */
2574         { 0x1e, KEY_UP },               /* Video Setting */
2575         { 0x0a, KEY_DOWN },             /* Video Default */
2576         { 0x05, KEY_CAMERA },           /* Snapshot */
2577         { 0x0c, KEY_RIGHT },            /* Hide Panel */
2578         /* Four buttons without label */
2579         { 0x49, KEY_RED },
2580         { 0x0b, KEY_GREEN },
2581         { 0x13, KEY_YELLOW },
2582         { 0x50, KEY_BLUE },
2583 };
2584
2585 struct ir_scancode_table ir_codes_genius_tvgo_a11mce_table = {
2586         .scan = ir_codes_genius_tvgo_a11mce,
2587         .size = ARRAY_SIZE(ir_codes_genius_tvgo_a11mce),
2588 };
2589 EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce_table);
2590
2591 /*
2592  * Remote control for Powercolor Real Angel 330
2593  * Daniel Fraga <fragabr@gmail.com>
2594  */
2595 static struct ir_scancode ir_codes_powercolor_real_angel[] = {
2596         { 0x38, KEY_SWITCHVIDEOMODE },  /* switch inputs */
2597         { 0x0c, KEY_MEDIA },            /* Turn ON/OFF App */
2598         { 0x00, KEY_0 },
2599         { 0x01, KEY_1 },
2600         { 0x02, KEY_2 },
2601         { 0x03, KEY_3 },
2602         { 0x04, KEY_4 },
2603         { 0x05, KEY_5 },
2604         { 0x06, KEY_6 },
2605         { 0x07, KEY_7 },
2606         { 0x08, KEY_8 },
2607         { 0x09, KEY_9 },
2608         { 0x0a, KEY_DIGITS },           /* single, double, tripple digit */
2609         { 0x29, KEY_PREVIOUS },         /* previous channel */
2610         { 0x12, KEY_BRIGHTNESSUP },
2611         { 0x13, KEY_BRIGHTNESSDOWN },
2612         { 0x2b, KEY_MODE },             /* stereo/mono */
2613         { 0x2c, KEY_TEXT },             /* teletext */
2614         { 0x20, KEY_CHANNELUP },        /* channel up */
2615         { 0x21, KEY_CHANNELDOWN },      /* channel down */
2616         { 0x10, KEY_VOLUMEUP },         /* volume up */
2617         { 0x11, KEY_VOLUMEDOWN },       /* volume down */
2618         { 0x0d, KEY_MUTE },
2619         { 0x1f, KEY_RECORD },
2620         { 0x17, KEY_PLAY },
2621         { 0x16, KEY_PAUSE },
2622         { 0x0b, KEY_STOP },
2623         { 0x27, KEY_FASTFORWARD },
2624         { 0x26, KEY_REWIND },
2625         { 0x1e, KEY_SEARCH },           /* autoscan */
2626         { 0x0e, KEY_CAMERA },           /* snapshot */
2627         { 0x2d, KEY_SETUP },
2628         { 0x0f, KEY_SCREEN },           /* full screen */
2629         { 0x14, KEY_RADIO },            /* FM radio */
2630         { 0x25, KEY_POWER },            /* power */
2631 };
2632
2633 struct ir_scancode_table ir_codes_powercolor_real_angel_table = {
2634         .scan = ir_codes_powercolor_real_angel,
2635         .size = ARRAY_SIZE(ir_codes_powercolor_real_angel),
2636 };
2637 EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel_table);
2638
2639 /* Kworld Plus TV Analog Lite PCI IR
2640    Mauro Carvalho Chehab <mchehab@infradead.org>
2641  */
2642 static struct ir_scancode ir_codes_kworld_plus_tv_analog[] = {
2643         { 0x0c, KEY_PROG1 },            /* Kworld key */
2644         { 0x16, KEY_CLOSECD },          /* -> ) */
2645         { 0x1d, KEY_POWER2 },
2646
2647         { 0x00, KEY_1 },
2648         { 0x01, KEY_2 },
2649         { 0x02, KEY_3 },                /* Two keys have the same code: 3 and left */
2650         { 0x03, KEY_4 },                /* Two keys have the same code: 3 and right */
2651         { 0x04, KEY_5 },
2652         { 0x05, KEY_6 },
2653         { 0x06, KEY_7 },
2654         { 0x07, KEY_8 },
2655         { 0x08, KEY_9 },
2656         { 0x0a, KEY_0 },
2657
2658         { 0x09, KEY_AGAIN },
2659         { 0x14, KEY_MUTE },
2660
2661         { 0x20, KEY_UP },
2662         { 0x21, KEY_DOWN },
2663         { 0x0b, KEY_ENTER },
2664
2665         { 0x10, KEY_CHANNELUP },
2666         { 0x11, KEY_CHANNELDOWN },
2667
2668         /* Couldn't map key left/key right since those
2669            conflict with '3' and '4' scancodes
2670            I dunno what the original driver does
2671          */
2672
2673         { 0x13, KEY_VOLUMEUP },
2674         { 0x12, KEY_VOLUMEDOWN },
2675
2676         /* The lower part of the IR
2677            There are several duplicated keycodes there.
2678            Most of them conflict with digits.
2679            Add mappings just to the unused scancodes.
2680            Somehow, the original driver has a way to know,
2681            but this doesn't seem to be on some GPIO.
2682            Also, it is not related to the time between keyup
2683            and keydown.
2684          */
2685         { 0x19, KEY_TIME},              /* Timeshift */
2686         { 0x1a, KEY_STOP},
2687         { 0x1b, KEY_RECORD},
2688
2689         { 0x22, KEY_TEXT},
2690
2691         { 0x15, KEY_AUDIO},             /* ((*)) */
2692         { 0x0f, KEY_ZOOM},
2693         { 0x1c, KEY_CAMERA},            /* snapshot */
2694
2695         { 0x18, KEY_RED},               /* B */
2696         { 0x23, KEY_GREEN},             /* C */
2697 };
2698 struct ir_scancode_table ir_codes_kworld_plus_tv_analog_table = {
2699         .scan = ir_codes_kworld_plus_tv_analog,
2700         .size = ARRAY_SIZE(ir_codes_kworld_plus_tv_analog),
2701 };
2702 EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog_table);
2703
2704 /* Kaiomy TVnPC U2
2705    Mauro Carvalho Chehab <mchehab@infradead.org>
2706  */
2707 static struct ir_scancode ir_codes_kaiomy[] = {
2708         { 0x43, KEY_POWER2},
2709         { 0x01, KEY_LIST},
2710         { 0x0b, KEY_ZOOM},
2711         { 0x03, KEY_POWER},
2712
2713         { 0x04, KEY_1},
2714         { 0x08, KEY_2},
2715         { 0x02, KEY_3},
2716
2717         { 0x0f, KEY_4},
2718         { 0x05, KEY_5},
2719         { 0x06, KEY_6},
2720
2721         { 0x0c, KEY_7},
2722         { 0x0d, KEY_8},
2723         { 0x0a, KEY_9},
2724
2725         { 0x11, KEY_0},
2726
2727         { 0x09, KEY_CHANNELUP},
2728         { 0x07, KEY_CHANNELDOWN},
2729
2730         { 0x0e, KEY_VOLUMEUP},
2731         { 0x13, KEY_VOLUMEDOWN},
2732
2733         { 0x10, KEY_HOME},
2734         { 0x12, KEY_ENTER},
2735
2736         { 0x14, KEY_RECORD},
2737         { 0x15, KEY_STOP},
2738         { 0x16, KEY_PLAY},
2739         { 0x17, KEY_MUTE},
2740
2741         { 0x18, KEY_UP},
2742         { 0x19, KEY_DOWN},
2743         { 0x1a, KEY_LEFT},
2744         { 0x1b, KEY_RIGHT},
2745
2746         { 0x1c, KEY_RED},
2747         { 0x1d, KEY_GREEN},
2748         { 0x1e, KEY_YELLOW},
2749         { 0x1f, KEY_BLUE},
2750 };
2751 struct ir_scancode_table ir_codes_kaiomy_table = {
2752         .scan = ir_codes_kaiomy,
2753         .size = ARRAY_SIZE(ir_codes_kaiomy),
2754 };
2755 EXPORT_SYMBOL_GPL(ir_codes_kaiomy_table);
2756
2757 static struct ir_scancode ir_codes_avermedia_a16d[] = {
2758         { 0x20, KEY_LIST},
2759         { 0x00, KEY_POWER},
2760         { 0x28, KEY_1},
2761         { 0x18, KEY_2},
2762         { 0x38, KEY_3},
2763         { 0x24, KEY_4},
2764         { 0x14, KEY_5},
2765         { 0x34, KEY_6},
2766         { 0x2c, KEY_7},
2767         { 0x1c, KEY_8},
2768         { 0x3c, KEY_9},
2769         { 0x12, KEY_SUBTITLE},
2770         { 0x22, KEY_0},
2771         { 0x32, KEY_REWIND},
2772         { 0x3a, KEY_SHUFFLE},
2773         { 0x02, KEY_PRINT},
2774         { 0x11, KEY_CHANNELDOWN},
2775         { 0x31, KEY_CHANNELUP},
2776         { 0x0c, KEY_ZOOM},
2777         { 0x1e, KEY_VOLUMEDOWN},
2778         { 0x3e, KEY_VOLUMEUP},
2779         { 0x0a, KEY_MUTE},
2780         { 0x04, KEY_AUDIO},
2781         { 0x26, KEY_RECORD},
2782         { 0x06, KEY_PLAY},
2783         { 0x36, KEY_STOP},
2784         { 0x16, KEY_PAUSE},
2785         { 0x2e, KEY_REWIND},
2786         { 0x0e, KEY_FASTFORWARD},
2787         { 0x30, KEY_TEXT},
2788         { 0x21, KEY_GREEN},
2789         { 0x01, KEY_BLUE},
2790         { 0x08, KEY_EPG},
2791         { 0x2a, KEY_MENU},
2792 };
2793 struct ir_scancode_table ir_codes_avermedia_a16d_table = {
2794         .scan = ir_codes_avermedia_a16d,
2795         .size = ARRAY_SIZE(ir_codes_avermedia_a16d),
2796 };
2797 EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d_table);
2798
2799 /* Encore ENLTV-FM v5.3
2800    Mauro Carvalho Chehab <mchehab@infradead.org>
2801  */
2802 static struct ir_scancode ir_codes_encore_enltv_fm53[] = {
2803         { 0x10, KEY_POWER2},
2804         { 0x06, KEY_MUTE},
2805
2806         { 0x09, KEY_1},
2807         { 0x1d, KEY_2},
2808         { 0x1f, KEY_3},
2809         { 0x19, KEY_4},
2810         { 0x1b, KEY_5},
2811         { 0x11, KEY_6},
2812         { 0x17, KEY_7},
2813         { 0x12, KEY_8},
2814         { 0x16, KEY_9},
2815         { 0x48, KEY_0},
2816
2817         { 0x04, KEY_LIST},              /* -/-- */
2818         { 0x40, KEY_LAST},              /* recall */
2819
2820         { 0x02, KEY_MODE},              /* TV/AV */
2821         { 0x05, KEY_CAMERA},            /* SNAPSHOT */
2822
2823         { 0x4c, KEY_CHANNELUP},         /* UP */
2824         { 0x00, KEY_CHANNELDOWN},       /* DOWN */
2825         { 0x0d, KEY_VOLUMEUP},          /* RIGHT */
2826         { 0x15, KEY_VOLUMEDOWN},        /* LEFT */
2827         { 0x49, KEY_ENTER},             /* OK */
2828
2829         { 0x54, KEY_RECORD},
2830         { 0x4d, KEY_PLAY},              /* pause */
2831
2832         { 0x1e, KEY_MENU},              /* video setting */
2833         { 0x0e, KEY_RIGHT},             /* <- */
2834         { 0x1a, KEY_LEFT},              /* -> */
2835
2836         { 0x0a, KEY_CLEAR},             /* video default */
2837         { 0x0c, KEY_ZOOM},              /* hide pannel */
2838         { 0x47, KEY_SLEEP},             /* shutdown */
2839 };
2840 struct ir_scancode_table ir_codes_encore_enltv_fm53_table = {
2841         .scan = ir_codes_encore_enltv_fm53,
2842         .size = ARRAY_SIZE(ir_codes_encore_enltv_fm53),
2843 };
2844 EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53_table);
2845
2846 /* Zogis Real Audio 220 - 32 keys IR */
2847 static struct ir_scancode ir_codes_real_audio_220_32_keys[] = {
2848         { 0x1c, KEY_RADIO},
2849         { 0x12, KEY_POWER2},
2850
2851         { 0x01, KEY_1},
2852         { 0x02, KEY_2},
2853         { 0x03, KEY_3},
2854         { 0x04, KEY_4},
2855         { 0x05, KEY_5},
2856         { 0x06, KEY_6},
2857         { 0x07, KEY_7},
2858         { 0x08, KEY_8},
2859         { 0x09, KEY_9},
2860         { 0x00, KEY_0},
2861
2862         { 0x0c, KEY_VOLUMEUP},
2863         { 0x18, KEY_VOLUMEDOWN},
2864         { 0x0b, KEY_CHANNELUP},
2865         { 0x15, KEY_CHANNELDOWN},
2866         { 0x16, KEY_ENTER},
2867
2868         { 0x11, KEY_LIST},              /* Source */
2869         { 0x0d, KEY_AUDIO},             /* stereo */
2870
2871         { 0x0f, KEY_PREVIOUS},          /* Prev */
2872         { 0x1b, KEY_TIME},              /* Timeshift */
2873         { 0x1a, KEY_NEXT},              /* Next */
2874
2875         { 0x0e, KEY_STOP},
2876         { 0x1f, KEY_PLAY},
2877         { 0x1e, KEY_PLAYPAUSE},         /* Pause */
2878
2879         { 0x1d, KEY_RECORD},
2880         { 0x13, KEY_MUTE},
2881         { 0x19, KEY_CAMERA},            /* Snapshot */
2882
2883 };
2884 struct ir_scancode_table ir_codes_real_audio_220_32_keys_table = {
2885         .scan = ir_codes_real_audio_220_32_keys,
2886         .size = ARRAY_SIZE(ir_codes_real_audio_220_32_keys),
2887 };
2888 EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys_table);
2889
2890 /* ATI TV Wonder HD 600 USB
2891    Devin Heitmueller <devin.heitmueller@gmail.com>
2892  */
2893 static struct ir_scancode ir_codes_ati_tv_wonder_hd_600[] = {
2894         { 0x00, KEY_RECORD},            /* Row 1 */
2895         { 0x01, KEY_PLAYPAUSE},
2896         { 0x02, KEY_STOP},
2897         { 0x03, KEY_POWER},
2898         { 0x04, KEY_PREVIOUS},  /* Row 2 */
2899         { 0x05, KEY_REWIND},
2900         { 0x06, KEY_FORWARD},
2901         { 0x07, KEY_NEXT},
2902         { 0x08, KEY_EPG},               /* Row 3 */
2903         { 0x09, KEY_HOME},
2904         { 0x0a, KEY_MENU},
2905         { 0x0b, KEY_CHANNELUP},
2906         { 0x0c, KEY_BACK},              /* Row 4 */
2907         { 0x0d, KEY_UP},
2908         { 0x0e, KEY_INFO},
2909         { 0x0f, KEY_CHANNELDOWN},
2910         { 0x10, KEY_LEFT},              /* Row 5 */
2911         { 0x11, KEY_SELECT},
2912         { 0x12, KEY_RIGHT},
2913         { 0x13, KEY_VOLUMEUP},
2914         { 0x14, KEY_LAST},              /* Row 6 */
2915         { 0x15, KEY_DOWN},
2916         { 0x16, KEY_MUTE},
2917         { 0x17, KEY_VOLUMEDOWN},
2918 };
2919 struct ir_scancode_table ir_codes_ati_tv_wonder_hd_600_table = {
2920         .scan = ir_codes_ati_tv_wonder_hd_600,
2921         .size = ARRAY_SIZE(ir_codes_ati_tv_wonder_hd_600),
2922 };
2923 EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600_table);
2924
2925 /* DVBWorld remotes
2926    Igor M. Liplianin <liplianin@me.by>
2927  */
2928 static struct ir_scancode ir_codes_dm1105_nec[] = {
2929         { 0x0a, KEY_POWER2},            /* power */
2930         { 0x0c, KEY_MUTE},              /* mute */
2931         { 0x11, KEY_1},
2932         { 0x12, KEY_2},
2933         { 0x13, KEY_3},
2934         { 0x14, KEY_4},
2935         { 0x15, KEY_5},
2936         { 0x16, KEY_6},
2937         { 0x17, KEY_7},
2938         { 0x18, KEY_8},
2939         { 0x19, KEY_9},
2940         { 0x10, KEY_0},
2941         { 0x1c, KEY_CHANNELUP},         /* ch+ */
2942         { 0x0f, KEY_CHANNELDOWN},       /* ch- */
2943         { 0x1a, KEY_VOLUMEUP},          /* vol+ */
2944         { 0x0e, KEY_VOLUMEDOWN},        /* vol- */
2945         { 0x04, KEY_RECORD},            /* rec */
2946         { 0x09, KEY_CHANNEL},           /* fav */
2947         { 0x08, KEY_BACKSPACE},         /* rewind */
2948         { 0x07, KEY_FASTFORWARD},       /* fast */
2949         { 0x0b, KEY_PAUSE},             /* pause */
2950         { 0x02, KEY_ESC},               /* cancel */
2951         { 0x03, KEY_TAB},               /* tab */
2952         { 0x00, KEY_UP},                /* up */
2953         { 0x1f, KEY_ENTER},             /* ok */
2954         { 0x01, KEY_DOWN},              /* down */
2955         { 0x05, KEY_RECORD},            /* cap */
2956         { 0x06, KEY_STOP},              /* stop */
2957         { 0x40, KEY_ZOOM},              /* full */
2958         { 0x1e, KEY_TV},                /* tvmode */
2959         { 0x1b, KEY_B},                 /* recall */
2960 };
2961 struct ir_scancode_table ir_codes_dm1105_nec_table = {
2962         .scan = ir_codes_dm1105_nec,
2963         .size = ARRAY_SIZE(ir_codes_dm1105_nec),
2964 };
2965 EXPORT_SYMBOL_GPL(ir_codes_dm1105_nec_table);
2966
2967 /* Terratec Cinergy Hybrid T USB XS
2968    Devin Heitmueller <dheitmueller@linuxtv.org>
2969  */
2970 static struct ir_scancode ir_codes_terratec_cinergy_xs[] = {
2971         { 0x41, KEY_HOME},
2972         { 0x01, KEY_POWER},
2973         { 0x42, KEY_MENU},
2974         { 0x02, KEY_1},
2975         { 0x03, KEY_2},
2976         { 0x04, KEY_3},
2977         { 0x43, KEY_SUBTITLE},
2978         { 0x05, KEY_4},
2979         { 0x06, KEY_5},
2980         { 0x07, KEY_6},
2981         { 0x44, KEY_TEXT},
2982         { 0x08, KEY_7},
2983         { 0x09, KEY_8},
2984         { 0x0a, KEY_9},
2985         { 0x45, KEY_DELETE},
2986         { 0x0b, KEY_TUNER},
2987         { 0x0c, KEY_0},
2988         { 0x0d, KEY_MODE},
2989         { 0x46, KEY_TV},
2990         { 0x47, KEY_DVD},
2991         { 0x49, KEY_VIDEO},
2992         { 0x4b, KEY_AUX},
2993         { 0x10, KEY_UP},
2994         { 0x11, KEY_LEFT},
2995         { 0x12, KEY_OK},
2996         { 0x13, KEY_RIGHT},
2997         { 0x14, KEY_DOWN},
2998         { 0x0f, KEY_EPG},
2999         { 0x16, KEY_INFO},
3000         { 0x4d, KEY_BACKSPACE},
3001         { 0x1c, KEY_VOLUMEUP},
3002         { 0x4c, KEY_PLAY},
3003         { 0x1b, KEY_CHANNELUP},
3004         { 0x1e, KEY_VOLUMEDOWN},
3005         { 0x1d, KEY_MUTE},
3006         { 0x1f, KEY_CHANNELDOWN},
3007         { 0x17, KEY_RED},
3008         { 0x18, KEY_GREEN},
3009         { 0x19, KEY_YELLOW},
3010         { 0x1a, KEY_BLUE},
3011         { 0x58, KEY_RECORD},
3012         { 0x48, KEY_STOP},
3013         { 0x40, KEY_PAUSE},
3014         { 0x54, KEY_LAST},
3015         { 0x4e, KEY_REWIND},
3016         { 0x4f, KEY_FASTFORWARD},
3017         { 0x5c, KEY_NEXT},
3018 };
3019 struct ir_scancode_table ir_codes_terratec_cinergy_xs_table = {
3020         .scan = ir_codes_terratec_cinergy_xs,
3021         .size = ARRAY_SIZE(ir_codes_terratec_cinergy_xs),
3022 };
3023 EXPORT_SYMBOL_GPL(ir_codes_terratec_cinergy_xs_table);
3024
3025 /* EVGA inDtube
3026    Devin Heitmueller <devin.heitmueller@gmail.com>
3027  */
3028 static struct ir_scancode ir_codes_evga_indtube[] = {
3029         { 0x12, KEY_POWER},
3030         { 0x02, KEY_MODE},      /* TV */
3031         { 0x14, KEY_MUTE},
3032         { 0x1a, KEY_CHANNELUP},
3033         { 0x16, KEY_TV2},       /* PIP */
3034         { 0x1d, KEY_VOLUMEUP},
3035         { 0x05, KEY_CHANNELDOWN},
3036         { 0x0f, KEY_PLAYPAUSE},
3037         { 0x19, KEY_VOLUMEDOWN},
3038         { 0x1c, KEY_REWIND},
3039         { 0x0d, KEY_RECORD},
3040         { 0x18, KEY_FORWARD},
3041         { 0x1e, KEY_PREVIOUS},
3042         { 0x1b, KEY_STOP},
3043         { 0x1f, KEY_NEXT},
3044         { 0x13, KEY_CAMERA},
3045 };
3046 struct ir_scancode_table ir_codes_evga_indtube_table = {
3047         .scan = ir_codes_evga_indtube,
3048         .size = ARRAY_SIZE(ir_codes_evga_indtube),
3049 };
3050 EXPORT_SYMBOL_GPL(ir_codes_evga_indtube_table);
3051
3052 static struct ir_scancode ir_codes_videomate_s350[] = {
3053         { 0x00, KEY_TV},
3054         { 0x01, KEY_DVD},
3055         { 0x04, KEY_RECORD},
3056         { 0x05, KEY_VIDEO},     /* TV/Video */
3057         { 0x07, KEY_STOP},
3058         { 0x08, KEY_PLAYPAUSE},
3059         { 0x0a, KEY_REWIND},
3060         { 0x0f, KEY_FASTFORWARD},
3061         { 0x10, KEY_CHANNELUP},
3062         { 0x12, KEY_VOLUMEUP},
3063         { 0x13, KEY_CHANNELDOWN},
3064         { 0x14, KEY_MUTE},
3065         { 0x15, KEY_VOLUMEDOWN},
3066         { 0x16, KEY_1},
3067         { 0x17, KEY_2},
3068         { 0x18, KEY_3},
3069         { 0x19, KEY_4},
3070         { 0x1a, KEY_5},
3071         { 0x1b, KEY_6},
3072         { 0x1c, KEY_7},
3073         { 0x1d, KEY_8},
3074         { 0x1e, KEY_9},
3075         { 0x1f, KEY_0},
3076         { 0x21, KEY_SLEEP},
3077         { 0x24, KEY_ZOOM},
3078         { 0x25, KEY_LAST},      /* Recall */
3079         { 0x26, KEY_SUBTITLE},  /* CC */
3080         { 0x27, KEY_LANGUAGE},  /* MTS */
3081         { 0x29, KEY_CHANNEL},   /* SURF */
3082         { 0x2b, KEY_A},
3083         { 0x2c, KEY_B},
3084         { 0x2f, KEY_CAMERA},    /* Snapshot */
3085         { 0x23, KEY_RADIO},
3086         { 0x02, KEY_PREVIOUSSONG},
3087         { 0x06, KEY_NEXTSONG},
3088         { 0x03, KEY_EPG},
3089         { 0x09, KEY_SETUP},
3090         { 0x22, KEY_BACKSPACE},
3091         { 0x0c, KEY_UP},
3092         { 0x0e, KEY_DOWN},
3093         { 0x0b, KEY_LEFT},
3094         { 0x0d, KEY_RIGHT},
3095         { 0x11, KEY_ENTER},
3096         { 0x20, KEY_TEXT},
3097 };
3098 struct ir_scancode_table ir_codes_videomate_s350_table = {
3099         .scan = ir_codes_videomate_s350,
3100         .size = ARRAY_SIZE(ir_codes_videomate_s350),
3101 };
3102 EXPORT_SYMBOL_GPL(ir_codes_videomate_s350_table);
3103
3104 /* GADMEI UTV330+ RM008Z remote
3105    Shine Liu <shinel@foxmail.com>
3106  */
3107 static struct ir_scancode ir_codes_gadmei_rm008z[] = {
3108         { 0x14, KEY_POWER2},            /* POWER OFF */
3109         { 0x0c, KEY_MUTE},              /* MUTE */
3110
3111         { 0x18, KEY_TV},                /* TV */
3112         { 0x0e, KEY_VIDEO},             /* AV */
3113         { 0x0b, KEY_AUDIO},             /* SV */
3114         { 0x0f, KEY_RADIO},             /* FM */
3115
3116         { 0x00, KEY_1},
3117         { 0x01, KEY_2},
3118         { 0x02, KEY_3},
3119         { 0x03, KEY_4},
3120         { 0x04, KEY_5},
3121         { 0x05, KEY_6},
3122         { 0x06, KEY_7},
3123         { 0x07, KEY_8},
3124         { 0x08, KEY_9},
3125         { 0x09, KEY_0},
3126         { 0x0a, KEY_INFO},              /* OSD */
3127         { 0x1c, KEY_BACKSPACE},         /* LAST */
3128
3129         { 0x0d, KEY_PLAY},              /* PLAY */
3130         { 0x1e, KEY_CAMERA},            /* SNAPSHOT */
3131         { 0x1a, KEY_RECORD},            /* RECORD */
3132         { 0x17, KEY_STOP},              /* STOP */
3133
3134         { 0x1f, KEY_UP},                /* UP */
3135         { 0x44, KEY_DOWN},              /* DOWN */
3136         { 0x46, KEY_TAB},               /* BACK */
3137         { 0x4a, KEY_ZOOM},              /* FULLSECREEN */
3138
3139         { 0x10, KEY_VOLUMEUP},          /* VOLUMEUP */
3140         { 0x11, KEY_VOLUMEDOWN},        /* VOLUMEDOWN */
3141         { 0x12, KEY_CHANNELUP},         /* CHANNELUP */
3142         { 0x13, KEY_CHANNELDOWN},       /* CHANNELDOWN */
3143         { 0x15, KEY_ENTER},             /* OK */
3144 };
3145 struct ir_scancode_table ir_codes_gadmei_rm008z_table = {
3146         .scan = ir_codes_gadmei_rm008z,
3147         .size = ARRAY_SIZE(ir_codes_gadmei_rm008z),
3148 };
3149 EXPORT_SYMBOL_GPL(ir_codes_gadmei_rm008z_table);