aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/cx88/cx88-input.c30
-rw-r--r--drivers/media/video/ir-kbd-i2c.c22
2 files changed, 48 insertions, 4 deletions
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
index 097081eb505f..13bc5d160761 100644
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -394,7 +394,7 @@ void cx88_ir_irq(struct cx88_core *core)
394{ 394{
395 struct cx88_IR *ir = core->ir; 395 struct cx88_IR *ir = core->ir;
396 u32 samples, ircode; 396 u32 samples, ircode;
397 int i; 397 int i, start, range, toggle, dev, code;
398 398
399 if (NULL == ir) 399 if (NULL == ir)
400 return; 400 return;
@@ -463,11 +463,37 @@ void cx88_ir_irq(struct cx88_core *core)
463 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: 463 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
464 case CX88_BOARD_HAUPPAUGE_HVR1100: 464 case CX88_BOARD_HAUPPAUGE_HVR1100:
465 case CX88_BOARD_HAUPPAUGE_HVR3000: 465 case CX88_BOARD_HAUPPAUGE_HVR3000:
466 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
467 case CX88_BOARD_HAUPPAUGE_HVR4000: 466 case CX88_BOARD_HAUPPAUGE_HVR4000:
468 case CX88_BOARD_HAUPPAUGE_HVR4000LITE: 467 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
469 ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7); 468 ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
470 ir_dprintk("biphase decoded: %x\n", ircode); 469 ir_dprintk("biphase decoded: %x\n", ircode);
470 /*
471 * RC5 has an extension bit which adds a new range
472 * of available codes, this is detected here. Also
473 * hauppauge remotes (black/silver) always use
474 * specific device ids. If we do not filter the
475 * device ids then messages destined for devices
476 * such as TVs (id=0) will get through to the
477 * device causing mis-fired events.
478 */
479 /* split rc5 data block ... */
480 start = (ircode & 0x2000) >> 13;
481 range = (ircode & 0x1000) >> 12;
482 toggle= (ircode & 0x0800) >> 11;
483 dev = (ircode & 0x07c0) >> 6;
484 code = (ircode & 0x003f) | ((range << 6) ^ 0x0040);
485 if( start != 1)
486 /* no key pressed */
487 break;
488 if ( dev != 0x1e && dev != 0x1f )
489 /* not a hauppauge remote */
490 break;
491 ir_input_keydown(ir->input, &ir->ir, code, ircode);
492 ir->release = jiffies + msecs_to_jiffies(120);
493 break;
494 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
495 ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
496 ir_dprintk("biphase decoded: %x\n", ircode);
471 if ((ircode & 0xfffff000) != 0x3000) 497 if ((ircode & 0xfffff000) != 0x3000)
472 break; 498 break;
473 ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f, ircode); 499 ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f, ircode);
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
index a30254bed311..703195a5ad4e 100644
--- a/drivers/media/video/ir-kbd-i2c.c
+++ b/drivers/media/video/ir-kbd-i2c.c
@@ -65,7 +65,7 @@ static int get_key_haup_common(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
65 int size, int offset) 65 int size, int offset)
66{ 66{
67 unsigned char buf[6]; 67 unsigned char buf[6];
68 int start, range, toggle, dev, code; 68 int start, range, toggle, dev, code, ircode;
69 69
70 /* poll IR chip */ 70 /* poll IR chip */
71 if (size != i2c_master_recv(&ir->c,buf,size)) 71 if (size != i2c_master_recv(&ir->c,buf,size))
@@ -85,6 +85,24 @@ static int get_key_haup_common(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
85 if (!start) 85 if (!start)
86 /* no key pressed */ 86 /* no key pressed */
87 return 0; 87 return 0;
88 /*
89 * Hauppauge remotes (black/silver) always use
90 * specific device ids. If we do not filter the
91 * device ids then messages destined for devices
92 * such as TVs (id=0) will get through causing
93 * mis-fired events.
94 *
95 * We also filter out invalid key presses which
96 * produce annoying debug log entries.
97 */
98 ircode= (start << 12) | (toggle << 11) | (dev << 6) | code;
99 if ((ircode & 0x1fff)==0x1fff)
100 /* invalid key press */
101 return 0;
102
103 if (dev!=0x1e && dev!=0x1f)
104 /* not a hauppauge remote */
105 return 0;
88 106
89 if (!range) 107 if (!range)
90 code += 64; 108 code += 64;
@@ -94,7 +112,7 @@ static int get_key_haup_common(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
94 112
95 /* return key */ 113 /* return key */
96 *ir_key = code; 114 *ir_key = code;
97 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code; 115 *ir_raw = ircode;
98 return 1; 116 return 1;
99} 117}
100 118