diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-08-02 15:43:35 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-02 16:42:22 -0300 |
commit | 044e5878c2158d701e6f47a9604910589a384ee2 (patch) | |
tree | 9d06e2660ad15575a5df2c1e3bacfa68738ea55e /drivers/media/IR | |
parent | f9839da0513b4f13a137a07a9362ea5b02897bd7 (diff) |
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 <arnd@arndb.de>
Tested-by: Jarod Wilson <jarod@redhat.com>
Acked-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/IR')
-rw-r--r-- | drivers/media/IR/ir-lirc-codec.c | 7 | ||||
-rw-r--r-- | drivers/media/IR/lirc_dev.c | 12 | ||||
-rw-r--r-- | drivers/media/IR/lirc_dev.h | 3 |
3 files changed, 10 insertions, 12 deletions
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, |