3 * handle saa7134 IR remotes via linux kernel input layer.
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.
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.
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
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>
29 #include "saa7134-reg.h"
32 static unsigned int disable_ir = 0;
33 module_param(disable_ir, int, 0444);
34 MODULE_PARM_DESC(disable_ir,"disable infrared remote support");
36 static unsigned int ir_debug = 0;
37 module_param(ir_debug, int, 0644);
38 MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");
40 #define dprintk(fmt, arg...) if (ir_debug) \
41 printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg)
42 #define i2cdprintk(fmt, arg...) if (ir_debug) \
43 printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
45 /* ---------------------------------------------------------------------- */
47 static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = {
59 [ 14 ] = KEY_MODE, // Air/Cable
60 [ 17 ] = KEY_VIDEO, // Video
61 [ 21 ] = KEY_AUDIO, // Audio
62 [ 0 ] = KEY_POWER, // Power
63 [ 24 ] = KEY_TUNER, // AV Source
64 [ 2 ] = KEY_ZOOM, // Fullscreen
65 [ 26 ] = KEY_LANGUAGE, // Stereo
66 [ 27 ] = KEY_MUTE, // Mute
67 [ 20 ] = KEY_VOLUMEUP, // Volume +
68 [ 23 ] = KEY_VOLUMEDOWN, // Volume -
69 [ 18 ] = KEY_CHANNELUP, // Channel +
70 [ 19 ] = KEY_CHANNELDOWN, // Channel -
71 [ 6 ] = KEY_AGAIN, // Recall
72 [ 16 ] = KEY_ENTER, // Enter
75 static IR_KEYTAB_TYPE flydvb_codes[IR_KEYTAB_SIZE] = {
76 [ 0x01 ] = KEY_ZOOM, // Full Screen
77 [ 0x00 ] = KEY_POWER, // Power
88 [ 0x06 ] = KEY_AGAIN, // Recall
90 [ 0x10 ] = KEY_MUTE, // Mute
91 [ 0x02 ] = KEY_RADIO, // TV/Radio
92 [ 0x1b ] = KEY_LANGUAGE, // SAP (Second Audio Program)
94 [ 0x14 ] = KEY_VOLUMEUP, // VOL+
95 [ 0x17 ] = KEY_VOLUMEDOWN, // VOL-
96 [ 0x12 ] = KEY_CHANNELUP, // CH+
97 [ 0x13 ] = KEY_CHANNELDOWN, // CH-
98 [ 0x1d ] = KEY_ENTER, // Enter
100 [ 0x1a ] = KEY_MODE, // PIP
101 [ 0x18 ] = KEY_TUNER, // Source
103 [ 0x1e ] = KEY_RECORD, // Record/Pause
104 [ 0x15 ] = KEY_ANGLE, // Swap (no label on key)
105 [ 0x1c ] = KEY_PAUSE, // Timeshift/Pause
106 [ 0x19 ] = KEY_BACK, // Rewind <<
107 [ 0x0a ] = KEY_PLAYPAUSE, // Play/Pause
108 [ 0x1f ] = KEY_FORWARD, // Forward >>
109 [ 0x16 ] = KEY_PREVIOUS, // Back |<<
110 [ 0x11 ] = KEY_STOP, // Stop
111 [ 0x0e ] = KEY_NEXT, // End >>|
114 static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
126 [ 0x0a ] = KEY_POWER,
127 [ 0x0b ] = KEY_PROG1, // app
128 [ 0x0c ] = KEY_ZOOM, // zoom/fullscreen
129 [ 0x0d ] = KEY_CHANNELUP, // channel
130 [ 0x0e ] = KEY_CHANNELDOWN, // channel-
131 [ 0x0f ] = KEY_VOLUMEUP,
132 [ 0x10 ] = KEY_VOLUMEDOWN,
133 [ 0x11 ] = KEY_TUNER, // AV
134 [ 0x12 ] = KEY_NUMLOCK, // -/--
135 [ 0x13 ] = KEY_AUDIO, // audio
140 [ 0x18 ] = KEY_RIGHT,
142 [ 0x1a ] = BTN_RIGHT,
143 [ 0x1b ] = KEY_WWW, // text
144 [ 0x1c ] = KEY_REWIND,
145 [ 0x1d ] = KEY_FORWARD,
146 [ 0x1e ] = KEY_RECORD,
148 [ 0x20 ] = KEY_PREVIOUSSONG,
149 [ 0x21 ] = KEY_NEXTSONG,
150 [ 0x22 ] = KEY_PAUSE,
154 /* Alfons Geser <a.geser@cox.net>
155 * updates from Job D. R. Borges <jobdrb@ig.com.br> */
156 static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = {
158 [ 1 ] = KEY_TV, // DVR
159 [ 21 ] = KEY_DVD, // DVD
160 [ 23 ] = KEY_AUDIO, // music
161 // DVR mode / DVD mode / music mode
163 [ 27 ] = KEY_MUTE, // mute
164 [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek
165 [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek
166 [ 22 ] = KEY_ZOOM, // full screen
167 [ 28 ] = KEY_VIDEO, // video source / eject / delall
168 [ 29 ] = KEY_RESTART, // playback / angle / del
169 [ 47 ] = KEY_SEARCH, // scan / menu / playlist
170 [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo
172 [ 49 ] = KEY_HELP, // help
173 [ 50 ] = KEY_MODE, // num/memo
174 [ 51 ] = KEY_ESC, // cancel
176 [ 12 ] = KEY_UP, // up
177 [ 16 ] = KEY_DOWN, // down
178 [ 8 ] = KEY_LEFT, // left
179 [ 4 ] = KEY_RIGHT, // right
180 [ 3 ] = KEY_SELECT, // select
182 [ 31 ] = KEY_REWIND, // rewind
183 [ 32 ] = KEY_PLAYPAUSE, // play/pause
184 [ 41 ] = KEY_FORWARD, // forward
185 [ 20 ] = KEY_AGAIN, // repeat
186 [ 43 ] = KEY_RECORD, // recording
187 [ 44 ] = KEY_STOP, // stop
188 [ 45 ] = KEY_PLAY, // play
189 [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle
202 [ 42 ] = KEY_VOLUMEUP,
203 [ 17 ] = KEY_VOLUMEDOWN,
204 [ 24 ] = KEY_CHANNELUP, // CH.tracking up
205 [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down
207 [ 19 ] = KEY_KPENTER, // enter
208 [ 33 ] = KEY_KPDOT, // . (decimal dot)
211 static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = {
212 [ 30 ] = KEY_POWER, // power
213 [ 28 ] = KEY_SEARCH, // scan
214 [ 7 ] = KEY_SELECT, // source
216 [ 22 ] = KEY_VOLUMEUP,
217 [ 20 ] = KEY_VOLUMEDOWN,
218 [ 31 ] = KEY_CHANNELUP,
219 [ 23 ] = KEY_CHANNELDOWN,
234 [ 3 ] = KEY_TUNER, // tv/fm
235 [ 4 ] = KEY_REWIND, // fm tuning left or function left
236 [ 12 ] = KEY_FORWARD, // fm tuning right or function right
243 [ 14 ] = KEY_MENU, // function
244 [ 19 ] = KEY_AGAIN, // recall
245 [ 29 ] = KEY_RESTART, // reset
246 [ 26 ] = KEY_SHUFFLE, // snapshot/shuffle
249 [ 13 ] = KEY_F21, // mts
250 [ 15 ] = KEY_F22, // min
253 /* Alex Hermann <gaaf@gmx.net> */
254 static IR_KEYTAB_TYPE md2819_codes[IR_KEYTAB_SIZE] = {
266 [ 32 ] = KEY_TV, // TV/FM
267 [ 16 ] = KEY_CD, // CD
268 [ 48 ] = KEY_TEXT, // TELETEXT
269 [ 0 ] = KEY_POWER, // POWER
271 [ 8 ] = KEY_VIDEO, // VIDEO
272 [ 4 ] = KEY_AUDIO, // AUDIO
273 [ 12 ] = KEY_ZOOM, // FULL SCREEN
275 [ 18 ] = KEY_SUBTITLE, // DISPLAY - ???
276 [ 50 ] = KEY_REWIND, // LOOP - ???
277 [ 2 ] = KEY_PRINT, // PREVIEW - ???
279 [ 42 ] = KEY_SEARCH, // AUTOSCAN
280 [ 26 ] = KEY_SLEEP, // FREEZE - ???
281 [ 58 ] = KEY_SHUFFLE, // SNAPSHOT - ???
282 [ 10 ] = KEY_MUTE, // MUTE
284 [ 38 ] = KEY_RECORD, // RECORD
285 [ 22 ] = KEY_PAUSE, // PAUSE
286 [ 54 ] = KEY_STOP, // STOP
287 [ 6 ] = KEY_PLAY, // PLAY
289 [ 46 ] = KEY_RED, // <RED>
290 [ 33 ] = KEY_GREEN, // <GREEN>
291 [ 14 ] = KEY_YELLOW, // <YELLOW>
292 [ 1 ] = KEY_BLUE, // <BLUE>
294 [ 30 ] = KEY_VOLUMEDOWN, // VOLUME-
295 [ 62 ] = KEY_VOLUMEUP, // VOLUME+
296 [ 17 ] = KEY_CHANNELDOWN, // CHANNEL/PAGE-
297 [ 49 ] = KEY_CHANNELUP // CHANNEL/PAGE+
300 static IR_KEYTAB_TYPE videomate_tv_pvr_codes[IR_KEYTAB_SIZE] = {
309 [ 8 ] = KEY_PLAYPAUSE,
310 [ 15 ] = KEY_FORWARD,
312 [ 2 ] = KEY_PREVIOUS,
325 [ 34 ] = KEY_CHANNEL,
327 [ 18 ] = KEY_VOLUMEUP,
328 [ 21 ] = KEY_VOLUMEDOWN,
329 [ 16 ] = KEY_CHANNELUP,
330 [ 19 ] = KEY_CHANNELDOWN,
345 [ 32 ] = KEY_LANGUAGE,
349 /* Michael Tokarev <mjt@tls.msk.ru>
350 http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
351 keytable is used by MANLI MTV00[12] and BeholdTV 40[13] at
352 least, and probably other cards too.
353 The "ascii-art picture" below (in comments, first row
354 is the keycode in hex, and subsequent row(s) shows
355 the button labels (several variants when appropriate)
356 helps to descide which keycodes to assign to the buttons.
358 static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = {
364 [ 0x1c ] = KEY_RADIO, /*XXX*/
365 [ 0x12 ] = KEY_POWER,
390 [ 0x0a ] = KEY_AGAIN, /*XXX KEY_REWIND? */
392 [ 0x17 ] = KEY_DIGITS, /*XXX*/
409 [ 0x0b ] = KEY_UP, /*XXX KEY_SCROLLUP? */
410 [ 0x18 ] = KEY_LEFT, /*XXX KEY_BACK? */
411 [ 0x16 ] = KEY_OK, /*XXX KEY_SELECT? KEY_ENTER? */
412 [ 0x0c ] = KEY_RIGHT, /*XXX KEY_FORWARD? */
413 [ 0x15 ] = KEY_DOWN, /*XXX KEY_SCROLLDOWN? */
419 [ 0x11 ] = KEY_TV, /*XXX*/
420 [ 0x0d ] = KEY_MODE, /*XXX there's no KEY_STEREO */
429 [ 0x0f ] = KEY_AUDIO,
430 [ 0x1b ] = KEY_VOLUMEUP,
431 [ 0x1a ] = KEY_CHANNELUP,
432 [ 0x0e ] = KEY_SLEEP, /*XXX maybe KEY_PAUSE */
433 [ 0x1f ] = KEY_VOLUMEDOWN,
434 [ 0x1e ] = KEY_CHANNELDOWN,
440 [ 0x19 ] = KEY_RECORD, /*XXX*/
446 /* Mike Baikov <mike@baikov.com> */
447 static IR_KEYTAB_TYPE gotview7135_codes[IR_KEYTAB_SIZE] = {
461 [ 115] = KEY_AGAIN, /* LOOP */
463 [ 97 ] = KEY_PRINT, /* PREVIEW */
465 [ 32 ] = KEY_CHANNELUP,
466 [ 64 ] = KEY_CHANNELDOWN,
467 [ 24 ] = KEY_VOLUMEDOWN,
468 [ 80 ] = KEY_VOLUMEUP,
471 [ 123] = KEY_SHUFFLE, /* SNAPSHOT */
477 [ 25 ] = KEY_FORWARD,
480 [ 82 ] = KEY_F21, /* LIVE TIMESHIFT */
481 [ 26 ] = KEY_F22, /* MIN TIMESHIFT */
482 [ 58 ] = KEY_F23, /* TIMESHIFT */
483 [ 112] = KEY_F24, /* NORMAL TIMESHIFT */
486 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
489 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
501 [ 0x12 ] = KEY_KPDOT, /* 100+ */
503 [ 0x7 ] = KEY_VOLUMEUP,
504 [ 0xb ] = KEY_VOLUMEDOWN,
505 [ 0x1a ] = KEY_KPPLUS,
506 [ 0x18 ] = KEY_KPMINUS,
509 [ 0xf ] = KEY_CHANNELUP,
510 [ 0x13 ] = KEY_CHANNELDOWN,
513 [ 0x1b ] = KEY_VIDEO, /* Video source */
514 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
515 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
517 [ 0x4b ] = KEY_RECORD,
519 [ 0x45 ] = KEY_PAUSE, /* Pause */
521 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
522 [ 0x42 ] = KEY_REWIND, /* Backward ? */
526 /* Mapping for the 28 key remote control as seen at
527 http://www.sednacomputer.com/photo/cardbus-tv.jpg
528 Pavel Mihaylov <bin@bash.info> */
529 static IR_KEYTAB_TYPE pctv_sedna_codes[IR_KEYTAB_SIZE] = {
541 [ 0x0a ] = KEY_AGAIN, /* Recall */
542 [ 0x0b ] = KEY_CHANNELUP,
543 [ 0x0c ] = KEY_VOLUMEUP,
544 [ 0x0d ] = KEY_MODE, /* Stereo */
546 [ 0x0f ] = KEY_PREVIOUSSONG,
548 [ 0x11 ] = KEY_TUNER, /* Source */
549 [ 0x12 ] = KEY_POWER,
551 [ 0x15 ] = KEY_CHANNELDOWN,
552 [ 0x18 ] = KEY_VOLUMEDOWN,
553 [ 0x19 ] = KEY_SHUFFLE, /* Snapshot */
554 [ 0x1a ] = KEY_NEXTSONG,
555 [ 0x1b ] = KEY_TEXT, /* Time Shift */
556 [ 0x1c ] = KEY_RADIO, /* FM Radio */
557 [ 0x1d ] = KEY_RECORD,
558 [ 0x1e ] = KEY_PAUSE,
562 /* -------------------- GPIO generic keycode builder -------------------- */
564 static int build_key(struct saa7134_dev *dev)
566 struct saa7134_ir *ir = dev->remote;
569 /* rising SAA7134_GPIO_GPRESCAN reads the status */
570 saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
571 saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
573 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
575 if (ir->last_gpio == gpio)
577 ir->last_gpio = gpio;
580 data = ir_extract_bits(gpio, ir->mask_keycode);
581 dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
582 gpio, ir->mask_keycode, data);
585 if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
586 (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
587 ir_input_keydown(ir->dev, &ir->ir, data, data);
589 ir_input_nokey(ir->dev, &ir->ir);
592 else { /* IRQ driven mode - handle key press and release in one go */
593 if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
594 (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
595 ir_input_keydown(ir->dev, &ir->ir, data, data);
596 ir_input_nokey(ir->dev, &ir->ir);
603 /* --------------------- Chip specific I2C key builders ----------------- */
605 static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
610 if (1 != i2c_master_recv(&ir->c,&b,1)) {
611 i2cdprintk("read error\n");
615 /* no button press */
628 void saa7134_input_irq(struct saa7134_dev *dev)
630 struct saa7134_ir *ir = dev->remote;
636 static void saa7134_input_timer(unsigned long data)
638 struct saa7134_dev *dev = (struct saa7134_dev*)data;
639 struct saa7134_ir *ir = dev->remote;
640 unsigned long timeout;
643 timeout = jiffies + (ir->polling * HZ / 1000);
644 mod_timer(&ir->timer, timeout);
647 int saa7134_input_init1(struct saa7134_dev *dev)
649 struct saa7134_ir *ir;
650 struct input_dev *input_dev;
651 IR_KEYTAB_TYPE *ir_codes = NULL;
652 u32 mask_keycode = 0;
653 u32 mask_keydown = 0;
656 int ir_type = IR_TYPE_OTHER;
658 if (dev->has_remote != SAA7134_REMOTE_GPIO)
663 /* detect & configure */
664 switch (dev->board) {
665 case SAA7134_BOARD_FLYVIDEO2000:
666 case SAA7134_BOARD_FLYVIDEO3000:
667 case SAA7134_BOARD_FLYTVPLATINUM_FM:
668 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
669 ir_codes = flyvideo_codes;
670 mask_keycode = 0xEC00000;
671 mask_keydown = 0x0040000;
673 case SAA7134_BOARD_CINERGY400:
674 case SAA7134_BOARD_CINERGY600:
675 case SAA7134_BOARD_CINERGY600_MK3:
676 ir_codes = cinergy_codes;
677 mask_keycode = 0x00003f;
678 mask_keyup = 0x040000;
680 case SAA7134_BOARD_ECS_TVP3XP:
681 case SAA7134_BOARD_ECS_TVP3XP_4CB5:
682 ir_codes = eztv_codes;
683 mask_keycode = 0x00017c;
684 mask_keyup = 0x000002;
687 case SAA7134_BOARD_KWORLD_XPERT:
688 case SAA7134_BOARD_AVACSSMARTTV:
689 ir_codes = avacssmart_codes;
690 mask_keycode = 0x00001F;
691 mask_keyup = 0x000020;
694 case SAA7134_BOARD_MD2819:
695 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
696 case SAA7134_BOARD_AVERMEDIA_305:
697 case SAA7134_BOARD_AVERMEDIA_307:
698 case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
699 case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
700 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
701 ir_codes = md2819_codes;
702 mask_keycode = 0x0007C8;
703 mask_keydown = 0x000010;
705 /* Set GPIO pin2 to high to enable the IR controller */
706 saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
707 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
709 case SAA7134_BOARD_KWORLD_TERMINATOR:
710 ir_codes = avacssmart_codes;
711 mask_keycode = 0x00001f;
712 mask_keyup = 0x000060;
715 case SAA7134_BOARD_MANLI_MTV001:
716 case SAA7134_BOARD_MANLI_MTV002:
717 case SAA7134_BOARD_BEHOLD_409FM:
718 ir_codes = manli_codes;
719 mask_keycode = 0x001f00;
720 mask_keyup = 0x004000;
723 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
724 ir_codes = pctv_sedna_codes;
725 mask_keycode = 0x001f00;
726 mask_keyup = 0x004000;
729 case SAA7134_BOARD_GOTVIEW_7135:
730 ir_codes = gotview7135_codes;
731 mask_keycode = 0x0003EC;
732 mask_keyup = 0x008000;
733 mask_keydown = 0x000010;
736 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
737 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
738 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
739 ir_codes = videomate_tv_pvr_codes;
740 mask_keycode = 0x00003F;
741 mask_keyup = 0x400000;
744 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
745 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
746 ir_codes = videomate_tv_pvr_codes;
747 mask_keycode = 0x003F00;
748 mask_keyup = 0x040000;
750 case SAA7134_BOARD_FLYDVBT_LR301:
751 ir_codes = flydvb_codes;
752 mask_keycode = 0x0001F00;
753 mask_keydown = 0x0040000;
756 if (NULL == ir_codes) {
757 printk("%s: Oops: IR config error [card=%d]\n",
758 dev->name, dev->board);
762 ir = kzalloc(sizeof(*ir), GFP_KERNEL);
763 input_dev = input_allocate_device();
764 if (!ir || !input_dev) {
766 input_free_device(input_dev);
772 /* init hardware-specific stuff */
773 ir->mask_keycode = mask_keycode;
774 ir->mask_keydown = mask_keydown;
775 ir->mask_keyup = mask_keyup;
776 ir->polling = polling;
778 /* init input device */
779 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
780 saa7134_boards[dev->board].name);
781 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
784 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
785 input_dev->name = ir->name;
786 input_dev->phys = ir->phys;
787 input_dev->id.bustype = BUS_PCI;
788 input_dev->id.version = 1;
789 if (dev->pci->subsystem_vendor) {
790 input_dev->id.vendor = dev->pci->subsystem_vendor;
791 input_dev->id.product = dev->pci->subsystem_device;
793 input_dev->id.vendor = dev->pci->vendor;
794 input_dev->id.product = dev->pci->device;
796 input_dev->cdev.dev = &dev->pci->dev;
801 init_timer(&ir->timer);
802 ir->timer.function = saa7134_input_timer;
803 ir->timer.data = (unsigned long)dev;
804 ir->timer.expires = jiffies + HZ;
805 add_timer(&ir->timer);
808 input_register_device(ir->dev);
812 void saa7134_input_fini(struct saa7134_dev *dev)
814 if (NULL == dev->remote)
817 if (dev->remote->polling)
818 del_timer_sync(&dev->remote->timer);
819 input_unregister_device(dev->remote->dev);
824 void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
827 dprintk("Found supported i2c remote, but IR has been disabled\n");
832 switch (dev->board) {
833 case SAA7134_BOARD_PINNACLE_PCTV_110i:
834 snprintf(ir->c.name, sizeof(ir->c.name), "Pinnacle PCTV");
835 ir->get_key = get_key_pinnacle;
836 ir->ir_codes = ir_codes_pinnacle;
838 case SAA7134_BOARD_UPMOST_PURPLE_TV:
839 snprintf(ir->c.name, sizeof(ir->c.name), "Purple TV");
840 ir->get_key = get_key_purpletv;
841 ir->ir_codes = ir_codes_purpletv;
844 dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board);
849 /* ----------------------------------------------------------------------