diff options
author | Sean Young <sean@mess.org> | 2017-09-23 10:41:13 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2017-12-14 10:35:16 -0500 |
commit | a60d64b15c20d178ba3a9bc3a542492b4ddeea70 (patch) | |
tree | 8b5e5086384e7868ce0357a2b5002a67ccfe0c63 /drivers/media/rc/lirc_dev.c | |
parent | 0d39ab0b628b38acf83506d36e9ec969055698df (diff) |
media: lirc: lirc interface should not be a raw decoder
The lirc user interface exists as a raw decoder, which does not make
much sense for transmit-only devices.
In addition, we want to have lirc char devices for devices which do not
use raw IR, i.e. scancode only devices.
Note that rc-code, lirc_dev, ir-lirc-codec are now calling functions of
each other, so they've been merged into one module rc-core to avoid
circular dependencies.
Since ir-lirc-codec no longer exists as separate codec module, there is no
need for RC_DRIVER_IR_RAW_TX type drivers to call ir_raw_event_register().
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/rc/lirc_dev.c')
-rw-r--r-- | drivers/media/rc/lirc_dev.c | 47 |
1 files changed, 13 insertions, 34 deletions
diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c index ef7e915dc9a2..3cc95deaa84e 100644 --- a/drivers/media/rc/lirc_dev.c +++ b/drivers/media/rc/lirc_dev.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/cdev.h> | 26 | #include <linux/cdev.h> |
27 | #include <linux/idr.h> | 27 | #include <linux/idr.h> |
28 | 28 | ||
29 | #include <media/rc-core.h> | 29 | #include "rc-core-priv.h" |
30 | #include <media/lirc.h> | 30 | #include <media/lirc.h> |
31 | #include <media/lirc_dev.h> | 31 | #include <media/lirc_dev.h> |
32 | 32 | ||
@@ -236,7 +236,7 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file) | |||
236 | 236 | ||
237 | d->open++; | 237 | d->open++; |
238 | 238 | ||
239 | lirc_init_pdata(inode, file); | 239 | file->private_data = d->rdev; |
240 | nonseekable_open(inode, file); | 240 | nonseekable_open(inode, file); |
241 | mutex_unlock(&d->mutex); | 241 | mutex_unlock(&d->mutex); |
242 | 242 | ||
@@ -250,11 +250,12 @@ EXPORT_SYMBOL(lirc_dev_fop_open); | |||
250 | 250 | ||
251 | int lirc_dev_fop_close(struct inode *inode, struct file *file) | 251 | int lirc_dev_fop_close(struct inode *inode, struct file *file) |
252 | { | 252 | { |
253 | struct lirc_dev *d = file->private_data; | 253 | struct rc_dev *rcdev = file->private_data; |
254 | struct lirc_dev *d = rcdev->lirc_dev; | ||
254 | 255 | ||
255 | mutex_lock(&d->mutex); | 256 | mutex_lock(&d->mutex); |
256 | 257 | ||
257 | rc_close(d->rdev); | 258 | rc_close(rcdev); |
258 | d->open--; | 259 | d->open--; |
259 | 260 | ||
260 | mutex_unlock(&d->mutex); | 261 | mutex_unlock(&d->mutex); |
@@ -265,7 +266,8 @@ EXPORT_SYMBOL(lirc_dev_fop_close); | |||
265 | 266 | ||
266 | unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait) | 267 | unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait) |
267 | { | 268 | { |
268 | struct lirc_dev *d = file->private_data; | 269 | struct rc_dev *rcdev = file->private_data; |
270 | struct lirc_dev *d = rcdev->lirc_dev; | ||
269 | unsigned int ret; | 271 | unsigned int ret; |
270 | 272 | ||
271 | if (!d->attached) | 273 | if (!d->attached) |
@@ -290,7 +292,8 @@ EXPORT_SYMBOL(lirc_dev_fop_poll); | |||
290 | 292 | ||
291 | long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 293 | long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
292 | { | 294 | { |
293 | struct lirc_dev *d = file->private_data; | 295 | struct rc_dev *rcdev = file->private_data; |
296 | struct lirc_dev *d = rcdev->lirc_dev; | ||
294 | __u32 mode; | 297 | __u32 mode; |
295 | int result; | 298 | int result; |
296 | 299 | ||
@@ -349,7 +352,8 @@ ssize_t lirc_dev_fop_read(struct file *file, | |||
349 | size_t length, | 352 | size_t length, |
350 | loff_t *ppos) | 353 | loff_t *ppos) |
351 | { | 354 | { |
352 | struct lirc_dev *d = file->private_data; | 355 | struct rc_dev *rcdev = file->private_data; |
356 | struct lirc_dev *d = rcdev->lirc_dev; | ||
353 | unsigned char *buf; | 357 | unsigned char *buf; |
354 | int ret, written = 0; | 358 | int ret, written = 0; |
355 | DECLARE_WAITQUEUE(wait, current); | 359 | DECLARE_WAITQUEUE(wait, current); |
@@ -448,24 +452,7 @@ out_unlocked: | |||
448 | } | 452 | } |
449 | EXPORT_SYMBOL(lirc_dev_fop_read); | 453 | EXPORT_SYMBOL(lirc_dev_fop_read); |
450 | 454 | ||
451 | void lirc_init_pdata(struct inode *inode, struct file *file) | 455 | int __init lirc_dev_init(void) |
452 | { | ||
453 | struct lirc_dev *d = container_of(inode->i_cdev, struct lirc_dev, cdev); | ||
454 | |||
455 | file->private_data = d; | ||
456 | } | ||
457 | EXPORT_SYMBOL(lirc_init_pdata); | ||
458 | |||
459 | void *lirc_get_pdata(struct file *file) | ||
460 | { | ||
461 | struct lirc_dev *d = file->private_data; | ||
462 | |||
463 | return d->data; | ||
464 | } | ||
465 | EXPORT_SYMBOL(lirc_get_pdata); | ||
466 | |||
467 | |||
468 | static int __init lirc_dev_init(void) | ||
469 | { | 456 | { |
470 | int retval; | 457 | int retval; |
471 | 458 | ||
@@ -489,16 +476,8 @@ static int __init lirc_dev_init(void) | |||
489 | return 0; | 476 | return 0; |
490 | } | 477 | } |
491 | 478 | ||
492 | static void __exit lirc_dev_exit(void) | 479 | void __exit lirc_dev_exit(void) |
493 | { | 480 | { |
494 | class_destroy(lirc_class); | 481 | class_destroy(lirc_class); |
495 | unregister_chrdev_region(lirc_base_dev, LIRC_MAX_DEVICES); | 482 | unregister_chrdev_region(lirc_base_dev, LIRC_MAX_DEVICES); |
496 | pr_info("module unloaded\n"); | ||
497 | } | 483 | } |
498 | |||
499 | module_init(lirc_dev_init); | ||
500 | module_exit(lirc_dev_exit); | ||
501 | |||
502 | MODULE_DESCRIPTION("LIRC base driver module"); | ||
503 | MODULE_AUTHOR("Artur Lipowski"); | ||
504 | MODULE_LICENSE("GPL"); | ||