V4L/DVB: Convert drivers/media/dvb/ttpci/budget-ci.c to use ir-core

Converts drivers/media/dvb/ttpci/budget-ci.c to use ir-core rather than
rolling its own keydown timeout handler and reporting keys via
drivers/media/IR/ir-functions.c.

[mchehab@redhat.com: Drop the call to ir_input_init() as it is no longer needed]

Signed-off-by: David Härdeman <david@hardeman.nu>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
David Härdeman 2010-04-02 15:58:30 -03:00 committed by Mauro Carvalho Chehab
parent a374fef443
commit 13c2449708
1 changed files with 3 additions and 37 deletions

View File

@ -35,7 +35,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <media/ir-common.h> #include <media/ir-core.h>
#include "budget.h" #include "budget.h"
@ -82,12 +82,6 @@
#define SLOTSTATUS_READY 8 #define SLOTSTATUS_READY 8
#define SLOTSTATUS_OCCUPIED (SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY) #define SLOTSTATUS_OCCUPIED (SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY)
/*
* Milliseconds during which a key is regarded as pressed.
* If an identical command arrives within this time, the timer will start over.
*/
#define IR_KEYPRESS_TIMEOUT 250
/* RC5 device wildcard */ /* RC5 device wildcard */
#define IR_DEVICE_ANY 255 #define IR_DEVICE_ANY 255
@ -104,12 +98,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
struct budget_ci_ir { struct budget_ci_ir {
struct input_dev *dev; struct input_dev *dev;
struct tasklet_struct msp430_irq_tasklet; struct tasklet_struct msp430_irq_tasklet;
struct timer_list timer_keyup;
char name[72]; /* 40 + 32 for (struct saa7146_dev).name */ char name[72]; /* 40 + 32 for (struct saa7146_dev).name */
char phys[32]; char phys[32];
struct ir_input_state state;
int rc5_device; int rc5_device;
u32 last_raw;
u32 ir_key; u32 ir_key;
bool have_command; bool have_command;
}; };
@ -124,18 +115,11 @@ struct budget_ci {
u8 tuner_pll_address; /* used for philips_tdm1316l configs */ u8 tuner_pll_address; /* used for philips_tdm1316l configs */
}; };
static void msp430_ir_keyup(unsigned long data)
{
struct budget_ci_ir *ir = (struct budget_ci_ir *) data;
ir_input_nokey(ir->dev, &ir->state);
}
static void msp430_ir_interrupt(unsigned long data) static void msp430_ir_interrupt(unsigned long data)
{ {
struct budget_ci *budget_ci = (struct budget_ci *) data; struct budget_ci *budget_ci = (struct budget_ci *) data;
struct input_dev *dev = budget_ci->ir.dev; struct input_dev *dev = budget_ci->ir.dev;
u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8; u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;
u32 raw;
/* /*
* The msp430 chip can generate two different bytes, command and device * The msp430 chip can generate two different bytes, command and device
@ -171,20 +155,12 @@ static void msp430_ir_interrupt(unsigned long data)
return; return;
budget_ci->ir.have_command = false; budget_ci->ir.have_command = false;
/* FIXME: We should generate complete scancodes with device info */
if (budget_ci->ir.rc5_device != IR_DEVICE_ANY && if (budget_ci->ir.rc5_device != IR_DEVICE_ANY &&
budget_ci->ir.rc5_device != (command & 0x1f)) budget_ci->ir.rc5_device != (command & 0x1f))
return; return;
/* Is this a repeated key sequence? (same device, command, toggle) */ ir_keydown(dev, budget_ci->ir.ir_key, (command & 0x20) ? 1 : 0);
raw = budget_ci->ir.ir_key | (command << 8);
if (budget_ci->ir.last_raw != raw || !timer_pending(&budget_ci->ir.timer_keyup)) {
ir_input_nokey(dev, &budget_ci->ir.state);
ir_input_keydown(dev, &budget_ci->ir.state,
budget_ci->ir.ir_key);
budget_ci->ir.last_raw = raw;
}
mod_timer(&budget_ci->ir.timer_keyup, jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT));
} }
static int msp430_ir_init(struct budget_ci *budget_ci) static int msp430_ir_init(struct budget_ci *budget_ci)
@ -249,13 +225,6 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
break; break;
} }
ir_input_init(input_dev, &budget_ci->ir.state, IR_TYPE_RC5);
/* initialise the key-up timeout handler */
init_timer(&budget_ci->ir.timer_keyup);
budget_ci->ir.timer_keyup.function = msp430_ir_keyup;
budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir;
budget_ci->ir.last_raw = 0xffff; /* An impossible value */
error = ir_input_register(input_dev, ir_codes, NULL, MODULE_NAME); error = ir_input_register(input_dev, ir_codes, NULL, MODULE_NAME);
if (error) { if (error) {
printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error); printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
@ -284,9 +253,6 @@ static void msp430_ir_deinit(struct budget_ci *budget_ci)
saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
tasklet_kill(&budget_ci->ir.msp430_irq_tasklet); tasklet_kill(&budget_ci->ir.msp430_irq_tasklet);
del_timer_sync(&dev->timer);
ir_input_nokey(dev, &budget_ci->ir.state);
ir_input_unregister(dev); ir_input_unregister(dev);
} }