@@ -126,6 +126,7 @@ add v3.1_no_pm_qos.patch
add no_atomic_include.patch
add v4l2-compat-timespec.patch
add v3.0_ida2bit.patch
+add v3.0_remove_ida_lird_dev.patch
[2.6.39]
add v2.6_rc_main_bsearch_h.patch
new file mode 100644
@@ -0,0 +1,111 @@
+diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c
+index e16d113..67f1f7d 100644
+--- a/drivers/media/rc/lirc_dev.c
++++ b/drivers/media/rc/lirc_dev.c
+@@ -24,7 +24,6 @@
+ #include <linux/mutex.h>
+ #include <linux/device.h>
+ #include <linux/cdev.h>
+-#include <linux/idr.h>
+
+ #include <media/rc-core.h>
+ #include <media/lirc.h>
+@@ -34,9 +33,10 @@
+
+ static dev_t lirc_base_dev;
+
+-/* Used to keep track of allocated lirc devices */
+-#define LIRC_MAX_DEVICES 256
+-static DEFINE_IDA(lirc_ida);
++/* This mutex protects the irctls array */
++static DEFINE_MUTEX(lirc_dev_lock);
++
++static struct lirc_dev *irctls[MAX_IRCTL_DEVICES];
+
+ /* Only used for sysfs but defined to void otherwise */
+ static struct class *lirc_class;
+@@ -45,6 +45,10 @@ static void lirc_release_device(struct device *ld)
+ {
+ struct lirc_dev *d = container_of(ld, struct lirc_dev, dev);
+
++ mutex_lock(&lirc_dev_lock);
++ irctls[d->minor] = NULL;
++ mutex_unlock(&lirc_dev_lock);
++
+ put_device(d->dev.parent);
+
+ if (d->buf_internal) {
+@@ -161,9 +165,20 @@ int lirc_register_device(struct lirc_dev *d)
+ return err;
+ }
+
+- minor = ida_simple_get(&lirc_ida, 0, LIRC_MAX_DEVICES, GFP_KERNEL);
+- if (minor < 0)
+- return minor;
++ mutex_lock(&lirc_dev_lock);
++
++ /* find first free slot for driver */
++ for (minor = 0; minor < MAX_IRCTL_DEVICES; minor++)
++ if (!irctls[minor])
++ break;
++
++ if (minor == MAX_IRCTL_DEVICES) {
++ dev_err(&d->dev, "no free slots for drivers!\n");
++ mutex_unlock(&lirc_dev_lock);
++ return -ENOMEM;
++ }
++ irctls[minor] = d;
++ mutex_unlock(&lirc_dev_lock);
+
+ d->minor = minor;
+ d->dev.devt = MKDEV(MAJOR(lirc_base_dev), d->minor);
+@@ -175,7 +190,10 @@ int lirc_register_device(struct lirc_dev *d)
+
+ err = cdev_device_add(&d->cdev, &d->dev);
+ if (err) {
+- ida_simple_remove(&lirc_ida, minor);
++ mutex_lock(&lirc_dev_lock);
++ irctls[minor] = NULL;
++ mutex_unlock(&lirc_dev_lock);
++
+ return err;
+ }
+
+@@ -208,7 +226,6 @@ void lirc_unregister_device(struct lirc_dev *d)
+ mutex_unlock(&d->mutex);
+
+ cdev_device_del(&d->cdev, &d->dev);
+- ida_simple_remove(&lirc_ida, d->minor);
+ put_device(&d->dev);
+ }
+ EXPORT_SYMBOL(lirc_unregister_device);
+@@ -487,7 +504,7 @@ static 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, MAX_IRCTL_DEVICES,
+ "BaseRemoteCtl");
+ if (retval) {
+ class_destroy(lirc_class);
+@@ -504,7 +521,7 @@ static int __init lirc_dev_init(void)
+ static 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, MAX_IRCTL_DEVICES);
+ pr_info("module unloaded\n");
+ }
+
+diff --git a/include/media/lirc_dev.h b/include/media/lirc_dev.h
+index 857da67..47bcd39 100644
+--- a/include/media/lirc_dev.h
++++ b/include/media/lirc_dev.h
+@@ -9,6 +9,7 @@
+ #ifndef _LINUX_LIRC_DEV_H
+ #define _LINUX_LIRC_DEV_H
+
++#define MAX_IRCTL_DEVICES 8
+ #define BUFLEN 16
+
+ #include <linux/slab.h>