From: Arnd Bergmann Date: Mon, 2 Aug 2010 18:43:35 +0000 (-0300) Subject: V4L/DVB: lirc: use unlocked_ioctl X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=044e5878c2158d701e6f47a9604910589a384ee2;p=openwrt%2Fstaging%2Fblogic.git V4L/DVB: lirc: use unlocked_ioctl New code should not rely on the big kernel lock, so use the unlocked_ioctl file operation in lirc. Signed-off-by: Arnd Bergmann Tested-by: Jarod Wilson Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/IR/ir-lirc-codec.c b/drivers/media/IR/ir-lirc-codec.c index aff31d1b13d5..178bc5baab78 100644 --- a/drivers/media/IR/ir-lirc-codec.c +++ b/drivers/media/IR/ir-lirc-codec.c @@ -97,8 +97,7 @@ out: return ret; } -static int ir_lirc_ioctl(struct inode *node, struct file *filep, - unsigned int cmd, unsigned long arg) +static long ir_lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { struct lirc_codec *lirc; struct ir_input_dev *ir_dev; @@ -154,7 +153,7 @@ static int ir_lirc_ioctl(struct inode *node, struct file *filep, break; default: - return lirc_dev_fop_ioctl(node, filep, cmd, arg); + return lirc_dev_fop_ioctl(filep, cmd, arg); } return ret; @@ -173,7 +172,7 @@ static void ir_lirc_close(void *data) static struct file_operations lirc_fops = { .owner = THIS_MODULE, .write = ir_lirc_transmit_ir, - .ioctl = ir_lirc_ioctl, + .unlocked_ioctl = ir_lirc_ioctl, .read = lirc_dev_fop_read, .poll = lirc_dev_fop_poll, .open = lirc_dev_fop_open, diff --git a/drivers/media/IR/lirc_dev.c b/drivers/media/IR/lirc_dev.c index 64170fa58006..c11b8f706258 100644 --- a/drivers/media/IR/lirc_dev.c +++ b/drivers/media/IR/lirc_dev.c @@ -160,7 +160,7 @@ static struct file_operations fops = { .read = lirc_dev_fop_read, .write = lirc_dev_fop_write, .poll = lirc_dev_fop_poll, - .ioctl = lirc_dev_fop_ioctl, + .unlocked_ioctl = lirc_dev_fop_ioctl, .open = lirc_dev_fop_open, .release = lirc_dev_fop_close, }; @@ -242,9 +242,9 @@ int lirc_register_driver(struct lirc_driver *d) goto out; } else if (!d->rbuf) { if (!(d->fops && d->fops->read && d->fops->poll && - d->fops->ioctl)) { + d->fops->unlocked_ioctl)) { dev_err(d->dev, "lirc_dev: lirc_register_driver: " - "neither read, poll nor ioctl can be NULL!\n"); + "neither read, poll nor unlocked_ioctl can be NULL!\n"); err = -EBADRQC; goto out; } @@ -425,6 +425,7 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file) retval = -ENODEV; goto error; } + file->private_data = ir; dev_dbg(ir->d.dev, LOGHEAD "open called\n", ir->d.name, ir->d.minor); @@ -516,12 +517,11 @@ unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait) } EXPORT_SYMBOL(lirc_dev_fop_poll); -int lirc_dev_fop_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) +long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { unsigned long mode; int result = 0; - struct irctl *ir = irctls[iminor(inode)]; + struct irctl *ir = file->private_data; dev_dbg(ir->d.dev, LOGHEAD "ioctl called (0x%x)\n", ir->d.name, ir->d.minor, cmd); diff --git a/drivers/media/IR/lirc_dev.h b/drivers/media/IR/lirc_dev.h index 4afd96a38a43..b1f60663cb39 100644 --- a/drivers/media/IR/lirc_dev.h +++ b/drivers/media/IR/lirc_dev.h @@ -216,8 +216,7 @@ void *lirc_get_pdata(struct file *file); int lirc_dev_fop_open(struct inode *inode, struct file *file); int lirc_dev_fop_close(struct inode *inode, struct file *file); unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait); -int lirc_dev_fop_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg); +long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg); ssize_t lirc_dev_fop_read(struct file *file, char *buffer, size_t length, loff_t *ppos); ssize_t lirc_dev_fop_write(struct file *file, const char *buffer, size_t length,