diff options
Diffstat (limited to 'drivers/iio/inkern.c')
-rw-r--r-- | drivers/iio/inkern.c | 86 |
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 | } |
357 | EXPORT_SYMBOL_GPL(iio_channel_release); | 357 | EXPORT_SYMBOL_GPL(iio_channel_release); |
358 | 358 | ||
359 | static 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 | |||
366 | static 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 | |||
378 | struct 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 | } | ||
398 | EXPORT_SYMBOL_GPL(devm_iio_channel_get); | ||
399 | |||
400 | void 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 | } | ||
405 | EXPORT_SYMBOL_GPL(devm_iio_channel_release); | ||
406 | |||
359 | struct iio_channel *iio_channel_get_all(struct device *dev) | 407 | struct 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 | } |
442 | EXPORT_SYMBOL_GPL(iio_channel_release_all); | 490 | EXPORT_SYMBOL_GPL(iio_channel_release_all); |
443 | 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 | |||
444 | 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, |
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) { |