Commit 6c7e653f authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] saa7134: Remove legacy IR decoding logic inside the module

The only IR left still using the old raw decoders on saa7134 is ENCORE
FM 5.3. As it is now using the standard rc-core raw decoders, lots
of old code can be removed from saa7134.
Acked-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 70de3918
...@@ -54,11 +54,8 @@ MODULE_PARM_DESC(disable_other_ir, "disable full codes of " ...@@ -54,11 +54,8 @@ MODULE_PARM_DESC(disable_other_ir, "disable full codes of "
#define i2cdprintk(fmt, arg...) if (ir_debug) \ #define i2cdprintk(fmt, arg...) if (ir_debug) \
printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg) printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg)
/* Helper functions for RC5 and NEC decoding at GPIO16 or GPIO18 */ /* Helper function for raw decoding at GPIO16 or GPIO18 */
static int saa7134_rc5_irq(struct saa7134_dev *dev);
static int saa7134_nec_irq(struct saa7134_dev *dev);
static int saa7134_raw_decode_irq(struct saa7134_dev *dev); static int saa7134_raw_decode_irq(struct saa7134_dev *dev);
static void nec_task(unsigned long data);
/* -------------------- GPIO generic keycode builder -------------------- */ /* -------------------- GPIO generic keycode builder -------------------- */
...@@ -397,12 +394,8 @@ void saa7134_input_irq(struct saa7134_dev *dev) ...@@ -397,12 +394,8 @@ void saa7134_input_irq(struct saa7134_dev *dev)
if (!ir->running) if (!ir->running)
return; return;
if (ir->nec_gpio) { if (!ir->polling && !ir->raw_decode) {
saa7134_nec_irq(dev);
} else if (!ir->polling && !ir->rc5_gpio && !ir->raw_decode) {
build_key(dev); build_key(dev);
} else if (ir->rc5_gpio) {
saa7134_rc5_irq(dev);
} else if (ir->raw_decode) { } else if (ir->raw_decode) {
saa7134_raw_decode_irq(dev); saa7134_raw_decode_irq(dev);
} }
...@@ -448,17 +441,6 @@ static int __saa7134_ir_start(void *priv) ...@@ -448,17 +441,6 @@ static int __saa7134_ir_start(void *priv)
(unsigned long)dev); (unsigned long)dev);
ir->timer.expires = jiffies + HZ; ir->timer.expires = jiffies + HZ;
add_timer(&ir->timer); add_timer(&ir->timer);
} else if (ir->rc5_gpio) {
/* set timer_end for code completion */
init_timer(&ir->timer_end);
ir->timer_end.function = ir_rc5_timer_end;
ir->timer_end.data = (unsigned long)ir;
ir->shift_by = 2;
ir->start = 0x2;
ir->addr = 0x17;
ir->rc5_remote_gap = ir_rc5_remote_gap;
} else if (ir->nec_gpio) {
tasklet_init(&ir->tlet, nec_task, (unsigned long)dev);
} else if (ir->raw_decode) { } else if (ir->raw_decode) {
/* set timer_end for code completion */ /* set timer_end for code completion */
init_timer(&ir->timer_end); init_timer(&ir->timer_end);
...@@ -486,10 +468,6 @@ static void __saa7134_ir_stop(void *priv) ...@@ -486,10 +468,6 @@ static void __saa7134_ir_stop(void *priv)
return; return;
if (dev->remote->polling) if (dev->remote->polling)
del_timer_sync(&dev->remote->timer); del_timer_sync(&dev->remote->timer);
else if (ir->rc5_gpio)
del_timer_sync(&ir->timer_end);
else if (ir->nec_gpio)
tasklet_kill(&ir->tlet);
else if (ir->raw_decode) { else if (ir->raw_decode) {
del_timer_sync(&ir->timer_end); del_timer_sync(&ir->timer_end);
ir->active = 0; ir->active = 0;
...@@ -531,40 +509,6 @@ static void saa7134_ir_close(struct rc_dev *rc) ...@@ -531,40 +509,6 @@ static void saa7134_ir_close(struct rc_dev *rc)
__saa7134_ir_stop(dev); __saa7134_ir_stop(dev);
} }
static int saa7134_ir_change_protocol(struct rc_dev *rc, u64 ir_type)
{
struct saa7134_dev *dev = rc->priv;
struct card_ir *ir = dev->remote;
u32 nec_gpio, rc5_gpio;
if (ir_type == IR_TYPE_RC5) {
dprintk("Changing protocol to RC5\n");
nec_gpio = 0;
rc5_gpio = 1;
} else if (ir_type == IR_TYPE_NEC) {
dprintk("Changing protocol to NEC\n");
nec_gpio = 1;
rc5_gpio = 0;
} else {
dprintk("IR protocol type %ud is not supported\n",
(unsigned)ir_type);
return -EINVAL;
}
if (ir->running) {
saa7134_ir_stop(dev);
ir->nec_gpio = nec_gpio;
ir->rc5_gpio = rc5_gpio;
saa7134_ir_start(dev);
} else {
ir->nec_gpio = nec_gpio;
ir->rc5_gpio = rc5_gpio;
}
return 0;
}
int saa7134_input_init1(struct saa7134_dev *dev) int saa7134_input_init1(struct saa7134_dev *dev)
{ {
struct card_ir *ir; struct card_ir *ir;
...@@ -574,10 +518,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) ...@@ -574,10 +518,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
u32 mask_keydown = 0; u32 mask_keydown = 0;
u32 mask_keyup = 0; u32 mask_keyup = 0;
int polling = 0; int polling = 0;
int rc5_gpio = 0;
int nec_gpio = 0;
int raw_decode = 0; int raw_decode = 0;
int allow_protocol_change = 0;
int err; int err;
if (dev->has_remote != SAA7134_REMOTE_GPIO) if (dev->has_remote != SAA7134_REMOTE_GPIO)
...@@ -830,8 +771,6 @@ int saa7134_input_init1(struct saa7134_dev *dev) ...@@ -830,8 +771,6 @@ int saa7134_input_init1(struct saa7134_dev *dev)
ir->mask_keydown = mask_keydown; ir->mask_keydown = mask_keydown;
ir->mask_keyup = mask_keyup; ir->mask_keyup = mask_keyup;
ir->polling = polling; ir->polling = polling;
ir->rc5_gpio = rc5_gpio;
ir->nec_gpio = nec_gpio;
ir->raw_decode = raw_decode; ir->raw_decode = raw_decode;
/* init input device */ /* init input device */
...@@ -846,11 +785,6 @@ int saa7134_input_init1(struct saa7134_dev *dev) ...@@ -846,11 +785,6 @@ int saa7134_input_init1(struct saa7134_dev *dev)
if (raw_decode) if (raw_decode)
rc->driver_type = RC_DRIVER_IR_RAW; rc->driver_type = RC_DRIVER_IR_RAW;
if (!raw_decode && allow_protocol_change) {
rc->allowed_protos = IR_TYPE_RC5 | IR_TYPE_NEC;
rc->change_protocol = saa7134_ir_change_protocol;
}
rc->input_name = ir->name; rc->input_name = ir->name;
rc->input_phys = ir->phys; rc->input_phys = ir->phys;
rc->input_id.bustype = BUS_PCI; rc->input_id.bustype = BUS_PCI;
...@@ -1024,152 +958,3 @@ static int saa7134_raw_decode_irq(struct saa7134_dev *dev) ...@@ -1024,152 +958,3 @@ static int saa7134_raw_decode_irq(struct saa7134_dev *dev)
return 1; return 1;
} }
static int saa7134_rc5_irq(struct saa7134_dev *dev)
{
struct card_ir *ir = dev->remote;
struct timeval tv;
u32 gap;
unsigned long current_jiffies, timeout;
/* get time of bit */
current_jiffies = jiffies;
do_gettimeofday(&tv);
/* avoid overflow with gap >1s */
if (tv.tv_sec - ir->base_time.tv_sec > 1) {
gap = 200000;
} else {
gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
tv.tv_usec - ir->base_time.tv_usec;
}
/* active code => add bit */
if (ir->active) {
/* only if in the code (otherwise spurious IRQ or timer
late) */
if (ir->last_bit < 28) {
ir->last_bit = (gap - ir_rc5_remote_gap / 2) /
ir_rc5_remote_gap;
ir->code |= 1 << ir->last_bit;
}
/* starting new code */
} else {
ir->active = 1;
ir->code = 0;
ir->base_time = tv;
ir->last_bit = 0;
timeout = current_jiffies + (500 + 30 * HZ) / 1000;
mod_timer(&ir->timer_end, timeout);
}
return 1;
}
static void nec_task(unsigned long data)
{
struct saa7134_dev *dev = (struct saa7134_dev *) data;
struct card_ir *ir;
struct timeval tv;
int count, pulse, oldpulse, gap;
u32 ircode = 0, not_code = 0;
int ngap = 0;
if (!data) {
printk(KERN_ERR "saa713x/ir: Can't recover dev struct\n");
/* GPIO will be kept disabled */
return;
}
ir = dev->remote;
/* rising SAA7134_GPIO_GPRESCAN reads the status */
saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
oldpulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
pulse = oldpulse;
do_gettimeofday(&tv);
ir->base_time = tv;
/* Decode NEC pulsecode. This code can take up to 76.5 ms to run.
Unfortunately, using IRQ to decode pulse didn't work, since it uses
a pulse train of 38KHz. This means one pulse on each 52 us
*/
do {
/* Wait until the end of pulse/space or 5 ms */
for (count = 0; count < 500; count++) {
udelay(10);
/* rising SAA7134_GPIO_GPRESCAN reads the status */
saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2)
& ir->mask_keydown;
if (pulse != oldpulse)
break;
}
do_gettimeofday(&tv);
gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
tv.tv_usec - ir->base_time.tv_usec;
if (!pulse) {
/* Bit 0 has 560 us, while bit 1 has 1120 us.
Do something only if bit == 1
*/
if (ngap && (gap > 560 + 280)) {
unsigned int shift = ngap - 1;
/* Address first, then command */
if (shift < 8) {
shift += 8;
ircode |= 1 << shift;
} else if (shift < 16) {
not_code |= 1 << shift;
} else if (shift < 24) {
shift -= 16;
ircode |= 1 << shift;
} else {
shift -= 24;
not_code |= 1 << shift;
}
}
ngap++;
}
ir->base_time = tv;
/* TIMEOUT - Long pulse */
if (gap >= 5000)
break;
oldpulse = pulse;
} while (ngap < 32);
if (ngap == 32) {
/* FIXME: should check if not_code == ~ircode */
ir->code = ir_extract_bits(ircode, ir->mask_keycode);
dprintk("scancode = 0x%02x (code = 0x%02x, notcode= 0x%02x)\n",
ir->code, ircode, not_code);
ir_keydown(ir->dev, ir->code, 0);
} else {
dprintk("Repeat last key\n");
ir_repeat(ir->dev);
}
saa_setl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_P);
}
static int saa7134_nec_irq(struct saa7134_dev *dev)
{
struct card_ir *ir = dev->remote;
saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_P);
tasklet_schedule(&ir->tlet);
return 1;
}
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#include <media/v4l2-ioctl.h> #include <media/v4l2-ioctl.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/tuner.h> #include <media/tuner.h>
#include <media/ir-common.h> #include <media/ir-core.h>
#include <media/ir-kbd-i2c.h> #include <media/ir-kbd-i2c.h>
#include <media/videobuf-dma-sg.h> #include <media/videobuf-dma-sg.h>
#include <sound/core.h> #include <sound/core.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment