--- linux/drivers/media/dvb/ttpci/budget-ci.c.orig 2004-09-20 17:37:46.000000000 +0100 +++ linux/drivers/media/dvb/ttpci/budget-ci.c 2004-10-17 22:02:12.000000000 +0100 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include "dvb_ca_en50221.h" @@ -234,10 +235,48 @@ static void msp430_ir_interrupt (unsigne } } +static int budget_ci_ir_write_proc (struct file *file, + const char __user *buffer, + unsigned long count, void *data) +{ + /* adapted from av7110_ir.c */ + char *page; + int i; + struct input_dev *input = (struct input_dev *)data; + + if (count < sizeof (key_map)) + return -EINVAL; + + page = (char *)vmalloc(sizeof (key_map)); + if (!page) + return -ENOMEM; + + if (copy_from_user(page, buffer, sizeof (key_map))) { + vfree(page); + return -EFAULT; + } + + memcpy (&key_map, page, sizeof (key_map)); + vfree(page); + + memset (input->keybit, 0, sizeof(input->keybit)); + + for (i=0; i KEY_MAX) + key_map[i] = 0; + else if (key_map[i] > KEY_RESERVED) + set_bit (key_map[i], input->keybit); + } + + return count; +} + + static int msp430_ir_init (struct budget_ci *budget_ci) { struct saa7146_dev *saa = budget_ci->budget.dev; int i; + static struct proc_dir_entry *e; memset(&budget_ci->input_dev, 0, sizeof(struct input_dev)); @@ -258,6 +297,13 @@ static int msp430_ir_init (struct budget saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); + e = create_proc_entry ("budget_ci_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL); + if (e) { + e->write_proc = budget_ci_ir_write_proc; + e->data = &budget_ci->input_dev; + e->size = sizeof (key_map); + } + return 0; } @@ -266,6 +312,8 @@ static void msp430_ir_deinit (struct bud struct saa7146_dev *saa = budget_ci->budget.dev; struct input_dev *dev = &budget_ci->input_dev; + remove_proc_entry ("budget_ci_ir", NULL); + saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06); saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);