From: Andy Walls <awalls@md.metrocast.net>
To: Jarod Wilson <jarod@redhat.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH] [media] lirc_dev: store cdev in irctl, up maxdevs
Date: Sat, 28 May 2011 12:42:41 -0400 [thread overview]
Message-ID: <1306600961.8085.15.camel@localhost> (raw)
In-Reply-To: <1306526466-18717-1-git-send-email-jarod@redhat.com>
On Fri, 2011-05-27 at 16:01 -0400, Jarod Wilson wrote:
> Store the cdev pointer in struct irctl, allocated dynamically as needed,
> rather than having a static array. At the same time, recycle some of the
> saved memory to nudge the maximum number of lirc devices supported up a
> ways -- its not that uncommon these days, now that we have the rc-core
> lirc bridge driver, to see a system with at least 4 raw IR receivers.
> (consider a mythtv backend with several video capture devices and the
> possible need for IR transmit hardware).
>
> Signed-off-by: Jarod Wilson <jarod@redhat.com>
> ---
> drivers/media/rc/lirc_dev.c | 33 ++++++++++++++++++++++++---------
> include/media/lirc_dev.h | 2 +-
> 2 files changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c
> index fd237ab..9e79692 100644
> --- a/drivers/media/rc/lirc_dev.c
> +++ b/drivers/media/rc/lirc_dev.c
> @@ -55,6 +55,8 @@ struct irctl {
> struct lirc_buffer *buf;
> unsigned int chunk_size;
>
> + struct cdev *cdev;
> +
> struct task_struct *task;
> long jiffies_to_wait;
> };
> @@ -62,7 +64,6 @@ struct irctl {
> static DEFINE_MUTEX(lirc_dev_lock);
>
> static struct irctl *irctls[MAX_IRCTL_DEVICES];
> -static struct cdev cdevs[MAX_IRCTL_DEVICES];
>
> /* Only used for sysfs but defined to void otherwise */
> static struct class *lirc_class;
> @@ -169,7 +170,9 @@ static int lirc_cdev_add(struct irctl *ir)
> {
> int retval;
> struct lirc_driver *d = &ir->d;
> - struct cdev *cdev = &cdevs[d->minor];
> + struct cdev *cdev;
> +
> + cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
if (cdev == NULL)
> if (d->fops) {
> cdev_init(cdev, d->fops);
generate_oops();
;)
Regards,
Andy
> @@ -180,12 +183,20 @@ static int lirc_cdev_add(struct irctl *ir)
> }
> retval = kobject_set_name(&cdev->kobj, "lirc%d", d->minor);
> if (retval)
> - return retval;
> + goto err_out;
>
> retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1);
> - if (retval)
> + if (retval) {
> kobject_put(&cdev->kobj);
> + goto err_out;
> + }
> +
> + ir->cdev = cdev;
> +
> + return 0;
>
> +err_out:
> + kfree(cdev);
> return retval;
> }
>
> @@ -214,7 +225,7 @@ int lirc_register_driver(struct lirc_driver *d)
> if (MAX_IRCTL_DEVICES <= d->minor) {
> dev_err(d->dev, "lirc_dev: lirc_register_driver: "
> "\"minor\" must be between 0 and %d (%d)!\n",
> - MAX_IRCTL_DEVICES-1, d->minor);
> + MAX_IRCTL_DEVICES - 1, d->minor);
> err = -EBADRQC;
> goto out;
> }
> @@ -369,7 +380,7 @@ int lirc_unregister_driver(int minor)
>
> if (minor < 0 || minor >= MAX_IRCTL_DEVICES) {
> printk(KERN_ERR "lirc_dev: %s: minor (%d) must be between "
> - "0 and %d!\n", __func__, minor, MAX_IRCTL_DEVICES-1);
> + "0 and %d!\n", __func__, minor, MAX_IRCTL_DEVICES - 1);
> return -EBADRQC;
> }
>
> @@ -380,7 +391,7 @@ int lirc_unregister_driver(int minor)
> return -ENOENT;
> }
>
> - cdev = &cdevs[minor];
> + cdev = ir->cdev;
>
> mutex_lock(&lirc_dev_lock);
>
> @@ -410,6 +421,7 @@ int lirc_unregister_driver(int minor)
> } else {
> lirc_irctl_cleanup(ir);
> cdev_del(cdev);
> + kfree(cdev);
> kfree(ir);
> irctls[minor] = NULL;
> }
> @@ -453,7 +465,7 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file)
> goto error;
> }
>
> - cdev = &cdevs[iminor(inode)];
> + cdev = ir->cdev;
> if (try_module_get(cdev->owner)) {
> ir->open++;
> retval = ir->d.set_use_inc(ir->d.data);
> @@ -484,13 +496,15 @@ EXPORT_SYMBOL(lirc_dev_fop_open);
> int lirc_dev_fop_close(struct inode *inode, struct file *file)
> {
> struct irctl *ir = irctls[iminor(inode)];
> - struct cdev *cdev = &cdevs[iminor(inode)];
> + struct cdev *cdev;
>
> if (!ir) {
> printk(KERN_ERR "%s: called with invalid irctl\n", __func__);
> return -EINVAL;
> }
>
> + cdev = ir->cdev;
> +
> dev_dbg(ir->d.dev, LOGHEAD "close called\n", ir->d.name, ir->d.minor);
>
> WARN_ON(mutex_lock_killable(&lirc_dev_lock));
> @@ -503,6 +517,7 @@ int lirc_dev_fop_close(struct inode *inode, struct file *file)
> lirc_irctl_cleanup(ir);
> cdev_del(cdev);
> irctls[ir->d.minor] = NULL;
> + kfree(cdev);
> kfree(ir);
> }
>
> diff --git a/include/media/lirc_dev.h b/include/media/lirc_dev.h
> index 630e702..168dd0b 100644
> --- a/include/media/lirc_dev.h
> +++ b/include/media/lirc_dev.h
> @@ -9,7 +9,7 @@
> #ifndef _LINUX_LIRC_DEV_H
> #define _LINUX_LIRC_DEV_H
>
> -#define MAX_IRCTL_DEVICES 4
> +#define MAX_IRCTL_DEVICES 8
> #define BUFLEN 16
>
> #define mod(n, div) ((n) % (div))
next prev parent reply other threads:[~2011-05-28 20:41 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-27 20:01 [PATCH] [media] lirc_dev: store cdev in irctl, up maxdevs Jarod Wilson
2011-05-28 16:42 ` Andy Walls [this message]
2011-05-29 0:18 ` Jarod Wilson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1306600961.8085.15.camel@localhost \
--to=awalls@md.metrocast.net \
--cc=jarod@redhat.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox