aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/inkern.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/inkern.c')
-rw-r--r--drivers/iio/inkern.c86
1 files changed, 85 insertions, 1 deletions
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
index 734a0042de0c..c4757e6367e7 100644
--- a/drivers/iio/inkern.c
+++ b/drivers/iio/inkern.c
@@ -356,6 +356,54 @@ void iio_channel_release(struct iio_channel *channel)
356} 356}
357EXPORT_SYMBOL_GPL(iio_channel_release); 357EXPORT_SYMBOL_GPL(iio_channel_release);
358 358
359static void devm_iio_channel_free(struct device *dev, void *res)
360{
361 struct iio_channel *channel = *(struct iio_channel **)res;
362
363 iio_channel_release(channel);
364}
365
366static int devm_iio_channel_match(struct device *dev, void *res, void *data)
367{
368 struct iio_channel **r = res;
369
370 if (!r || !*r) {
371 WARN_ON(!r || !*r);
372 return 0;
373 }
374
375 return *r == data;
376}
377
378struct iio_channel *devm_iio_channel_get(struct device *dev,
379 const char *channel_name)
380{
381 struct iio_channel **ptr, *channel;
382
383 ptr = devres_alloc(devm_iio_channel_free, sizeof(*ptr), GFP_KERNEL);
384 if (!ptr)
385 return ERR_PTR(-ENOMEM);
386
387 channel = iio_channel_get(dev, channel_name);
388 if (IS_ERR(channel)) {
389 devres_free(ptr);
390 return channel;
391 }
392
393 *ptr = channel;
394 devres_add(dev, ptr);
395
396 return channel;
397}
398EXPORT_SYMBOL_GPL(devm_iio_channel_get);
399
400void devm_iio_channel_release(struct device *dev, struct iio_channel *channel)
401{
402 WARN_ON(devres_release(dev, devm_iio_channel_free,
403 devm_iio_channel_match, channel));
404}
405EXPORT_SYMBOL_GPL(devm_iio_channel_release);
406
359struct iio_channel *iio_channel_get_all(struct device *dev) 407struct iio_channel *iio_channel_get_all(struct device *dev)
360{ 408{
361 const char *name; 409 const char *name;
@@ -441,6 +489,42 @@ void iio_channel_release_all(struct iio_channel *channels)
441} 489}
442EXPORT_SYMBOL_GPL(iio_channel_release_all); 490EXPORT_SYMBOL_GPL(iio_channel_release_all);
443 491
492static 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
499struct 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}
518EXPORT_SYMBOL_GPL(devm_iio_channel_get_all);
519
520void 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}
526EXPORT_SYMBOL_GPL(devm_iio_channel_release_all);
527
444static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, 528static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
445 enum iio_chan_info_enum info) 529 enum iio_chan_info_enum info)
446{ 530{
@@ -452,7 +536,7 @@ static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
452 if (val2 == NULL) 536 if (val2 == NULL)
453 val2 = &unused; 537 val2 = &unused;
454 538
455 if(!iio_channel_has_info(chan->channel, info)) 539 if (!iio_channel_has_info(chan->channel, info))
456 return -EINVAL; 540 return -EINVAL;
457 541
458 if (chan->indio_dev->info->read_raw_multi) { 542 if (chan->indio_dev->info->read_raw_multi) {