summaryrefslogtreecommitdiffstats
path: root/drivers/staging/iio/industrialio-trigger.c
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2011-08-30 12:41:07 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2011-09-06 16:00:25 -0700
commit47c24fdd4253a2c8d730b978a186923b1af5e879 (patch)
treec70e6887bb431943e5307d328bb0f480f802f738 /drivers/staging/iio/industrialio-trigger.c
parent5aa9618896e0ba49b444731f9fafa7f7c18a13ab (diff)
downloadop-kernel-dev-47c24fdd4253a2c8d730b978a186923b1af5e879.zip
op-kernel-dev-47c24fdd4253a2c8d730b978a186923b1af5e879.tar.gz
staging:iio: use ida_simple_get and ida_simple_remove + merge ids
Use new simple ida allocation functions to remove some boilerplate code. Also, now we only have one chdev per device we don't need to maintain a separate ida for minor numbers. Just use the devices id. Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio/industrialio-trigger.c')
-rw-r--r--drivers/staging/iio/industrialio-trigger.c48
1 files changed, 7 insertions, 41 deletions
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index f1ece86..b99d14e 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -32,8 +32,7 @@
* Any other suggestions?
*/
-static DEFINE_IDR(iio_trigger_idr);
-static DEFINE_SPINLOCK(iio_trigger_idr_lock);
+static DEFINE_IDA(iio_trigger_ida);
/* Single list of all available triggers */
static LIST_HEAD(iio_trigger_list);
@@ -72,48 +71,15 @@ static void iio_trigger_unregister_sysfs(struct iio_trigger *trig_info)
NULL);
}
-
-/**
- * iio_trigger_register_id() - get a unique id for this trigger
- * @trig_info: the trigger
- **/
-static int iio_trigger_register_id(struct iio_trigger *trig_info)
-{
- int ret = 0;
-
-idr_again:
- if (unlikely(idr_pre_get(&iio_trigger_idr, GFP_KERNEL) == 0))
- return -ENOMEM;
-
- spin_lock(&iio_trigger_idr_lock);
- ret = idr_get_new(&iio_trigger_idr, NULL, &trig_info->id);
- spin_unlock(&iio_trigger_idr_lock);
- if (unlikely(ret == -EAGAIN))
- goto idr_again;
- else if (likely(!ret))
- trig_info->id = trig_info->id & MAX_ID_MASK;
-
- return ret;
-}
-
-/**
- * iio_trigger_unregister_id() - free up unique id for use by another trigger
- * @trig_info: the trigger
- **/
-static void iio_trigger_unregister_id(struct iio_trigger *trig_info)
-{
- spin_lock(&iio_trigger_idr_lock);
- idr_remove(&iio_trigger_idr, trig_info->id);
- spin_unlock(&iio_trigger_idr_lock);
-}
-
int iio_trigger_register(struct iio_trigger *trig_info)
{
int ret;
- ret = iio_trigger_register_id(trig_info);
- if (ret)
+ trig_info->id = ida_simple_get(&iio_trigger_ida, 0, 0, GFP_KERNEL);
+ if (trig_info->id < 0) {
+ ret = trig_info->id;
goto error_ret;
+ }
/* Set the name used for the sysfs directory etc */
dev_set_name(&trig_info->dev, "trigger%ld",
(unsigned long) trig_info->id);
@@ -136,7 +102,7 @@ int iio_trigger_register(struct iio_trigger *trig_info)
error_device_del:
device_del(&trig_info->dev);
error_unregister_id:
- iio_trigger_unregister_id(trig_info);
+ ida_simple_remove(&iio_trigger_ida, trig_info->id);
error_ret:
return ret;
}
@@ -149,7 +115,7 @@ void iio_trigger_unregister(struct iio_trigger *trig_info)
mutex_unlock(&iio_trigger_list_lock);
iio_trigger_unregister_sysfs(trig_info);
- iio_trigger_unregister_id(trig_info);
+ ida_simple_remove(&iio_trigger_ida, trig_info->id);
/* Possible issue in here */
device_unregister(&trig_info->dev);
}
OpenPOWER on IntegriCloud