aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index dff33279ab33..32859e549afa 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -425,8 +425,11 @@ static void saa7134_input_timer(unsigned long data)
425void ir_raw_decode_timer_end(unsigned long data) 425void ir_raw_decode_timer_end(unsigned long data)
426{ 426{
427 struct saa7134_dev *dev = (struct saa7134_dev *)data; 427 struct saa7134_dev *dev = (struct saa7134_dev *)data;
428 struct card_ir *ir = dev->remote;
428 429
429 ir_raw_event_handle(dev->remote->dev); 430 ir_raw_event_handle(dev->remote->dev);
431
432 ir->active = 0;
430} 433}
431 434
432void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir) 435void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir)
@@ -462,6 +465,7 @@ void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir)
462 init_timer(&ir->timer_end); 465 init_timer(&ir->timer_end);
463 ir->timer_end.function = ir_raw_decode_timer_end; 466 ir->timer_end.function = ir_raw_decode_timer_end;
464 ir->timer_end.data = (unsigned long)dev; 467 ir->timer_end.data = (unsigned long)dev;
468 ir->active = 0;
465 } 469 }
466} 470}
467 471
@@ -477,8 +481,10 @@ void saa7134_ir_stop(struct saa7134_dev *dev)
477 del_timer_sync(&ir->timer_end); 481 del_timer_sync(&ir->timer_end);
478 else if (ir->nec_gpio) 482 else if (ir->nec_gpio)
479 tasklet_kill(&ir->tlet); 483 tasklet_kill(&ir->tlet);
480 else if (ir->raw_decode) 484 else if (ir->raw_decode) {
481 del_timer_sync(&ir->timer_end); 485 del_timer_sync(&ir->timer_end);
486 ir->active = 0;
487 }
482 488
483 ir->running = 0; 489 ir->running = 0;
484} 490}
@@ -951,38 +957,23 @@ static int saa7134_raw_decode_irq(struct saa7134_dev *dev)
951 unsigned long timeout; 957 unsigned long timeout;
952 int count, pulse, oldpulse; 958 int count, pulse, oldpulse;
953 959
954 /* Disable IR IRQ line */
955 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18);
956
957 /* Generate initial event */ 960 /* Generate initial event */
958 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN); 961 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
959 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN); 962 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
960 pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown; 963 pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
961 ir_raw_event_store(dev->remote->dev, pulse? IR_PULSE : IR_SPACE); 964 ir_raw_event_store(dev->remote->dev, pulse? IR_PULSE : IR_SPACE);
962 965
963#if 1
964 /* Wait up to 10 ms for event change */
965 oldpulse = pulse;
966 for (count = 0; count < 1000; count++) {
967 udelay(10);
968 /* rising SAA7134_GPIO_GPRESCAN reads the status */
969 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
970 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
971 pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2)
972 & ir->mask_keydown;
973 if (pulse != oldpulse)
974 break;
975 }
976
977 /* Store final event */
978 ir_raw_event_store(dev->remote->dev, pulse? IR_PULSE : IR_SPACE);
979#endif
980 /* Wait 15 ms before deciding to do something else */
981 timeout = jiffies + jiffies_to_msecs(15);
982 mod_timer(&ir->timer_end, timeout);
983 966
984 /* Enable IR IRQ line */ 967 /*
985 saa_setl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18); 968 * Wait 15 ms from the start of the first IR event before processing
969 * the event. This time is enough for NEC protocol. May need adjustments
970 * to work with other protocols.
971 */
972 if (!ir->active) {
973 timeout = jiffies + jiffies_to_msecs(15);
974 mod_timer(&ir->timer_end, timeout);
975 ir->active = 1;
976 }
986 977
987 return 1; 978 return 1;
988} 979}