aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/common')
-rw-r--r--drivers/media/common/Makefile1
-rw-r--r--drivers/media/common/ir-common.c519
-rw-r--r--drivers/media/common/ir-functions.c272
-rw-r--r--drivers/media/common/ir-keymaps.c1415
-rw-r--r--drivers/media/common/saa7146_core.c9
-rw-r--r--drivers/media/common/saa7146_fops.c24
-rw-r--r--drivers/media/common/saa7146_i2c.c4
-rw-r--r--drivers/media/common/saa7146_vbi.c2
-rw-r--r--drivers/media/common/saa7146_video.c30
9 files changed, 1721 insertions, 555 deletions
diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile
index bd458cb9b4e..61b89617a96 100644
--- a/drivers/media/common/Makefile
+++ b/drivers/media/common/Makefile
@@ -1,5 +1,6 @@
1saa7146-objs := saa7146_i2c.o saa7146_core.o 1saa7146-objs := saa7146_i2c.o saa7146_core.o
2saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o 2saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
3ir-common-objs := ir-functions.o ir-keymaps.o
3 4
4obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o 5obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
5obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o 6obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
diff --git a/drivers/media/common/ir-common.c b/drivers/media/common/ir-common.c
deleted file mode 100644
index 97fa3fc571c..00000000000
--- a/drivers/media/common/ir-common.c
+++ /dev/null
@@ -1,519 +0,0 @@
1/*
2 *
3 * some common structs and functions to handle infrared remotes via
4 * input layer ...
5 *
6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/string.h>
26#include <media/ir-common.h>
27
28/* -------------------------------------------------------------------------- */
29
30MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
31MODULE_LICENSE("GPL");
32
33static int repeat = 1;
34module_param(repeat, int, 0444);
35MODULE_PARM_DESC(repeat,"auto-repeat for IR keys (default: on)");
36
37static int debug = 0; /* debug level (0,1,2) */
38module_param(debug, int, 0644);
39
40#define dprintk(level, fmt, arg...) if (debug >= level) \
41 printk(KERN_DEBUG fmt , ## arg)
42
43/* -------------------------------------------------------------------------- */
44
45/* generic RC5 keytable */
46/* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
47/* used by old (black) Hauppauge remotes */
48IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE] = {
49 /* Keys 0 to 9 */
50 [ 0x00 ] = KEY_KP0,
51 [ 0x01 ] = KEY_KP1,
52 [ 0x02 ] = KEY_KP2,
53 [ 0x03 ] = KEY_KP3,
54 [ 0x04 ] = KEY_KP4,
55 [ 0x05 ] = KEY_KP5,
56 [ 0x06 ] = KEY_KP6,
57 [ 0x07 ] = KEY_KP7,
58 [ 0x08 ] = KEY_KP8,
59 [ 0x09 ] = KEY_KP9,
60
61 [ 0x0b ] = KEY_CHANNEL, /* channel / program (japan: 11) */
62 [ 0x0c ] = KEY_POWER, /* standby */
63 [ 0x0d ] = KEY_MUTE, /* mute / demute */
64 [ 0x0f ] = KEY_TV, /* display */
65 [ 0x10 ] = KEY_VOLUMEUP,
66 [ 0x11 ] = KEY_VOLUMEDOWN,
67 [ 0x12 ] = KEY_BRIGHTNESSUP,
68 [ 0x13 ] = KEY_BRIGHTNESSDOWN,
69 [ 0x1e ] = KEY_SEARCH, /* search + */
70 [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */
71 [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */
72 [ 0x22 ] = KEY_CHANNEL, /* alt / channel */
73 [ 0x23 ] = KEY_LANGUAGE, /* 1st / 2nd language */
74 [ 0x26 ] = KEY_SLEEP, /* sleeptimer */
75 [ 0x2e ] = KEY_MENU, /* 2nd controls (USA: menu) */
76 [ 0x30 ] = KEY_PAUSE,
77 [ 0x32 ] = KEY_REWIND,
78 [ 0x33 ] = KEY_GOTO,
79 [ 0x35 ] = KEY_PLAY,
80 [ 0x36 ] = KEY_STOP,
81 [ 0x37 ] = KEY_RECORD, /* recording */
82 [ 0x3c ] = KEY_TEXT, /* teletext submode (Japan: 12) */
83 [ 0x3d ] = KEY_SUSPEND, /* system standby */
84
85};
86EXPORT_SYMBOL_GPL(ir_codes_rc5_tv);
87
88/* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
89IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
90 /* Keys 0 to 9 */
91 [ 18 ] = KEY_KP0,
92 [ 5 ] = KEY_KP1,
93 [ 6 ] = KEY_KP2,
94 [ 7 ] = KEY_KP3,
95 [ 9 ] = KEY_KP4,
96 [ 10 ] = KEY_KP5,
97 [ 11 ] = KEY_KP6,
98 [ 13 ] = KEY_KP7,
99 [ 14 ] = KEY_KP8,
100 [ 15 ] = KEY_KP9,
101
102 [ 0 ] = KEY_POWER,
103 [ 2 ] = KEY_TUNER, /* TV/FM */
104 [ 30 ] = KEY_VIDEO,
105 [ 4 ] = KEY_VOLUMEUP,
106 [ 8 ] = KEY_VOLUMEDOWN,
107 [ 12 ] = KEY_CHANNELUP,
108 [ 16 ] = KEY_CHANNELDOWN,
109 [ 3 ] = KEY_ZOOM, /* fullscreen */
110 [ 31 ] = KEY_SUBTITLE, /* closed caption/teletext */
111 [ 32 ] = KEY_SLEEP,
112 [ 20 ] = KEY_MUTE,
113 [ 43 ] = KEY_RED,
114 [ 44 ] = KEY_GREEN,
115 [ 45 ] = KEY_YELLOW,
116 [ 46 ] = KEY_BLUE,
117 [ 24 ] = KEY_KPPLUS, /* fine tune + */
118 [ 25 ] = KEY_KPMINUS, /* fine tune - */
119 [ 33 ] = KEY_KPDOT,
120 [ 19 ] = KEY_KPENTER,
121 [ 34 ] = KEY_BACK,
122 [ 35 ] = KEY_PLAYPAUSE,
123 [ 36 ] = KEY_NEXT,
124 [ 38 ] = KEY_STOP,
125 [ 39 ] = KEY_RECORD
126};
127EXPORT_SYMBOL_GPL(ir_codes_winfast);
128
129IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
130 [ 0x59 ] = KEY_MUTE,
131 [ 0x4a ] = KEY_POWER,
132
133 [ 0x18 ] = KEY_TEXT,
134 [ 0x26 ] = KEY_TV,
135 [ 0x3d ] = KEY_PRINT,
136
137 [ 0x48 ] = KEY_RED,
138 [ 0x04 ] = KEY_GREEN,
139 [ 0x11 ] = KEY_YELLOW,
140 [ 0x00 ] = KEY_BLUE,
141
142 [ 0x2d ] = KEY_VOLUMEUP,
143 [ 0x1e ] = KEY_VOLUMEDOWN,
144
145 [ 0x49 ] = KEY_MENU,
146
147 [ 0x16 ] = KEY_CHANNELUP,
148 [ 0x17 ] = KEY_CHANNELDOWN,
149
150 [ 0x20 ] = KEY_UP,
151 [ 0x21 ] = KEY_DOWN,
152 [ 0x22 ] = KEY_LEFT,
153 [ 0x23 ] = KEY_RIGHT,
154 [ 0x0d ] = KEY_SELECT,
155
156
157
158 [ 0x08 ] = KEY_BACK,
159 [ 0x07 ] = KEY_REFRESH,
160
161 [ 0x2f ] = KEY_ZOOM,
162 [ 0x29 ] = KEY_RECORD,
163
164 [ 0x4b ] = KEY_PAUSE,
165 [ 0x4d ] = KEY_REWIND,
166 [ 0x2e ] = KEY_PLAY,
167 [ 0x4e ] = KEY_FORWARD,
168 [ 0x53 ] = KEY_PREVIOUS,
169 [ 0x4c ] = KEY_STOP,
170 [ 0x54 ] = KEY_NEXT,
171
172 [ 0x69 ] = KEY_KP0,
173 [ 0x6a ] = KEY_KP1,
174 [ 0x6b ] = KEY_KP2,
175 [ 0x6c ] = KEY_KP3,
176 [ 0x6d ] = KEY_KP4,
177 [ 0x6e ] = KEY_KP5,
178 [ 0x6f ] = KEY_KP6,
179 [ 0x70 ] = KEY_KP7,
180 [ 0x71 ] = KEY_KP8,
181 [ 0x72 ] = KEY_KP9,
182
183 [ 0x74 ] = KEY_CHANNEL,
184 [ 0x0a ] = KEY_BACKSPACE,
185};
186
187EXPORT_SYMBOL_GPL(ir_codes_pinnacle);
188
189/* empty keytable, can be used as placeholder for not-yet created keytables */
190IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = {
191 [ 42 ] = KEY_COFFEE,
192};
193EXPORT_SYMBOL_GPL(ir_codes_empty);
194
195/* Hauppauge: the newer, gray remotes (seems there are multiple
196 * slightly different versions), shipped with cx88+ivtv cards.
197 * almost rc5 coding, but some non-standard keys */
198IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = {
199 /* Keys 0 to 9 */
200 [ 0x00 ] = KEY_KP0,
201 [ 0x01 ] = KEY_KP1,
202 [ 0x02 ] = KEY_KP2,
203 [ 0x03 ] = KEY_KP3,
204 [ 0x04 ] = KEY_KP4,
205 [ 0x05 ] = KEY_KP5,
206 [ 0x06 ] = KEY_KP6,
207 [ 0x07 ] = KEY_KP7,
208 [ 0x08 ] = KEY_KP8,
209 [ 0x09 ] = KEY_KP9,
210
211 [ 0x0a ] = KEY_TEXT, /* keypad asterisk as well */
212 [ 0x0b ] = KEY_RED, /* red button */
213 [ 0x0c ] = KEY_RADIO,
214 [ 0x0d ] = KEY_MENU,
215 [ 0x0e ] = KEY_SUBTITLE, /* also the # key */
216 [ 0x0f ] = KEY_MUTE,
217 [ 0x10 ] = KEY_VOLUMEUP,
218 [ 0x11 ] = KEY_VOLUMEDOWN,
219 [ 0x12 ] = KEY_PREVIOUS, /* previous channel */
220 [ 0x14 ] = KEY_UP,
221 [ 0x15 ] = KEY_DOWN,
222 [ 0x16 ] = KEY_LEFT,
223 [ 0x17 ] = KEY_RIGHT,
224 [ 0x18 ] = KEY_VIDEO, /* Videos */
225 [ 0x19 ] = KEY_AUDIO, /* Music */
226 /* 0x1a: Pictures - presume this means
227 "Multimedia Home Platform" -
228 no "PICTURES" key in input.h
229 */
230 [ 0x1a ] = KEY_MHP,
231
232 [ 0x1b ] = KEY_EPG, /* Guide */
233 [ 0x1c ] = KEY_TV,
234 [ 0x1e ] = KEY_NEXTSONG, /* skip >| */
235 [ 0x1f ] = KEY_EXIT, /* back/exit */
236 [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */
237 [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */
238 [ 0x22 ] = KEY_CHANNEL, /* source (old black remote) */
239 [ 0x24 ] = KEY_PREVIOUSSONG, /* replay |< */
240 [ 0x25 ] = KEY_ENTER, /* OK */
241 [ 0x26 ] = KEY_SLEEP, /* minimize (old black remote) */
242 [ 0x29 ] = KEY_BLUE, /* blue key */
243 [ 0x2e ] = KEY_GREEN, /* green button */
244 [ 0x30 ] = KEY_PAUSE, /* pause */
245 [ 0x32 ] = KEY_REWIND, /* backward << */
246 [ 0x34 ] = KEY_FASTFORWARD, /* forward >> */
247 [ 0x35 ] = KEY_PLAY,
248 [ 0x36 ] = KEY_STOP,
249 [ 0x37 ] = KEY_RECORD, /* recording */
250 [ 0x38 ] = KEY_YELLOW, /* yellow key */
251 [ 0x3b ] = KEY_SELECT, /* top right button */
252 [ 0x3c ] = KEY_ZOOM, /* full */
253 [ 0x3d ] = KEY_POWER, /* system power (green button) */
254};
255EXPORT_SYMBOL(ir_codes_hauppauge_new);
256
257IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE] = {
258 [ 2 ] = KEY_KP0,
259 [ 1 ] = KEY_KP1,
260 [ 11 ] = KEY_KP2,
261 [ 27 ] = KEY_KP3,
262 [ 5 ] = KEY_KP4,
263 [ 9 ] = KEY_KP5,
264 [ 21 ] = KEY_KP6,
265 [ 6 ] = KEY_KP7,
266 [ 10 ] = KEY_KP8,
267 [ 18 ] = KEY_KP9,
268
269 [ 3 ] = KEY_TUNER, /* TV/FM */
270 [ 7 ] = KEY_SEARCH, /* scan */
271 [ 28 ] = KEY_ZOOM, /* full screen */
272 [ 30 ] = KEY_POWER,
273 [ 23 ] = KEY_VOLUMEDOWN,
274 [ 31 ] = KEY_VOLUMEUP,
275 [ 20 ] = KEY_CHANNELDOWN,
276 [ 22 ] = KEY_CHANNELUP,
277 [ 24 ] = KEY_MUTE,
278
279 [ 0 ] = KEY_LIST, /* source */
280 [ 19 ] = KEY_INFO, /* loop */
281 [ 16 ] = KEY_LAST, /* +100 */
282 [ 13 ] = KEY_CLEAR, /* reset */
283 [ 12 ] = BTN_RIGHT, /* fun++ */
284 [ 4 ] = BTN_LEFT, /* fun-- */
285 [ 14 ] = KEY_GOTO, /* function */
286 [ 15 ] = KEY_STOP, /* freeze */
287};
288EXPORT_SYMBOL(ir_codes_pixelview);
289
290/* -------------------------------------------------------------------------- */
291
292static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
293{
294 if (KEY_RESERVED == ir->keycode) {
295 printk(KERN_INFO "%s: unknown key: key=0x%02x raw=0x%02x down=%d\n",
296 dev->name,ir->ir_key,ir->ir_raw,ir->keypressed);
297 return;
298 }
299 dprintk(1,"%s: key event code=%d down=%d\n",
300 dev->name,ir->keycode,ir->keypressed);
301 input_report_key(dev,ir->keycode,ir->keypressed);
302 input_sync(dev);
303}
304
305/* -------------------------------------------------------------------------- */
306
307void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
308 int ir_type, IR_KEYTAB_TYPE *ir_codes)
309{
310 int i;
311
312 ir->ir_type = ir_type;
313 if (ir_codes)
314 memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
315
316
317 dev->keycode = ir->ir_codes;
318 dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
319 dev->keycodemax = IR_KEYTAB_SIZE;
320 for (i = 0; i < IR_KEYTAB_SIZE; i++)
321 set_bit(ir->ir_codes[i], dev->keybit);
322 clear_bit(0, dev->keybit);
323
324 set_bit(EV_KEY, dev->evbit);
325 if (repeat)
326 set_bit(EV_REP, dev->evbit);
327}
328
329void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir)
330{
331 if (ir->keypressed) {
332 ir->keypressed = 0;
333 ir_input_key_event(dev,ir);
334 }
335}
336
337void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
338 u32 ir_key, u32 ir_raw)
339{
340 u32 keycode = IR_KEYCODE(ir->ir_codes, ir_key);
341
342 if (ir->keypressed && ir->keycode != keycode) {
343 ir->keypressed = 0;
344 ir_input_key_event(dev,ir);
345 }
346 if (!ir->keypressed) {
347 ir->ir_key = ir_key;
348 ir->ir_raw = ir_raw;
349 ir->keycode = keycode;
350 ir->keypressed = 1;
351 ir_input_key_event(dev,ir);
352 }
353}
354
355/* -------------------------------------------------------------------------- */
356
357u32 ir_extract_bits(u32 data, u32 mask)
358{
359 int mbit, vbit;
360 u32 value;
361
362 value = 0;
363 vbit = 0;
364 for (mbit = 0; mbit < 32; mbit++) {
365 if (!(mask & ((u32)1 << mbit)))
366 continue;
367 if (data & ((u32)1 << mbit))
368 value |= (1 << vbit);
369 vbit++;
370 }
371 return value;
372}
373
374static int inline getbit(u32 *samples, int bit)
375{
376 return (samples[bit/32] & (1 << (31-(bit%32)))) ? 1 : 0;
377}
378
379/* sump raw samples for visual debugging ;) */
380int ir_dump_samples(u32 *samples, int count)
381{
382 int i, bit, start;
383
384 printk(KERN_DEBUG "ir samples: ");
385 start = 0;
386 for (i = 0; i < count * 32; i++) {
387 bit = getbit(samples,i);
388 if (bit)
389 start = 1;
390 if (0 == start)
391 continue;
392 printk("%s", bit ? "#" : "_");
393 }
394 printk("\n");
395 return 0;
396}
397
398/* decode raw samples, pulse distance coding used by NEC remotes */
399int ir_decode_pulsedistance(u32 *samples, int count, int low, int high)
400{
401 int i,last,bit,len;
402 u32 curBit;
403 u32 value;
404
405 /* find start burst */
406 for (i = len = 0; i < count * 32; i++) {
407 bit = getbit(samples,i);
408 if (bit) {
409 len++;
410 } else {
411 if (len >= 29)
412 break;
413 len = 0;
414 }
415 }
416
417 /* start burst to short */
418 if (len < 29)
419 return 0xffffffff;
420
421 /* find start silence */
422 for (len = 0; i < count * 32; i++) {
423 bit = getbit(samples,i);
424 if (bit) {
425 break;
426 } else {
427 len++;
428 }
429 }
430
431 /* silence to short */
432 if (len < 7)
433 return 0xffffffff;
434
435 /* go decoding */
436 len = 0;
437 last = 1;
438 value = 0; curBit = 1;
439 for (; i < count * 32; i++) {
440 bit = getbit(samples,i);
441 if (last) {
442 if(bit) {
443 continue;
444 } else {
445 len = 1;
446 }
447 } else {
448 if (bit) {
449 if (len > (low + high) /2)
450 value |= curBit;
451 curBit <<= 1;
452 if (curBit == 1)
453 break;
454 } else {
455 len++;
456 }
457 }
458 last = bit;
459 }
460
461 return value;
462}
463
464/* decode raw samples, biphase coding, used by rc5 for example */
465int ir_decode_biphase(u32 *samples, int count, int low, int high)
466{
467 int i,last,bit,len,flips;
468 u32 value;
469
470 /* find start bit (1) */
471 for (i = 0; i < 32; i++) {
472 bit = getbit(samples,i);
473 if (bit)
474 break;
475 }
476
477 /* go decoding */
478 len = 0;
479 flips = 0;
480 value = 1;
481 for (; i < count * 32; i++) {
482 if (len > high)
483 break;
484 if (flips > 1)
485 break;
486 last = bit;
487 bit = getbit(samples,i);
488 if (last == bit) {
489 len++;
490 continue;
491 }
492 if (len < low) {
493 len++;
494 flips++;
495 continue;
496 }
497 value <<= 1;
498 value |= bit;
499 flips = 0;
500 len = 1;
501 }
502 return value;
503}
504
505EXPORT_SYMBOL_GPL(ir_input_init);
506EXPORT_SYMBOL_GPL(ir_input_nokey);
507EXPORT_SYMBOL_GPL(ir_input_keydown);
508
509EXPORT_SYMBOL_GPL(ir_extract_bits);
510EXPORT_SYMBOL_GPL(ir_dump_samples);
511EXPORT_SYMBOL_GPL(ir_decode_biphase);
512EXPORT_SYMBOL_GPL(ir_decode_pulsedistance);
513
514/*
515 * Local variables:
516 * c-basic-offset: 8
517 * End:
518 */
519
diff --git a/drivers/media/common/ir-functions.c b/drivers/media/common/ir-functions.c
new file mode 100644
index 00000000000..397cff8b345
--- /dev/null
+++ b/drivers/media/common/ir-functions.c
@@ -0,0 +1,272 @@
1/*
2 *
3 * some common structs and functions to handle infrared remotes via
4 * input layer ...
5 *
6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/string.h>
26#include <media/ir-common.h>
27
28/* -------------------------------------------------------------------------- */
29
30MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
31MODULE_LICENSE("GPL");
32
33static int repeat = 1;
34module_param(repeat, int, 0444);
35MODULE_PARM_DESC(repeat,"auto-repeat for IR keys (default: on)");
36
37static int debug = 0; /* debug level (0,1,2) */
38module_param(debug, int, 0644);
39
40#define dprintk(level, fmt, arg...) if (debug >= level) \
41 printk(KERN_DEBUG fmt , ## arg)
42
43/* -------------------------------------------------------------------------- */
44
45static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
46{
47 if (KEY_RESERVED == ir->keycode) {
48 printk(KERN_INFO "%s: unknown key: key=0x%02x raw=0x%02x down=%d\n",
49 dev->name,ir->ir_key,ir->ir_raw,ir->keypressed);
50 return;
51 }
52 dprintk(1,"%s: key event code=%d down=%d\n",
53 dev->name,ir->keycode,ir->keypressed);
54 input_report_key(dev,ir->keycode,ir->keypressed);
55 input_sync(dev);
56}
57
58/* -------------------------------------------------------------------------- */
59
60void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
61 int ir_type, IR_KEYTAB_TYPE *ir_codes)
62{
63 int i;
64
65 ir->ir_type = ir_type;
66 if (ir_codes)
67 memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
68
69
70 dev->keycode = ir->ir_codes;
71 dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
72 dev->keycodemax = IR_KEYTAB_SIZE;
73 for (i = 0; i < IR_KEYTAB_SIZE; i++)
74 set_bit(ir->ir_codes[i], dev->keybit);
75 clear_bit(0, dev->keybit);
76
77 set_bit(EV_KEY, dev->evbit);
78 if (repeat)
79 set_bit(EV_REP, dev->evbit);
80}
81
82void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir)
83{
84 if (ir->keypressed) {
85 ir->keypressed = 0;
86 ir_input_key_event(dev,ir);
87 }
88}
89
90void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
91 u32 ir_key, u32 ir_raw)
92{
93 u32 keycode = IR_KEYCODE(ir->ir_codes, ir_key);
94
95 if (ir->keypressed && ir->keycode != keycode) {
96 ir->keypressed = 0;
97 ir_input_key_event(dev,ir);
98 }
99 if (!ir->keypressed) {
100 ir->ir_key = ir_key;
101 ir->ir_raw = ir_raw;
102 ir->keycode = keycode;
103 ir->keypressed = 1;
104 ir_input_key_event(dev,ir);
105 }
106}
107
108/* -------------------------------------------------------------------------- */
109
110u32 ir_extract_bits(u32 data, u32 mask)
111{
112 int mbit, vbit;
113 u32 value;
114
115 value = 0;
116 vbit = 0;
117 for (mbit = 0; mbit < 32; mbit++) {
118 if (!(mask & ((u32)1 << mbit)))
119 continue;
120 if (data & ((u32)1 << mbit))
121 value |= (1 << vbit);
122 vbit++;
123 }
124 return value;
125}
126
127static int inline getbit(u32 *samples, int bit)
128{
129 return (samples[bit/32] & (1 << (31-(bit%32)))) ? 1 : 0;
130}
131
132/* sump raw samples for visual debugging ;) */
133int ir_dump_samples(u32 *samples, int count)
134{
135 int i, bit, start;
136
137 printk(KERN_DEBUG "ir samples: ");
138 start = 0;
139 for (i = 0; i < count * 32; i++) {
140 bit = getbit(samples,i);
141 if (bit)
142 start = 1;
143 if (0 == start)
144 continue;
145 printk("%s", bit ? "#" : "_");
146 }
147 printk("\n");
148 return 0;
149}
150
151/* decode raw samples, pulse distance coding used by NEC remotes */
152int ir_decode_pulsedistance(u32 *samples, int count, int low, int high)
153{
154 int i,last,bit,len;
155 u32 curBit;
156 u32 value;
157
158 /* find start burst */
159 for (i = len = 0; i < count * 32; i++) {
160 bit = getbit(samples,i);
161 if (bit) {
162 len++;
163 } else {
164 if (len >= 29)
165 break;
166 len = 0;
167 }
168 }
169
170 /* start burst to short */
171 if (len < 29)
172 return 0xffffffff;
173
174 /* find start silence */
175 for (len = 0; i < count * 32; i++) {
176 bit = getbit(samples,i);
177 if (bit) {
178 break;
179 } else {
180 len++;
181 }
182 }
183
184 /* silence to short */
185 if (len < 7)
186 return 0xffffffff;
187
188 /* go decoding */
189 len = 0;
190 last = 1;
191 value = 0; curBit = 1;
192 for (; i < count * 32; i++) {
193 bit = getbit(samples,i);
194 if (last) {
195 if(bit) {
196 continue;
197 } else {
198 len = 1;
199 }
200 } else {
201 if (bit) {
202 if (len > (low + high) /2)
203 value |= curBit;
204 curBit <<= 1;
205 if (curBit == 1)
206 break;
207 } else {
208 len++;
209 }
210 }
211 last = bit;
212 }
213
214 return value;
215}
216
217/* decode raw samples, biphase coding, used by rc5 for example */
218int ir_decode_biphase(u32 *samples, int count, int low, int high)
219{
220 int i,last,bit,len,flips;
221 u32 value;
222
223 /* find start bit (1) */
224 for (i = 0; i < 32; i++) {
225 bit = getbit(samples,i);
226 if (bit)
227 break;
228 }
229
230 /* go decoding */
231 len = 0;
232 flips = 0;
233 value = 1;
234 for (; i < count * 32; i++) {
235 if (len > high)
236 break;
237 if (flips > 1)
238 break;
239 last = bit;
240 bit = getbit(samples,i);
241 if (last == bit) {
242 len++;
243 continue;
244 }
245 if (len < low) {
246 len++;
247 flips++;
248 continue;
249 }
250 value <<= 1;
251 value |= bit;
252 flips = 0;
253 len = 1;
254 }
255 return value;
256}
257
258EXPORT_SYMBOL_GPL(ir_input_init);
259EXPORT_SYMBOL_GPL(ir_input_nokey);
260EXPORT_SYMBOL_GPL(ir_input_keydown);
261
262EXPORT_SYMBOL_GPL(ir_extract_bits);
263EXPORT_SYMBOL_GPL(ir_dump_samples);
264EXPORT_SYMBOL_GPL(ir_decode_biphase);
265EXPORT_SYMBOL_GPL(ir_decode_pulsedistance);
266
267/*
268 * Local variables:
269 * c-basic-offset: 8
270 * End:
271 */
272
diff --git a/drivers/media/common/ir-keymaps.c b/drivers/media/common/ir-keymaps.c
new file mode 100644
index 00000000000..a294d5c2c73
--- /dev/null
+++ b/drivers/media/common/ir-keymaps.c
@@ -0,0 +1,1415 @@
1/*
2
3
4 Keytables for supported remote controls. This file is part of
5 video4linux.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 */
22#include <linux/module.h>
23#include <linux/moduleparam.h>
24
25#include <linux/input.h>
26#include <media/ir-common.h>
27
28/* empty keytable, can be used as placeholder for not-yet created keytables */
29IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = {
30 [ 0x2a ] = KEY_COFFEE,
31};
32
33EXPORT_SYMBOL_GPL(ir_codes_empty);
34
35/* Matt Jesson <dvb@jesson.eclipse.co.uk */
36IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE] = {
37 [ 0x28 ] = KEY_0, //'0' / 'enter'
38 [ 0x22 ] = KEY_1, //'1'
39 [ 0x12 ] = KEY_2, //'2' / 'up arrow'
40 [ 0x32 ] = KEY_3, //'3'
41 [ 0x24 ] = KEY_4, //'4' / 'left arrow'
42 [ 0x14 ] = KEY_5, //'5'
43 [ 0x34 ] = KEY_6, //'6' / 'right arrow'
44 [ 0x26 ] = KEY_7, //'7'
45 [ 0x16 ] = KEY_8, //'8' / 'down arrow'
46 [ 0x36 ] = KEY_9, //'9'
47
48 [ 0x20 ] = KEY_LIST, // 'source'
49 [ 0x10 ] = KEY_TEXT, // 'teletext'
50 [ 0x00 ] = KEY_POWER, // 'power'
51 [ 0x04 ] = KEY_AUDIO, // 'audio'
52 [ 0x06 ] = KEY_ZOOM, // 'full screen'
53 [ 0x18 ] = KEY_VIDEO, // 'display'
54 [ 0x38 ] = KEY_SEARCH, // 'loop'
55 [ 0x08 ] = KEY_INFO, // 'preview'
56 [ 0x2a ] = KEY_REWIND, // 'backward <<'
57 [ 0x1a ] = KEY_FASTFORWARD, // 'forward >>'
58 [ 0x3a ] = KEY_RECORD, // 'capture'
59 [ 0x0a ] = KEY_MUTE, // 'mute'
60 [ 0x2c ] = KEY_RECORD, // 'record'
61 [ 0x1c ] = KEY_PAUSE, // 'pause'
62 [ 0x3c ] = KEY_STOP, // 'stop'
63 [ 0x0c ] = KEY_PLAY, // 'play'
64 [ 0x2e ] = KEY_RED, // 'red'
65 [ 0x01 ] = KEY_BLUE, // 'blue' / 'cancel'
66 [ 0x0e ] = KEY_YELLOW, // 'yellow' / 'ok'
67 [ 0x21 ] = KEY_GREEN, // 'green'
68 [ 0x11 ] = KEY_CHANNELDOWN, // 'channel -'
69 [ 0x31 ] = KEY_CHANNELUP, // 'channel +'
70 [ 0x1e ] = KEY_VOLUMEDOWN, // 'volume -'
71 [ 0x3e ] = KEY_VOLUMEUP, // 'volume +'
72};
73
74EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt);
75
76/* Attila Kondoros <attila.kondoros@chello.hu> */
77IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = {
78
79 [ 0x01 ] = KEY_1,
80 [ 0x02 ] = KEY_2,
81 [ 0x03 ] = KEY_3,
82 [ 0x04 ] = KEY_4,
83 [ 0x05 ] = KEY_5,
84 [ 0x06 ] = KEY_6,
85 [ 0x07 ] = KEY_7,
86 [ 0x08 ] = KEY_8,
87 [ 0x09 ] = KEY_9,
88 [ 0x00 ] = KEY_0,
89 [ 0x17 ] = KEY_LAST, // +100
90 [ 0x0a ] = KEY_LIST, // recall
91
92
93 [ 0x1c ] = KEY_TUNER, // TV/FM
94 [ 0x15 ] = KEY_SEARCH, // scan
95 [ 0x12 ] = KEY_POWER, // power
96 [ 0x1f ] = KEY_VOLUMEDOWN, // vol up
97 [ 0x1b ] = KEY_VOLUMEUP, // vol down
98 [ 0x1e ] = KEY_CHANNELDOWN, // chn up
99 [ 0x1a ] = KEY_CHANNELUP, // chn down
100
101 [ 0x11 ] = KEY_VIDEO, // video
102 [ 0x0f ] = KEY_ZOOM, // full screen
103 [ 0x13 ] = KEY_MUTE, // mute/unmute
104 [ 0x10 ] = KEY_TEXT, // min
105
106 [ 0x0d ] = KEY_STOP, // freeze
107 [ 0x0e ] = KEY_RECORD, // record
108 [ 0x1d ] = KEY_PLAYPAUSE, // stop
109 [ 0x19 ] = KEY_PLAY, // play
110
111 [ 0x16 ] = KEY_GOTO, // osd
112 [ 0x14 ] = KEY_REFRESH, // default
113 [ 0x0c ] = KEY_KPPLUS, // fine tune >>>>
114 [ 0x18 ] = KEY_KPMINUS // fine tune <<<<
115};
116
117EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp);
118
119/* ---------------------------------------------------------------------- */
120
121IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE] = {
122
123 [ 0x1e ] = KEY_POWER, // power
124 [ 0x07 ] = KEY_MEDIA, // source
125 [ 0x1c ] = KEY_SEARCH, // scan
126
127/* FIXME: duplicate keycodes?
128 *
129 * These four keys seem to share the same GPIO as CH+, CH-, <<< and >>>
130 * The GPIO values are
131 * 6397fb for both "Scan <" and "CH -",
132 * 639ffb for "Scan >" and "CH+",
133 * 6384fb for "Tune <" and "<<<",
134 * 638cfb for "Tune >" and ">>>", regardless of the mask.
135 *
136 * [ 0x17 ] = KEY_BACK, // fm scan <<
137 * [ 0x1f ] = KEY_FORWARD, // fm scan >>
138 *
139 * [ 0x04 ] = KEY_LEFT, // fm tuning <
140 * [ 0x0c ] = KEY_RIGHT, // fm tuning >
141 *
142 * For now, these four keys are disabled. Pressing them will generate
143 * the CH+/CH-/<<</>>> events
144 */
145
146 [ 0x03 ] = KEY_TUNER, // TV/FM
147
148 [ 0x00 ] = KEY_RECORD,
149 [ 0x08 ] = KEY_STOP,
150 [ 0x11 ] = KEY_PLAY,
151
152 [ 0x1a ] = KEY_PLAYPAUSE, // freeze
153 [ 0x19 ] = KEY_ZOOM, // zoom
154 [ 0x0f ] = KEY_TEXT, // min
155
156 [ 0x01 ] = KEY_1,
157 [ 0x0b ] = KEY_2,
158 [ 0x1b ] = KEY_3,
159 [ 0x05 ] = KEY_4,
160 [ 0x09 ] = KEY_5,
161 [ 0x15 ] = KEY_6,
162 [ 0x06 ] = KEY_7,
163 [ 0x0a ] = KEY_8,
164 [ 0x12 ] = KEY_9,
165 [ 0x02 ] = KEY_0,
166 [ 0x10 ] = KEY_LAST, // +100
167 [ 0x13 ] = KEY_LIST, // recall
168
169 [ 0x1f ] = KEY_CHANNELUP, // chn down
170 [ 0x17 ] = KEY_CHANNELDOWN, // chn up
171 [ 0x16 ] = KEY_VOLUMEUP, // vol down
172 [ 0x14 ] = KEY_VOLUMEDOWN, // vol up
173
174 [ 0x04 ] = KEY_KPMINUS, // <<<
175 [ 0x0e ] = KEY_SETUP, // function
176 [ 0x0c ] = KEY_KPPLUS, // >>>
177
178 [ 0x0d ] = KEY_GOTO, // mts
179 [ 0x1d ] = KEY_REFRESH, // reset
180 [ 0x18 ] = KEY_MUTE // mute/unmute
181};
182
183EXPORT_SYMBOL_GPL(ir_codes_pixelview);
184
185IR_KEYTAB_TYPE ir_codes_nebula[IR_KEYTAB_SIZE] = {
186 [ 0x00 ] = KEY_0,
187 [ 0x01 ] = KEY_1,
188 [ 0x02 ] = KEY_2,
189 [ 0x03 ] = KEY_3,
190 [ 0x04 ] = KEY_4,
191 [ 0x05 ] = KEY_5,
192 [ 0x06 ] = KEY_6,
193 [ 0x07 ] = KEY_7,
194 [ 0x08 ] = KEY_8,
195 [ 0x09 ] = KEY_9,
196 [ 0x0a ] = KEY_TV,
197 [ 0x0b ] = KEY_AUX,
198 [ 0x0c ] = KEY_DVD,
199 [ 0x0d ] = KEY_POWER,
200 [ 0x0e ] = KEY_MHP, /* labelled 'Picture' */
201 [ 0x0f ] = KEY_AUDIO,
202 [ 0x10 ] = KEY_INFO,
203 [ 0x11 ] = KEY_F13, /* 16:9 */
204 [ 0x12 ] = KEY_F14, /* 14:9 */
205 [ 0x13 ] = KEY_EPG,
206 [ 0x14 ] = KEY_EXIT,
207 [ 0x15 ] = KEY_MENU,
208 [ 0x16 ] = KEY_UP,
209 [ 0x17 ] = KEY_DOWN,
210 [ 0x18 ] = KEY_LEFT,
211 [ 0x19 ] = KEY_RIGHT,
212 [ 0x1a ] = KEY_ENTER,
213 [ 0x1b ] = KEY_CHANNELUP,
214 [ 0x1c ] = KEY_CHANNELDOWN,
215 [ 0x1d ] = KEY_VOLUMEUP,
216 [ 0x1e ] = KEY_VOLUMEDOWN,
217 [ 0x1f ] = KEY_RED,
218 [ 0x20 ] = KEY_GREEN,
219 [ 0x21 ] = KEY_YELLOW,
220 [ 0x22 ] = KEY_BLUE,
221 [ 0x23 ] = KEY_SUBTITLE,
222 [ 0x24 ] = KEY_F15, /* AD */
223 [ 0x25 ] = KEY_TEXT,
224 [ 0x26 ] = KEY_MUTE,
225 [ 0x27 ] = KEY_REWIND,
226 [ 0x28 ] = KEY_STOP,
227 [ 0x29 ] = KEY_PLAY,
228 [ 0x2a ] = KEY_FASTFORWARD,
229 [ 0x2b ] = KEY_F16, /* chapter */
230 [ 0x2c ] = KEY_PAUSE,
231 [ 0x2d ] = KEY_PLAY,
232 [ 0x2e ] = KEY_RECORD,
233 [ 0x2f ] = KEY_F17, /* picture in picture */
234 [ 0x30 ] = KEY_KPPLUS, /* zoom in */
235 [ 0x31 ] = KEY_KPMINUS, /* zoom out */
236 [ 0x32 ] = KEY_F18, /* capture */
237 [ 0x33 ] = KEY_F19, /* web */
238 [ 0x34 ] = KEY_EMAIL,
239 [ 0x35 ] = KEY_PHONE,
240 [ 0x36 ] = KEY_PC
241};
242
243EXPORT_SYMBOL_GPL(ir_codes_nebula);
244
245/* DigitalNow DNTV Live DVB-T Remote */
246IR_KEYTAB_TYPE ir_codes_dntv_live_dvb_t[IR_KEYTAB_SIZE] = {
247 [ 0x00 ] = KEY_ESC, /* 'go up a level?' */
248 /* Keys 0 to 9 */
249 [ 0x0a ] = KEY_0,
250 [ 0x01 ] = KEY_1,
251 [ 0x02 ] = KEY_2,
252 [ 0x03 ] = KEY_3,
253 [ 0x04 ] = KEY_4,
254 [ 0x05 ] = KEY_5,
255 [ 0x06 ] = KEY_6,
256 [ 0x07 ] = KEY_7,
257 [ 0x08 ] = KEY_8,
258 [ 0x09 ] = KEY_9,
259
260 [ 0x0b ] = KEY_TUNER, /* tv/fm */
261 [ 0x0c ] = KEY_SEARCH, /* scan */
262 [ 0x0d ] = KEY_STOP,
263 [ 0x0e ] = KEY_PAUSE,
264 [ 0x0f ] = KEY_LIST, /* source */
265
266 [ 0x10 ] = KEY_MUTE,
267 [ 0x11 ] = KEY_REWIND, /* backward << */
268 [ 0x12 ] = KEY_POWER,
269 [ 0x13 ] = KEY_S, /* snap */
270 [ 0x14 ] = KEY_AUDIO, /* stereo */
271 [ 0x15 ] = KEY_CLEAR, /* reset */
272 [ 0x16 ] = KEY_PLAY,
273 [ 0x17 ] = KEY_ENTER,
274 [ 0x18 ] = KEY_ZOOM, /* full screen */
275 [ 0x19 ] = KEY_FASTFORWARD, /* forward >> */
276 [ 0x1a ] = KEY_CHANNELUP,
277 [ 0x1b ] = KEY_VOLUMEUP,
278 [ 0x1c ] = KEY_INFO, /* preview */
279 [ 0x1d ] = KEY_RECORD, /* record */
280 [ 0x1e ] = KEY_CHANNELDOWN,
281 [ 0x1f ] = KEY_VOLUMEDOWN,
282};
283
284EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t);
285
286/* ---------------------------------------------------------------------- */
287
288/* IO-DATA BCTV7E Remote */
289IR_KEYTAB_TYPE ir_codes_iodata_bctv7e[IR_KEYTAB_SIZE] = {
290 [ 0x40 ] = KEY_TV,
291 [ 0x20 ] = KEY_RADIO, /* FM */
292 [ 0x60 ] = KEY_EPG,
293 [ 0x00 ] = KEY_POWER,
294
295 /* Keys 0 to 9 */
296 [ 0x44 ] = KEY_0, /* 10 */
297 [ 0x50 ] = KEY_1,
298 [ 0x30 ] = KEY_2,
299 [ 0x70 ] = KEY_3,
300 [ 0x48 ] = KEY_4,
301 [ 0x28 ] = KEY_5,
302 [ 0x68 ] = KEY_6,
303 [ 0x58 ] = KEY_7,
304 [ 0x38 ] = KEY_8,
305 [ 0x78 ] = KEY_9,
306
307 [ 0x10 ] = KEY_L, /* Live */
308 [ 0x08 ] = KEY_T, /* Time Shift */
309
310 [ 0x18 ] = KEY_PLAYPAUSE, /* Play */
311
312 [ 0x24 ] = KEY_ENTER, /* 11 */
313 [ 0x64 ] = KEY_ESC, /* 12 */
314 [ 0x04 ] = KEY_M, /* Multi */
315
316 [ 0x54 ] = KEY_VIDEO,
317 [ 0x34 ] = KEY_CHANNELUP,
318 [ 0x74 ] = KEY_VOLUMEUP,
319 [ 0x14 ] = KEY_MUTE,
320
321 [ 0x4c ] = KEY_S, /* SVIDEO */
322 [ 0x2c ] = KEY_CHANNELDOWN,
323 [ 0x6c ] = KEY_VOLUMEDOWN,
324 [ 0x0c ] = KEY_ZOOM,
325
326 [ 0x5c ] = KEY_PAUSE,
327 [ 0x3c ] = KEY_C, /* || (red) */
328 [ 0x7c ] = KEY_RECORD, /* recording */
329 [ 0x1c ] = KEY_STOP,
330
331 [ 0x41 ] = KEY_REWIND, /* backward << */
332 [ 0x21 ] = KEY_PLAY,
333 [ 0x61 ] = KEY_FASTFORWARD, /* forward >> */
334 [ 0x01 ] = KEY_NEXT, /* skip >| */
335};
336
337EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e);
338
339/* ---------------------------------------------------------------------- */
340
341/* ADS Tech Instant TV DVB-T PCI Remote */
342IR_KEYTAB_TYPE ir_codes_adstech_dvb_t_pci[IR_KEYTAB_SIZE] = {
343 /* Keys 0 to 9 */
344 [ 0x4d ] = KEY_0,
345 [ 0x57 ] = KEY_1,
346 [ 0x4f ] = KEY_2,
347 [ 0x53 ] = KEY_3,
348 [ 0x56 ] = KEY_4,
349 [ 0x4e ] = KEY_5,
350 [ 0x5e ] = KEY_6,
351 [ 0x54 ] = KEY_7,
352 [ 0x4c ] = KEY_8,
353 [ 0x5c ] = KEY_9,
354
355 [ 0x5b ] = KEY_POWER,
356 [ 0x5f ] = KEY_MUTE,
357 [ 0x55 ] = KEY_GOTO,
358 [ 0x5d ] = KEY_SEARCH,
359 [ 0x17 ] = KEY_EPG, /* Guide */
360 [ 0x1f ] = KEY_MENU,
361 [ 0x0f ] = KEY_UP,
362 [ 0x46 ] = KEY_DOWN,
363 [ 0x16 ] = KEY_LEFT,
364 [ 0x1e ] = KEY_RIGHT,
365 [ 0x0e ] = KEY_SELECT, /* Enter */
366 [ 0x5a ] = KEY_INFO,
367 [ 0x52 ] = KEY_EXIT,
368 [ 0x59 ] = KEY_PREVIOUS,
369 [ 0x51 ] = KEY_NEXT,
370 [ 0x58 ] = KEY_REWIND,
371 [ 0x50 ] = KEY_FORWARD,
372 [ 0x44 ] = KEY_PLAYPAUSE,
373 [ 0x07 ] = KEY_STOP,
374 [ 0x1b ] = KEY_RECORD,
375 [ 0x13 ] = KEY_TUNER, /* Live */
376 [ 0x0a ] = KEY_A,
377 [ 0x12 ] = KEY_B,
378 [ 0x03 ] = KEY_PROG1, /* 1 */
379 [ 0x01 ] = KEY_PROG2, /* 2 */
380 [ 0x00 ] = KEY_PROG3, /* 3 */
381 [ 0x06 ] = KEY_DVD,
382 [ 0x48 ] = KEY_AUX, /* Photo */
383 [ 0x40 ] = KEY_VIDEO,
384 [ 0x19 ] = KEY_AUDIO, /* Music */
385 [ 0x0b ] = KEY_CHANNELUP,
386 [ 0x08 ] = KEY_CHANNELDOWN,
387 [ 0x15 ] = KEY_VOLUMEUP,
388 [ 0x1c ] = KEY_VOLUMEDOWN,
389};
390
391EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci);
392
393/* ---------------------------------------------------------------------- */
394
395/* MSI TV@nywhere remote */
396IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = {
397 /* Keys 0 to 9 */
398 [ 0x00 ] = KEY_0,
399 [ 0x01 ] = KEY_1,
400 [ 0x02 ] = KEY_2,
401 [ 0x03 ] = KEY_3,
402 [ 0x04 ] = KEY_4,
403 [ 0x05 ] = KEY_5,
404 [ 0x06 ] = KEY_6,
405 [ 0x07 ] = KEY_7,
406 [ 0x08 ] = KEY_8,
407 [ 0x09 ] = KEY_9,
408
409 [ 0x0c ] = KEY_MUTE,
410 [ 0x0f ] = KEY_SCREEN, /* Full Screen */
411 [ 0x10 ] = KEY_F, /* Funtion */
412 [ 0x11 ] = KEY_T, /* Time shift */
413 [ 0x12 ] = KEY_POWER,
414 [ 0x13 ] = KEY_MEDIA, /* MTS */
415 [ 0x14 ] = KEY_SLOW,
416 [ 0x16 ] = KEY_REWIND, /* backward << */
417 [ 0x17 ] = KEY_ENTER, /* Return */
418 [ 0x18 ] = KEY_FASTFORWARD, /* forward >> */
419 [ 0x1a ] = KEY_CHANNELUP,
420 [ 0x1b ] = KEY_VOLUMEUP,
421 [ 0x1e ] = KEY_CHANNELDOWN,
422 [ 0x1f ] = KEY_VOLUMEDOWN,
423};
424
425EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere);
426
427/* ---------------------------------------------------------------------- */
428
429/* Cinergy 1400 DVB-T */
430IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = {
431 [ 0x01 ] = KEY_POWER,
432 [ 0x02 ] = KEY_1,
433 [ 0x03 ] = KEY_2,
434 [ 0x04 ] = KEY_3,
435 [ 0x05 ] = KEY_4,
436 [ 0x06 ] = KEY_5,
437 [ 0x07 ] = KEY_6,
438 [ 0x08 ] = KEY_7,
439 [ 0x09 ] = KEY_8,
440 [ 0x0a ] = KEY_9,
441 [ 0x0c ] = KEY_0,
442
443 [ 0x0b ] = KEY_VIDEO,
444 [ 0x0d ] = KEY_REFRESH,
445 [ 0x0e ] = KEY_SELECT,
446 [ 0x0f ] = KEY_EPG,
447 [ 0x10 ] = KEY_UP,
448 [ 0x11 ] = KEY_LEFT,
449 [ 0x12 ] = KEY_OK,
450 [ 0x13 ] = KEY_RIGHT,
451 [ 0x14 ] = KEY_DOWN,
452 [ 0x15 ] = KEY_TEXT,
453 [ 0x16 ] = KEY_INFO,
454
455 [ 0x17 ] = KEY_RED,
456 [ 0x18 ] = KEY_GREEN,
457 [ 0x19 ] = KEY_YELLOW,
458 [ 0x1a ] = KEY_BLUE,
459
460 [ 0x1b ] = KEY_CHANNELUP,
461 [ 0x1c ] = KEY_VOLUMEUP,
462 [ 0x1d ] = KEY_MUTE,
463 [ 0x1e ] = KEY_VOLUMEDOWN,
464 [ 0x1f ] = KEY_CHANNELDOWN,
465
466 [ 0x40 ] = KEY_PAUSE,
467 [ 0x4c ] = KEY_PLAY,
468 [ 0x58 ] = KEY_RECORD,
469 [ 0x54 ] = KEY_PREVIOUS,
470 [ 0x48 ] = KEY_STOP,
471 [ 0x5c ] = KEY_NEXT,
472};
473
474EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400);
475
476/* ---------------------------------------------------------------------- */
477
478/* AVERTV STUDIO 303 Remote */
479IR_KEYTAB_TYPE ir_codes_avertv_303[IR_KEYTAB_SIZE] = {
480 [ 0x2a ] = KEY_1,
481 [ 0x32 ] = KEY_2,
482 [ 0x3a ] = KEY_3,
483 [ 0x4a ] = KEY_4,
484 [ 0x52 ] = KEY_5,
485 [ 0x5a ] = KEY_6,
486 [ 0x6a ] = KEY_7,
487 [ 0x72 ] = KEY_8,
488 [ 0x7a ] = KEY_9,
489 [ 0x0e ] = KEY_0,
490
491 [ 0x02 ] = KEY_POWER,
492 [ 0x22 ] = KEY_VIDEO,
493 [ 0x42 ] = KEY_AUDIO,
494 [ 0x62 ] = KEY_ZOOM,
495 [ 0x0a ] = KEY_TV,
496 [ 0x12 ] = KEY_CD,
497 [ 0x1a ] = KEY_TEXT,
498
499 [ 0x16 ] = KEY_SUBTITLE,
500 [ 0x1e ] = KEY_REWIND,
501 [ 0x06 ] = KEY_PRINT,
502
503 [ 0x2e ] = KEY_SEARCH,
504 [ 0x36 ] = KEY_SLEEP,
505 [ 0x3e ] = KEY_SHUFFLE,
506 [ 0x26 ] = KEY_MUTE,
507
508 [ 0x4e ] = KEY_RECORD,
509 [ 0x56 ] = KEY_PAUSE,
510 [ 0x5e ] = KEY_STOP,
511 [ 0x46 ] = KEY_PLAY,
512
513 [ 0x6e ] = KEY_RED,
514 [ 0x0b ] = KEY_GREEN,
515 [ 0x66 ] = KEY_YELLOW,
516 [ 0x03 ] = KEY_BLUE,
517
518 [ 0x76 ] = KEY_LEFT,
519 [ 0x7e ] = KEY_RIGHT,
520 [ 0x13 ] = KEY_DOWN,
521 [ 0x1b ] = KEY_UP,
522};
523
524EXPORT_SYMBOL_GPL(ir_codes_avertv_303);
525
526/* ---------------------------------------------------------------------- */
527
528/* DigitalNow DNTV Live! DVB-T Pro Remote */
529IR_KEYTAB_TYPE ir_codes_dntv_live_dvbt_pro[IR_KEYTAB_SIZE] = {
530 [ 0x16 ] = KEY_POWER,
531 [ 0x5b ] = KEY_HOME,
532
533 [ 0x55 ] = KEY_TV, /* live tv */
534 [ 0x58 ] = KEY_TUNER, /* digital Radio */
535 [ 0x5a ] = KEY_RADIO, /* FM radio */
536 [ 0x59 ] = KEY_DVD, /* dvd menu */
537 [ 0x03 ] = KEY_1,
538 [ 0x01 ] = KEY_2,
539 [ 0x06 ] = KEY_3,
540 [ 0x09 ] = KEY_4,
541 [ 0x1d ] = KEY_5,
542 [ 0x1f ] = KEY_6,
543 [ 0x0d ] = KEY_7,
544 [ 0x19 ] = KEY_8,
545 [ 0x1b ] = KEY_9,
546 [ 0x0c ] = KEY_CANCEL,
547 [ 0x15 ] = KEY_0,
548 [ 0x4a ] = KEY_CLEAR,
549 [ 0x13 ] = KEY_BACK,
550 [ 0x00 ] = KEY_TAB,
551 [ 0x4b ] = KEY_UP,
552 [ 0x4e ] = KEY_LEFT,
553 [ 0x4f ] = KEY_OK,
554 [ 0x52 ] = KEY_RIGHT,
555 [ 0x51 ] = KEY_DOWN,
556 [ 0x1e ] = KEY_VOLUMEUP,
557 [ 0x0a ] = KEY_VOLUMEDOWN,
558 [ 0x02 ] = KEY_CHANNELDOWN,
559 [ 0x05 ] = KEY_CHANNELUP,
560 [ 0x11 ] = KEY_RECORD,
561 [ 0x14 ] = KEY_PLAY,
562 [ 0x4c ] = KEY_PAUSE,
563 [ 0x1a ] = KEY_STOP,
564 [ 0x40 ] = KEY_REWIND,
565 [ 0x12 ] = KEY_FASTFORWARD,
566 [ 0x41 ] = KEY_PREVIOUSSONG, /* replay |< */
567 [ 0x42 ] = KEY_NEXTSONG, /* skip >| */
568 [ 0x54 ] = KEY_CAMERA, /* capture */
569 [ 0x50 ] = KEY_LANGUAGE, /* sap */
570 [ 0x47 ] = KEY_TV2, /* pip */
571 [ 0x4d ] = KEY_SCREEN,
572 [ 0x43 ] = KEY_SUBTITLE,
573 [ 0x10 ] = KEY_MUTE,
574 [ 0x49 ] = KEY_AUDIO, /* l/r */
575 [ 0x07 ] = KEY_SLEEP,
576 [ 0x08 ] = KEY_VIDEO, /* a/v */
577 [ 0x0e ] = KEY_PREVIOUS, /* recall */
578 [ 0x45 ] = KEY_ZOOM, /* zoom + */
579 [ 0x46 ] = KEY_ANGLE, /* zoom - */
580 [ 0x56 ] = KEY_RED,
581 [ 0x57 ] = KEY_GREEN,
582 [ 0x5c ] = KEY_YELLOW,
583 [ 0x5d ] = KEY_BLUE,
584};
585
586EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro);
587
588IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE] = {
589 [ 0x01 ] = KEY_CHANNEL,
590 [ 0x02 ] = KEY_SELECT,
591 [ 0x03 ] = KEY_MUTE,
592 [ 0x04 ] = KEY_POWER,
593 [ 0x05 ] = KEY_1,
594 [ 0x06 ] = KEY_2,
595 [ 0x07 ] = KEY_3,
596 [ 0x08 ] = KEY_CHANNELUP,
597 [ 0x09 ] = KEY_4,
598 [ 0x0a ] = KEY_5,
599 [ 0x0b ] = KEY_6,
600 [ 0x0c ] = KEY_CHANNELDOWN,
601 [ 0x0d ] = KEY_7,
602 [ 0x0e ] = KEY_8,
603 [ 0x0f ] = KEY_9,
604 [ 0x10 ] = KEY_VOLUMEUP,
605 [ 0x11 ] = KEY_0,
606 [ 0x12 ] = KEY_MENU,
607 [ 0x13 ] = KEY_PRINT,
608 [ 0x14 ] = KEY_VOLUMEDOWN,
609 [ 0x16 ] = KEY_PAUSE,
610 [ 0x18 ] = KEY_RECORD,
611 [ 0x19 ] = KEY_REWIND,
612 [ 0x1a ] = KEY_PLAY,
613 [ 0x1b ] = KEY_FORWARD,
614 [ 0x1c ] = KEY_BACKSPACE,
615 [ 0x1e ] = KEY_STOP,
616 [ 0x40 ] = KEY_ZOOM,
617};
618
619EXPORT_SYMBOL_GPL(ir_codes_em_terratec);
620
621IR_KEYTAB_TYPE ir_codes_em_pinnacle_usb[IR_KEYTAB_SIZE] = {
622 [ 0x3a ] = KEY_0,
623 [ 0x31 ] = KEY_1,
624 [ 0x32 ] = KEY_2,
625 [ 0x33 ] = KEY_3,
626 [ 0x34 ] = KEY_4,
627 [ 0x35 ] = KEY_5,
628 [ 0x36 ] = KEY_6,
629 [ 0x37 ] = KEY_7,
630 [ 0x38 ] = KEY_8,
631 [ 0x39 ] = KEY_9,
632
633 [ 0x2f ] = KEY_POWER,
634
635 [ 0x2e ] = KEY_P,
636 [ 0x1f ] = KEY_L,
637 [ 0x2b ] = KEY_I,
638
639 [ 0x2d ] = KEY_ZOOM,
640 [ 0x1e ] = KEY_ZOOM,
641 [ 0x1b ] = KEY_VOLUMEUP,
642 [ 0x0f ] = KEY_VOLUMEDOWN,
643 [ 0x17 ] = KEY_CHANNELUP,
644 [ 0x1c ] = KEY_CHANNELDOWN,
645 [ 0x25 ] = KEY_INFO,
646
647 [ 0x3c ] = KEY_MUTE,
648
649 [ 0x3d ] = KEY_LEFT,
650 [ 0x3b ] = KEY_RIGHT,
651
652 [ 0x3f ] = KEY_UP,
653 [ 0x3e ] = KEY_DOWN,
654 [ 0x1a ] = KEY_PAUSE,
655
656 [ 0x1d ] = KEY_MENU,
657 [ 0x19 ] = KEY_PLAY,
658 [ 0x16 ] = KEY_REWIND,
659 [ 0x13 ] = KEY_FORWARD,
660 [ 0x15 ] = KEY_PAUSE,
661 [ 0x0e ] = KEY_REWIND,
662 [ 0x0d ] = KEY_PLAY,
663 [ 0x0b ] = KEY_STOP,
664 [ 0x07 ] = KEY_FORWARD,
665 [ 0x27 ] = KEY_RECORD,
666 [ 0x26 ] = KEY_TUNER,
667 [ 0x29 ] = KEY_TEXT,
668 [ 0x2a ] = KEY_MEDIA,
669 [ 0x18 ] = KEY_EPG,
670 [ 0x27 ] = KEY_RECORD,
671};
672
673EXPORT_SYMBOL_GPL(ir_codes_em_pinnacle_usb);
674
675IR_KEYTAB_TYPE ir_codes_flyvideo[IR_KEYTAB_SIZE] = {
676 [ 0x0f ] = KEY_0,
677 [ 0x03 ] = KEY_1,
678 [ 0x04 ] = KEY_2,
679 [ 0x05 ] = KEY_3,
680 [ 0x07 ] = KEY_4,
681 [ 0x08 ] = KEY_5,
682 [ 0x09 ] = KEY_6,
683 [ 0x0b ] = KEY_7,
684 [ 0x0c ] = KEY_8,
685 [ 0x0d ] = KEY_9,
686
687 [ 0x0e ] = KEY_MODE, // Air/Cable
688 [ 0x11 ] = KEY_VIDEO, // Video
689 [ 0x15 ] = KEY_AUDIO, // Audio
690 [ 0x00 ] = KEY_POWER, // Power
691 [ 0x18 ] = KEY_TUNER, // AV Source
692 [ 0x02 ] = KEY_ZOOM, // Fullscreen
693 [ 0x1a ] = KEY_LANGUAGE, // Stereo
694 [ 0x1b ] = KEY_MUTE, // Mute
695 [ 0x14 ] = KEY_VOLUMEUP, // Volume +
696 [ 0x17 ] = KEY_VOLUMEDOWN, // Volume -
697 [ 0x12 ] = KEY_CHANNELUP, // Channel +
698 [ 0x13 ] = KEY_CHANNELDOWN, // Channel -
699 [ 0x06 ] = KEY_AGAIN, // Recall
700 [ 0x10 ] = KEY_ENTER, // Enter
701};
702
703EXPORT_SYMBOL_GPL(ir_codes_flyvideo);
704
705IR_KEYTAB_TYPE ir_codes_flydvb[IR_KEYTAB_SIZE] = {
706 [ 0x01 ] = KEY_ZOOM, // Full Screen
707 [ 0x00 ] = KEY_POWER, // Power
708
709 [ 0x03 ] = KEY_1,
710 [ 0x04 ] = KEY_2,
711 [ 0x05 ] = KEY_3,
712 [ 0x07 ] = KEY_4,
713 [ 0x08 ] = KEY_5,
714 [ 0x09 ] = KEY_6,
715 [ 0x0b ] = KEY_7,
716 [ 0x0c ] = KEY_8,
717 [ 0x0d ] = KEY_9,
718 [ 0x06 ] = KEY_AGAIN, // Recall
719 [ 0x0f ] = KEY_0,
720 [ 0x10 ] = KEY_MUTE, // Mute
721 [ 0x02 ] = KEY_RADIO, // TV/Radio
722 [ 0x1b ] = KEY_LANGUAGE, // SAP (Second Audio Program)
723
724 [ 0x14 ] = KEY_VOLUMEUP, // VOL+
725 [ 0x17 ] = KEY_VOLUMEDOWN, // VOL-
726 [ 0x12 ] = KEY_CHANNELUP, // CH+
727 [ 0x13 ] = KEY_CHANNELDOWN, // CH-
728 [ 0x1d ] = KEY_ENTER, // Enter
729
730 [ 0x1a ] = KEY_MODE, // PIP
731 [ 0x18 ] = KEY_TUNER, // Source
732
733 [ 0x1e ] = KEY_RECORD, // Record/Pause
734 [ 0x15 ] = KEY_ANGLE, // Swap (no label on key)
735 [ 0x1c ] = KEY_PAUSE, // Timeshift/Pause
736 [ 0x19 ] = KEY_BACK, // Rewind <<
737 [ 0x0a ] = KEY_PLAYPAUSE, // Play/Pause
738 [ 0x1f ] = KEY_FORWARD, // Forward >>
739 [ 0x16 ] = KEY_PREVIOUS, // Back |<<
740 [ 0x11 ] = KEY_STOP, // Stop
741 [ 0x0e ] = KEY_NEXT, // End >>|
742};
743
744EXPORT_SYMBOL_GPL(ir_codes_flydvb);
745
746IR_KEYTAB_TYPE ir_codes_cinergy[IR_KEYTAB_SIZE] = {
747 [ 0x00 ] = KEY_0,
748 [ 0x01 ] = KEY_1,
749 [ 0x02 ] = KEY_2,
750 [ 0x03 ] = KEY_3,
751 [ 0x04 ] = KEY_4,
752 [ 0x05 ] = KEY_5,
753 [ 0x06 ] = KEY_6,
754 [ 0x07 ] = KEY_7,
755 [ 0x08 ] = KEY_8,
756 [ 0x09 ] = KEY_9,
757
758 [ 0x0a ] = KEY_POWER,
759 [ 0x0b ] = KEY_PROG1, // app
760 [ 0x0c ] = KEY_ZOOM, // zoom/fullscreen
761 [ 0x0d ] = KEY_CHANNELUP, // channel
762 [ 0x0e ] = KEY_CHANNELDOWN, // channel-
763 [ 0x0f ] = KEY_VOLUMEUP,
764 [ 0x10 ] = KEY_VOLUMEDOWN,
765 [ 0x11 ] = KEY_TUNER, // AV
766 [ 0x12 ] = KEY_NUMLOCK, // -/--
767 [ 0x13 ] = KEY_AUDIO, // audio
768 [ 0x14 ] = KEY_MUTE,
769 [ 0x15 ] = KEY_UP,
770 [ 0x16 ] = KEY_DOWN,
771 [ 0x17 ] = KEY_LEFT,
772 [ 0x18 ] = KEY_RIGHT,
773 [ 0x19 ] = BTN_LEFT,
774 [ 0x1a ] = BTN_RIGHT,
775 [ 0x1b ] = KEY_WWW, // text
776 [ 0x1c ] = KEY_REWIND,
777 [ 0x1d ] = KEY_FORWARD,
778 [ 0x1e ] = KEY_RECORD,
779 [ 0x1f ] = KEY_PLAY,
780 [ 0x20 ] = KEY_PREVIOUSSONG,
781 [ 0x21 ] = KEY_NEXTSONG,
782 [ 0x22 ] = KEY_PAUSE,
783 [ 0x23 ] = KEY_STOP,
784};
785
786EXPORT_SYMBOL_GPL(ir_codes_cinergy);
787
788/* Alfons Geser <a.geser@cox.net>
789 * updates from Job D. R. Borges <jobdrb@ig.com.br> */
790IR_KEYTAB_TYPE ir_codes_eztv[IR_KEYTAB_SIZE] = {
791 [ 0x12 ] = KEY_POWER,
792 [ 0x01 ] = KEY_TV, // DVR
793 [ 0x15 ] = KEY_DVD, // DVD
794 [ 0x17 ] = KEY_AUDIO, // music
795 // DVR mode / DVD mode / music mode
796
797 [ 0x1b ] = KEY_MUTE, // mute
798 [ 0x02 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek
799 [ 0x1e ] = KEY_SUBTITLE, // closed captioning / subtitle / seek
800 [ 0x16 ] = KEY_ZOOM, // full screen
801 [ 0x1c ] = KEY_VIDEO, // video source / eject / delall
802 [ 0x1d ] = KEY_RESTART, // playback / angle / del
803 [ 0x2f ] = KEY_SEARCH, // scan / menu / playlist
804 [ 0x30 ] = KEY_CHANNEL, // CH surfing / bookmark / memo
805
806 [ 0x31 ] = KEY_HELP, // help
807 [ 0x32 ] = KEY_MODE, // num/memo
808 [ 0x33 ] = KEY_ESC, // cancel
809
810 [ 0x0c ] = KEY_UP, // up
811 [ 0x10 ] = KEY_DOWN, // down
812 [ 0x08 ] = KEY_LEFT, // left
813 [ 0x04 ] = KEY_RIGHT, // right
814 [ 0x03 ] = KEY_SELECT, // select
815
816 [ 0x1f ] = KEY_REWIND, // rewind
817 [ 0x20 ] = KEY_PLAYPAUSE, // play/pause
818 [ 0x29 ] = KEY_FORWARD, // forward
819 [ 0x14 ] = KEY_AGAIN, // repeat
820 [ 0x2b ] = KEY_RECORD, // recording
821 [ 0x2c ] = KEY_STOP, // stop
822 [ 0x2d ] = KEY_PLAY, // play
823 [ 0x2e ] = KEY_SHUFFLE, // snapshot / shuffle
824
825 [ 0x00 ] = KEY_0,
826 [ 0x05 ] = KEY_1,
827 [ 0x06 ] = KEY_2,
828 [ 0x07 ] = KEY_3,
829 [ 0x09 ] = KEY_4,
830 [ 0x0a ] = KEY_5,
831 [ 0x0b ] = KEY_6,
832 [ 0x0d ] = KEY_7,
833 [ 0x0e ] = KEY_8,
834 [ 0x0f ] = KEY_9,
835
836 [ 0x2a ] = KEY_VOLUMEUP,
837 [ 0x11 ] = KEY_VOLUMEDOWN,
838 [ 0x18 ] = KEY_CHANNELUP, // CH.tracking up
839 [ 0x19 ] = KEY_CHANNELDOWN, // CH.tracking down
840
841 [ 0x13 ] = KEY_ENTER, // enter
842 [ 0x21 ] = KEY_DOT, // . (decimal dot)
843};
844
845EXPORT_SYMBOL_GPL(ir_codes_eztv);
846
847/* Alex Hermann <gaaf@gmx.net> */
848IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE] = {
849 [ 0x28 ] = KEY_1,
850 [ 0x18 ] = KEY_2,
851 [ 0x38 ] = KEY_3,
852 [ 0x24 ] = KEY_4,
853 [ 0x14 ] = KEY_5,
854 [ 0x34 ] = KEY_6,
855 [ 0x2c ] = KEY_7,
856 [ 0x1c ] = KEY_8,
857 [ 0x3c ] = KEY_9,
858 [ 0x22 ] = KEY_0,
859
860 [ 0x20 ] = KEY_TV, /* TV/FM */
861 [ 0x10 ] = KEY_CD, /* CD */
862 [ 0x30 ] = KEY_TEXT, /* TELETEXT */
863 [ 0x00 ] = KEY_POWER, /* POWER */
864
865 [ 0x08 ] = KEY_VIDEO, /* VIDEO */
866 [ 0x04 ] = KEY_AUDIO, /* AUDIO */
867 [ 0x0c ] = KEY_ZOOM, /* FULL SCREEN */
868
869 [ 0x12 ] = KEY_SUBTITLE, /* DISPLAY */
870 [ 0x32 ] = KEY_REWIND, /* LOOP */
871 [ 0x02 ] = KEY_PRINT, /* PREVIEW */
872
873 [ 0x2a ] = KEY_SEARCH, /* AUTOSCAN */
874 [ 0x1a ] = KEY_SLEEP, /* FREEZE */
875 [ 0x3a ] = KEY_SHUFFLE, /* SNAPSHOT */
876 [ 0x0a ] = KEY_MUTE, /* MUTE */
877
878 [ 0x26 ] = KEY_RECORD, /* RECORD */
879 [ 0x16 ] = KEY_PAUSE, /* PAUSE */
880 [ 0x36 ] = KEY_STOP, /* STOP */
881 [ 0x06 ] = KEY_PLAY, /* PLAY */
882
883 [ 0x2e ] = KEY_RED, /* RED */
884 [ 0x21 ] = KEY_GREEN, /* GREEN */
885 [ 0x0e ] = KEY_YELLOW, /* YELLOW */
886 [ 0x01 ] = KEY_BLUE, /* BLUE */
887
888 [ 0x1e ] = KEY_VOLUMEDOWN, /* VOLUME- */
889 [ 0x3e ] = KEY_VOLUMEUP, /* VOLUME+ */
890 [ 0x11 ] = KEY_CHANNELDOWN, /* CHANNEL/PAGE- */
891 [ 0x31 ] = KEY_CHANNELUP /* CHANNEL/PAGE+ */
892};
893
894EXPORT_SYMBOL_GPL(ir_codes_avermedia);
895
896IR_KEYTAB_TYPE ir_codes_videomate_tv_pvr[IR_KEYTAB_SIZE] = {
897 [ 0x14 ] = KEY_MUTE,
898 [ 0x24 ] = KEY_ZOOM,
899
900 [ 0x01 ] = KEY_DVD,
901 [ 0x23 ] = KEY_RADIO,
902 [ 0x00 ] = KEY_TV,
903
904 [ 0x0a ] = KEY_REWIND,
905 [ 0x08 ] = KEY_PLAYPAUSE,
906 [ 0x0f ] = KEY_FORWARD,
907
908 [ 0x02 ] = KEY_PREVIOUS,
909 [ 0x07 ] = KEY_STOP,
910 [ 0x06 ] = KEY_NEXT,
911
912 [ 0x0c ] = KEY_UP,
913 [ 0x0e ] = KEY_DOWN,
914 [ 0x0b ] = KEY_LEFT,
915 [ 0x0d ] = KEY_RIGHT,
916 [ 0x11 ] = KEY_OK,
917
918 [ 0x03 ] = KEY_MENU,
919 [ 0x09 ] = KEY_SETUP,
920 [ 0x05 ] = KEY_VIDEO,
921 [ 0x22 ] = KEY_CHANNEL,
922
923 [ 0x12 ] = KEY_VOLUMEUP,
924 [ 0x15 ] = KEY_VOLUMEDOWN,
925 [ 0x10 ] = KEY_CHANNELUP,
926 [ 0x13 ] = KEY_CHANNELDOWN,
927
928 [ 0x04 ] = KEY_RECORD,
929
930 [ 0x16 ] = KEY_1,
931 [ 0x17 ] = KEY_2,
932 [ 0x18 ] = KEY_3,
933 [ 0x19 ] = KEY_4,
934 [ 0x1a ] = KEY_5,
935 [ 0x1b ] = KEY_6,
936 [ 0x1c ] = KEY_7,
937 [ 0x1d ] = KEY_8,
938 [ 0x1e ] = KEY_9,
939 [ 0x1f ] = KEY_0,
940
941 [ 0x20 ] = KEY_LANGUAGE,
942 [ 0x21 ] = KEY_SLEEP,
943};
944
945EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr);
946
947/* Michael Tokarev <mjt@tls.msk.ru>
948 http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
949 keytable is used by MANLI MTV00[ 0x0c ] and BeholdTV 40[13] at
950 least, and probably other cards too.
951 The "ascii-art picture" below (in comments, first row
952 is the keycode in hex, and subsequent row(s) shows
953 the button labels (several variants when appropriate)
954 helps to descide which keycodes to assign to the buttons.
955 */
956IR_KEYTAB_TYPE ir_codes_manli[IR_KEYTAB_SIZE] = {
957
958 /* 0x1c 0x12 *
959 * FUNCTION POWER *
960 * FM (|) *
961 * */
962 [ 0x1c ] = KEY_RADIO, /*XXX*/
963 [ 0x12 ] = KEY_POWER,
964
965 /* 0x01 0x02 0x03 *
966 * 1 2 3 *
967 * *
968 * 0x04 0x05 0x06 *
969 * 4 5 6 *
970 * *
971 * 0x07 0x08 0x09 *
972 * 7 8 9 *
973 * */
974 [ 0x01 ] = KEY_1,
975 [ 0x02 ] = KEY_2,
976 [ 0x03 ] = KEY_3,
977 [ 0x04 ] = KEY_4,
978 [ 0x05 ] = KEY_5,
979 [ 0x06 ] = KEY_6,
980 [ 0x07 ] = KEY_7,
981 [ 0x08 ] = KEY_8,
982 [ 0x09 ] = KEY_9,
983
984 /* 0x0a 0x00 0x17 *
985 * RECALL 0 +100 *
986 * PLUS *
987 * */
988 [ 0x0a ] = KEY_AGAIN, /*XXX KEY_REWIND? */
989 [ 0x00 ] = KEY_0,
990 [ 0x17 ] = KEY_DIGITS, /*XXX*/
991
992 /* 0x14 0x10 *
993 * MENU INFO *
994 * OSD */
995 [ 0x14 ] = KEY_MENU,
996 [ 0x10 ] = KEY_INFO,
997
998 /* 0x0b *
999 * Up *
1000 * *
1001 * 0x18 0x16 0x0c *
1002 * Left Ok Right *
1003 * *
1004 * 0x015 *
1005 * Down *
1006 * */
1007 [ 0x0b ] = KEY_UP, /*XXX KEY_SCROLLUP? */
1008 [ 0x18 ] = KEY_LEFT, /*XXX KEY_BACK? */
1009 [ 0x16 ] = KEY_OK, /*XXX KEY_SELECT? KEY_ENTER? */
1010 [ 0x0c ] = KEY_RIGHT, /*XXX KEY_FORWARD? */
1011 [ 0x15 ] = KEY_DOWN, /*XXX KEY_SCROLLDOWN? */
1012
1013 /* 0x11 0x0d *
1014 * TV/AV MODE *
1015 * SOURCE STEREO *
1016 * */
1017 [ 0x11 ] = KEY_TV, /*XXX*/
1018 [ 0x0d ] = KEY_MODE, /*XXX there's no KEY_STEREO */
1019
1020 /* 0x0f 0x1b 0x1a *
1021 * AUDIO Vol+ Chan+ *
1022 * TIMESHIFT??? *
1023 * *
1024 * 0x0e 0x1f 0x1e *
1025 * SLEEP Vol- Chan- *
1026 * */
1027 [ 0x0f ] = KEY_AUDIO,
1028 [ 0x1b ] = KEY_VOLUMEUP,
1029 [ 0x1a ] = KEY_CHANNELUP,
1030 [ 0x0e ] = KEY_SLEEP, /*XXX maybe KEY_PAUSE */
1031 [ 0x1f ] = KEY_VOLUMEDOWN,
1032 [ 0x1e ] = KEY_CHANNELDOWN,
1033
1034 /* 0x13 0x19 *
1035 * MUTE SNAPSHOT*
1036 * */
1037 [ 0x13 ] = KEY_MUTE,
1038 [ 0x19 ] = KEY_RECORD, /*XXX*/
1039
1040 // 0x1d unused ?
1041};
1042
1043EXPORT_SYMBOL_GPL(ir_codes_manli);
1044
1045/* Mike Baikov <mike@baikov.com> */
1046IR_KEYTAB_TYPE ir_codes_gotview7135[IR_KEYTAB_SIZE] = {
1047
1048 [ 0x21 ] = KEY_POWER,
1049 [ 0x69 ] = KEY_TV,
1050 [ 0x33 ] = KEY_0,
1051 [ 0x51 ] = KEY_1,
1052 [ 0x31 ] = KEY_2,
1053 [ 0x71 ] = KEY_3,
1054 [ 0x3b ] = KEY_4,
1055 [ 0x58 ] = KEY_5,
1056 [ 0x41 ] = KEY_6,
1057 [ 0x48 ] = KEY_7,
1058 [ 0x30 ] = KEY_8,
1059 [ 0x53 ] = KEY_9,
1060 [ 0x73 ] = KEY_AGAIN, /* LOOP */
1061 [ 0x0a ] = KEY_AUDIO,
1062 [ 0x61 ] = KEY_PRINT, /* PREVIEW */
1063 [ 0x7a ] = KEY_VIDEO,
1064 [ 0x20 ] = KEY_CHANNELUP,
1065 [ 0x40 ] = KEY_CHANNELDOWN,
1066 [ 0x18 ] = KEY_VOLUMEDOWN,
1067 [ 0x50 ] = KEY_VOLUMEUP,
1068 [ 0x10 ] = KEY_MUTE,
1069 [ 0x4a ] = KEY_SEARCH,
1070 [ 0x7b ] = KEY_SHUFFLE, /* SNAPSHOT */
1071 [ 0x22 ] = KEY_RECORD,
1072 [ 0x62 ] = KEY_STOP,
1073 [ 0x78 ] = KEY_PLAY,
1074 [ 0x39 ] = KEY_REWIND,
1075 [ 0x59 ] = KEY_PAUSE,
1076 [ 0x19 ] = KEY_FORWARD,
1077 [ 0x09 ] = KEY_ZOOM,
1078
1079 [ 0x52 ] = KEY_F21, /* LIVE TIMESHIFT */
1080 [ 0x1a ] = KEY_F22, /* MIN TIMESHIFT */
1081 [ 0x3a ] = KEY_F23, /* TIMESHIFT */
1082 [ 0x70 ] = KEY_F24, /* NORMAL TIMESHIFT */
1083};
1084
1085EXPORT_SYMBOL_GPL(ir_codes_gotview7135);
1086
1087IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
1088 [ 0x03 ] = KEY_POWER,
1089 [ 0x6f ] = KEY_MUTE,
1090 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
1091
1092 [ 0x11 ] = KEY_0,
1093 [ 0x04 ] = KEY_1,
1094 [ 0x05 ] = KEY_2,
1095 [ 0x06 ] = KEY_3,
1096 [ 0x08 ] = KEY_4,
1097 [ 0x09 ] = KEY_5,
1098 [ 0x0a ] = KEY_6,
1099 [ 0x0c ] = KEY_7,
1100 [ 0x0d ] = KEY_8,
1101 [ 0x0e ] = KEY_9,
1102 [ 0x12 ] = KEY_DOT, /* 100+ */
1103
1104 [ 0x07 ] = KEY_VOLUMEUP,
1105 [ 0x0b ] = KEY_VOLUMEDOWN,
1106 [ 0x1a ] = KEY_KPPLUS,
1107 [ 0x18 ] = KEY_KPMINUS,
1108 [ 0x15 ] = KEY_UP,
1109 [ 0x1d ] = KEY_DOWN,
1110 [ 0x0f ] = KEY_CHANNELUP,
1111 [ 0x13 ] = KEY_CHANNELDOWN,
1112 [ 0x48 ] = KEY_ZOOM,
1113
1114 [ 0x1b ] = KEY_VIDEO, /* Video source */
1115 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
1116 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
1117
1118 [ 0x4b ] = KEY_RECORD,
1119 [ 0x46 ] = KEY_PLAY,
1120 [ 0x45 ] = KEY_PAUSE, /* Pause */
1121 [ 0x44 ] = KEY_STOP,
1122 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
1123 [ 0x42 ] = KEY_REWIND, /* Backward ? */
1124
1125};
1126
1127EXPORT_SYMBOL_GPL(ir_codes_purpletv);
1128
1129/* Mapping for the 28 key remote control as seen at
1130 http://www.sednacomputer.com/photo/cardbus-tv.jpg
1131 Pavel Mihaylov <bin@bash.info> */
1132IR_KEYTAB_TYPE ir_codes_pctv_sedna[IR_KEYTAB_SIZE] = {
1133 [ 0x00 ] = KEY_0,
1134 [ 0x01 ] = KEY_1,
1135 [ 0x02 ] = KEY_2,
1136 [ 0x03 ] = KEY_3,
1137 [ 0x04 ] = KEY_4,
1138 [ 0x05 ] = KEY_5,
1139 [ 0x06 ] = KEY_6,
1140 [ 0x07 ] = KEY_7,
1141 [ 0x08 ] = KEY_8,
1142 [ 0x09 ] = KEY_9,
1143
1144 [ 0x0a ] = KEY_AGAIN, /* Recall */
1145 [ 0x0b ] = KEY_CHANNELUP,
1146 [ 0x0c ] = KEY_VOLUMEUP,
1147 [ 0x0d ] = KEY_MODE, /* Stereo */
1148 [ 0x0e ] = KEY_STOP,
1149 [ 0x0f ] = KEY_PREVIOUSSONG,
1150 [ 0x10 ] = KEY_ZOOM,
1151 [ 0x11 ] = KEY_TUNER, /* Source */
1152 [ 0x12 ] = KEY_POWER,
1153 [ 0x13 ] = KEY_MUTE,
1154 [ 0x15 ] = KEY_CHANNELDOWN,
1155 [ 0x18 ] = KEY_VOLUMEDOWN,
1156 [ 0x19 ] = KEY_SHUFFLE, /* Snapshot */
1157 [ 0x1a ] = KEY_NEXTSONG,
1158 [ 0x1b ] = KEY_TEXT, /* Time Shift */
1159 [ 0x1c ] = KEY_RADIO, /* FM Radio */
1160 [ 0x1d ] = KEY_RECORD,
1161 [ 0x1e ] = KEY_PAUSE,
1162};
1163
1164EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna);
1165
1166/* Mark Phalan <phalanm@o2.ie> */
1167IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
1168 [ 0x00 ] = KEY_0,
1169 [ 0x01 ] = KEY_1,
1170 [ 0x02 ] = KEY_2,
1171 [ 0x03 ] = KEY_3,
1172 [ 0x04 ] = KEY_4,
1173 [ 0x05 ] = KEY_5,
1174 [ 0x06 ] = KEY_6,
1175 [ 0x07 ] = KEY_7,
1176 [ 0x08 ] = KEY_8,
1177 [ 0x09 ] = KEY_9,
1178
1179 [ 0x12 ] = KEY_POWER,
1180 [ 0x10 ] = KEY_MUTE,
1181 [ 0x1f ] = KEY_VOLUMEDOWN,
1182 [ 0x1b ] = KEY_VOLUMEUP,
1183 [ 0x1a ] = KEY_CHANNELUP,
1184 [ 0x1e ] = KEY_CHANNELDOWN,
1185 [ 0x0e ] = KEY_PAGEUP,
1186 [ 0x1d ] = KEY_PAGEDOWN,
1187 [ 0x13 ] = KEY_SOUND,
1188
1189 [ 0x18 ] = KEY_KPPLUSMINUS, /* CH +/- */
1190 [ 0x16 ] = KEY_SUBTITLE, /* CC */
1191 [ 0x0d ] = KEY_TEXT, /* TTX */
1192 [ 0x0b ] = KEY_TV, /* AIR/CBL */
1193 [ 0x11 ] = KEY_PC, /* PC/TV */
1194 [ 0x17 ] = KEY_OK, /* CH RTN */
1195 [ 0x19 ] = KEY_MODE, /* FUNC */
1196 [ 0x0c ] = KEY_SEARCH, /* AUTOSCAN */
1197
1198 /* Not sure what to do with these ones! */
1199 [ 0x0f ] = KEY_SELECT, /* SOURCE */
1200 [ 0x0a ] = KEY_KPPLUS, /* +100 */
1201 [ 0x14 ] = KEY_EQUAL, /* SYNC */
1202 [ 0x1c ] = KEY_MEDIA, /* PC/TV */
1203};
1204
1205EXPORT_SYMBOL_GPL(ir_codes_pv951);
1206
1207/* generic RC5 keytable */
1208/* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
1209/* used by old (black) Hauppauge remotes */
1210IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE] = {
1211 /* Keys 0 to 9 */
1212 [ 0x00 ] = KEY_0,
1213 [ 0x01 ] = KEY_1,
1214 [ 0x02 ] = KEY_2,
1215 [ 0x03 ] = KEY_3,
1216 [ 0x04 ] = KEY_4,
1217 [ 0x05 ] = KEY_5,
1218 [ 0x06 ] = KEY_6,
1219 [ 0x07 ] = KEY_7,
1220 [ 0x08 ] = KEY_8,
1221 [ 0x09 ] = KEY_9,
1222
1223 [ 0x0b ] = KEY_CHANNEL, /* channel / program (japan: 11) */
1224 [ 0x0c ] = KEY_POWER, /* standby */
1225 [ 0x0d ] = KEY_MUTE, /* mute / demute */
1226 [ 0x0f ] = KEY_TV, /* display */
1227 [ 0x10 ] = KEY_VOLUMEUP,
1228 [ 0x11 ] = KEY_VOLUMEDOWN,
1229 [ 0x12 ] = KEY_BRIGHTNESSUP,
1230 [ 0x13 ] = KEY_BRIGHTNESSDOWN,
1231 [ 0x1e ] = KEY_SEARCH, /* search + */
1232 [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */
1233 [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */
1234 [ 0x22 ] = KEY_CHANNEL, /* alt / channel */
1235 [ 0x23 ] = KEY_LANGUAGE, /* 1st / 2nd language */
1236 [ 0x26 ] = KEY_SLEEP, /* sleeptimer */
1237 [ 0x2e ] = KEY_MENU, /* 2nd controls (USA: menu) */
1238 [ 0x30 ] = KEY_PAUSE,
1239 [ 0x32 ] = KEY_REWIND,
1240 [ 0x33 ] = KEY_GOTO,
1241 [ 0x35 ] = KEY_PLAY,
1242 [ 0x36 ] = KEY_STOP,
1243 [ 0x37 ] = KEY_RECORD, /* recording */
1244 [ 0x3c ] = KEY_TEXT, /* teletext submode (Japan: 12) */
1245 [ 0x3d ] = KEY_SUSPEND, /* system standby */
1246
1247};
1248
1249EXPORT_SYMBOL_GPL(ir_codes_rc5_tv);
1250
1251/* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
1252IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
1253 /* Keys 0 to 9 */
1254 [ 0x12 ] = KEY_0,
1255 [ 0x05 ] = KEY_1,
1256 [ 0x06 ] = KEY_2,
1257 [ 0x07 ] = KEY_3,
1258 [ 0x09 ] = KEY_4,
1259 [ 0x0a ] = KEY_5,
1260 [ 0x0b ] = KEY_6,
1261 [ 0x0d ] = KEY_7,
1262 [ 0x0e ] = KEY_8,
1263 [ 0x0f ] = KEY_9,
1264
1265 [ 0x00 ] = KEY_POWER,
1266 [ 0x02 ] = KEY_TUNER, /* TV/FM */
1267 [ 0x1e ] = KEY_VIDEO,
1268 [ 0x04 ] = KEY_VOLUMEUP,
1269 [ 0x08 ] = KEY_VOLUMEDOWN,
1270 [ 0x0c ] = KEY_CHANNELUP,
1271 [ 0x10 ] = KEY_CHANNELDOWN,
1272 [ 0x03 ] = KEY_ZOOM, /* fullscreen */
1273 [ 0x1f ] = KEY_SUBTITLE, /* closed caption/teletext */
1274 [ 0x20 ] = KEY_SLEEP,
1275 [ 0x14 ] = KEY_MUTE,
1276 [ 0x2b ] = KEY_RED,
1277 [ 0x2c ] = KEY_GREEN,
1278 [ 0x2d ] = KEY_YELLOW,
1279 [ 0x2e ] = KEY_BLUE,
1280 [ 0x18 ] = KEY_KPPLUS, /* fine tune + */
1281 [ 0x19 ] = KEY_KPMINUS, /* fine tune - */
1282 [ 0x21 ] = KEY_DOT,
1283 [ 0x13 ] = KEY_ENTER,
1284 [ 0x22 ] = KEY_BACK,
1285 [ 0x23 ] = KEY_PLAYPAUSE,
1286 [ 0x24 ] = KEY_NEXT,
1287 [ 0x26 ] = KEY_STOP,
1288 [ 0x27 ] = KEY_RECORD
1289};
1290
1291EXPORT_SYMBOL_GPL(ir_codes_winfast);
1292
1293IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
1294 [ 0x59 ] = KEY_MUTE,
1295 [ 0x4a ] = KEY_POWER,
1296
1297 [ 0x18 ] = KEY_TEXT,
1298 [ 0x26 ] = KEY_TV,
1299 [ 0x3d ] = KEY_PRINT,
1300
1301 [ 0x48 ] = KEY_RED,
1302 [ 0x04 ] = KEY_GREEN,
1303 [ 0x11 ] = KEY_YELLOW,
1304 [ 0x00 ] = KEY_BLUE,
1305
1306 [ 0x2d ] = KEY_VOLUMEUP,
1307 [ 0x1e ] = KEY_VOLUMEDOWN,
1308
1309 [ 0x49 ] = KEY_MENU,
1310
1311 [ 0x16 ] = KEY_CHANNELUP,
1312 [ 0x17 ] = KEY_CHANNELDOWN,
1313
1314 [ 0x20 ] = KEY_UP,
1315 [ 0x21 ] = KEY_DOWN,
1316 [ 0x22 ] = KEY_LEFT,
1317 [ 0x23 ] = KEY_RIGHT,
1318 [ 0x0d ] = KEY_SELECT,
1319
1320
1321
1322 [ 0x08 ] = KEY_BACK,
1323 [ 0x07 ] = KEY_REFRESH,
1324
1325 [ 0x2f ] = KEY_ZOOM,
1326 [ 0x29 ] = KEY_RECORD,
1327
1328 [ 0x4b ] = KEY_PAUSE,
1329 [ 0x4d ] = KEY_REWIND,
1330 [ 0x2e ] = KEY_PLAY,
1331 [ 0x4e ] = KEY_FORWARD,
1332 [ 0x53 ] = KEY_PREVIOUS,
1333 [ 0x4c ] = KEY_STOP,
1334 [ 0x54 ] = KEY_NEXT,
1335
1336 [ 0x69 ] = KEY_0,
1337 [ 0x6a ] = KEY_1,
1338 [ 0x6b ] = KEY_2,
1339 [ 0x6c ] = KEY_3,
1340 [ 0x6d ] = KEY_4,
1341 [ 0x6e ] = KEY_5,
1342 [ 0x6f ] = KEY_6,
1343 [ 0x70 ] = KEY_7,
1344 [ 0x71 ] = KEY_8,
1345 [ 0x72 ] = KEY_9,
1346
1347 [ 0x74 ] = KEY_CHANNEL,
1348 [ 0x0a ] = KEY_BACKSPACE,
1349};
1350
1351EXPORT_SYMBOL_GPL(ir_codes_pinnacle);
1352
1353/* Hauppauge: the newer, gray remotes (seems there are multiple
1354 * slightly different versions), shipped with cx88+ivtv cards.
1355 * almost rc5 coding, but some non-standard keys */
1356IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = {
1357 /* Keys 0 to 9 */
1358 [ 0x00 ] = KEY_0,
1359 [ 0x01 ] = KEY_1,
1360 [ 0x02 ] = KEY_2,
1361 [ 0x03 ] = KEY_3,
1362 [ 0x04 ] = KEY_4,
1363 [ 0x05 ] = KEY_5,
1364 [ 0x06 ] = KEY_6,
1365 [ 0x07 ] = KEY_7,
1366 [ 0x08 ] = KEY_8,
1367 [ 0x09 ] = KEY_9,
1368
1369 [ 0x0a ] = KEY_TEXT, /* keypad asterisk as well */
1370 [ 0x0b ] = KEY_RED, /* red button */
1371 [ 0x0c ] = KEY_RADIO,
1372 [ 0x0d ] = KEY_MENU,
1373 [ 0x0e ] = KEY_SUBTITLE, /* also the # key */
1374 [ 0x0f ] = KEY_MUTE,
1375 [ 0x10 ] = KEY_VOLUMEUP,
1376 [ 0x11 ] = KEY_VOLUMEDOWN,
1377 [ 0x12 ] = KEY_PREVIOUS, /* previous channel */
1378 [ 0x14 ] = KEY_UP,
1379 [ 0x15 ] = KEY_DOWN,
1380 [ 0x16 ] = KEY_LEFT,
1381 [ 0x17 ] = KEY_RIGHT,
1382 [ 0x18 ] = KEY_VIDEO, /* Videos */
1383 [ 0x19 ] = KEY_AUDIO, /* Music */
1384 /* 0x1a: Pictures - presume this means
1385 "Multimedia Home Platform" -
1386 no "PICTURES" key in input.h
1387 */
1388 [ 0x1a ] = KEY_MHP,
1389
1390 [ 0x1b ] = KEY_EPG, /* Guide */
1391 [ 0x1c ] = KEY_TV,
1392 [ 0x1e ] = KEY_NEXTSONG, /* skip >| */
1393 [ 0x1f ] = KEY_EXIT, /* back/exit */
1394 [ 0x20 ] = KEY_CHANNELUP, /* channel / program + */
1395 [ 0x21 ] = KEY_CHANNELDOWN, /* channel / program - */
1396 [ 0x22 ] = KEY_CHANNEL, /* source (old black remote) */
1397 [ 0x24 ] = KEY_PREVIOUSSONG, /* replay |< */
1398 [ 0x25 ] = KEY_ENTER, /* OK */
1399 [ 0x26 ] = KEY_SLEEP, /* minimize (old black remote) */
1400 [ 0x29 ] = KEY_BLUE, /* blue key */
1401 [ 0x2e ] = KEY_GREEN, /* green button */
1402 [ 0x30 ] = KEY_PAUSE, /* pause */
1403 [ 0x32 ] = KEY_REWIND, /* backward << */
1404 [ 0x34 ] = KEY_FASTFORWARD, /* forward >> */
1405 [ 0x35 ] = KEY_PLAY,
1406 [ 0x36 ] = KEY_STOP,
1407 [ 0x37 ] = KEY_RECORD, /* recording */
1408 [ 0x38 ] = KEY_YELLOW, /* yellow key */
1409 [ 0x3b ] = KEY_SELECT, /* top right button */
1410 [ 0x3c ] = KEY_ZOOM, /* full */
1411 [ 0x3d ] = KEY_POWER, /* system power (green button) */
1412};
1413
1414EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new);
1415
diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
index 04c1938b9c9..8cdd4d265ff 100644
--- a/drivers/media/common/saa7146_core.c
+++ b/drivers/media/common/saa7146_core.c
@@ -21,7 +21,7 @@
21#include <media/saa7146.h> 21#include <media/saa7146.h>
22 22
23LIST_HEAD(saa7146_devices); 23LIST_HEAD(saa7146_devices);
24DECLARE_MUTEX(saa7146_devices_lock); 24DEFINE_MUTEX(saa7146_devices_lock);
25 25
26static int saa7146_num; 26static int saa7146_num;
27 27
@@ -116,8 +116,7 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
116 pg = vmalloc_to_page(virt); 116 pg = vmalloc_to_page(virt);
117 if (NULL == pg) 117 if (NULL == pg)
118 goto err; 118 goto err;
119 if (PageHighMem(pg)) 119 BUG_ON(PageHighMem(pg));
120 BUG();
121 sglist[i].page = pg; 120 sglist[i].page = pg;
122 sglist[i].length = PAGE_SIZE; 121 sglist[i].length = PAGE_SIZE;
123 } 122 }
@@ -402,11 +401,11 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
402 401
403 pci_set_drvdata(pci, dev); 402 pci_set_drvdata(pci, dev);
404 403
405 init_MUTEX(&dev->lock); 404 mutex_init(&dev->lock);
406 spin_lock_init(&dev->int_slock); 405 spin_lock_init(&dev->int_slock);
407 spin_lock_init(&dev->slock); 406 spin_lock_init(&dev->slock);
408 407
409 init_MUTEX(&dev->i2c_lock); 408 mutex_init(&dev->i2c_lock);
410 409
411 dev->module = THIS_MODULE; 410 dev->module = THIS_MODULE;
412 init_waitqueue_head(&dev->i2c_wq); 411 init_waitqueue_head(&dev->i2c_wq);
diff --git a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c
index f8cf73ed49a..3870fa948cc 100644
--- a/drivers/media/common/saa7146_fops.c
+++ b/drivers/media/common/saa7146_fops.c
@@ -17,18 +17,18 @@ int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit)
17 } 17 }
18 18
19 /* is it free? */ 19 /* is it free? */
20 down(&dev->lock); 20 mutex_lock(&dev->lock);
21 if (vv->resources & bit) { 21 if (vv->resources & bit) {
22 DEB_D(("locked! vv->resources:0x%02x, we want:0x%02x\n",vv->resources,bit)); 22 DEB_D(("locked! vv->resources:0x%02x, we want:0x%02x\n",vv->resources,bit));
23 /* no, someone else uses it */ 23 /* no, someone else uses it */
24 up(&dev->lock); 24 mutex_unlock(&dev->lock);
25 return 0; 25 return 0;
26 } 26 }
27 /* it's free, grab it */ 27 /* it's free, grab it */
28 fh->resources |= bit; 28 fh->resources |= bit;
29 vv->resources |= bit; 29 vv->resources |= bit;
30 DEB_D(("res: get 0x%02x, cur:0x%02x\n",bit,vv->resources)); 30 DEB_D(("res: get 0x%02x, cur:0x%02x\n",bit,vv->resources));
31 up(&dev->lock); 31 mutex_unlock(&dev->lock);
32 return 1; 32 return 1;
33} 33}
34 34
@@ -37,14 +37,13 @@ void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits)
37 struct saa7146_dev *dev = fh->dev; 37 struct saa7146_dev *dev = fh->dev;
38 struct saa7146_vv *vv = dev->vv_data; 38 struct saa7146_vv *vv = dev->vv_data;
39 39
40 if ((fh->resources & bits) != bits) 40 BUG_ON((fh->resources & bits) != bits);
41 BUG();
42 41
43 down(&dev->lock); 42 mutex_lock(&dev->lock);
44 fh->resources &= ~bits; 43 fh->resources &= ~bits;
45 vv->resources &= ~bits; 44 vv->resources &= ~bits;
46 DEB_D(("res: put 0x%02x, cur:0x%02x\n",bits,vv->resources)); 45 DEB_D(("res: put 0x%02x, cur:0x%02x\n",bits,vv->resources));
47 up(&dev->lock); 46 mutex_unlock(&dev->lock);
48} 47}
49 48
50 49
@@ -55,8 +54,7 @@ void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf)
55{ 54{
56 DEB_EE(("dev:%p, buf:%p\n",dev,buf)); 55 DEB_EE(("dev:%p, buf:%p\n",dev,buf));
57 56
58 if (in_interrupt()) 57 BUG_ON(in_interrupt());
59 BUG();
60 58
61 videobuf_waiton(&buf->vb,0,0); 59 videobuf_waiton(&buf->vb,0,0);
62 videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma); 60 videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
@@ -204,7 +202,7 @@ static int fops_open(struct inode *inode, struct file *file)
204 202
205 DEB_EE(("inode:%p, file:%p, minor:%d\n",inode,file,minor)); 203 DEB_EE(("inode:%p, file:%p, minor:%d\n",inode,file,minor));
206 204
207 if (down_interruptible(&saa7146_devices_lock)) 205 if (mutex_lock_interruptible(&saa7146_devices_lock))
208 return -ERESTARTSYS; 206 return -ERESTARTSYS;
209 207
210 list_for_each(list,&saa7146_devices) { 208 list_for_each(list,&saa7146_devices) {
@@ -276,7 +274,7 @@ out:
276 kfree(fh); 274 kfree(fh);
277 file->private_data = NULL; 275 file->private_data = NULL;
278 } 276 }
279 up(&saa7146_devices_lock); 277 mutex_unlock(&saa7146_devices_lock);
280 return result; 278 return result;
281} 279}
282 280
@@ -287,7 +285,7 @@ static int fops_release(struct inode *inode, struct file *file)
287 285
288 DEB_EE(("inode:%p, file:%p\n",inode,file)); 286 DEB_EE(("inode:%p, file:%p\n",inode,file));
289 287
290 if (down_interruptible(&saa7146_devices_lock)) 288 if (mutex_lock_interruptible(&saa7146_devices_lock))
291 return -ERESTARTSYS; 289 return -ERESTARTSYS;
292 290
293 if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { 291 if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
@@ -303,7 +301,7 @@ static int fops_release(struct inode *inode, struct file *file)
303 file->private_data = NULL; 301 file->private_data = NULL;
304 kfree(fh); 302 kfree(fh);
305 303
306 up(&saa7146_devices_lock); 304 mutex_unlock(&saa7146_devices_lock);
307 305
308 return 0; 306 return 0;
309} 307}
diff --git a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
index 8aabdd8fb3c..d9953f7a8b6 100644
--- a/drivers/media/common/saa7146_i2c.c
+++ b/drivers/media/common/saa7146_i2c.c
@@ -279,7 +279,7 @@ int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *msgs, in
279 int address_err = 0; 279 int address_err = 0;
280 int short_delay = 0; 280 int short_delay = 0;
281 281
282 if (down_interruptible (&dev->i2c_lock)) 282 if (mutex_lock_interruptible(&dev->i2c_lock))
283 return -ERESTARTSYS; 283 return -ERESTARTSYS;
284 284
285 for(i=0;i<num;i++) { 285 for(i=0;i<num;i++) {
@@ -366,7 +366,7 @@ out:
366 } 366 }
367 } 367 }
368 368
369 up(&dev->i2c_lock); 369 mutex_unlock(&dev->i2c_lock);
370 return err; 370 return err;
371} 371}
372 372
diff --git a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c
index 468d3c95907..500bd3f05e1 100644
--- a/drivers/media/common/saa7146_vbi.c
+++ b/drivers/media/common/saa7146_vbi.c
@@ -410,7 +410,7 @@ static int vbi_open(struct saa7146_dev *dev, struct file *file)
410 V4L2_FIELD_SEQ_TB, // FIXME: does this really work? 410 V4L2_FIELD_SEQ_TB, // FIXME: does this really work?
411 sizeof(struct saa7146_buf), 411 sizeof(struct saa7146_buf),
412 file); 412 file);
413 init_MUTEX(&fh->vbi_q.lock); 413 mutex_init(&fh->vbi_q.lock);
414 414
415 init_timer(&fh->vbi_read_timeout); 415 init_timer(&fh->vbi_read_timeout);
416 fh->vbi_read_timeout.function = vbi_read_timeout; 416 fh->vbi_read_timeout.function = vbi_read_timeout;
diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
index 7ebac7949df..6b42713d97f 100644
--- a/drivers/media/common/saa7146_video.c
+++ b/drivers/media/common/saa7146_video.c
@@ -378,20 +378,20 @@ static int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f)
378 err = try_win(dev,&f->fmt.win); 378 err = try_win(dev,&f->fmt.win);
379 if (0 != err) 379 if (0 != err)
380 return err; 380 return err;
381 down(&dev->lock); 381 mutex_lock(&dev->lock);
382 fh->ov.win = f->fmt.win; 382 fh->ov.win = f->fmt.win;
383 fh->ov.nclips = f->fmt.win.clipcount; 383 fh->ov.nclips = f->fmt.win.clipcount;
384 if (fh->ov.nclips > 16) 384 if (fh->ov.nclips > 16)
385 fh->ov.nclips = 16; 385 fh->ov.nclips = 16;
386 if (copy_from_user(fh->ov.clips,f->fmt.win.clips,sizeof(struct v4l2_clip)*fh->ov.nclips)) { 386 if (copy_from_user(fh->ov.clips,f->fmt.win.clips,sizeof(struct v4l2_clip)*fh->ov.nclips)) {
387 up(&dev->lock); 387 mutex_unlock(&dev->lock);
388 return -EFAULT; 388 return -EFAULT;
389 } 389 }
390 390
391 /* fh->ov.fh is used to indicate that we have valid overlay informations, too */ 391 /* fh->ov.fh is used to indicate that we have valid overlay informations, too */
392 fh->ov.fh = fh; 392 fh->ov.fh = fh;
393 393
394 up(&dev->lock); 394 mutex_unlock(&dev->lock);
395 395
396 /* check if our current overlay is active */ 396 /* check if our current overlay is active */
397 if (IS_OVERLAY_ACTIVE(fh) != 0) { 397 if (IS_OVERLAY_ACTIVE(fh) != 0) {
@@ -516,7 +516,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c)
516 return -EINVAL; 516 return -EINVAL;
517 } 517 }
518 518
519 down(&dev->lock); 519 mutex_lock(&dev->lock);
520 520
521 switch (ctrl->type) { 521 switch (ctrl->type) {
522 case V4L2_CTRL_TYPE_BOOLEAN: 522 case V4L2_CTRL_TYPE_BOOLEAN:
@@ -560,7 +560,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c)
560 /* fixme: we can support changing VFLIP and HFLIP here... */ 560 /* fixme: we can support changing VFLIP and HFLIP here... */
561 if (IS_CAPTURE_ACTIVE(fh) != 0) { 561 if (IS_CAPTURE_ACTIVE(fh) != 0) {
562 DEB_D(("V4L2_CID_HFLIP while active capture.\n")); 562 DEB_D(("V4L2_CID_HFLIP while active capture.\n"));
563 up(&dev->lock); 563 mutex_unlock(&dev->lock);
564 return -EINVAL; 564 return -EINVAL;
565 } 565 }
566 vv->hflip = c->value; 566 vv->hflip = c->value;
@@ -568,7 +568,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c)
568 case V4L2_CID_VFLIP: 568 case V4L2_CID_VFLIP:
569 if (IS_CAPTURE_ACTIVE(fh) != 0) { 569 if (IS_CAPTURE_ACTIVE(fh) != 0) {
570 DEB_D(("V4L2_CID_VFLIP while active capture.\n")); 570 DEB_D(("V4L2_CID_VFLIP while active capture.\n"));
571 up(&dev->lock); 571 mutex_unlock(&dev->lock);
572 return -EINVAL; 572 return -EINVAL;
573 } 573 }
574 vv->vflip = c->value; 574 vv->vflip = c->value;
@@ -577,7 +577,7 @@ static int set_control(struct saa7146_fh *fh, struct v4l2_control *c)
577 return -EINVAL; 577 return -EINVAL;
578 } 578 }
579 } 579 }
580 up(&dev->lock); 580 mutex_unlock(&dev->lock);
581 581
582 if (IS_OVERLAY_ACTIVE(fh) != 0) { 582 if (IS_OVERLAY_ACTIVE(fh) != 0) {
583 saa7146_stop_preview(fh); 583 saa7146_stop_preview(fh);
@@ -939,7 +939,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
939 } 939 }
940 } 940 }
941 941
942 down(&dev->lock); 942 mutex_lock(&dev->lock);
943 943
944 /* ok, accept it */ 944 /* ok, accept it */
945 vv->ov_fb = *fb; 945 vv->ov_fb = *fb;
@@ -948,7 +948,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
948 vv->ov_fb.fmt.bytesperline = 948 vv->ov_fb.fmt.bytesperline =
949 vv->ov_fb.fmt.width*fmt->depth/8; 949 vv->ov_fb.fmt.width*fmt->depth/8;
950 950
951 up(&dev->lock); 951 mutex_unlock(&dev->lock);
952 952
953 return 0; 953 return 0;
954 } 954 }
@@ -1086,7 +1086,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1086 } 1086 }
1087 } 1087 }
1088 1088
1089 down(&dev->lock); 1089 mutex_lock(&dev->lock);
1090 1090
1091 for(i = 0; i < dev->ext_vv_data->num_stds; i++) 1091 for(i = 0; i < dev->ext_vv_data->num_stds; i++)
1092 if (*id & dev->ext_vv_data->stds[i].id) 1092 if (*id & dev->ext_vv_data->stds[i].id)
@@ -1098,7 +1098,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1098 found = 1; 1098 found = 1;
1099 } 1099 }
1100 1100
1101 up(&dev->lock); 1101 mutex_unlock(&dev->lock);
1102 1102
1103 if (vv->ov_suspend != NULL) { 1103 if (vv->ov_suspend != NULL) {
1104 saa7146_start_preview(vv->ov_suspend); 1104 saa7146_start_preview(vv->ov_suspend);
@@ -1201,11 +1201,11 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1201 DEB_D(("VIDIOCGMBUF \n")); 1201 DEB_D(("VIDIOCGMBUF \n"));
1202 1202
1203 q = &fh->video_q; 1203 q = &fh->video_q;
1204 down(&q->lock); 1204 mutex_lock(&q->lock);
1205 err = videobuf_mmap_setup(q,gbuffers,gbufsize, 1205 err = videobuf_mmap_setup(q,gbuffers,gbufsize,
1206 V4L2_MEMORY_MMAP); 1206 V4L2_MEMORY_MMAP);
1207 if (err < 0) { 1207 if (err < 0) {
1208 up(&q->lock); 1208 mutex_unlock(&q->lock);
1209 return err; 1209 return err;
1210 } 1210 }
1211 memset(mbuf,0,sizeof(*mbuf)); 1211 memset(mbuf,0,sizeof(*mbuf));
@@ -1213,7 +1213,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1213 mbuf->size = gbuffers * gbufsize; 1213 mbuf->size = gbuffers * gbufsize;
1214 for (i = 0; i < gbuffers; i++) 1214 for (i = 0; i < gbuffers; i++)
1215 mbuf->offsets[i] = i * gbufsize; 1215 mbuf->offsets[i] = i * gbufsize;
1216 up(&q->lock); 1216 mutex_unlock(&q->lock);
1217 return 0; 1217 return 0;
1218 } 1218 }
1219 default: 1219 default:
@@ -1414,7 +1414,7 @@ static int video_open(struct saa7146_dev *dev, struct file *file)
1414 sizeof(struct saa7146_buf), 1414 sizeof(struct saa7146_buf),
1415 file); 1415 file);
1416 1416
1417 init_MUTEX(&fh->video_q.lock); 1417 mutex_init(&fh->video_q.lock);
1418 1418
1419 return 0; 1419 return 0;
1420} 1420}