diff options
author | Jonathan Cameron <jic23@cam.ac.uk> | 2011-08-30 12:41:07 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-06 16:00:25 -0700 |
commit | 47c24fdd4253a2c8d730b978a186923b1af5e879 (patch) | |
tree | c70e6887bb431943e5307d328bb0f480f802f738 /drivers/staging/iio/industrialio-trigger.c | |
parent | 5aa9618896e0ba49b444731f9fafa7f7c18a13ab (diff) | |
download | op-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.c | 48 |
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); } |