diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-input.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-input.c | 30 |
1 files changed, 28 insertions, 2 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); |