Lines Matching +full:chan +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/iio/iio-opaque.h>
30 int ret = -ENODEV; in iio_map_array_unregister_locked()
34 if (indio_dev == mapi->indio_dev) { in iio_map_array_unregister_locked()
35 list_del(&mapi->l); in iio_map_array_unregister_locked()
55 ret = -ENOMEM; in iio_map_array_register()
58 mapi->map = &maps[i]; in iio_map_array_register()
59 mapi->indio_dev = indio_dev; in iio_map_array_register()
60 list_add_tail(&mapi->l, &iio_map_list); in iio_map_array_register()
105 *iio_chan_spec_from_name(const struct iio_dev *indio_dev, const char *name) in iio_chan_spec_from_name() argument
108 const struct iio_chan_spec *chan = NULL; in iio_chan_spec_from_name() local
110 for (i = 0; i < indio_dev->num_channels; i++) in iio_chan_spec_from_name()
111 if (indio_dev->channels[i].datasheet_name && in iio_chan_spec_from_name()
112 strcmp(name, indio_dev->channels[i].datasheet_name) == 0) { in iio_chan_spec_from_name()
113 chan = &indio_dev->channels[i]; in iio_chan_spec_from_name()
116 return chan; in iio_chan_spec_from_name()
120 * __fwnode_iio_simple_xlate - translate iiospec to the IIO channel index
132 if (!iiospec->nargs) in __fwnode_iio_simple_xlate()
135 if (iiospec->args[0] >= indio_dev->num_channels) { in __fwnode_iio_simple_xlate()
136 dev_err(&indio_dev->dev, "invalid channel index %llu\n", in __fwnode_iio_simple_xlate()
137 iiospec->args[0]); in __fwnode_iio_simple_xlate()
138 return -EINVAL; in __fwnode_iio_simple_xlate()
141 return iiospec->args[0]; in __fwnode_iio_simple_xlate()
152 err = fwnode_property_get_reference_args(fwnode, "io-channels", in __fwnode_iio_channel_get()
153 "#io-channel-cells", 0, in __fwnode_iio_channel_get()
161 return -EPROBE_DEFER; in __fwnode_iio_channel_get()
165 channel->indio_dev = indio_dev; in __fwnode_iio_channel_get()
166 if (indio_dev->info->fwnode_xlate) in __fwnode_iio_channel_get()
167 index = indio_dev->info->fwnode_xlate(indio_dev, &iiospec); in __fwnode_iio_channel_get()
173 channel->channel = &indio_dev->channels[index]; in __fwnode_iio_channel_get()
189 return ERR_PTR(-EINVAL); in fwnode_iio_channel_get()
193 return ERR_PTR(-ENOMEM); in fwnode_iio_channel_get()
207 __fwnode_iio_channel_get_by_name(struct fwnode_handle *fwnode, const char *name) in __fwnode_iio_channel_get_by_name() argument
209 struct iio_channel *chan; in __fwnode_iio_channel_get_by_name() local
213 * For named iio channels, first look up the name in the in __fwnode_iio_channel_get_by_name()
214 * "io-channel-names" property. If it cannot be found, the in __fwnode_iio_channel_get_by_name()
218 if (name) in __fwnode_iio_channel_get_by_name()
219 index = fwnode_property_match_string(fwnode, "io-channel-names", in __fwnode_iio_channel_get_by_name()
220 name); in __fwnode_iio_channel_get_by_name()
222 chan = fwnode_iio_channel_get(fwnode, index); in __fwnode_iio_channel_get_by_name()
223 if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) in __fwnode_iio_channel_get_by_name()
224 return chan; in __fwnode_iio_channel_get_by_name()
225 if (name) { in __fwnode_iio_channel_get_by_name()
228 fwnode, name, index); in __fwnode_iio_channel_get_by_name()
230 * In this case, we found 'name' in 'io-channel-names' in __fwnode_iio_channel_get_by_name()
232 * with any other lookup. Hence, explicitly return -EINVAL in __fwnode_iio_channel_get_by_name()
236 return ERR_PTR(-EINVAL); in __fwnode_iio_channel_get_by_name()
240 * with -EINVAL or -ENOENT (ACPI case) which is expected. We in __fwnode_iio_channel_get_by_name()
243 if (PTR_ERR(chan) != -EINVAL && PTR_ERR(chan) != -ENOENT) in __fwnode_iio_channel_get_by_name()
244 return chan; in __fwnode_iio_channel_get_by_name()
245 } else if (PTR_ERR(chan) != -ENOENT) { in __fwnode_iio_channel_get_by_name()
247 * if !name, then we should only proceed the lookup if in __fwnode_iio_channel_get_by_name()
248 * fwnode_property_get_reference_args() returns -ENOENT. in __fwnode_iio_channel_get_by_name()
250 return chan; in __fwnode_iio_channel_get_by_name()
254 return ERR_PTR(-ENODEV); in __fwnode_iio_channel_get_by_name()
258 const char *name) in fwnode_iio_channel_get_by_name() argument
261 struct iio_channel *chan; in fwnode_iio_channel_get_by_name() local
264 chan = __fwnode_iio_channel_get_by_name(fwnode, name); in fwnode_iio_channel_get_by_name()
265 if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV) in fwnode_iio_channel_get_by_name()
266 return chan; in fwnode_iio_channel_get_by_name()
270 * If the parent node has a "io-channel-ranges" property, in fwnode_iio_channel_get_by_name()
274 if (!fwnode_property_present(parent, "io-channel-ranges")) { in fwnode_iio_channel_get_by_name()
276 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_by_name()
279 chan = __fwnode_iio_channel_get_by_name(fwnode, name); in fwnode_iio_channel_get_by_name()
280 if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV) { in fwnode_iio_channel_get_by_name()
282 return chan; in fwnode_iio_channel_get_by_name()
286 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_by_name()
298 ret = fwnode_property_get_reference_args(fwnode, "io-channels", in fwnode_iio_channel_get_all()
299 "#io-channel-cells", 0, in fwnode_iio_channel_get_all()
306 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_all()
311 return ERR_PTR(-ENOMEM); in fwnode_iio_channel_get_all()
328 static struct iio_channel *iio_channel_get_sys(const char *name, in iio_channel_get_sys() argument
335 if (!(name || channel_name)) in iio_channel_get_sys()
336 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
341 if ((name && strcmp(name, c_i->map->consumer_dev_name) != 0) || in iio_channel_get_sys()
343 strcmp(channel_name, c_i->map->consumer_channel) != 0)) in iio_channel_get_sys()
346 iio_device_get(c->indio_dev); in iio_channel_get_sys()
351 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
355 err = -ENOMEM; in iio_channel_get_sys()
359 channel->indio_dev = c->indio_dev; in iio_channel_get_sys()
361 if (c->map->adc_channel_label) { in iio_channel_get_sys()
362 channel->channel = in iio_channel_get_sys()
363 iio_chan_spec_from_name(channel->indio_dev, in iio_channel_get_sys()
364 c->map->adc_channel_label); in iio_channel_get_sys()
366 if (!channel->channel) { in iio_channel_get_sys()
367 err = -EINVAL; in iio_channel_get_sys()
377 iio_device_put(c->indio_dev); in iio_channel_get_sys()
384 const char *name = dev ? dev_name(dev) : NULL; in iio_channel_get() local
390 if (!IS_ERR(channel) || PTR_ERR(channel) != -ENODEV) in iio_channel_get()
394 return iio_channel_get_sys(name, channel_name); in iio_channel_get()
402 iio_device_put(channel->indio_dev); in iio_channel_release()
451 const char *name; in iio_channel_get_all() local
459 return ERR_PTR(-EINVAL); in iio_channel_get_all()
463 * We only want to carry on if the error is -ENODEV. Anything else in iio_channel_get_all()
466 if (!IS_ERR(chans) || PTR_ERR(chans) != -ENODEV) in iio_channel_get_all()
469 name = dev_name(dev); in iio_channel_get_all()
474 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
480 ret = -ENODEV; in iio_channel_get_all()
487 ret = -ENOMEM; in iio_channel_get_all()
493 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
495 chans[mapind].indio_dev = c->indio_dev; in iio_channel_get_all()
496 chans[mapind].data = c->map->consumer_data; in iio_channel_get_all()
499 c->map->adc_channel_label); in iio_channel_get_all()
501 ret = -EINVAL; in iio_channel_get_all()
508 ret = -ENODEV; in iio_channel_get_all()
528 struct iio_channel *chan = &channels[0]; in iio_channel_release_all() local
530 while (chan->indio_dev) { in iio_channel_release_all()
531 iio_device_put(chan->indio_dev); in iio_channel_release_all()
532 chan++; in iio_channel_release_all()
561 static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, in iio_channel_read() argument
572 if (!iio_channel_has_info(chan->channel, info)) in iio_channel_read()
573 return -EINVAL; in iio_channel_read()
575 if (chan->indio_dev->info->read_raw_multi) { in iio_channel_read()
576 ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev, in iio_channel_read()
577 chan->channel, INDIO_MAX_RAW_ELEMENTS, in iio_channel_read()
582 ret = chan->indio_dev->info->read_raw(chan->indio_dev, in iio_channel_read()
583 chan->channel, val, val2, info); in iio_channel_read()
589 int iio_read_channel_raw(struct iio_channel *chan, int *val) in iio_read_channel_raw() argument
591 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_raw()
594 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_raw()
595 if (!chan->indio_dev->info) { in iio_read_channel_raw()
596 ret = -ENODEV; in iio_read_channel_raw()
600 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW); in iio_read_channel_raw()
602 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_raw()
608 int iio_read_channel_average_raw(struct iio_channel *chan, int *val) in iio_read_channel_average_raw() argument
610 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_average_raw()
613 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_average_raw()
614 if (!chan->indio_dev->info) { in iio_read_channel_average_raw()
615 ret = -ENODEV; in iio_read_channel_average_raw()
619 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_AVERAGE_RAW); in iio_read_channel_average_raw()
621 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_average_raw()
627 static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, in iio_convert_raw_to_processed_unlocked() argument
635 offset_type = iio_channel_read(chan, &offset_val, &offset_val2, in iio_convert_raw_to_processed_unlocked()
655 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
661 scale_type = iio_channel_read(chan, &scale_val, &scale_val2, in iio_convert_raw_to_processed_unlocked()
678 *processed = -raw64 * scale_val; in iio_convert_raw_to_processed_unlocked()
686 *processed = -raw64 * scale_val; in iio_convert_raw_to_processed_unlocked()
700 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
706 int iio_convert_raw_to_processed(struct iio_channel *chan, int raw, in iio_convert_raw_to_processed() argument
709 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_convert_raw_to_processed()
712 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_convert_raw_to_processed()
713 if (!chan->indio_dev->info) { in iio_convert_raw_to_processed()
714 ret = -ENODEV; in iio_convert_raw_to_processed()
718 ret = iio_convert_raw_to_processed_unlocked(chan, raw, processed, in iio_convert_raw_to_processed()
721 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_convert_raw_to_processed()
727 int iio_read_channel_attribute(struct iio_channel *chan, int *val, int *val2, in iio_read_channel_attribute() argument
730 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_attribute()
733 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_attribute()
734 if (!chan->indio_dev->info) { in iio_read_channel_attribute()
735 ret = -ENODEV; in iio_read_channel_attribute()
739 ret = iio_channel_read(chan, val, val2, attribute); in iio_read_channel_attribute()
741 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_attribute()
747 int iio_read_channel_offset(struct iio_channel *chan, int *val, int *val2) in iio_read_channel_offset() argument
749 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_OFFSET); in iio_read_channel_offset()
753 int iio_read_channel_processed_scale(struct iio_channel *chan, int *val, in iio_read_channel_processed_scale() argument
756 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_processed_scale()
759 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_processed_scale()
760 if (!chan->indio_dev->info) { in iio_read_channel_processed_scale()
761 ret = -ENODEV; in iio_read_channel_processed_scale()
765 if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) { in iio_read_channel_processed_scale()
766 ret = iio_channel_read(chan, val, NULL, in iio_read_channel_processed_scale()
772 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW); in iio_read_channel_processed_scale()
775 ret = iio_convert_raw_to_processed_unlocked(chan, *val, val, in iio_read_channel_processed_scale()
780 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_processed_scale()
786 int iio_read_channel_processed(struct iio_channel *chan, int *val) in iio_read_channel_processed() argument
789 return iio_read_channel_processed_scale(chan, val, 1); in iio_read_channel_processed()
793 int iio_read_channel_scale(struct iio_channel *chan, int *val, int *val2) in iio_read_channel_scale() argument
795 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_SCALE); in iio_read_channel_scale()
799 static int iio_channel_read_avail(struct iio_channel *chan, in iio_channel_read_avail() argument
803 if (!iio_channel_has_available(chan->channel, info)) in iio_channel_read_avail()
804 return -EINVAL; in iio_channel_read_avail()
806 return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel, in iio_channel_read_avail()
810 int iio_read_avail_channel_attribute(struct iio_channel *chan, in iio_read_avail_channel_attribute() argument
814 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_avail_channel_attribute()
817 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_avail_channel_attribute()
818 if (!chan->indio_dev->info) { in iio_read_avail_channel_attribute()
819 ret = -ENODEV; in iio_read_avail_channel_attribute()
823 ret = iio_channel_read_avail(chan, vals, type, length, attribute); in iio_read_avail_channel_attribute()
825 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_avail_channel_attribute()
831 int iio_read_avail_channel_raw(struct iio_channel *chan, in iio_read_avail_channel_raw() argument
837 ret = iio_read_avail_channel_attribute(chan, vals, &type, length, in iio_read_avail_channel_raw()
842 ret = -EINVAL; in iio_read_avail_channel_raw()
848 static int iio_channel_read_max(struct iio_channel *chan, in iio_channel_read_max() argument
860 ret = iio_channel_read_avail(chan, &vals, type, &length, info); in iio_channel_read_max()
875 return -EINVAL; in iio_channel_read_max()
878 *val = vals[--length]; in iio_channel_read_max()
880 if (vals[--length] > *val) in iio_channel_read_max()
886 return -EINVAL; in iio_channel_read_max()
895 int iio_read_max_channel_raw(struct iio_channel *chan, int *val) in iio_read_max_channel_raw() argument
897 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_max_channel_raw()
901 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_max_channel_raw()
902 if (!chan->indio_dev->info) { in iio_read_max_channel_raw()
903 ret = -ENODEV; in iio_read_max_channel_raw()
907 ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); in iio_read_max_channel_raw()
909 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_max_channel_raw()
915 int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type) in iio_get_channel_type() argument
917 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_get_channel_type()
921 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_get_channel_type()
922 if (!chan->indio_dev->info) { in iio_get_channel_type()
923 ret = -ENODEV; in iio_get_channel_type()
927 *type = chan->channel->type; in iio_get_channel_type()
929 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_get_channel_type()
935 static int iio_channel_write(struct iio_channel *chan, int val, int val2, in iio_channel_write() argument
938 return chan->indio_dev->info->write_raw(chan->indio_dev, in iio_channel_write()
939 chan->channel, val, val2, info); in iio_channel_write()
942 int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2, in iio_write_channel_attribute() argument
945 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_write_channel_attribute()
948 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_write_channel_attribute()
949 if (!chan->indio_dev->info) { in iio_write_channel_attribute()
950 ret = -ENODEV; in iio_write_channel_attribute()
954 ret = iio_channel_write(chan, val, val2, attribute); in iio_write_channel_attribute()
956 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_write_channel_attribute()
962 int iio_write_channel_raw(struct iio_channel *chan, int val) in iio_write_channel_raw() argument
964 return iio_write_channel_attribute(chan, val, 0, IIO_CHAN_INFO_RAW); in iio_write_channel_raw()
968 unsigned int iio_get_channel_ext_info_count(struct iio_channel *chan) in iio_get_channel_ext_info_count() argument
973 if (!chan->channel->ext_info) in iio_get_channel_ext_info_count()
976 for (ext_info = chan->channel->ext_info; ext_info->name; ext_info++) in iio_get_channel_ext_info_count()
984 iio_lookup_ext_info(const struct iio_channel *chan, const char *attr) in iio_lookup_ext_info() argument
988 if (!chan->channel->ext_info) in iio_lookup_ext_info()
991 for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { in iio_lookup_ext_info()
992 if (!strcmp(attr, ext_info->name)) in iio_lookup_ext_info()
999 ssize_t iio_read_channel_ext_info(struct iio_channel *chan, in iio_read_channel_ext_info() argument
1004 ext_info = iio_lookup_ext_info(chan, attr); in iio_read_channel_ext_info()
1006 return -EINVAL; in iio_read_channel_ext_info()
1008 return ext_info->read(chan->indio_dev, ext_info->private, in iio_read_channel_ext_info()
1009 chan->channel, buf); in iio_read_channel_ext_info()
1013 ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, in iio_write_channel_ext_info() argument
1018 ext_info = iio_lookup_ext_info(chan, attr); in iio_write_channel_ext_info()
1020 return -EINVAL; in iio_write_channel_ext_info()
1022 return ext_info->write(chan->indio_dev, ext_info->private, in iio_write_channel_ext_info()
1023 chan->channel, buf, len); in iio_write_channel_ext_info()