• Home
  • Raw
  • Download

Lines Matching +full:chan +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-only
14 #include <linux/iio/iio-opaque.h>
31 int ret = -ENODEV; in iio_map_array_unregister_locked()
35 if (indio_dev == mapi->indio_dev) { in iio_map_array_unregister_locked()
36 list_del(&mapi->l); in iio_map_array_unregister_locked()
56 ret = -ENOMEM; in iio_map_array_register()
59 mapi->map = &maps[i]; in iio_map_array_register()
60 mapi->indio_dev = indio_dev; in iio_map_array_register()
61 list_add_tail(&mapi->l, &iio_map_list); in iio_map_array_register()
106 *iio_chan_spec_from_name(const struct iio_dev *indio_dev, const char *name) in iio_chan_spec_from_name() argument
109 const struct iio_chan_spec *chan = NULL; in iio_chan_spec_from_name() local
111 for (i = 0; i < indio_dev->num_channels; i++) in iio_chan_spec_from_name()
112 if (indio_dev->channels[i].datasheet_name && in iio_chan_spec_from_name()
113 strcmp(name, indio_dev->channels[i].datasheet_name) == 0) { in iio_chan_spec_from_name()
114 chan = &indio_dev->channels[i]; in iio_chan_spec_from_name()
117 return chan; in iio_chan_spec_from_name()
121 * __fwnode_iio_simple_xlate - translate iiospec to the IIO channel index
133 if (!iiospec->nargs) in __fwnode_iio_simple_xlate()
136 if (iiospec->args[0] >= indio_dev->num_channels) { in __fwnode_iio_simple_xlate()
137 dev_err(&indio_dev->dev, "invalid channel index %llu\n", in __fwnode_iio_simple_xlate()
138 iiospec->args[0]); in __fwnode_iio_simple_xlate()
139 return -EINVAL; in __fwnode_iio_simple_xlate()
142 return iiospec->args[0]; in __fwnode_iio_simple_xlate()
153 err = fwnode_property_get_reference_args(fwnode, "io-channels", in __fwnode_iio_channel_get()
154 "#io-channel-cells", 0, in __fwnode_iio_channel_get()
162 return -EPROBE_DEFER; in __fwnode_iio_channel_get()
166 channel->indio_dev = indio_dev; in __fwnode_iio_channel_get()
167 if (indio_dev->info->fwnode_xlate) in __fwnode_iio_channel_get()
168 index = indio_dev->info->fwnode_xlate(indio_dev, &iiospec); in __fwnode_iio_channel_get()
174 channel->channel = &indio_dev->channels[index]; in __fwnode_iio_channel_get()
190 return ERR_PTR(-EINVAL); in fwnode_iio_channel_get()
194 return ERR_PTR(-ENOMEM); in fwnode_iio_channel_get()
208 __fwnode_iio_channel_get_by_name(struct fwnode_handle *fwnode, const char *name) in __fwnode_iio_channel_get_by_name() argument
210 struct iio_channel *chan; in __fwnode_iio_channel_get_by_name() local
214 * For named iio channels, first look up the name in the in __fwnode_iio_channel_get_by_name()
215 * "io-channel-names" property. If it cannot be found, the in __fwnode_iio_channel_get_by_name()
219 if (name) in __fwnode_iio_channel_get_by_name()
220 index = fwnode_property_match_string(fwnode, "io-channel-names", in __fwnode_iio_channel_get_by_name()
221 name); in __fwnode_iio_channel_get_by_name()
223 chan = fwnode_iio_channel_get(fwnode, index); in __fwnode_iio_channel_get_by_name()
224 if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) in __fwnode_iio_channel_get_by_name()
225 return chan; in __fwnode_iio_channel_get_by_name()
226 if (name) { in __fwnode_iio_channel_get_by_name()
229 fwnode, name, index); in __fwnode_iio_channel_get_by_name()
231 * In this case, we found 'name' in 'io-channel-names' in __fwnode_iio_channel_get_by_name()
233 * with any other lookup. Hence, explicitly return -EINVAL in __fwnode_iio_channel_get_by_name()
237 return ERR_PTR(-EINVAL); in __fwnode_iio_channel_get_by_name()
241 * with -EINVAL or -ENOENT (ACPI case) which is expected. We in __fwnode_iio_channel_get_by_name()
244 if (PTR_ERR(chan) != -EINVAL && PTR_ERR(chan) != -ENOENT) in __fwnode_iio_channel_get_by_name()
245 return chan; in __fwnode_iio_channel_get_by_name()
246 } else if (PTR_ERR(chan) != -ENOENT) { in __fwnode_iio_channel_get_by_name()
248 * if !name, then we should only proceed the lookup if in __fwnode_iio_channel_get_by_name()
249 * fwnode_property_get_reference_args() returns -ENOENT. in __fwnode_iio_channel_get_by_name()
251 return chan; in __fwnode_iio_channel_get_by_name()
255 return ERR_PTR(-ENODEV); in __fwnode_iio_channel_get_by_name()
259 const char *name) in fwnode_iio_channel_get_by_name() argument
262 struct iio_channel *chan; in fwnode_iio_channel_get_by_name() local
265 chan = __fwnode_iio_channel_get_by_name(fwnode, name); in fwnode_iio_channel_get_by_name()
266 if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV) in fwnode_iio_channel_get_by_name()
267 return chan; in fwnode_iio_channel_get_by_name()
271 * If the parent node has a "io-channel-ranges" property, in fwnode_iio_channel_get_by_name()
275 if (!fwnode_property_present(parent, "io-channel-ranges")) { in fwnode_iio_channel_get_by_name()
277 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_by_name()
280 chan = __fwnode_iio_channel_get_by_name(parent, name); in fwnode_iio_channel_get_by_name()
281 if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV) { in fwnode_iio_channel_get_by_name()
283 return chan; in fwnode_iio_channel_get_by_name()
287 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_by_name()
299 ret = fwnode_property_get_reference_args(fwnode, "io-channels", in fwnode_iio_channel_get_all()
300 "#io-channel-cells", 0, in fwnode_iio_channel_get_all()
307 return ERR_PTR(-ENODEV); in fwnode_iio_channel_get_all()
312 return ERR_PTR(-ENOMEM); in fwnode_iio_channel_get_all()
329 static struct iio_channel *iio_channel_get_sys(const char *name, in iio_channel_get_sys() argument
336 if (!(name || channel_name)) in iio_channel_get_sys()
337 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
342 if ((name && strcmp(name, c_i->map->consumer_dev_name) != 0) || in iio_channel_get_sys()
344 strcmp(channel_name, c_i->map->consumer_channel) != 0)) in iio_channel_get_sys()
347 iio_device_get(c->indio_dev); in iio_channel_get_sys()
352 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
356 err = -ENOMEM; in iio_channel_get_sys()
360 channel->indio_dev = c->indio_dev; in iio_channel_get_sys()
362 if (c->map->adc_channel_label) { in iio_channel_get_sys()
363 channel->channel = in iio_channel_get_sys()
364 iio_chan_spec_from_name(channel->indio_dev, in iio_channel_get_sys()
365 c->map->adc_channel_label); in iio_channel_get_sys()
367 if (!channel->channel) { in iio_channel_get_sys()
368 err = -EINVAL; in iio_channel_get_sys()
378 iio_device_put(c->indio_dev); in iio_channel_get_sys()
385 const char *name = dev ? dev_name(dev) : NULL; in iio_channel_get() local
391 if (!IS_ERR(channel) || PTR_ERR(channel) != -ENODEV) in iio_channel_get()
395 return iio_channel_get_sys(name, channel_name); in iio_channel_get()
403 iio_device_put(channel->indio_dev); in iio_channel_release()
452 const char *name; in iio_channel_get_all() local
460 return ERR_PTR(-EINVAL); in iio_channel_get_all()
464 * We only want to carry on if the error is -ENODEV. Anything else in iio_channel_get_all()
467 if (!IS_ERR(chans) || PTR_ERR(chans) != -ENODEV) in iio_channel_get_all()
470 name = dev_name(dev); in iio_channel_get_all()
475 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
481 ret = -ENODEV; in iio_channel_get_all()
488 ret = -ENOMEM; in iio_channel_get_all()
494 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
496 chans[mapind].indio_dev = c->indio_dev; in iio_channel_get_all()
497 chans[mapind].data = c->map->consumer_data; in iio_channel_get_all()
500 c->map->adc_channel_label); in iio_channel_get_all()
502 ret = -EINVAL; in iio_channel_get_all()
509 ret = -ENODEV; in iio_channel_get_all()
529 struct iio_channel *chan = &channels[0]; in iio_channel_release_all() local
531 while (chan->indio_dev) { in iio_channel_release_all()
532 iio_device_put(chan->indio_dev); in iio_channel_release_all()
533 chan++; in iio_channel_release_all()
562 static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, in iio_channel_read() argument
565 const struct iio_info *iio_info = chan->indio_dev->info; in iio_channel_read()
574 if (!iio_channel_has_info(chan->channel, info)) in iio_channel_read()
575 return -EINVAL; in iio_channel_read()
577 if (iio_info->read_raw_multi) { in iio_channel_read()
578 ret = iio_info->read_raw_multi(chan->indio_dev, in iio_channel_read()
579 chan->channel, in iio_channel_read()
584 } else if (iio_info->read_raw) { in iio_channel_read()
585 ret = iio_info->read_raw(chan->indio_dev, in iio_channel_read()
586 chan->channel, val, val2, info); in iio_channel_read()
588 return -EINVAL; in iio_channel_read()
594 int iio_read_channel_raw(struct iio_channel *chan, int *val) in iio_read_channel_raw() argument
596 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_raw()
599 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_raw()
600 if (!chan->indio_dev->info) { in iio_read_channel_raw()
601 ret = -ENODEV; in iio_read_channel_raw()
605 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW); in iio_read_channel_raw()
607 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_raw()
613 int iio_read_channel_average_raw(struct iio_channel *chan, int *val) in iio_read_channel_average_raw() argument
615 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_average_raw()
618 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_average_raw()
619 if (!chan->indio_dev->info) { in iio_read_channel_average_raw()
620 ret = -ENODEV; in iio_read_channel_average_raw()
624 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_AVERAGE_RAW); in iio_read_channel_average_raw()
626 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_average_raw()
632 static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, in iio_convert_raw_to_processed_unlocked() argument
640 offset_type = iio_channel_read(chan, &offset_val, &offset_val2, in iio_convert_raw_to_processed_unlocked()
660 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
666 scale_type = iio_channel_read(chan, &scale_val, &scale_val2, in iio_convert_raw_to_processed_unlocked()
683 *processed = -raw64 * scale_val * scale; in iio_convert_raw_to_processed_unlocked()
691 *processed = -raw64 * scale_val * scale; in iio_convert_raw_to_processed_unlocked()
705 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
711 int iio_convert_raw_to_processed(struct iio_channel *chan, int raw, in iio_convert_raw_to_processed() argument
714 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_convert_raw_to_processed()
717 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_convert_raw_to_processed()
718 if (!chan->indio_dev->info) { in iio_convert_raw_to_processed()
719 ret = -ENODEV; in iio_convert_raw_to_processed()
723 ret = iio_convert_raw_to_processed_unlocked(chan, raw, processed, in iio_convert_raw_to_processed()
726 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_convert_raw_to_processed()
732 int iio_read_channel_attribute(struct iio_channel *chan, int *val, int *val2, in iio_read_channel_attribute() argument
735 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_attribute()
738 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_attribute()
739 if (!chan->indio_dev->info) { in iio_read_channel_attribute()
740 ret = -ENODEV; in iio_read_channel_attribute()
744 ret = iio_channel_read(chan, val, val2, attribute); in iio_read_channel_attribute()
746 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_attribute()
752 int iio_read_channel_offset(struct iio_channel *chan, int *val, int *val2) in iio_read_channel_offset() argument
754 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_OFFSET); in iio_read_channel_offset()
758 int iio_read_channel_processed_scale(struct iio_channel *chan, int *val, in iio_read_channel_processed_scale() argument
761 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_channel_processed_scale()
764 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_processed_scale()
765 if (!chan->indio_dev->info) { in iio_read_channel_processed_scale()
766 ret = -ENODEV; in iio_read_channel_processed_scale()
770 if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) { in iio_read_channel_processed_scale()
771 ret = iio_channel_read(chan, val, NULL, in iio_read_channel_processed_scale()
777 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW); in iio_read_channel_processed_scale()
780 ret = iio_convert_raw_to_processed_unlocked(chan, *val, val, in iio_read_channel_processed_scale()
785 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_channel_processed_scale()
791 int iio_read_channel_processed(struct iio_channel *chan, int *val) in iio_read_channel_processed() argument
794 return iio_read_channel_processed_scale(chan, val, 1); in iio_read_channel_processed()
798 int iio_read_channel_scale(struct iio_channel *chan, int *val, int *val2) in iio_read_channel_scale() argument
800 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_SCALE); in iio_read_channel_scale()
804 static int iio_channel_read_avail(struct iio_channel *chan, in iio_channel_read_avail() argument
808 const struct iio_info *iio_info = chan->indio_dev->info; in iio_channel_read_avail()
810 if (!iio_channel_has_available(chan->channel, info)) in iio_channel_read_avail()
811 return -EINVAL; in iio_channel_read_avail()
813 if (iio_info->read_avail) in iio_channel_read_avail()
814 return iio_info->read_avail(chan->indio_dev, chan->channel, in iio_channel_read_avail()
816 return -EINVAL; in iio_channel_read_avail()
819 int iio_read_avail_channel_attribute(struct iio_channel *chan, in iio_read_avail_channel_attribute() argument
823 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_avail_channel_attribute()
826 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_avail_channel_attribute()
827 if (!chan->indio_dev->info) { in iio_read_avail_channel_attribute()
828 ret = -ENODEV; in iio_read_avail_channel_attribute()
832 ret = iio_channel_read_avail(chan, vals, type, length, attribute); in iio_read_avail_channel_attribute()
834 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_avail_channel_attribute()
840 int iio_read_avail_channel_raw(struct iio_channel *chan, in iio_read_avail_channel_raw() argument
846 ret = iio_read_avail_channel_attribute(chan, vals, &type, length, in iio_read_avail_channel_raw()
851 ret = -EINVAL; in iio_read_avail_channel_raw()
857 static int iio_channel_read_max(struct iio_channel *chan, in iio_channel_read_max() argument
865 ret = iio_channel_read_avail(chan, &vals, type, &length, info); in iio_channel_read_max()
884 return -EINVAL; in iio_channel_read_max()
891 return -EINVAL; in iio_channel_read_max()
896 return -EINVAL; in iio_channel_read_max()
900 int iio_read_max_channel_raw(struct iio_channel *chan, int *val) in iio_read_max_channel_raw() argument
902 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_max_channel_raw()
906 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_max_channel_raw()
907 if (!chan->indio_dev->info) { in iio_read_max_channel_raw()
908 ret = -ENODEV; in iio_read_max_channel_raw()
912 ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); in iio_read_max_channel_raw()
914 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_max_channel_raw()
920 static int iio_channel_read_min(struct iio_channel *chan, in iio_channel_read_min() argument
928 ret = iio_channel_read_avail(chan, &vals, type, &length, info); in iio_channel_read_min()
947 return -EINVAL; in iio_channel_read_min()
954 return -EINVAL; in iio_channel_read_min()
959 return -EINVAL; in iio_channel_read_min()
963 int iio_read_min_channel_raw(struct iio_channel *chan, int *val) in iio_read_min_channel_raw() argument
965 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_read_min_channel_raw()
969 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_read_min_channel_raw()
970 if (!chan->indio_dev->info) { in iio_read_min_channel_raw()
971 ret = -ENODEV; in iio_read_min_channel_raw()
975 ret = iio_channel_read_min(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); in iio_read_min_channel_raw()
977 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_read_min_channel_raw()
983 int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type) in iio_get_channel_type() argument
985 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_get_channel_type()
989 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_get_channel_type()
990 if (!chan->indio_dev->info) { in iio_get_channel_type()
991 ret = -ENODEV; in iio_get_channel_type()
995 *type = chan->channel->type; in iio_get_channel_type()
997 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_get_channel_type()
1003 static int iio_channel_write(struct iio_channel *chan, int val, int val2, in iio_channel_write() argument
1006 const struct iio_info *iio_info = chan->indio_dev->info; in iio_channel_write()
1008 if (iio_info->write_raw) in iio_channel_write()
1009 return iio_info->write_raw(chan->indio_dev, in iio_channel_write()
1010 chan->channel, val, val2, info); in iio_channel_write()
1011 return -EINVAL; in iio_channel_write()
1014 int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2, in iio_write_channel_attribute() argument
1017 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); in iio_write_channel_attribute()
1020 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_write_channel_attribute()
1021 if (!chan->indio_dev->info) { in iio_write_channel_attribute()
1022 ret = -ENODEV; in iio_write_channel_attribute()
1026 ret = iio_channel_write(chan, val, val2, attribute); in iio_write_channel_attribute()
1028 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_write_channel_attribute()
1034 int iio_write_channel_raw(struct iio_channel *chan, int val) in iio_write_channel_raw() argument
1036 return iio_write_channel_attribute(chan, val, 0, IIO_CHAN_INFO_RAW); in iio_write_channel_raw()
1040 unsigned int iio_get_channel_ext_info_count(struct iio_channel *chan) in iio_get_channel_ext_info_count() argument
1045 if (!chan->channel->ext_info) in iio_get_channel_ext_info_count()
1048 for (ext_info = chan->channel->ext_info; ext_info->name; ext_info++) in iio_get_channel_ext_info_count()
1056 iio_lookup_ext_info(const struct iio_channel *chan, const char *attr) in iio_lookup_ext_info() argument
1060 if (!chan->channel->ext_info) in iio_lookup_ext_info()
1063 for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { in iio_lookup_ext_info()
1064 if (!strcmp(attr, ext_info->name)) in iio_lookup_ext_info()
1071 ssize_t iio_read_channel_ext_info(struct iio_channel *chan, in iio_read_channel_ext_info() argument
1076 ext_info = iio_lookup_ext_info(chan, attr); in iio_read_channel_ext_info()
1078 return -EINVAL; in iio_read_channel_ext_info()
1080 return ext_info->read(chan->indio_dev, ext_info->private, in iio_read_channel_ext_info()
1081 chan->channel, buf); in iio_read_channel_ext_info()
1085 ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, in iio_write_channel_ext_info() argument
1090 ext_info = iio_lookup_ext_info(chan, attr); in iio_write_channel_ext_info()
1092 return -EINVAL; in iio_write_channel_ext_info()
1094 return ext_info->write(chan->indio_dev, ext_info->private, in iio_write_channel_ext_info()
1095 chan->channel, buf, len); in iio_write_channel_ext_info()