[PATCH] V4L: 904: added dvb support for tda8275a philips tiger reference design
[deliverable/linux.git] / drivers / media / video / saa7134 / saa7134-input.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 *
3 * handle saa7134 IR remotes via linux kernel input layer.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/init.h>
24#include <linux/delay.h>
25#include <linux/sched.h>
26#include <linux/interrupt.h>
27#include <linux/input.h>
28
29#include "saa7134-reg.h"
30#include "saa7134.h"
31
32static unsigned int disable_ir = 0;
33module_param(disable_ir, int, 0444);
34MODULE_PARM_DESC(disable_ir,"disable infrared remote support");
35
36static unsigned int ir_debug = 0;
37module_param(ir_debug, int, 0644);
38MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");
39
40#define dprintk(fmt, arg...) if (ir_debug) \
41 printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg)
ac9cd976
RC
42#define i2cdprintk(fmt, arg...) if (ir_debug) \
43 printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
1da177e4
LT
44
45/* ---------------------------------------------------------------------- */
46
47static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = {
48 [ 15 ] = KEY_KP0,
49 [ 3 ] = KEY_KP1,
50 [ 4 ] = KEY_KP2,
51 [ 5 ] = KEY_KP3,
52 [ 7 ] = KEY_KP4,
53 [ 8 ] = KEY_KP5,
54 [ 9 ] = KEY_KP6,
55 [ 11 ] = KEY_KP7,
56 [ 12 ] = KEY_KP8,
57 [ 13 ] = KEY_KP9,
58
59 [ 14 ] = KEY_TUNER, // Air/Cable
60 [ 17 ] = KEY_VIDEO, // Video
61 [ 21 ] = KEY_AUDIO, // Audio
62 [ 0 ] = KEY_POWER, // Pover
63 [ 2 ] = KEY_ZOOM, // Fullscreen
64 [ 27 ] = KEY_MUTE, // Mute
65 [ 20 ] = KEY_VOLUMEUP,
66 [ 23 ] = KEY_VOLUMEDOWN,
67 [ 18 ] = KEY_CHANNELUP, // Channel +
68 [ 19 ] = KEY_CHANNELDOWN, // Channel -
69 [ 6 ] = KEY_AGAIN, // Recal
70 [ 16 ] = KEY_KPENTER, // Enter
71
1da177e4
LT
72 [ 26 ] = KEY_F22, // Stereo
73 [ 24 ] = KEY_EDIT, // AV Source
1da177e4
LT
74};
75
76static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
77 [ 0 ] = KEY_KP0,
78 [ 1 ] = KEY_KP1,
79 [ 2 ] = KEY_KP2,
80 [ 3 ] = KEY_KP3,
81 [ 4 ] = KEY_KP4,
82 [ 5 ] = KEY_KP5,
83 [ 6 ] = KEY_KP6,
84 [ 7 ] = KEY_KP7,
85 [ 8 ] = KEY_KP8,
86 [ 9 ] = KEY_KP9,
87
88 [ 0x0a ] = KEY_POWER,
89 [ 0x0b ] = KEY_PROG1, // app
90 [ 0x0c ] = KEY_ZOOM, // zoom/fullscreen
91 [ 0x0d ] = KEY_CHANNELUP, // channel
92 [ 0x0e ] = KEY_CHANNELDOWN, // channel-
93 [ 0x0f ] = KEY_VOLUMEUP,
94 [ 0x10 ] = KEY_VOLUMEDOWN,
95 [ 0x11 ] = KEY_TUNER, // AV
96 [ 0x12 ] = KEY_NUMLOCK, // -/--
97 [ 0x13 ] = KEY_AUDIO, // audio
98 [ 0x14 ] = KEY_MUTE,
99 [ 0x15 ] = KEY_UP,
100 [ 0x16 ] = KEY_DOWN,
101 [ 0x17 ] = KEY_LEFT,
102 [ 0x18 ] = KEY_RIGHT,
103 [ 0x19 ] = BTN_LEFT,
104 [ 0x1a ] = BTN_RIGHT,
105 [ 0x1b ] = KEY_WWW, // text
106 [ 0x1c ] = KEY_REWIND,
107 [ 0x1d ] = KEY_FORWARD,
108 [ 0x1e ] = KEY_RECORD,
109 [ 0x1f ] = KEY_PLAY,
110 [ 0x20 ] = KEY_PREVIOUSSONG,
111 [ 0x21 ] = KEY_NEXTSONG,
112 [ 0x22 ] = KEY_PAUSE,
113 [ 0x23 ] = KEY_STOP,
114};
115
116/* Alfons Geser <a.geser@cox.net>
117 * updates from Job D. R. Borges <jobdrb@ig.com.br> */
118static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = {
4ac97914
MCC
119 [ 18 ] = KEY_POWER,
120 [ 1 ] = KEY_TV, // DVR
121 [ 21 ] = KEY_DVD, // DVD
122 [ 23 ] = KEY_AUDIO, // music
f2421ca3 123 // DVR mode / DVD mode / music mode
4ac97914
MCC
124
125 [ 27 ] = KEY_MUTE, // mute
126 [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek
127 [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek
128 [ 22 ] = KEY_ZOOM, // full screen
129 [ 28 ] = KEY_VIDEO, // video source / eject / delall
130 [ 29 ] = KEY_RESTART, // playback / angle / del
131 [ 47 ] = KEY_SEARCH, // scan / menu / playlist
132 [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo
133
134 [ 49 ] = KEY_HELP, // help
135 [ 50 ] = KEY_MODE, // num/memo
136 [ 51 ] = KEY_ESC, // cancel
1da177e4
LT
137
138 [ 12 ] = KEY_UP, // up
139 [ 16 ] = KEY_DOWN, // down
140 [ 8 ] = KEY_LEFT, // left
141 [ 4 ] = KEY_RIGHT, // right
142 [ 3 ] = KEY_SELECT, // select
143
144 [ 31 ] = KEY_REWIND, // rewind
145 [ 32 ] = KEY_PLAYPAUSE, // play/pause
146 [ 41 ] = KEY_FORWARD, // forward
147 [ 20 ] = KEY_AGAIN, // repeat
148 [ 43 ] = KEY_RECORD, // recording
149 [ 44 ] = KEY_STOP, // stop
150 [ 45 ] = KEY_PLAY, // play
151 [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle
152
4ac97914
MCC
153 [ 0 ] = KEY_KP0,
154 [ 5 ] = KEY_KP1,
155 [ 6 ] = KEY_KP2,
156 [ 7 ] = KEY_KP3,
157 [ 9 ] = KEY_KP4,
158 [ 10 ] = KEY_KP5,
159 [ 11 ] = KEY_KP6,
160 [ 13 ] = KEY_KP7,
161 [ 14 ] = KEY_KP8,
162 [ 15 ] = KEY_KP9,
163
164 [ 42 ] = KEY_VOLUMEUP,
165 [ 17 ] = KEY_VOLUMEDOWN,
166 [ 24 ] = KEY_CHANNELUP, // CH.tracking up
167 [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down
168
169 [ 19 ] = KEY_KPENTER, // enter
170 [ 33 ] = KEY_KPDOT, // . (decimal dot)
1da177e4
LT
171};
172
173static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = {
330a115a 174 [ 30 ] = KEY_POWER, // power
1da177e4 175 [ 28 ] = KEY_SEARCH, // scan
330a115a 176 [ 7 ] = KEY_SELECT, // source
1da177e4
LT
177
178 [ 22 ] = KEY_VOLUMEUP,
179 [ 20 ] = KEY_VOLUMEDOWN,
330a115a 180 [ 31 ] = KEY_CHANNELUP,
1da177e4
LT
181 [ 23 ] = KEY_CHANNELDOWN,
182 [ 24 ] = KEY_MUTE,
183
184 [ 2 ] = KEY_KP0,
330a115a
MCC
185 [ 1 ] = KEY_KP1,
186 [ 11 ] = KEY_KP2,
187 [ 27 ] = KEY_KP3,
188 [ 5 ] = KEY_KP4,
189 [ 9 ] = KEY_KP5,
190 [ 21 ] = KEY_KP6,
1da177e4 191 [ 6 ] = KEY_KP7,
330a115a 192 [ 10 ] = KEY_KP8,
1da177e4
LT
193 [ 18 ] = KEY_KP9,
194 [ 16 ] = KEY_KPDOT,
195
196 [ 3 ] = KEY_TUNER, // tv/fm
330a115a
MCC
197 [ 4 ] = KEY_REWIND, // fm tuning left or function left
198 [ 12 ] = KEY_FORWARD, // fm tuning right or function right
1da177e4
LT
199
200 [ 0 ] = KEY_RECORD,
330a115a
MCC
201 [ 8 ] = KEY_STOP,
202 [ 17 ] = KEY_PLAY,
1da177e4
LT
203
204 [ 25 ] = KEY_ZOOM,
205 [ 14 ] = KEY_MENU, // function
206 [ 19 ] = KEY_AGAIN, // recall
207 [ 29 ] = KEY_RESTART, // reset
330a115a 208 [ 26 ] = KEY_SHUFFLE, // snapshot/shuffle
1da177e4
LT
209
210// FIXME
211 [ 13 ] = KEY_F21, // mts
330a115a 212 [ 15 ] = KEY_F22, // min
1da177e4
LT
213};
214
215/* Alex Hermann <gaaf@gmx.net> */
216static IR_KEYTAB_TYPE md2819_codes[IR_KEYTAB_SIZE] = {
217 [ 40 ] = KEY_KP1,
218 [ 24 ] = KEY_KP2,
219 [ 56 ] = KEY_KP3,
220 [ 36 ] = KEY_KP4,
221 [ 20 ] = KEY_KP5,
222 [ 52 ] = KEY_KP6,
223 [ 44 ] = KEY_KP7,
224 [ 28 ] = KEY_KP8,
225 [ 60 ] = KEY_KP9,
226 [ 34 ] = KEY_KP0,
227
228 [ 32 ] = KEY_TV, // TV/FM
229 [ 16 ] = KEY_CD, // CD
230 [ 48 ] = KEY_TEXT, // TELETEXT
231 [ 0 ] = KEY_POWER, // POWER
232
233 [ 8 ] = KEY_VIDEO, // VIDEO
234 [ 4 ] = KEY_AUDIO, // AUDIO
235 [ 12 ] = KEY_ZOOM, // FULL SCREEN
236
237 [ 18 ] = KEY_SUBTITLE, // DISPLAY - ???
238 [ 50 ] = KEY_REWIND, // LOOP - ???
239 [ 2 ] = KEY_PRINT, // PREVIEW - ???
240
241 [ 42 ] = KEY_SEARCH, // AUTOSCAN
242 [ 26 ] = KEY_SLEEP, // FREEZE - ???
243 [ 58 ] = KEY_SHUFFLE, // SNAPSHOT - ???
244 [ 10 ] = KEY_MUTE, // MUTE
245
246 [ 38 ] = KEY_RECORD, // RECORD
247 [ 22 ] = KEY_PAUSE, // PAUSE
248 [ 54 ] = KEY_STOP, // STOP
249 [ 6 ] = KEY_PLAY, // PLAY
250
251 [ 46 ] = KEY_RED, // <RED>
252 [ 33 ] = KEY_GREEN, // <GREEN>
253 [ 14 ] = KEY_YELLOW, // <YELLOW>
254 [ 1 ] = KEY_BLUE, // <BLUE>
255
256 [ 30 ] = KEY_VOLUMEDOWN, // VOLUME-
257 [ 62 ] = KEY_VOLUMEUP, // VOLUME+
258 [ 17 ] = KEY_CHANNELDOWN, // CHANNEL/PAGE-
259 [ 49 ] = KEY_CHANNELUP // CHANNEL/PAGE+
260};
261
262static IR_KEYTAB_TYPE videomate_tv_pvr_codes[IR_KEYTAB_SIZE] = {
263 [ 20 ] = KEY_MUTE,
264 [ 36 ] = KEY_ZOOM,
265
266 [ 1 ] = KEY_DVD,
267 [ 35 ] = KEY_RADIO,
268 [ 0 ] = KEY_TV,
269
270 [ 10 ] = KEY_REWIND,
271 [ 8 ] = KEY_PLAYPAUSE,
272 [ 15 ] = KEY_FORWARD,
273
274 [ 2 ] = KEY_PREVIOUS,
275 [ 7 ] = KEY_STOP,
276 [ 6 ] = KEY_NEXT,
277
278 [ 12 ] = KEY_UP,
279 [ 14 ] = KEY_DOWN,
280 [ 11 ] = KEY_LEFT,
281 [ 13 ] = KEY_RIGHT,
282 [ 17 ] = KEY_OK,
283
284 [ 3 ] = KEY_MENU,
285 [ 9 ] = KEY_SETUP,
286 [ 5 ] = KEY_VIDEO,
287 [ 34 ] = KEY_CHANNEL,
288
289 [ 18 ] = KEY_VOLUMEUP,
290 [ 21 ] = KEY_VOLUMEDOWN,
291 [ 16 ] = KEY_CHANNELUP,
292 [ 19 ] = KEY_CHANNELDOWN,
293
294 [ 4 ] = KEY_RECORD,
295
296 [ 22 ] = KEY_KP1,
297 [ 23 ] = KEY_KP2,
298 [ 24 ] = KEY_KP3,
299 [ 25 ] = KEY_KP4,
300 [ 26 ] = KEY_KP5,
301 [ 27 ] = KEY_KP6,
302 [ 28 ] = KEY_KP7,
303 [ 29 ] = KEY_KP8,
304 [ 30 ] = KEY_KP9,
305 [ 31 ] = KEY_KP0,
306
307 [ 32 ] = KEY_LANGUAGE,
308 [ 33 ] = KEY_SLEEP,
309};
ac19ecc6
MCC
310
311/* Michael Tokarev <mjt@tls.msk.ru>
312 http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
313 keytable is used by MANLI MTV00[12] and BeholdTV 40[13] at
314 least, and probably other cards too.
315 The "ascii-art picture" below (in comments, first row
316 is the keycode in hex, and subsequent row(s) shows
317 the button labels (several variants when appropriate)
318 helps to descide which keycodes to assign to the buttons.
319 */
320static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = {
321
322 /* 0x1c 0x12 *
323 * FUNCTION POWER *
324 * FM (|) *
325 * */
326 [ 0x1c ] = KEY_RADIO, /*XXX*/
327 [ 0x12 ] = KEY_POWER,
328
329 /* 0x01 0x02 0x03 *
330 * 1 2 3 *
331 * *
332 * 0x04 0x05 0x06 *
333 * 4 5 6 *
334 * *
335 * 0x07 0x08 0x09 *
336 * 7 8 9 *
337 * */
338 [ 0x01 ] = KEY_KP1,
339 [ 0x02 ] = KEY_KP2,
340 [ 0x03 ] = KEY_KP3,
341 [ 0x04 ] = KEY_KP4,
342 [ 0x05 ] = KEY_KP5,
343 [ 0x06 ] = KEY_KP6,
344 [ 0x07 ] = KEY_KP7,
345 [ 0x08 ] = KEY_KP8,
346 [ 0x09 ] = KEY_KP9,
347
348 /* 0x0a 0x00 0x17 *
349 * RECALL 0 +100 *
350 * PLUS *
351 * */
352 [ 0x0a ] = KEY_AGAIN, /*XXX KEY_REWIND? */
353 [ 0x00 ] = KEY_KP0,
354 [ 0x17 ] = KEY_DIGITS, /*XXX*/
355
356 /* 0x14 0x10 *
357 * MENU INFO *
358 * OSD */
359 [ 0x14 ] = KEY_MENU,
360 [ 0x10 ] = KEY_INFO,
361
362 /* 0x0b *
363 * Up *
364 * *
365 * 0x18 0x16 0x0c *
366 * Left Ok Right *
367 * *
368 * 0x015 *
369 * Down *
370 * */
371 [ 0x0b ] = KEY_UP, /*XXX KEY_SCROLLUP? */
372 [ 0x18 ] = KEY_LEFT, /*XXX KEY_BACK? */
373 [ 0x16 ] = KEY_OK, /*XXX KEY_SELECT? KEY_ENTER? */
374 [ 0x0c ] = KEY_RIGHT, /*XXX KEY_FORWARD? */
375 [ 0x15 ] = KEY_DOWN, /*XXX KEY_SCROLLDOWN? */
376
377 /* 0x11 0x0d *
378 * TV/AV MODE *
379 * SOURCE STEREO *
380 * */
381 [ 0x11 ] = KEY_TV, /*XXX*/
382 [ 0x0d ] = KEY_MODE, /*XXX there's no KEY_STEREO */
383
384 /* 0x0f 0x1b 0x1a *
385 * AUDIO Vol+ Chan+ *
386 * TIMESHIFT??? *
387 * *
388 * 0x0e 0x1f 0x1e *
389 * SLEEP Vol- Chan- *
390 * */
391 [ 0x0f ] = KEY_AUDIO,
392 [ 0x1b ] = KEY_VOLUMEUP,
393 [ 0x1a ] = KEY_CHANNELUP,
394 [ 0x0e ] = KEY_SLEEP, /*XXX maybe KEY_PAUSE */
395 [ 0x1f ] = KEY_VOLUMEDOWN,
396 [ 0x1e ] = KEY_CHANNELDOWN,
397
398 /* 0x13 0x19 *
399 * MUTE SNAPSHOT*
400 * */
401 [ 0x13 ] = KEY_MUTE,
402 [ 0x19 ] = KEY_RECORD, /*XXX*/
403
404 // 0x1d unused ?
405};
6b961440
NS
406
407
dcd555ec 408/* Mike Baikov <mike@baikov.com> */
6b961440
NS
409static IR_KEYTAB_TYPE gotview7135_codes[IR_KEYTAB_SIZE] = {
410
411 [ 33 ] = KEY_POWER,
412 [ 105] = KEY_TV,
413 [ 51 ] = KEY_KP0,
414 [ 81 ] = KEY_KP1,
415 [ 49 ] = KEY_KP2,
416 [ 113] = KEY_KP3,
417 [ 59 ] = KEY_KP4,
418 [ 88 ] = KEY_KP5,
419 [ 65 ] = KEY_KP6,
420 [ 72 ] = KEY_KP7,
421 [ 48 ] = KEY_KP8,
422 [ 83 ] = KEY_KP9,
423 [ 115] = KEY_AGAIN, /* LOOP */
424 [ 10 ] = KEY_AUDIO,
425 [ 97 ] = KEY_PRINT, /* PREVIEW */
426 [ 122] = KEY_VIDEO,
427 [ 32 ] = KEY_CHANNELUP,
428 [ 64 ] = KEY_CHANNELDOWN,
429 [ 24 ] = KEY_VOLUMEDOWN,
430 [ 80 ] = KEY_VOLUMEUP,
431 [ 16 ] = KEY_MUTE,
432 [ 74 ] = KEY_SEARCH,
433 [ 123] = KEY_SHUFFLE, /* SNAPSHOT */
434 [ 34 ] = KEY_RECORD,
435 [ 98 ] = KEY_STOP,
436 [ 120] = KEY_PLAY,
437 [ 57 ] = KEY_REWIND,
438 [ 89 ] = KEY_PAUSE,
439 [ 25 ] = KEY_FORWARD,
440 [ 9 ] = KEY_ZOOM,
441
442 [ 82 ] = KEY_F21, /* LIVE TIMESHIFT */
443 [ 26 ] = KEY_F22, /* MIN TIMESHIFT */
444 [ 58 ] = KEY_F23, /* TIMESHIFT */
445 [ 112] = KEY_F24, /* NORMAL TIMESHIFT */
446};
447
ac9cd976
RC
448static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
449 [ 0x3 ] = KEY_POWER,
450 [ 0x6f ] = KEY_MUTE,
451 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
452
453 [ 0x11 ] = KEY_KP0,
454 [ 0x4 ] = KEY_KP1,
455 [ 0x5 ] = KEY_KP2,
456 [ 0x6 ] = KEY_KP3,
457 [ 0x8 ] = KEY_KP4,
458 [ 0x9 ] = KEY_KP5,
459 [ 0xa ] = KEY_KP6,
460 [ 0xc ] = KEY_KP7,
461 [ 0xd ] = KEY_KP8,
462 [ 0xe ] = KEY_KP9,
463 [ 0x12 ] = KEY_KPDOT, /* 100+ */
464
465 [ 0x7 ] = KEY_VOLUMEUP,
466 [ 0xb ] = KEY_VOLUMEDOWN,
467 [ 0x1a ] = KEY_KPPLUS,
468 [ 0x18 ] = KEY_KPMINUS,
469 [ 0x15 ] = KEY_UP,
470 [ 0x1d ] = KEY_DOWN,
471 [ 0xf ] = KEY_CHANNELUP,
472 [ 0x13 ] = KEY_CHANNELDOWN,
473 [ 0x48 ] = KEY_ZOOM,
474
475 [ 0x1b ] = KEY_VIDEO, /* Video source */
476 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
477 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
478
479 [ 0x4b ] = KEY_RECORD,
480 [ 0x46 ] = KEY_PLAY,
481 [ 0x45 ] = KEY_PAUSE, /* Pause */
482 [ 0x44 ] = KEY_STOP,
483 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
484 [ 0x42 ] = KEY_REWIND, /* Backward ? */
485
486};
487
488static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
489 [ 0x59 ] = KEY_MUTE,
490 [ 0x4a ] = KEY_POWER,
491
492 [ 0x18 ] = KEY_TEXT,
493 [ 0x26 ] = KEY_TV,
494 [ 0x3d ] = KEY_PRINT,
495
496 [ 0x48 ] = KEY_RED,
497 [ 0x04 ] = KEY_GREEN,
498 [ 0x11 ] = KEY_YELLOW,
499 [ 0x00 ] = KEY_BLUE,
500
501 [ 0x2d ] = KEY_VOLUMEUP,
502 [ 0x1e ] = KEY_VOLUMEDOWN,
503
504 [ 0x49 ] = KEY_MENU,
505
506 [ 0x16 ] = KEY_CHANNELUP,
507 [ 0x17 ] = KEY_CHANNELDOWN,
508
509 [ 0x20 ] = KEY_UP,
510 [ 0x21 ] = KEY_DOWN,
511 [ 0x22 ] = KEY_LEFT,
512 [ 0x23 ] = KEY_RIGHT,
513 [ 0x0d ] = KEY_SELECT,
514
515
516
517 [ 0x08 ] = KEY_BACK,
518 [ 0x07 ] = KEY_REFRESH,
519
520 [ 0x2f ] = KEY_ZOOM,
521 [ 0x29 ] = KEY_RECORD,
522
523 [ 0x4b ] = KEY_PAUSE,
524 [ 0x4d ] = KEY_REWIND,
525 [ 0x2e ] = KEY_PLAY,
526 [ 0x4e ] = KEY_FORWARD,
527 [ 0x53 ] = KEY_PREVIOUS,
528 [ 0x4c ] = KEY_STOP,
529 [ 0x54 ] = KEY_NEXT,
530
531 [ 0x69 ] = KEY_KP0,
532 [ 0x6a ] = KEY_KP1,
533 [ 0x6b ] = KEY_KP2,
534 [ 0x6c ] = KEY_KP3,
535 [ 0x6d ] = KEY_KP4,
536 [ 0x6e ] = KEY_KP5,
537 [ 0x6f ] = KEY_KP6,
538 [ 0x70 ] = KEY_KP7,
539 [ 0x71 ] = KEY_KP8,
540 [ 0x72 ] = KEY_KP9,
541
542 [ 0x74 ] = KEY_CHANNEL,
543 [ 0x0a ] = KEY_BACKSPACE,
544};
545
546/* -------------------- GPIO generic keycode builder -------------------- */
1da177e4
LT
547
548static int build_key(struct saa7134_dev *dev)
549{
550 struct saa7134_ir *ir = dev->remote;
551 u32 gpio, data;
552
553 /* rising SAA7134_GPIO_GPRESCAN reads the status */
554 saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
555 saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
556
557 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
4ac97914
MCC
558 if (ir->polling) {
559 if (ir->last_gpio == gpio)
560 return 0;
561 ir->last_gpio = gpio;
562 }
1da177e4 563
4ac97914 564 data = ir_extract_bits(gpio, ir->mask_keycode);
1da177e4
LT
565 dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
566 gpio, ir->mask_keycode, data);
567
568 if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
569 (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
b7df3910 570 ir_input_keydown(ir->dev, &ir->ir, data, data);
1da177e4 571 } else {
b7df3910 572 ir_input_nokey(ir->dev, &ir->ir);
1da177e4
LT
573 }
574 return 0;
575}
576
ac9cd976
RC
577/* --------------------- Chip specific I2C key builders ----------------- */
578
579static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
580{
581 unsigned char b;
582
583 /* poll IR chip */
584 if (1 != i2c_master_recv(&ir->c,&b,1)) {
585 i2cdprintk("read error\n");
586 return -EIO;
587 }
588
589 /* no button press */
590 if (b==0)
591 return 0;
592
593 /* repeating */
594 if (b & 0x80)
595 return 1;
596
597 *ir_key = b;
598 *ir_raw = b;
599 return 1;
600}
601
602/* The new pinnacle PCTV remote (with the colored buttons)
603 *
604 * Ricardo Cerqueira <v4l@cerqueira.org>
605 */
606
607static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
608{
609 unsigned char b[4];
610 unsigned int start = 0,parity = 0,code = 0;
611
612 /* poll IR chip */
613 if (4 != i2c_master_recv(&ir->c,b,4)) {
614 i2cdprintk("read error\n");
615 return -EIO;
616 }
617
618 for (start = 0; start<4; start++) {
619 if (b[start] == 0x80) {
e8b23c02
RC
620 code=b[(start+3)%4];
621 parity=b[(start+2)%4];
ac9cd976
RC
622 }
623 }
624
625 /* Empty Request */
626 if (parity==0)
627 return 0;
628
629 /* Repeating... */
630 if (ir->old == parity)
631 return 0;
632
633
634 ir->old = parity;
635
636 /* Reduce code value to fit inside IR_KEYTAB_SIZE
637 *
638 * this is the only value that results in 42 unique
639 * codes < 128
640 */
641
642 code %= 0x88;
643
644 *ir_raw = code;
645 *ir_key = code;
646
647 i2cdprintk("Pinnacle PCTV key %02x\n", code);
648
649 return 1;
650}
651
1da177e4
LT
652
653void saa7134_input_irq(struct saa7134_dev *dev)
654{
4ac97914 655 struct saa7134_ir *ir = dev->remote;
1da177e4 656
4ac97914 657 if (!ir->polling)
1da177e4
LT
658 build_key(dev);
659}
660
661static void saa7134_input_timer(unsigned long data)
662{
663 struct saa7134_dev *dev = (struct saa7134_dev*)data;
664 struct saa7134_ir *ir = dev->remote;
665 unsigned long timeout;
666
667 build_key(dev);
668 timeout = jiffies + (ir->polling * HZ / 1000);
669 mod_timer(&ir->timer, timeout);
670}
671
672int saa7134_input_init1(struct saa7134_dev *dev)
673{
674 struct saa7134_ir *ir;
b7df3910 675 struct input_dev *input_dev;
1da177e4
LT
676 IR_KEYTAB_TYPE *ir_codes = NULL;
677 u32 mask_keycode = 0;
678 u32 mask_keydown = 0;
679 u32 mask_keyup = 0;
680 int polling = 0;
681 int ir_type = IR_TYPE_OTHER;
682
683 if (!dev->has_remote)
684 return -ENODEV;
685 if (disable_ir)
686 return -ENODEV;
687
688 /* detect & configure */
689 switch (dev->board) {
690 case SAA7134_BOARD_FLYVIDEO2000:
691 case SAA7134_BOARD_FLYVIDEO3000:
4ac97914 692 case SAA7134_BOARD_FLYTVPLATINUM_FM:
6af90ab5 693 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
1da177e4
LT
694 ir_codes = flyvideo_codes;
695 mask_keycode = 0xEC00000;
696 mask_keydown = 0x0040000;
697 break;
698 case SAA7134_BOARD_CINERGY400:
699 case SAA7134_BOARD_CINERGY600:
700 case SAA7134_BOARD_CINERGY600_MK3:
701 ir_codes = cinergy_codes;
702 mask_keycode = 0x00003f;
703 mask_keyup = 0x040000;
704 break;
705 case SAA7134_BOARD_ECS_TVP3XP:
706 case SAA7134_BOARD_ECS_TVP3XP_4CB5:
330a115a
MCC
707 ir_codes = eztv_codes;
708 mask_keycode = 0x00017c;
709 mask_keyup = 0x000002;
1da177e4 710 polling = 50; // ms
330a115a
MCC
711 break;
712 case SAA7134_BOARD_KWORLD_XPERT:
1da177e4 713 case SAA7134_BOARD_AVACSSMARTTV:
330a115a 714 ir_codes = avacssmart_codes;
1da177e4
LT
715 mask_keycode = 0x00001F;
716 mask_keyup = 0x000020;
717 polling = 50; // ms
718 break;
719 case SAA7134_BOARD_MD2819:
ac19ecc6 720 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
1da177e4
LT
721 case SAA7134_BOARD_AVERMEDIA_305:
722 case SAA7134_BOARD_AVERMEDIA_307:
ac19ecc6
MCC
723 case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
724 case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
725 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
1da177e4
LT
726 ir_codes = md2819_codes;
727 mask_keycode = 0x0007C8;
728 mask_keydown = 0x000010;
729 polling = 50; // ms
730 /* Set GPIO pin2 to high to enable the IR controller */
731 saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
732 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
733 break;
4ac97914 734 case SAA7134_BOARD_KWORLD_TERMINATOR:
dc2286cf
JW
735 ir_codes = avacssmart_codes;
736 mask_keycode = 0x00001f;
737 mask_keyup = 0x000060;
738 polling = 50; // ms
739 break;
ac19ecc6
MCC
740 case SAA7134_BOARD_MANLI_MTV001:
741 case SAA7134_BOARD_MANLI_MTV002:
a8ff417e 742 case SAA7134_BOARD_BEHOLD_409FM:
ac19ecc6
MCC
743 ir_codes = manli_codes;
744 mask_keycode = 0x001f00;
745 mask_keyup = 0x004000;
ac19ecc6
MCC
746 polling = 50; // ms
747 break;
4ac97914 748 case SAA7134_BOARD_GOTVIEW_7135:
6b961440
NS
749 ir_codes = gotview7135_codes;
750 mask_keycode = 0x0003EC;
751 mask_keyup = 0x008000;
752 mask_keydown = 0x000010;
753 polling = 50; // ms
754 break;
1da177e4 755 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
330a115a 756 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
1da177e4
LT
757 ir_codes = videomate_tv_pvr_codes;
758 mask_keycode = 0x00003F;
759 mask_keyup = 0x400000;
760 polling = 50; // ms
761 break;
4ac97914
MCC
762 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
763 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
fea095fe
NS
764 ir_codes = videomate_tv_pvr_codes;
765 mask_keycode = 0x003F00;
766 mask_keyup = 0x040000;
767 break;
1da177e4
LT
768 }
769 if (NULL == ir_codes) {
770 printk("%s: Oops: IR config error [card=%d]\n",
771 dev->name, dev->board);
772 return -ENODEV;
773 }
774
b7df3910
DT
775 ir = kzalloc(sizeof(*ir), GFP_KERNEL);
776 input_dev = input_allocate_device();
777 if (!ir || !input_dev) {
778 kfree(ir);
779 input_free_device(input_dev);
1da177e4 780 return -ENOMEM;
b7df3910 781 }
1da177e4
LT
782
783 /* init hardware-specific stuff */
784 ir->mask_keycode = mask_keycode;
785 ir->mask_keydown = mask_keydown;
786 ir->mask_keyup = mask_keyup;
4ac97914 787 ir->polling = polling;
1da177e4
LT
788
789 /* init input device */
790 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
791 saa7134_boards[dev->board].name);
792 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
793 pci_name(dev->pci));
794
b7df3910
DT
795 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
796 input_dev->name = ir->name;
797 input_dev->phys = ir->phys;
798 input_dev->id.bustype = BUS_PCI;
799 input_dev->id.version = 1;
1da177e4 800 if (dev->pci->subsystem_vendor) {
b7df3910
DT
801 input_dev->id.vendor = dev->pci->subsystem_vendor;
802 input_dev->id.product = dev->pci->subsystem_device;
1da177e4 803 } else {
b7df3910
DT
804 input_dev->id.vendor = dev->pci->vendor;
805 input_dev->id.product = dev->pci->device;
1da177e4 806 }
b7df3910 807 input_dev->cdev.dev = &dev->pci->dev;
1da177e4
LT
808
809 /* all done */
810 dev->remote = ir;
811 if (ir->polling) {
812 init_timer(&ir->timer);
813 ir->timer.function = saa7134_input_timer;
814 ir->timer.data = (unsigned long)dev;
815 ir->timer.expires = jiffies + HZ;
816 add_timer(&ir->timer);
817 }
818
b7df3910 819 input_register_device(ir->dev);
1da177e4
LT
820 return 0;
821}
822
823void saa7134_input_fini(struct saa7134_dev *dev)
824{
825 if (NULL == dev->remote)
826 return;
827
1da177e4
LT
828 if (dev->remote->polling)
829 del_timer_sync(&dev->remote->timer);
b7df3910 830 input_unregister_device(dev->remote->dev);
1da177e4
LT
831 kfree(dev->remote);
832 dev->remote = NULL;
833}
834
ac9cd976
RC
835void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
836{
837 if (disable_ir) {
838 ir->get_key=NULL;
839 return;
840 }
841
842 switch (dev->board) {
843 case SAA7134_BOARD_PINNACLE_PCTV_110i:
844 snprintf(ir->c.name, sizeof(ir->c.name), "Pinnacle PCTV");
845 ir->get_key = get_key_pinnacle;
846 ir->ir_codes = ir_codes_pinnacle;
847 break;
848 case SAA7134_BOARD_UPMOST_PURPLE_TV:
849 snprintf(ir->c.name, sizeof(ir->c.name), "Purple TV");
850 ir->get_key = get_key_purpletv;
851 ir->ir_codes = ir_codes_purpletv;
852 break;
853 default:
854 dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board);
855 break;
856 }
857
858}
1da177e4
LT
859/* ----------------------------------------------------------------------
860 * Local variables:
861 * c-basic-offset: 8
862 * End:
863 */
This page took 0.149852 seconds and 5 git commands to generate.