diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2016-04-06 06:31:07 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2016-04-19 14:58:15 -0400 |
commit | efc2c0133f198bc65593a67015af358919b0c48f (patch) | |
tree | a5559eed375f002c6ed912abd05c79e73f4bb7c4 /drivers/iio/inkern.c | |
parent | 8bf872d8d261feefcdf67027522e3f717cad2bfe (diff) |
iio: core: Add devm_ APIs for iio_channel_{get,release}_all
Some of kernel driver uses the IIO framework to get the sensor
value via ADC or IIO HW driver. The client driver get iio channel
by iio_channel_get_all() and release it by calling
iio_channel_release_all().
Add resource managed version (devm_*) of these APIs so that if client
calls the devm_iio_channel_get_all() then it need not to release it
explicitly, it can be done by managed device framework when driver
get un-binded.
This reduces the code in error path and also need of .remove callback in
some cases.
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/inkern.c')
-rw-r--r-- | drivers/iio/inkern.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 9fd8934c1887..c4757e6367e7 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c | |||
@@ -489,6 +489,42 @@ void iio_channel_release_all(struct iio_channel *channels) | |||
489 | } | 489 | } |
490 | EXPORT_SYMBOL_GPL(iio_channel_release_all); | 490 | EXPORT_SYMBOL_GPL(iio_channel_release_all); |
491 | 491 | ||
492 | static void devm_iio_channel_free_all(struct device *dev, void *res) | ||
493 | { | ||
494 | struct iio_channel *channels = *(struct iio_channel **)res; | ||
495 | |||
496 | iio_channel_release_all(channels); | ||
497 | } | ||
498 | |||
499 | struct iio_channel *devm_iio_channel_get_all(struct device *dev) | ||
500 | { | ||
501 | struct iio_channel **ptr, *channels; | ||
502 | |||
503 | ptr = devres_alloc(devm_iio_channel_free_all, sizeof(*ptr), GFP_KERNEL); | ||
504 | if (!ptr) | ||
505 | return ERR_PTR(-ENOMEM); | ||
506 | |||
507 | channels = iio_channel_get_all(dev); | ||
508 | if (IS_ERR(channels)) { | ||
509 | devres_free(ptr); | ||
510 | return channels; | ||
511 | } | ||
512 | |||
513 | *ptr = channels; | ||
514 | devres_add(dev, ptr); | ||
515 | |||
516 | return channels; | ||
517 | } | ||
518 | EXPORT_SYMBOL_GPL(devm_iio_channel_get_all); | ||
519 | |||
520 | void devm_iio_channel_release_all(struct device *dev, | ||
521 | struct iio_channel *channels) | ||
522 | { | ||
523 | WARN_ON(devres_release(dev, devm_iio_channel_free_all, | ||
524 | devm_iio_channel_match, channels)); | ||
525 | } | ||
526 | EXPORT_SYMBOL_GPL(devm_iio_channel_release_all); | ||
527 | |||
492 | static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, | 528 | static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, |
493 | enum iio_chan_info_enum info) | 529 | enum iio_chan_info_enum info) |
494 | { | 530 | { |