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
22 #include "saa7134-reg.h"
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/interrupt.h>
28 #include <linux/slab.h>
30 #define MODULE_NAME "saa7134"
32 static unsigned int disable_ir
;
33 module_param(disable_ir
, int, 0444);
34 MODULE_PARM_DESC(disable_ir
,"disable infrared remote support");
36 static unsigned int ir_debug
;
37 module_param(ir_debug
, int, 0644);
38 MODULE_PARM_DESC(ir_debug
,"enable debug messages [IR]");
40 static int pinnacle_remote
;
41 module_param(pinnacle_remote
, int, 0644); /* Choose Pinnacle PCTV remote */
42 MODULE_PARM_DESC(pinnacle_remote
, "Specify Pinnacle PCTV remote: 0=coloured, 1=grey (defaults to 0)");
44 #define input_dbg(fmt, arg...) do { \
46 printk(KERN_DEBUG pr_fmt("input: " fmt), ## arg); \
48 #define ir_dbg(ir, fmt, arg...) do { \
50 printk(KERN_DEBUG pr_fmt("ir %s: " fmt), ir->name, ## arg); \
53 /* Helper function for raw decoding at GPIO16 or GPIO18 */
54 static int saa7134_raw_decode_irq(struct saa7134_dev
*dev
);
56 /* -------------------- GPIO generic keycode builder -------------------- */
58 static int build_key(struct saa7134_dev
*dev
)
60 struct saa7134_card_ir
*ir
= dev
->remote
;
63 /* here comes the additional handshake steps for some cards */
65 case SAA7134_BOARD_GOTVIEW_7135
:
66 saa_setb(SAA7134_GPIO_GPSTATUS1
, 0x80);
67 saa_clearb(SAA7134_GPIO_GPSTATUS1
, 0x80);
70 /* rising SAA7134_GPIO_GPRESCAN reads the status */
71 saa_clearb(SAA7134_GPIO_GPMODE3
,SAA7134_GPIO_GPRESCAN
);
72 saa_setb(SAA7134_GPIO_GPMODE3
,SAA7134_GPIO_GPRESCAN
);
74 gpio
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2);
76 if (ir
->last_gpio
== gpio
)
81 data
= ir_extract_bits(gpio
, ir
->mask_keycode
);
82 input_dbg("build_key gpio=0x%x mask=0x%x data=%d\n",
83 gpio
, ir
->mask_keycode
, data
);
86 case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG
:
87 if (data
== ir
->mask_keycode
)
90 rc_keydown_notimeout(ir
->dev
, RC_TYPE_UNKNOWN
, data
, 0);
95 if ((ir
->mask_keydown
&& (0 != (gpio
& ir
->mask_keydown
))) ||
96 (ir
->mask_keyup
&& (0 == (gpio
& ir
->mask_keyup
)))) {
97 rc_keydown_notimeout(ir
->dev
, RC_TYPE_UNKNOWN
, data
, 0);
102 else { /* IRQ driven mode - handle key press and release in one go */
103 if ((ir
->mask_keydown
&& (0 != (gpio
& ir
->mask_keydown
))) ||
104 (ir
->mask_keyup
&& (0 == (gpio
& ir
->mask_keyup
)))) {
105 rc_keydown_notimeout(ir
->dev
, RC_TYPE_UNKNOWN
, data
, 0);
113 /* --------------------- Chip specific I2C key builders ----------------- */
115 static int get_key_flydvb_trio(struct IR_i2c
*ir
, enum rc_type
*protocol
,
116 u32
*scancode
, u8
*toggle
)
122 /* We need this to access GPI Used by the saa_readl macro. */
123 struct saa7134_dev
*dev
= ir
->c
->adapter
->algo_data
;
126 ir_dbg(ir
, "get_key_flydvb_trio: ir->c->adapter->algo_data is NULL!\n");
130 /* rising SAA7134_GPIGPRESCAN reads the status */
131 saa_clearb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
132 saa_setb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
134 gpio
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2);
137 return 0; /* No button press */
140 /* weak up the IR chip */
143 while (1 != i2c_master_send(ir
->c
, &b
, 1)) {
144 if ((attempt
++) < 10) {
146 * wait a bit for next attempt -
147 * I don't know how make it better
152 ir_dbg(ir
, "send wake up byte to pic16C505 (IR chip)failed %dx\n",
156 if (1 != i2c_master_recv(ir
->c
, &b
, 1)) {
157 ir_dbg(ir
, "read error\n");
161 *protocol
= RC_TYPE_UNKNOWN
;
167 static int get_key_msi_tvanywhere_plus(struct IR_i2c
*ir
, enum rc_type
*protocol
,
168 u32
*scancode
, u8
*toggle
)
173 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */
174 struct saa7134_dev
*dev
= ir
->c
->adapter
->algo_data
;
176 ir_dbg(ir
, "get_key_msi_tvanywhere_plus: ir->c->adapter->algo_data is NULL!\n");
180 /* rising SAA7134_GPIO_GPRESCAN reads the status */
182 saa_clearb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
183 saa_setb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
185 gpio
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2);
187 /* GPIO&0x40 is pulsed low when a button is pressed. Don't do
188 I2C receive if gpio&0x40 is not low. */
191 return 0; /* No button press */
193 /* GPIO says there is a button press. Get it. */
195 if (1 != i2c_master_recv(ir
->c
, &b
, 1)) {
196 ir_dbg(ir
, "read error\n");
200 /* No button press */
207 input_dbg("get_key_msi_tvanywhere_plus: Key = 0x%02X\n", b
);
208 *protocol
= RC_TYPE_UNKNOWN
;
214 /* copied and modified from get_key_msi_tvanywhere_plus() */
215 static int get_key_kworld_pc150u(struct IR_i2c
*ir
, enum rc_type
*protocol
,
216 u32
*scancode
, u8
*toggle
)
221 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */
222 struct saa7134_dev
*dev
= ir
->c
->adapter
->algo_data
;
224 ir_dbg(ir
, "get_key_kworld_pc150u: ir->c->adapter->algo_data is NULL!\n");
228 /* rising SAA7134_GPIO_GPRESCAN reads the status */
230 saa_clearb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
231 saa_setb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
233 gpio
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2);
235 /* GPIO&0x100 is pulsed low when a button is pressed. Don't do
236 I2C receive if gpio&0x100 is not low. */
239 return 0; /* No button press */
241 /* GPIO says there is a button press. Get it. */
243 if (1 != i2c_master_recv(ir
->c
, &b
, 1)) {
244 ir_dbg(ir
, "read error\n");
248 /* No button press */
255 input_dbg("get_key_kworld_pc150u: Key = 0x%02X\n", b
);
256 *protocol
= RC_TYPE_UNKNOWN
;
262 static int get_key_purpletv(struct IR_i2c
*ir
, enum rc_type
*protocol
,
263 u32
*scancode
, u8
*toggle
)
268 if (1 != i2c_master_recv(ir
->c
, &b
, 1)) {
269 ir_dbg(ir
, "read error\n");
273 /* no button press */
281 *protocol
= RC_TYPE_UNKNOWN
;
287 static int get_key_hvr1110(struct IR_i2c
*ir
, enum rc_type
*protocol
,
288 u32
*scancode
, u8
*toggle
)
290 unsigned char buf
[5];
293 if (5 != i2c_master_recv(ir
->c
, buf
, 5))
296 /* Check if some key were pressed */
297 if (!(buf
[0] & 0x80))
301 * buf[3] & 0x80 is always high.
302 * buf[3] & 0x40 is a parity bit. A repeat event is marked
303 * by preserving it into two separate readings
304 * buf[4] bits 0 and 1, and buf[1] and buf[2] are always
307 * Note that the keymap which the hvr1110 uses is RC5.
309 * FIXME: start bits could maybe be used...?
311 *protocol
= RC_TYPE_RC5
;
312 *scancode
= RC_SCANCODE_RC5(buf
[3] & 0x1f, buf
[4] >> 2);
313 *toggle
= !!(buf
[3] & 0x40);
318 static int get_key_beholdm6xx(struct IR_i2c
*ir
, enum rc_type
*protocol
,
319 u32
*scancode
, u8
*toggle
)
321 unsigned char data
[12];
324 struct saa7134_dev
*dev
= ir
->c
->adapter
->algo_data
;
326 /* rising SAA7134_GPIO_GPRESCAN reads the status */
327 saa_clearb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
328 saa_setb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
330 gpio
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2);
332 if (0x400000 & ~gpio
)
333 return 0; /* No button press */
335 ir
->c
->addr
= 0x5a >> 1;
337 if (12 != i2c_master_recv(ir
->c
, data
, 12)) {
338 ir_dbg(ir
, "read error\n");
342 if (data
[9] != (unsigned char)(~data
[8]))
345 *protocol
= RC_TYPE_NECX
;
346 *scancode
= RC_SCANCODE_NECX(data
[11] << 8 | data
[10], data
[9]);
351 /* Common (grey or coloured) pinnacle PCTV remote handling
354 static int get_key_pinnacle(struct IR_i2c
*ir
, enum rc_type
*protocol
,
355 u32
*scancode
, u8
*toggle
, int parity_offset
,
356 int marker
, int code_modulo
)
359 unsigned int start
= 0,parity
= 0,code
= 0;
362 if (4 != i2c_master_recv(ir
->c
, b
, 4)) {
363 ir_dbg(ir
, "read error\n");
367 for (start
= 0; start
< ARRAY_SIZE(b
); start
++) {
368 if (b
[start
] == marker
) {
369 code
=b
[(start
+parity_offset
+ 1) % 4];
370 parity
=b
[(start
+parity_offset
) % 4];
379 if (ir
->old
== parity
)
384 /* drop special codes when a key is held down a long time for the grey controller
385 In this case, the second bit of the code is asserted */
386 if (marker
== 0xfe && (code
& 0x40))
391 *protocol
= RC_TYPE_UNKNOWN
;
395 ir_dbg(ir
, "Pinnacle PCTV key %02x\n", code
);
399 /* The grey pinnacle PCTV remote
401 * There are one issue with this remote:
402 * - I2c packet does not change when the same key is pressed quickly. The workaround
403 * is to hold down each key for about half a second, so that another code is generated
404 * in the i2c packet, and the function can distinguish key presses.
406 * Sylvain Pasche <sylvain.pasche@gmail.com>
408 static int get_key_pinnacle_grey(struct IR_i2c
*ir
, enum rc_type
*protocol
,
409 u32
*scancode
, u8
*toggle
)
412 return get_key_pinnacle(ir
, protocol
, scancode
, toggle
, 1, 0xfe, 0xff);
416 /* The new pinnacle PCTV remote (with the colored buttons)
418 * Ricardo Cerqueira <v4l@cerqueira.org>
420 static int get_key_pinnacle_color(struct IR_i2c
*ir
, enum rc_type
*protocol
,
421 u32
*scancode
, u8
*toggle
)
423 /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
425 * this is the only value that results in 42 unique
429 return get_key_pinnacle(ir
, protocol
, scancode
, toggle
, 2, 0x80, 0x88);
432 void saa7134_input_irq(struct saa7134_dev
*dev
)
434 struct saa7134_card_ir
*ir
;
436 if (!dev
|| !dev
->remote
)
443 if (!ir
->polling
&& !ir
->raw_decode
) {
445 } else if (ir
->raw_decode
) {
446 saa7134_raw_decode_irq(dev
);
450 static void saa7134_input_timer(unsigned long data
)
452 struct saa7134_dev
*dev
= (struct saa7134_dev
*)data
;
453 struct saa7134_card_ir
*ir
= dev
->remote
;
456 mod_timer(&ir
->timer
, jiffies
+ msecs_to_jiffies(ir
->polling
));
459 static void ir_raw_decode_timer_end(unsigned long data
)
461 struct saa7134_dev
*dev
= (struct saa7134_dev
*)data
;
463 ir_raw_event_handle(dev
->remote
->dev
);
466 static int __saa7134_ir_start(void *priv
)
468 struct saa7134_dev
*dev
= priv
;
469 struct saa7134_card_ir
*ir
;
471 if (!dev
|| !dev
->remote
)
478 /* Moved here from saa7134_input_init1() because the latter
479 * is not called on device resume */
480 switch (dev
->board
) {
481 case SAA7134_BOARD_MD2819
:
482 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT
:
483 case SAA7134_BOARD_AVERMEDIA_305
:
484 case SAA7134_BOARD_AVERMEDIA_307
:
485 case SAA7134_BOARD_AVERMEDIA_505
:
486 case SAA7134_BOARD_AVERMEDIA_STUDIO_305
:
487 case SAA7134_BOARD_AVERMEDIA_STUDIO_505
:
488 case SAA7134_BOARD_AVERMEDIA_STUDIO_307
:
489 case SAA7134_BOARD_AVERMEDIA_STUDIO_507
:
490 case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA
:
491 case SAA7134_BOARD_AVERMEDIA_GO_007_FM
:
492 case SAA7134_BOARD_AVERMEDIA_M102
:
493 case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS
:
494 /* Without this we won't receive key up events */
495 saa_setb(SAA7134_GPIO_GPMODE0
, 0x4);
496 saa_setb(SAA7134_GPIO_GPSTATUS0
, 0x4);
498 case SAA7134_BOARD_AVERMEDIA_777
:
499 case SAA7134_BOARD_AVERMEDIA_A16AR
:
500 /* Without this we won't receive key up events */
501 saa_setb(SAA7134_GPIO_GPMODE1
, 0x1);
502 saa_setb(SAA7134_GPIO_GPSTATUS1
, 0x1);
504 case SAA7134_BOARD_AVERMEDIA_A16D
:
505 /* Without this we won't receive key up events */
506 saa_setb(SAA7134_GPIO_GPMODE1
, 0x1);
507 saa_setb(SAA7134_GPIO_GPSTATUS1
, 0x1);
509 case SAA7134_BOARD_GOTVIEW_7135
:
510 saa_setb(SAA7134_GPIO_GPMODE1
, 0x80);
517 setup_timer(&ir
->timer
, saa7134_input_timer
,
519 ir
->timer
.expires
= jiffies
+ HZ
;
520 add_timer(&ir
->timer
);
521 } else if (ir
->raw_decode
) {
522 /* set timer_end for code completion */
523 setup_timer(&ir
->timer
, ir_raw_decode_timer_end
,
530 static void __saa7134_ir_stop(void *priv
)
532 struct saa7134_dev
*dev
= priv
;
533 struct saa7134_card_ir
*ir
;
535 if (!dev
|| !dev
->remote
)
542 if (ir
->polling
|| ir
->raw_decode
)
543 del_timer_sync(&ir
->timer
);
550 int saa7134_ir_start(struct saa7134_dev
*dev
)
552 if (dev
->remote
->users
)
553 return __saa7134_ir_start(dev
);
558 void saa7134_ir_stop(struct saa7134_dev
*dev
)
560 if (dev
->remote
->users
)
561 __saa7134_ir_stop(dev
);
564 static int saa7134_ir_open(struct rc_dev
*rc
)
566 struct saa7134_dev
*dev
= rc
->priv
;
568 dev
->remote
->users
++;
569 return __saa7134_ir_start(dev
);
572 static void saa7134_ir_close(struct rc_dev
*rc
)
574 struct saa7134_dev
*dev
= rc
->priv
;
576 dev
->remote
->users
--;
577 if (!dev
->remote
->users
)
578 __saa7134_ir_stop(dev
);
581 int saa7134_input_init1(struct saa7134_dev
*dev
)
583 struct saa7134_card_ir
*ir
;
585 char *ir_codes
= NULL
;
586 u32 mask_keycode
= 0;
587 u32 mask_keydown
= 0;
589 unsigned polling
= 0;
590 bool raw_decode
= false;
593 if (dev
->has_remote
!= SAA7134_REMOTE_GPIO
)
598 /* detect & configure */
599 switch (dev
->board
) {
600 case SAA7134_BOARD_FLYVIDEO2000
:
601 case SAA7134_BOARD_FLYVIDEO3000
:
602 case SAA7134_BOARD_FLYTVPLATINUM_FM
:
603 case SAA7134_BOARD_FLYTVPLATINUM_MINI2
:
604 case SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM
:
605 ir_codes
= RC_MAP_FLYVIDEO
;
606 mask_keycode
= 0xEC00000;
607 mask_keydown
= 0x0040000;
609 case SAA7134_BOARD_CINERGY400
:
610 case SAA7134_BOARD_CINERGY600
:
611 case SAA7134_BOARD_CINERGY600_MK3
:
612 ir_codes
= RC_MAP_CINERGY
;
613 mask_keycode
= 0x00003f;
614 mask_keyup
= 0x040000;
616 case SAA7134_BOARD_ECS_TVP3XP
:
617 case SAA7134_BOARD_ECS_TVP3XP_4CB5
:
618 ir_codes
= RC_MAP_EZTV
;
619 mask_keycode
= 0x00017c;
620 mask_keyup
= 0x000002;
623 case SAA7134_BOARD_KWORLD_XPERT
:
624 case SAA7134_BOARD_AVACSSMARTTV
:
625 ir_codes
= RC_MAP_PIXELVIEW
;
626 mask_keycode
= 0x00001F;
627 mask_keyup
= 0x000020;
630 case SAA7134_BOARD_MD2819
:
631 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT
:
632 case SAA7134_BOARD_AVERMEDIA_305
:
633 case SAA7134_BOARD_AVERMEDIA_307
:
634 case SAA7134_BOARD_AVERMEDIA_505
:
635 case SAA7134_BOARD_AVERMEDIA_STUDIO_305
:
636 case SAA7134_BOARD_AVERMEDIA_STUDIO_505
:
637 case SAA7134_BOARD_AVERMEDIA_STUDIO_307
:
638 case SAA7134_BOARD_AVERMEDIA_STUDIO_507
:
639 case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA
:
640 case SAA7134_BOARD_AVERMEDIA_GO_007_FM
:
641 case SAA7134_BOARD_AVERMEDIA_M102
:
642 case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS
:
643 ir_codes
= RC_MAP_AVERMEDIA
;
644 mask_keycode
= 0x0007C8;
645 mask_keydown
= 0x000010;
647 /* GPIO stuff moved to __saa7134_ir_start() */
649 case SAA7134_BOARD_AVERMEDIA_M135A
:
650 ir_codes
= RC_MAP_AVERMEDIA_M135A
;
651 mask_keydown
= 0x0040000; /* Enable GPIO18 line on both edges */
652 mask_keyup
= 0x0040000;
653 mask_keycode
= 0xffff;
656 case SAA7134_BOARD_AVERMEDIA_M733A
:
657 ir_codes
= RC_MAP_AVERMEDIA_M733A_RM_K6
;
658 mask_keydown
= 0x0040000;
659 mask_keyup
= 0x0040000;
660 mask_keycode
= 0xffff;
663 case SAA7134_BOARD_AVERMEDIA_777
:
664 case SAA7134_BOARD_AVERMEDIA_A16AR
:
665 ir_codes
= RC_MAP_AVERMEDIA
;
666 mask_keycode
= 0x02F200;
667 mask_keydown
= 0x000400;
669 /* GPIO stuff moved to __saa7134_ir_start() */
671 case SAA7134_BOARD_AVERMEDIA_A16D
:
672 ir_codes
= RC_MAP_AVERMEDIA_A16D
;
673 mask_keycode
= 0x02F200;
674 mask_keydown
= 0x000400;
675 polling
= 50; /* ms */
676 /* GPIO stuff moved to __saa7134_ir_start() */
678 case SAA7134_BOARD_KWORLD_TERMINATOR
:
679 ir_codes
= RC_MAP_PIXELVIEW
;
680 mask_keycode
= 0x00001f;
681 mask_keyup
= 0x000060;
684 case SAA7134_BOARD_MANLI_MTV001
:
685 case SAA7134_BOARD_MANLI_MTV002
:
686 ir_codes
= RC_MAP_MANLI
;
687 mask_keycode
= 0x001f00;
688 mask_keyup
= 0x004000;
689 polling
= 50; /* ms */
691 case SAA7134_BOARD_BEHOLD_409FM
:
692 case SAA7134_BOARD_BEHOLD_401
:
693 case SAA7134_BOARD_BEHOLD_403
:
694 case SAA7134_BOARD_BEHOLD_403FM
:
695 case SAA7134_BOARD_BEHOLD_405
:
696 case SAA7134_BOARD_BEHOLD_405FM
:
697 case SAA7134_BOARD_BEHOLD_407
:
698 case SAA7134_BOARD_BEHOLD_407FM
:
699 case SAA7134_BOARD_BEHOLD_409
:
700 case SAA7134_BOARD_BEHOLD_505FM
:
701 case SAA7134_BOARD_BEHOLD_505RDS_MK5
:
702 case SAA7134_BOARD_BEHOLD_505RDS_MK3
:
703 case SAA7134_BOARD_BEHOLD_507_9FM
:
704 case SAA7134_BOARD_BEHOLD_507RDS_MK3
:
705 case SAA7134_BOARD_BEHOLD_507RDS_MK5
:
706 ir_codes
= RC_MAP_MANLI
;
707 mask_keycode
= 0x003f00;
708 mask_keyup
= 0x004000;
709 polling
= 50; /* ms */
711 case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM
:
712 ir_codes
= RC_MAP_BEHOLD_COLUMBUS
;
713 mask_keycode
= 0x003f00;
714 mask_keyup
= 0x004000;
717 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS
:
718 ir_codes
= RC_MAP_PCTV_SEDNA
;
719 mask_keycode
= 0x001f00;
720 mask_keyup
= 0x004000;
723 case SAA7134_BOARD_GOTVIEW_7135
:
724 ir_codes
= RC_MAP_GOTVIEW7135
;
725 mask_keycode
= 0x0003CC;
726 mask_keydown
= 0x000010;
727 polling
= 5; /* ms */
728 /* GPIO stuff moved to __saa7134_ir_start() */
730 case SAA7134_BOARD_VIDEOMATE_TV_PVR
:
731 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS
:
732 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII
:
733 ir_codes
= RC_MAP_VIDEOMATE_TV_PVR
;
734 mask_keycode
= 0x00003F;
735 mask_keyup
= 0x400000;
738 case SAA7134_BOARD_PROTEUS_2309
:
739 ir_codes
= RC_MAP_PROTEUS_2309
;
740 mask_keycode
= 0x00007F;
741 mask_keyup
= 0x000080;
744 case SAA7134_BOARD_VIDEOMATE_DVBT_300
:
745 case SAA7134_BOARD_VIDEOMATE_DVBT_200
:
746 ir_codes
= RC_MAP_VIDEOMATE_TV_PVR
;
747 mask_keycode
= 0x003F00;
748 mask_keyup
= 0x040000;
750 case SAA7134_BOARD_FLYDVBS_LR300
:
751 case SAA7134_BOARD_FLYDVBT_LR301
:
752 case SAA7134_BOARD_FLYDVBTDUO
:
753 ir_codes
= RC_MAP_FLYDVB
;
754 mask_keycode
= 0x0001F00;
755 mask_keydown
= 0x0040000;
757 case SAA7134_BOARD_ASUSTeK_P7131_DUAL
:
758 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA
:
759 case SAA7134_BOARD_ASUSTeK_P7131_ANALOG
:
760 ir_codes
= RC_MAP_ASUS_PC39
;
761 mask_keydown
= 0x0040000; /* Enable GPIO18 line on both edges */
762 mask_keyup
= 0x0040000;
763 mask_keycode
= 0xffff;
766 case SAA7134_BOARD_ASUSTeK_PS3_100
:
767 ir_codes
= RC_MAP_ASUS_PS3_100
;
768 mask_keydown
= 0x0040000;
769 mask_keyup
= 0x0040000;
770 mask_keycode
= 0xffff;
773 case SAA7134_BOARD_ENCORE_ENLTV
:
774 case SAA7134_BOARD_ENCORE_ENLTV_FM
:
775 ir_codes
= RC_MAP_ENCORE_ENLTV
;
776 mask_keycode
= 0x00007f;
777 mask_keyup
= 0x040000;
780 case SAA7134_BOARD_ENCORE_ENLTV_FM53
:
781 case SAA7134_BOARD_ENCORE_ENLTV_FM3
:
782 ir_codes
= RC_MAP_ENCORE_ENLTV_FM53
;
783 mask_keydown
= 0x0040000; /* Enable GPIO18 line on both edges */
784 mask_keyup
= 0x0040000;
785 mask_keycode
= 0xffff;
788 case SAA7134_BOARD_10MOONSTVMASTER3
:
789 ir_codes
= RC_MAP_ENCORE_ENLTV
;
790 mask_keycode
= 0x5f80000;
791 mask_keyup
= 0x8000000;
794 case SAA7134_BOARD_GENIUS_TVGO_A11MCE
:
795 ir_codes
= RC_MAP_GENIUS_TVGO_A11MCE
;
797 mask_keydown
= 0xf00000;
798 polling
= 50; /* ms */
800 case SAA7134_BOARD_REAL_ANGEL_220
:
801 ir_codes
= RC_MAP_REAL_AUDIO_220_32_KEYS
;
802 mask_keycode
= 0x3f00;
804 polling
= 50; /* ms */
806 case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG
:
807 ir_codes
= RC_MAP_KWORLD_PLUS_TV_ANALOG
;
809 polling
= 40; /* ms */
811 case SAA7134_BOARD_VIDEOMATE_S350
:
812 ir_codes
= RC_MAP_VIDEOMATE_S350
;
813 mask_keycode
= 0x003f00;
814 mask_keydown
= 0x040000;
816 case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S
:
817 ir_codes
= RC_MAP_WINFAST
;
818 mask_keycode
= 0x5f00;
819 mask_keyup
= 0x020000;
820 polling
= 50; /* ms */
822 case SAA7134_BOARD_VIDEOMATE_M1F
:
823 ir_codes
= RC_MAP_VIDEOMATE_K100
;
824 mask_keycode
= 0x0ff00;
825 mask_keyup
= 0x040000;
827 case SAA7134_BOARD_HAUPPAUGE_HVR1150
:
828 case SAA7134_BOARD_HAUPPAUGE_HVR1120
:
829 ir_codes
= RC_MAP_HAUPPAUGE
;
830 mask_keydown
= 0x0040000; /* Enable GPIO18 line on both edges */
831 mask_keyup
= 0x0040000;
832 mask_keycode
= 0xffff;
835 case SAA7134_BOARD_LEADTEK_WINFAST_TV2100_FM
:
836 ir_codes
= RC_MAP_LEADTEK_Y04G0051
;
837 mask_keydown
= 0x0040000; /* Enable GPIO18 line on both edges */
838 mask_keyup
= 0x0040000;
839 mask_keycode
= 0xffff;
843 if (NULL
== ir_codes
) {
844 pr_err("Oops: IR config error [card=%d]\n", dev
->board
);
848 ir
= kzalloc(sizeof(*ir
), GFP_KERNEL
);
849 rc
= rc_allocate_device();
858 /* init hardware-specific stuff */
859 ir
->mask_keycode
= mask_keycode
;
860 ir
->mask_keydown
= mask_keydown
;
861 ir
->mask_keyup
= mask_keyup
;
862 ir
->polling
= polling
;
863 ir
->raw_decode
= raw_decode
;
865 /* init input device */
866 snprintf(ir
->name
, sizeof(ir
->name
), "saa7134 IR (%s)",
867 saa7134_boards
[dev
->board
].name
);
868 snprintf(ir
->phys
, sizeof(ir
->phys
), "pci-%s/ir0",
872 rc
->open
= saa7134_ir_open
;
873 rc
->close
= saa7134_ir_close
;
875 rc
->driver_type
= RC_DRIVER_IR_RAW
;
877 rc
->input_name
= ir
->name
;
878 rc
->input_phys
= ir
->phys
;
879 rc
->input_id
.bustype
= BUS_PCI
;
880 rc
->input_id
.version
= 1;
881 if (dev
->pci
->subsystem_vendor
) {
882 rc
->input_id
.vendor
= dev
->pci
->subsystem_vendor
;
883 rc
->input_id
.product
= dev
->pci
->subsystem_device
;
885 rc
->input_id
.vendor
= dev
->pci
->vendor
;
886 rc
->input_id
.product
= dev
->pci
->device
;
888 rc
->dev
.parent
= &dev
->pci
->dev
;
889 rc
->map_name
= ir_codes
;
890 rc
->driver_name
= MODULE_NAME
;
892 err
= rc_register_device(rc
);
905 void saa7134_input_fini(struct saa7134_dev
*dev
)
907 if (NULL
== dev
->remote
)
910 saa7134_ir_stop(dev
);
911 rc_unregister_device(dev
->remote
->dev
);
916 void saa7134_probe_i2c_ir(struct saa7134_dev
*dev
)
918 struct i2c_board_info info
;
919 struct i2c_msg msg_msi
= {
928 input_dbg("IR has been disabled, not probing for i2c remote\n");
932 memset(&info
, 0, sizeof(struct i2c_board_info
));
933 memset(&dev
->init_data
, 0, sizeof(dev
->init_data
));
934 strlcpy(info
.type
, "ir_video", I2C_NAME_SIZE
);
936 switch (dev
->board
) {
937 case SAA7134_BOARD_PINNACLE_PCTV_110i
:
938 case SAA7134_BOARD_PINNACLE_PCTV_310i
:
939 dev
->init_data
.name
= "Pinnacle PCTV";
940 if (pinnacle_remote
== 0) {
941 dev
->init_data
.get_key
= get_key_pinnacle_color
;
942 dev
->init_data
.ir_codes
= RC_MAP_PINNACLE_COLOR
;
945 dev
->init_data
.get_key
= get_key_pinnacle_grey
;
946 dev
->init_data
.ir_codes
= RC_MAP_PINNACLE_GREY
;
950 case SAA7134_BOARD_UPMOST_PURPLE_TV
:
951 dev
->init_data
.name
= "Purple TV";
952 dev
->init_data
.get_key
= get_key_purpletv
;
953 dev
->init_data
.ir_codes
= RC_MAP_PURPLETV
;
956 case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS
:
957 dev
->init_data
.name
= "MSI TV@nywhere Plus";
958 dev
->init_data
.get_key
= get_key_msi_tvanywhere_plus
;
959 dev
->init_data
.ir_codes
= RC_MAP_MSI_TVANYWHERE_PLUS
;
961 * MSI TV@nyware Plus requires more frequent polling
962 * otherwise it will miss some keypresses
964 dev
->init_data
.polling_interval
= 50;
966 /* MSI TV@nywhere Plus controller doesn't seem to
967 respond to probes unless we read something from
968 an existing device. Weird...
969 REVISIT: might no longer be needed */
970 rc
= i2c_transfer(&dev
->i2c_adap
, &msg_msi
, 1);
971 input_dbg("probe 0x%02x @ %s: %s\n",
972 msg_msi
.addr
, dev
->i2c_adap
.name
,
973 (1 == rc
) ? "yes" : "no");
975 case SAA7134_BOARD_SNAZIO_TVPVR_PRO
:
976 dev
->init_data
.name
= "SnaZio* TVPVR PRO";
977 dev
->init_data
.get_key
= get_key_msi_tvanywhere_plus
;
978 dev
->init_data
.ir_codes
= RC_MAP_MSI_TVANYWHERE_PLUS
;
980 * MSI TV@nyware Plus requires more frequent polling
981 * otherwise it will miss some keypresses
983 dev
->init_data
.polling_interval
= 50;
986 * MSI TV@nywhere Plus controller doesn't seem to
987 * respond to probes unless we read something from
988 * an existing device. Weird...
989 * REVISIT: might no longer be needed
991 rc
= i2c_transfer(&dev
->i2c_adap
, &msg_msi
, 1);
992 input_dbg("probe 0x%02x @ %s: %s\n",
993 msg_msi
.addr
, dev
->i2c_adap
.name
,
994 (rc
== 1) ? "yes" : "no");
996 case SAA7134_BOARD_KWORLD_PC150U
:
997 /* copied and modified from MSI TV@nywhere Plus */
998 dev
->init_data
.name
= "Kworld PC150-U";
999 dev
->init_data
.get_key
= get_key_kworld_pc150u
;
1000 dev
->init_data
.ir_codes
= RC_MAP_KWORLD_PC150U
;
1002 /* MSI TV@nywhere Plus controller doesn't seem to
1003 respond to probes unless we read something from
1004 an existing device. Weird...
1005 REVISIT: might no longer be needed */
1006 rc
= i2c_transfer(&dev
->i2c_adap
, &msg_msi
, 1);
1007 input_dbg("probe 0x%02x @ %s: %s\n",
1008 msg_msi
.addr
, dev
->i2c_adap
.name
,
1009 (1 == rc
) ? "yes" : "no");
1011 case SAA7134_BOARD_HAUPPAUGE_HVR1110
:
1012 dev
->init_data
.name
= "HVR 1110";
1013 dev
->init_data
.get_key
= get_key_hvr1110
;
1014 dev
->init_data
.ir_codes
= RC_MAP_HAUPPAUGE
;
1017 case SAA7134_BOARD_BEHOLD_607FM_MK3
:
1018 case SAA7134_BOARD_BEHOLD_607FM_MK5
:
1019 case SAA7134_BOARD_BEHOLD_609FM_MK3
:
1020 case SAA7134_BOARD_BEHOLD_609FM_MK5
:
1021 case SAA7134_BOARD_BEHOLD_607RDS_MK3
:
1022 case SAA7134_BOARD_BEHOLD_607RDS_MK5
:
1023 case SAA7134_BOARD_BEHOLD_609RDS_MK3
:
1024 case SAA7134_BOARD_BEHOLD_609RDS_MK5
:
1025 case SAA7134_BOARD_BEHOLD_M6
:
1026 case SAA7134_BOARD_BEHOLD_M63
:
1027 case SAA7134_BOARD_BEHOLD_M6_EXTRA
:
1028 case SAA7134_BOARD_BEHOLD_H6
:
1029 case SAA7134_BOARD_BEHOLD_X7
:
1030 case SAA7134_BOARD_BEHOLD_H7
:
1031 case SAA7134_BOARD_BEHOLD_A7
:
1032 dev
->init_data
.name
= "BeholdTV";
1033 dev
->init_data
.get_key
= get_key_beholdm6xx
;
1034 dev
->init_data
.ir_codes
= RC_MAP_BEHOLD
;
1035 dev
->init_data
.type
= RC_BIT_NECX
;
1038 case SAA7134_BOARD_AVERMEDIA_CARDBUS_501
:
1039 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506
:
1042 case SAA7134_BOARD_AVERMEDIA_A706
:
1045 case SAA7134_BOARD_FLYDVB_TRIO
:
1046 dev
->init_data
.name
= "FlyDVB Trio";
1047 dev
->init_data
.get_key
= get_key_flydvb_trio
;
1048 dev
->init_data
.ir_codes
= RC_MAP_FLYDVB
;
1052 input_dbg("No I2C IR support for board %x\n", dev
->board
);
1056 if (dev
->init_data
.name
)
1057 info
.platform_data
= &dev
->init_data
;
1058 i2c_new_device(&dev
->i2c_adap
, &info
);
1061 static int saa7134_raw_decode_irq(struct saa7134_dev
*dev
)
1063 struct saa7134_card_ir
*ir
= dev
->remote
;
1064 unsigned long timeout
;
1067 /* Generate initial event */
1068 saa_clearb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
1069 saa_setb(SAA7134_GPIO_GPMODE3
, SAA7134_GPIO_GPRESCAN
);
1070 space
= saa_readl(SAA7134_GPIO_GPSTATUS0
>> 2) & ir
->mask_keydown
;
1071 ir_raw_event_store_edge(dev
->remote
->dev
, space
? IR_SPACE
: IR_PULSE
);
1074 * Wait 15 ms from the start of the first IR event before processing
1075 * the event. This time is enough for NEC protocol. May need adjustments
1076 * to work with other protocols.
1080 if (!timer_pending(&ir
->timer
)) {
1081 timeout
= jiffies
+ msecs_to_jiffies(15);
1082 mod_timer(&ir
->timer
, timeout
);