Commit a6ddd4fe authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab

media: lirc: remove last remnants of lirc kapi

rc-core has replaced the lirc kapi many years ago, and now with the last
driver ported to rc-core, we can finally remove it.

Note this has no effect on userspace.

All future IR drivers should use the rc-core api.
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bf01c824
...@@ -7,8 +7,3 @@ Remote Controller core ...@@ -7,8 +7,3 @@ Remote Controller core
.. kernel-doc:: include/media/rc-core.h .. kernel-doc:: include/media/rc-core.h
.. kernel-doc:: include/media/rc-map.h .. kernel-doc:: include/media/rc-map.h
LIRC
~~~~
.. kernel-doc:: include/media/lirc_dev.h
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/poll.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <media/lirc.h> #include <media/lirc.h>
#include <media/lirc_dev.h>
#include <media/rc-core.h> #include <media/rc-core.h>
#include "rc-core-priv.h" #include "rc-core-priv.h"
...@@ -90,8 +90,8 @@ void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -90,8 +90,8 @@ void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev)
static int ir_lirc_open(struct inode *inode, struct file *file) static int ir_lirc_open(struct inode *inode, struct file *file)
{ {
struct lirc_dev *d = container_of(inode->i_cdev, struct lirc_dev, cdev); struct rc_dev *dev = container_of(inode->i_cdev, struct rc_dev,
struct rc_dev *dev = d->rdev; lirc_cdev);
int retval; int retval;
retval = rc_open(dev); retval = rc_open(dev);
...@@ -523,7 +523,7 @@ static ssize_t ir_lirc_read(struct file *file, char __user *buffer, ...@@ -523,7 +523,7 @@ static ssize_t ir_lirc_read(struct file *file, char __user *buffer,
return copied; return copied;
} }
static const struct file_operations lirc_fops = { const struct file_operations lirc_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.write = ir_lirc_transmit_ir, .write = ir_lirc_transmit_ir,
.unlocked_ioctl = ir_lirc_ioctl, .unlocked_ioctl = ir_lirc_ioctl,
...@@ -536,36 +536,3 @@ static const struct file_operations lirc_fops = { ...@@ -536,36 +536,3 @@ static const struct file_operations lirc_fops = {
.release = ir_lirc_close, .release = ir_lirc_close,
.llseek = no_llseek, .llseek = no_llseek,
}; };
int ir_lirc_register(struct rc_dev *dev)
{
struct lirc_dev *ldev;
int rc = -ENOMEM;
ldev = lirc_allocate_device();
if (!ldev)
return rc;
ldev->fops = &lirc_fops;
ldev->dev.parent = &dev->dev;
ldev->rdev = dev;
ldev->owner = THIS_MODULE;
rc = lirc_register_device(ldev);
if (rc < 0)
goto out;
dev->send_mode = LIRC_MODE_PULSE;
dev->lirc_dev = ldev;
return 0;
out:
lirc_free_device(ldev);
return rc;
}
void ir_lirc_unregister(struct rc_dev *dev)
{
lirc_unregister_device(dev->lirc_dev);
dev->lirc_dev = NULL;
}
...@@ -18,24 +18,19 @@ ...@@ -18,24 +18,19 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/sched/signal.h>
#include <linux/ioctl.h>
#include <linux/poll.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/cdev.h>
#include <linux/idr.h> #include <linux/idr.h>
#include <linux/poll.h>
#include "rc-core-priv.h" #include "rc-core-priv.h"
#include <media/lirc.h> #include <media/lirc.h>
#include <media/lirc_dev.h>
#define LOGHEAD "lirc_dev (%s[%d]): " #define LOGHEAD "lirc_dev (%s[%d]): "
static dev_t lirc_base_dev; static dev_t lirc_base_dev;
/* Used to keep track of allocated lirc devices */ /* Used to keep track of allocated lirc devices */
#define LIRC_MAX_DEVICES 256
static DEFINE_IDA(lirc_ida); static DEFINE_IDA(lirc_ida);
/* Only used for sysfs but defined to void otherwise */ /* Only used for sysfs but defined to void otherwise */
...@@ -43,124 +38,80 @@ static struct class *lirc_class; ...@@ -43,124 +38,80 @@ static struct class *lirc_class;
static void lirc_release_device(struct device *ld) static void lirc_release_device(struct device *ld)
{ {
struct lirc_dev *d = container_of(ld, struct lirc_dev, dev); struct rc_dev *rcdev = container_of(ld, struct rc_dev, lirc_dev);
struct rc_dev *rcdev = d->rdev;
if (rcdev->driver_type == RC_DRIVER_IR_RAW) if (rcdev->driver_type == RC_DRIVER_IR_RAW)
kfifo_free(&rcdev->rawir); kfifo_free(&rcdev->rawir);
kfree(d); put_device(&rcdev->dev);
module_put(THIS_MODULE);
put_device(d->dev.parent);
}
struct lirc_dev *
lirc_allocate_device(void)
{
struct lirc_dev *d;
d = kzalloc(sizeof(*d), GFP_KERNEL);
if (d) {
device_initialize(&d->dev);
d->dev.class = lirc_class;
d->dev.release = lirc_release_device;
__module_get(THIS_MODULE);
}
return d;
} }
EXPORT_SYMBOL(lirc_allocate_device);
void lirc_free_device(struct lirc_dev *d) int ir_lirc_register(struct rc_dev *dev)
{ {
if (!d) int err, minor;
return;
put_device(&d->dev);
}
EXPORT_SYMBOL(lirc_free_device);
int lirc_register_device(struct lirc_dev *d) device_initialize(&dev->lirc_dev);
{ dev->lirc_dev.class = lirc_class;
struct rc_dev *rcdev = d->rdev; dev->lirc_dev.release = lirc_release_device;
int minor; dev->send_mode = LIRC_MODE_PULSE;
int err;
if (!d) { if (dev->driver_type == RC_DRIVER_IR_RAW) {
pr_err("driver pointer must be not NULL!\n"); if (kfifo_alloc(&dev->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL))
return -EBADRQC; return -ENOMEM;
} }
if (!d->dev.parent) { init_waitqueue_head(&dev->wait_poll);
pr_err("dev parent pointer not filled in!\n");
return -EINVAL;
}
if (!d->fops) { minor = ida_simple_get(&lirc_ida, 0, RC_DEV_MAX, GFP_KERNEL);
pr_err("fops pointer not filled in!\n"); if (minor < 0) {
return -EINVAL; err = minor;
goto out_kfifo;
} }
if (rcdev->driver_type == RC_DRIVER_IR_RAW) { dev->lirc_dev.parent = &dev->dev;
if (kfifo_alloc(&rcdev->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL)) dev->lirc_dev.devt = MKDEV(MAJOR(lirc_base_dev), minor);
return -ENOMEM; dev_set_name(&dev->lirc_dev, "lirc%d", minor);
}
cdev_init(&dev->lirc_cdev, &lirc_fops);
init_waitqueue_head(&rcdev->wait_poll); err = cdev_device_add(&dev->lirc_cdev, &dev->lirc_dev);
if (err)
goto out_ida;
minor = ida_simple_get(&lirc_ida, 0, LIRC_MAX_DEVICES, GFP_KERNEL); get_device(&dev->dev);
if (minor < 0)
return minor;
d->minor = minor; dev_info(&dev->dev, "lirc_dev: driver %s registered at minor = %d",
d->dev.devt = MKDEV(MAJOR(lirc_base_dev), d->minor); dev->driver_name, minor);
dev_set_name(&d->dev, "lirc%d", d->minor);
cdev_init(&d->cdev, d->fops); return 0;
d->cdev.owner = d->owner;
err = cdev_device_add(&d->cdev, &d->dev); out_ida:
if (err) {
ida_simple_remove(&lirc_ida, minor); ida_simple_remove(&lirc_ida, minor);
out_kfifo:
if (dev->driver_type == RC_DRIVER_IR_RAW)
kfifo_free(&dev->rawir);
return err; return err;
}
get_device(d->dev.parent);
dev_info(&d->dev, "lirc_dev: driver %s registered at minor = %d\n",
rcdev->driver_name, d->minor);
return 0;
} }
EXPORT_SYMBOL(lirc_register_device);
void lirc_unregister_device(struct lirc_dev *d) void ir_lirc_unregister(struct rc_dev *dev)
{ {
struct rc_dev *rcdev; dev_dbg(&dev->dev, "lirc_dev: driver %s unregistered from minor = %d\n",
dev->driver_name, MINOR(dev->lirc_dev.devt));
if (!d)
return;
rcdev = d->rdev;
dev_dbg(&d->dev, "lirc_dev: driver %s unregistered from minor = %d\n",
rcdev->driver_name, d->minor);
mutex_lock(&rcdev->lock); mutex_lock(&dev->lock);
if (rcdev->lirc_open) { if (dev->lirc_open) {
dev_dbg(&d->dev, LOGHEAD "releasing opened driver\n", dev_dbg(&dev->dev, LOGHEAD "releasing opened driver\n",
rcdev->driver_name, d->minor); dev->driver_name, MINOR(dev->lirc_dev.devt));
wake_up_poll(&rcdev->wait_poll, POLLHUP); wake_up_poll(&dev->wait_poll, POLLHUP);
} }
mutex_unlock(&rcdev->lock); mutex_unlock(&dev->lock);
cdev_device_del(&d->cdev, &d->dev); cdev_device_del(&dev->lirc_cdev, &dev->lirc_dev);
ida_simple_remove(&lirc_ida, d->minor); ida_simple_remove(&lirc_ida, MINOR(dev->lirc_dev.devt));
put_device(&d->dev); put_device(&dev->lirc_dev);
} }
EXPORT_SYMBOL(lirc_unregister_device);
int __init lirc_dev_init(void) int __init lirc_dev_init(void)
{ {
...@@ -172,7 +123,7 @@ int __init lirc_dev_init(void) ...@@ -172,7 +123,7 @@ int __init lirc_dev_init(void)
return PTR_ERR(lirc_class); return PTR_ERR(lirc_class);
} }
retval = alloc_chrdev_region(&lirc_base_dev, 0, LIRC_MAX_DEVICES, retval = alloc_chrdev_region(&lirc_base_dev, 0, RC_DEV_MAX,
"BaseRemoteCtl"); "BaseRemoteCtl");
if (retval) { if (retval) {
class_destroy(lirc_class); class_destroy(lirc_class);
...@@ -189,5 +140,5 @@ int __init lirc_dev_init(void) ...@@ -189,5 +140,5 @@ int __init lirc_dev_init(void)
void __exit lirc_dev_exit(void) void __exit lirc_dev_exit(void)
{ {
class_destroy(lirc_class); class_destroy(lirc_class);
unregister_chrdev_region(lirc_base_dev, LIRC_MAX_DEVICES); unregister_chrdev_region(lirc_base_dev, RC_DEV_MAX);
} }
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#ifndef _RC_CORE_PRIV #ifndef _RC_CORE_PRIV
#define _RC_CORE_PRIV #define _RC_CORE_PRIV
#define RC_DEV_MAX 256
/* Define the max number of pulse/space transitions to buffer */ /* Define the max number of pulse/space transitions to buffer */
#define MAX_IR_EVENT_SIZE 512 #define MAX_IR_EVENT_SIZE 512
...@@ -277,6 +278,8 @@ void lirc_dev_exit(void); ...@@ -277,6 +278,8 @@ void lirc_dev_exit(void);
void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev); void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev);
int ir_lirc_register(struct rc_dev *dev); int ir_lirc_register(struct rc_dev *dev);
void ir_lirc_unregister(struct rc_dev *dev); void ir_lirc_unregister(struct rc_dev *dev);
extern const struct file_operations lirc_fops;
#else #else
static inline int lirc_dev_init(void) { return 0; } static inline int lirc_dev_init(void) { return 0; }
static inline void lirc_dev_exit(void) {} static inline void lirc_dev_exit(void) {}
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
/* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */ /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */
#define IR_TAB_MIN_SIZE 256 #define IR_TAB_MIN_SIZE 256
#define IR_TAB_MAX_SIZE 8192 #define IR_TAB_MAX_SIZE 8192
#define RC_DEV_MAX 256
static const struct { static const struct {
const char *name; const char *name;
......
/*
* LIRC base driver
*
* by Artur Lipowski <alipowski@interia.pl>
* This code is licensed under GNU GPL
*
*/
#ifndef _LINUX_LIRC_DEV_H
#define _LINUX_LIRC_DEV_H
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/poll.h>
#include <linux/kfifo.h>
#include <media/lirc.h>
#include <linux/device.h>
#include <linux/cdev.h>
/**
* struct lirc_dev - represents a LIRC device
*
* @minor: the minor device (/dev/lircX) number for the device
* @rdev: &struct rc_dev associated with the device
* @fops: &struct file_operations for the device
* @owner: the module owning this struct
* @dev: &struct device assigned to the device
* @cdev: &struct cdev assigned to the device
*/
struct lirc_dev {
unsigned int minor;
struct rc_dev *rdev;
const struct file_operations *fops;
struct module *owner;
struct device dev;
struct cdev cdev;
};
struct lirc_dev *lirc_allocate_device(void);
void lirc_free_device(struct lirc_dev *d);
int lirc_register_device(struct lirc_dev *d);
void lirc_unregister_device(struct lirc_dev *d);
#endif
...@@ -17,10 +17,10 @@ ...@@ -17,10 +17,10 @@
#define _RC_CORE #define _RC_CORE
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/cdev.h>
#include <linux/kfifo.h> #include <linux/kfifo.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <media/lirc_dev.h>
#include <media/rc-map.h> #include <media/rc-map.h>
extern int rc_core_debug; extern int rc_core_debug;
...@@ -116,7 +116,8 @@ enum rc_filter_type { ...@@ -116,7 +116,8 @@ enum rc_filter_type {
* @max_timeout: maximum timeout supported by device * @max_timeout: maximum timeout supported by device
* @rx_resolution : resolution (in ns) of input sampler * @rx_resolution : resolution (in ns) of input sampler
* @tx_resolution: resolution (in ns) of output sampler * @tx_resolution: resolution (in ns) of output sampler
* @lirc_dev: lirc char device * @lirc_dev: lirc device
* @lirc_cdev: lirc char cdev
* @lirc_open: count of the number of times the device has been opened * @lirc_open: count of the number of times the device has been opened
* @carrier_low: when setting the carrier range, first the low end must be * @carrier_low: when setting the carrier range, first the low end must be
* set with an ioctl and then the high end with another ioctl * set with an ioctl and then the high end with another ioctl
...@@ -190,7 +191,8 @@ struct rc_dev { ...@@ -190,7 +191,8 @@ struct rc_dev {
u32 rx_resolution; u32 rx_resolution;
u32 tx_resolution; u32 tx_resolution;
#ifdef CONFIG_LIRC #ifdef CONFIG_LIRC
struct lirc_dev *lirc_dev; struct device lirc_dev;
struct cdev lirc_cdev;
int lirc_open; int lirc_open;
int carrier_low; int carrier_low;
ktime_t gap_start; ktime_t gap_start;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment