Merge 'staging-next' to Linus's tree
[pandora-kernel.git] / drivers / staging / iio / industrialio-core.c
index 92a212f..f3bf111 100644 (file)
 #define IIO_ID_FORMAT IIO_ID_PREFIX "%d"
 
 /* IDR to assign each registered device a unique id*/
-static DEFINE_IDR(iio_idr);
+static DEFINE_IDA(iio_ida);
 /* IDR to allocate character device minor numbers */
-static DEFINE_IDR(iio_chrdev_idr);
+static DEFINE_IDA(iio_chrdev_ida);
 /* Lock used to protect both of the above */
-static DEFINE_SPINLOCK(iio_idr_lock);
+static DEFINE_SPINLOCK(iio_ida_lock);
 
 dev_t iio_devt;
 EXPORT_SYMBOL(iio_devt);
@@ -59,7 +59,7 @@ EXPORT_SYMBOL(__iio_change_event);
  * are queued. Hence a client MUST open the chrdev before the ring buffer is
  * switched on.
  */
- int __iio_push_event(struct iio_event_interface *ev_int,
+int __iio_push_event(struct iio_event_interface *ev_int,
                     int ev_code,
                     s64 timestamp,
                     struct iio_shared_ev_pointer *
@@ -125,19 +125,10 @@ static irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
        }
 
        time_ns = iio_get_time_ns();
-       /* detect single element list*/
-       if (list_is_singular(&int_info->ev_list)) {
+       list_for_each_entry(p, &int_info->ev_list, list) {
                disable_irq_nosync(irq);
-               p = list_first_entry(&int_info->ev_list,
-                                    struct iio_event_handler_list,
-                                    list);
-               /* single event handler - maybe shared */
                p->handler(dev_info, 1, time_ns, !(p->refcount > 1));
-       } else
-               list_for_each_entry(p, &int_info->ev_list, list) {
-                       disable_irq_nosync(irq);
-                       p->handler(dev_info, 1, time_ns, 0);
-               }
+       }
        spin_unlock_irqrestore(&int_info->ev_list_lock, flags);
 
        return IRQ_HANDLED;
@@ -368,14 +359,14 @@ int iio_device_get_chrdev_minor(void)
 {
        int ret, val;
 
-idr_again:
-       if (unlikely(idr_pre_get(&iio_chrdev_idr, GFP_KERNEL) == 0))
+ida_again:
+       if (unlikely(ida_pre_get(&iio_chrdev_ida, GFP_KERNEL) == 0))
                return -ENOMEM;
-       spin_lock(&iio_idr_lock);
-       ret = idr_get_new(&iio_chrdev_idr, NULL, &val);
-       spin_unlock(&iio_idr_lock);
+       spin_lock(&iio_ida_lock);
+       ret = ida_get_new(&iio_chrdev_ida, &val);
+       spin_unlock(&iio_ida_lock);
        if (unlikely(ret == -EAGAIN))
-               goto idr_again;
+               goto ida_again;
        else if (unlikely(ret))
                return ret;
        if (val > IIO_DEV_MAX)
@@ -385,9 +376,9 @@ idr_again:
 
 void iio_device_free_chrdev_minor(int val)
 {
-       spin_lock(&iio_idr_lock);
-       idr_remove(&iio_chrdev_idr, val);
-       spin_unlock(&iio_idr_lock);
+       spin_lock(&iio_ida_lock);
+       ida_remove(&iio_chrdev_ida, val);
+       spin_unlock(&iio_ida_lock);
 }
 
 int iio_setup_ev_int(struct iio_event_interface *ev_int,
@@ -508,62 +499,49 @@ static int iio_device_register_sysfs(struct iio_dev *dev_info)
                goto error_ret;
        }
 
-       if (dev_info->scan_el_attrs) {
-               ret = sysfs_create_group(&dev_info->dev.kobj,
-                                        dev_info->scan_el_attrs);
-               if (ret)
-                       dev_err(&dev_info->dev,
-                               "Failed to add sysfs scan els\n");
-       }
-
 error_ret:
        return ret;
 }
 
 static void iio_device_unregister_sysfs(struct iio_dev *dev_info)
 {
-       if (dev_info->scan_el_attrs)
-               sysfs_remove_group(&dev_info->dev.kobj,
-                                  dev_info->scan_el_attrs);
-
        sysfs_remove_group(&dev_info->dev.kobj, dev_info->attrs);
 }
 
 /* Return a negative errno on failure */
-int iio_get_new_idr_val(struct idr *this_idr)
+int iio_get_new_ida_val(struct ida *this_ida)
 {
        int ret;
        int val;
 
-idr_again:
-       if (unlikely(idr_pre_get(this_idr, GFP_KERNEL) == 0))
+ida_again:
+       if (unlikely(ida_pre_get(this_ida, GFP_KERNEL) == 0))
                return -ENOMEM;
 
-       spin_lock(&iio_idr_lock);
-       ret = idr_get_new(this_idr, NULL, &val);
-       spin_unlock(&iio_idr_lock);
+       spin_lock(&iio_ida_lock);
+       ret = ida_get_new(this_ida, &val);
+       spin_unlock(&iio_ida_lock);
        if (unlikely(ret == -EAGAIN))
-               goto idr_again;
+               goto ida_again;
        else if (unlikely(ret))
                return ret;
 
        return val;
 }
-EXPORT_SYMBOL(iio_get_new_idr_val);
+EXPORT_SYMBOL(iio_get_new_ida_val);
 
-void iio_free_idr_val(struct idr *this_idr, int id)
+void iio_free_ida_val(struct ida *this_ida, int id)
 {
-       spin_lock(&iio_idr_lock);
-       idr_remove(this_idr, id);
-       spin_unlock(&iio_idr_lock);
+       spin_lock(&iio_ida_lock);
+       ida_remove(this_ida, id);
+       spin_unlock(&iio_ida_lock);
 }
-EXPORT_SYMBOL(iio_free_idr_val);
+EXPORT_SYMBOL(iio_free_ida_val);
 
 static int iio_device_register_id(struct iio_dev *dev_info,
-                                 struct idr *this_idr)
+                                 struct ida *this_ida)
 {
-
-       dev_info->id = iio_get_new_idr_val(&iio_idr);
+       dev_info->id = iio_get_new_ida_val(&iio_ida);
        if (dev_info->id < 0)
                return dev_info->id;
        return 0;
@@ -571,7 +549,7 @@ static int iio_device_register_id(struct iio_dev *dev_info,
 
 static void iio_device_unregister_id(struct iio_dev *dev_info)
 {
-       iio_free_idr_val(&iio_idr, dev_info->id);
+       iio_free_ida_val(&iio_ida, dev_info->id);
 }
 
 static inline int __iio_add_event_config_attrs(struct iio_dev *dev_info, int i)
@@ -770,7 +748,7 @@ int iio_device_register(struct iio_dev *dev_info)
 {
        int ret;
 
-       ret = iio_device_register_id(dev_info, &iio_idr);
+       ret = iio_device_register_id(dev_info, &iio_ida);
        if (ret) {
                dev_err(&dev_info->dev, "Failed to get id\n");
                goto error_ret;
@@ -779,7 +757,7 @@ int iio_device_register(struct iio_dev *dev_info)
 
        ret = device_add(&dev_info->dev);
        if (ret)
-               goto error_free_idr;
+               goto error_free_ida;
        ret = iio_device_register_sysfs(dev_info);
        if (ret) {
                dev_err(dev_info->dev.parent,
@@ -801,7 +779,7 @@ error_free_sysfs:
        iio_device_unregister_sysfs(dev_info);
 error_del_device:
        device_del(&dev_info->dev);
-error_free_idr:
+error_free_ida:
        iio_device_unregister_id(dev_info);
 error_ret:
        return ret;