--- linux/drivers/media/dvb/ttpci/budget-ci.c.orig 2003-11-20 10:50:15.000000000 +0000 +++ linux/drivers/media/dvb/ttpci/budget-ci.c 2004-09-27 22:16:19.000000000 +0100 @@ -34,6 +34,7 @@ #include #include #include +#include #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) #include "input_fake.h" @@ -181,10 +182,48 @@ } +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)); @@ -204,6 +243,13 @@ 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; } @@ -213,6 +259,8 @@ 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); saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);