Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -7,8 +7,3 @@ Remote Controller core
.. kernel-doc:: include/media/rc-core.h

.. kernel-doc:: include/media/rc-map.h

LIRC
~~~~

.. kernel-doc:: include/media/lirc_dev.h
+4 −37
Original line number Diff line number Diff line
@@ -12,10 +12,10 @@
 *  GNU General Public License for more details.
 */

#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <media/lirc.h>
#include <media/lirc_dev.h>
#include <media/rc-core.h>
#include "rc-core-priv.h"

@@ -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)
{
	struct lirc_dev *d = container_of(inode->i_cdev, struct lirc_dev, cdev);
	struct rc_dev *dev = d->rdev;
	struct rc_dev *dev = container_of(inode->i_cdev, struct rc_dev,
					  lirc_cdev);
	int retval;

	retval = rc_open(dev);
@@ -523,7 +523,7 @@ static ssize_t ir_lirc_read(struct file *file, char __user *buffer,
	return copied;
}

static const struct file_operations lirc_fops = {
const struct file_operations lirc_fops = {
	.owner		= THIS_MODULE,
	.write		= ir_lirc_transmit_ir,
	.unlocked_ioctl	= ir_lirc_ioctl,
@@ -536,36 +536,3 @@ static const struct file_operations lirc_fops = {
	.release	= ir_lirc_close,
	.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;
}
+48 −97
Original line number Diff line number Diff line
@@ -18,24 +18,19 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/sched/signal.h>
#include <linux/ioctl.h>
#include <linux/poll.h>
#include <linux/mutex.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/idr.h>
#include <linux/poll.h>

#include "rc-core-priv.h"
#include <media/lirc.h>
#include <media/lirc_dev.h>

#define LOGHEAD		"lirc_dev (%s[%d]): "

static dev_t lirc_base_dev;

/* Used to keep track of allocated lirc devices */
#define LIRC_MAX_DEVICES 256
static DEFINE_IDA(lirc_ida);

/* Only used for sysfs but defined to void otherwise */
@@ -43,124 +38,80 @@ static struct class *lirc_class;

static void lirc_release_device(struct device *ld)
{
	struct lirc_dev *d = container_of(ld, struct lirc_dev, dev);
	struct rc_dev *rcdev = d->rdev;
	struct rc_dev *rcdev = container_of(ld, struct rc_dev, lirc_dev);

	if (rcdev->driver_type == RC_DRIVER_IR_RAW)
		kfifo_free(&rcdev->rawir);

	kfree(d);
	module_put(THIS_MODULE);
	put_device(d->dev.parent);
	put_device(&rcdev->dev);
}

struct lirc_dev *
lirc_allocate_device(void)
int ir_lirc_register(struct rc_dev *dev)
{
	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);
	}
	int err, minor;

	return d;
}
EXPORT_SYMBOL(lirc_allocate_device);

void lirc_free_device(struct lirc_dev *d)
{
	if (!d)
		return;
	device_initialize(&dev->lirc_dev);
	dev->lirc_dev.class = lirc_class;
	dev->lirc_dev.release = lirc_release_device;
	dev->send_mode = LIRC_MODE_PULSE;

	put_device(&d->dev);
	if (dev->driver_type == RC_DRIVER_IR_RAW) {
		if (kfifo_alloc(&dev->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL))
			return -ENOMEM;
	}
EXPORT_SYMBOL(lirc_free_device);

int lirc_register_device(struct lirc_dev *d)
{
	struct rc_dev *rcdev = d->rdev;
	int minor;
	int err;
	init_waitqueue_head(&dev->wait_poll);

	if (!d) {
		pr_err("driver pointer must be not NULL!\n");
		return -EBADRQC;
	minor = ida_simple_get(&lirc_ida, 0, RC_DEV_MAX, GFP_KERNEL);
	if (minor < 0) {
		err = minor;
		goto out_kfifo;
	}

	if (!d->dev.parent) {
		pr_err("dev parent pointer not filled in!\n");
		return -EINVAL;
	}

	if (!d->fops) {
		pr_err("fops pointer not filled in!\n");
		return -EINVAL;
	}
	dev->lirc_dev.parent = &dev->dev;
	dev->lirc_dev.devt = MKDEV(MAJOR(lirc_base_dev), minor);
	dev_set_name(&dev->lirc_dev, "lirc%d", minor);

	if (rcdev->driver_type == RC_DRIVER_IR_RAW) {
		if (kfifo_alloc(&rcdev->rawir, MAX_IR_EVENT_SIZE, GFP_KERNEL))
			return -ENOMEM;
	}
	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);
	if (minor < 0)
		return minor;
	get_device(&dev->dev);

	d->minor = minor;
	d->dev.devt = MKDEV(MAJOR(lirc_base_dev), d->minor);
	dev_set_name(&d->dev, "lirc%d", d->minor);
	dev_info(&dev->dev, "lirc_dev: driver %s registered at minor = %d",
		 dev->driver_name, minor);

	cdev_init(&d->cdev, d->fops);
	d->cdev.owner = d->owner;
	return 0;

	err = cdev_device_add(&d->cdev, &d->dev);
	if (err) {
out_ida:
	ida_simple_remove(&lirc_ida, minor);
out_kfifo:
	if (dev->driver_type == RC_DRIVER_IR_RAW)
		kfifo_free(&dev->rawir);
	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;

	if (!d)
		return;

	rcdev = d->rdev;

	dev_dbg(&d->dev, "lirc_dev: driver %s unregistered from minor = %d\n",
		rcdev->driver_name, d->minor);
	dev_dbg(&dev->dev, "lirc_dev: driver %s unregistered from minor = %d\n",
		dev->driver_name, MINOR(dev->lirc_dev.devt));

	mutex_lock(&rcdev->lock);
	mutex_lock(&dev->lock);

	if (rcdev->lirc_open) {
		dev_dbg(&d->dev, LOGHEAD "releasing opened driver\n",
			rcdev->driver_name, d->minor);
		wake_up_poll(&rcdev->wait_poll, POLLHUP);
	if (dev->lirc_open) {
		dev_dbg(&dev->dev, LOGHEAD "releasing opened driver\n",
			dev->driver_name, MINOR(dev->lirc_dev.devt));
		wake_up_poll(&dev->wait_poll, POLLHUP);
	}

	mutex_unlock(&rcdev->lock);
	mutex_unlock(&dev->lock);

	cdev_device_del(&d->cdev, &d->dev);
	ida_simple_remove(&lirc_ida, d->minor);
	put_device(&d->dev);
	cdev_device_del(&dev->lirc_cdev, &dev->lirc_dev);
	ida_simple_remove(&lirc_ida, MINOR(dev->lirc_dev.devt));
	put_device(&dev->lirc_dev);
}
EXPORT_SYMBOL(lirc_unregister_device);

int __init lirc_dev_init(void)
{
@@ -172,7 +123,7 @@ int __init lirc_dev_init(void)
		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");
	if (retval) {
		class_destroy(lirc_class);
@@ -189,5 +140,5 @@ int __init lirc_dev_init(void)
void __exit lirc_dev_exit(void)
{
	class_destroy(lirc_class);
	unregister_chrdev_region(lirc_base_dev, LIRC_MAX_DEVICES);
	unregister_chrdev_region(lirc_base_dev, RC_DEV_MAX);
}
+3 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#ifndef _RC_CORE_PRIV
#define _RC_CORE_PRIV

#define	RC_DEV_MAX		256
/* Define the max number of pulse/space transitions to buffer */
#define	MAX_IR_EVENT_SIZE	512

@@ -277,6 +278,8 @@ void lirc_dev_exit(void);
void ir_lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev);
int ir_lirc_register(struct rc_dev *dev);
void ir_lirc_unregister(struct rc_dev *dev);

extern const struct file_operations lirc_fops;
#else
static inline int lirc_dev_init(void) { return 0; }
static inline void lirc_dev_exit(void) {}
+0 −1
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@
/* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */
#define IR_TAB_MIN_SIZE	256
#define IR_TAB_MAX_SIZE	8192
#define RC_DEV_MAX	256

static const struct {
	const char *name;
Loading