Lines Matching +full:io +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-only
39 ret = -ENOMEM; in iio_map_array_register()
42 mapi->map = &maps[i]; in iio_map_array_register()
43 mapi->indio_dev = indio_dev; in iio_map_array_register()
44 list_add_tail(&mapi->l, &iio_map_list); in iio_map_array_register()
60 int ret = -ENODEV; in iio_map_array_unregister()
65 if (indio_dev == mapi->indio_dev) { in iio_map_array_unregister()
66 list_del(&mapi->l); in iio_map_array_unregister()
82 for (i = 0; i < indio_dev->num_channels; i++) in iio_chan_spec_from_name()
83 if (indio_dev->channels[i].datasheet_name && in iio_chan_spec_from_name()
84 strcmp(name, indio_dev->channels[i].datasheet_name) == 0) { in iio_chan_spec_from_name()
85 chan = &indio_dev->channels[i]; in iio_chan_spec_from_name()
95 return dev->of_node == data && dev->type == &iio_device_type; in iio_dev_node_match()
99 * __of_iio_simple_xlate - translate iiospec to the IIO channel index
104 * channels in IIO chips. This function performs only one sanity check:
111 if (!iiospec->args_count) in __of_iio_simple_xlate()
114 if (iiospec->args[0] >= indio_dev->num_channels) { in __of_iio_simple_xlate()
115 dev_err(&indio_dev->dev, "invalid channel index %u\n", in __of_iio_simple_xlate()
116 iiospec->args[0]); in __of_iio_simple_xlate()
117 return -EINVAL; in __of_iio_simple_xlate()
120 return iiospec->args[0]; in __of_iio_simple_xlate()
131 err = of_parse_phandle_with_args(np, "io-channels", in __of_iio_channel_get()
132 "#io-channel-cells", in __of_iio_channel_get()
141 return -EPROBE_DEFER; in __of_iio_channel_get()
145 channel->indio_dev = indio_dev; in __of_iio_channel_get()
146 if (indio_dev->info->of_xlate) in __of_iio_channel_get()
147 index = indio_dev->info->of_xlate(indio_dev, &iiospec); in __of_iio_channel_get()
153 channel->channel = &indio_dev->channels[index]; in __of_iio_channel_get()
168 return ERR_PTR(-EINVAL); in of_iio_channel_get()
172 return ERR_PTR(-ENOMEM); in of_iio_channel_get()
195 * For named iio channels, first look up the name in the in of_iio_channel_get_by_name()
196 * "io-channel-names" property. If it cannot be found, the in of_iio_channel_get_by_name()
201 index = of_property_match_string(np, "io-channel-names", in of_iio_channel_get_by_name()
204 if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) in of_iio_channel_get_by_name()
214 * If the parent node has a "io-channel-ranges" property, in of_iio_channel_get_by_name()
215 * then we can try one of its channels. in of_iio_channel_get_by_name()
217 np = np->parent; in of_iio_channel_get_by_name()
218 if (np && !of_get_property(np, "io-channel-ranges", NULL)) in of_iio_channel_get_by_name()
232 ret = of_parse_phandle_with_args(dev->of_node, in of_iio_channel_get_all()
233 "io-channels", in of_iio_channel_get_all()
234 "#io-channel-cells", in of_iio_channel_get_all()
246 return ERR_PTR(-ENOMEM); in of_iio_channel_get_all()
250 ret = __of_iio_channel_get(&chans[mapind], dev->of_node, in of_iio_channel_get_all()
287 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
292 if ((name && strcmp(name, c_i->map->consumer_dev_name) != 0) || in iio_channel_get_sys()
294 strcmp(channel_name, c_i->map->consumer_channel) != 0)) in iio_channel_get_sys()
297 iio_device_get(c->indio_dev); in iio_channel_get_sys()
302 return ERR_PTR(-ENODEV); in iio_channel_get_sys()
306 err = -ENOMEM; in iio_channel_get_sys()
310 channel->indio_dev = c->indio_dev; in iio_channel_get_sys()
312 if (c->map->adc_channel_label) { in iio_channel_get_sys()
313 channel->channel = in iio_channel_get_sys()
314 iio_chan_spec_from_name(channel->indio_dev, in iio_channel_get_sys()
315 c->map->adc_channel_label); in iio_channel_get_sys()
317 if (channel->channel == NULL) { in iio_channel_get_sys()
318 err = -EINVAL; in iio_channel_get_sys()
328 iio_device_put(c->indio_dev); in iio_channel_get_sys()
339 channel = of_iio_channel_get_by_name(dev->of_node, in iio_channel_get()
353 iio_device_put(channel->indio_dev); in iio_channel_release()
372 return ERR_PTR(-ENOMEM); in devm_iio_channel_get()
397 return ERR_PTR(-EINVAL); in iio_channel_get_all()
408 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
414 ret = -ENODEV; in iio_channel_get_all()
421 ret = -ENOMEM; in iio_channel_get_all()
427 if (name && strcmp(name, c->map->consumer_dev_name) != 0) in iio_channel_get_all()
429 chans[mapind].indio_dev = c->indio_dev; in iio_channel_get_all()
430 chans[mapind].data = c->map->consumer_data; in iio_channel_get_all()
433 c->map->adc_channel_label); in iio_channel_get_all()
435 ret = -EINVAL; in iio_channel_get_all()
442 ret = -ENODEV; in iio_channel_get_all()
460 void iio_channel_release_all(struct iio_channel *channels) in iio_channel_release_all() argument
462 struct iio_channel *chan = &channels[0]; in iio_channel_release_all()
464 while (chan->indio_dev) { in iio_channel_release_all()
465 iio_device_put(chan->indio_dev); in iio_channel_release_all()
468 kfree(channels); in iio_channel_release_all()
474 struct iio_channel *channels = *(struct iio_channel **)res; in devm_iio_channel_free_all() local
476 iio_channel_release_all(channels); in devm_iio_channel_free_all()
481 struct iio_channel **ptr, *channels; in devm_iio_channel_get_all() local
485 return ERR_PTR(-ENOMEM); in devm_iio_channel_get_all()
487 channels = iio_channel_get_all(dev); in devm_iio_channel_get_all()
488 if (IS_ERR(channels)) { in devm_iio_channel_get_all()
490 return channels; in devm_iio_channel_get_all()
493 *ptr = channels; in devm_iio_channel_get_all()
496 return channels; in devm_iio_channel_get_all()
511 if (!iio_channel_has_info(chan->channel, info)) in iio_channel_read()
512 return -EINVAL; in iio_channel_read()
514 if (chan->indio_dev->info->read_raw_multi) { in iio_channel_read()
515 ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev, in iio_channel_read()
516 chan->channel, INDIO_MAX_RAW_ELEMENTS, in iio_channel_read()
521 ret = chan->indio_dev->info->read_raw(chan->indio_dev, in iio_channel_read()
522 chan->channel, val, val2, info); in iio_channel_read()
531 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_channel_raw()
532 if (chan->indio_dev->info == NULL) { in iio_read_channel_raw()
533 ret = -ENODEV; in iio_read_channel_raw()
539 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_channel_raw()
549 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_channel_average_raw()
550 if (chan->indio_dev->info == NULL) { in iio_read_channel_average_raw()
551 ret = -ENODEV; in iio_read_channel_average_raw()
557 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_channel_average_raw()
590 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
613 *processed = -raw64 * scale_val; in iio_convert_raw_to_processed_unlocked()
621 *processed = -raw64 * scale_val; in iio_convert_raw_to_processed_unlocked()
635 return -EINVAL; in iio_convert_raw_to_processed_unlocked()
646 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_convert_raw_to_processed()
647 if (chan->indio_dev->info == NULL) { in iio_convert_raw_to_processed()
648 ret = -ENODEV; in iio_convert_raw_to_processed()
655 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_convert_raw_to_processed()
666 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_channel_attribute()
667 if (chan->indio_dev->info == NULL) { in iio_read_channel_attribute()
668 ret = -ENODEV; in iio_read_channel_attribute()
674 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_channel_attribute()
690 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_channel_processed()
691 if (chan->indio_dev->info == NULL) { in iio_read_channel_processed()
692 ret = -ENODEV; in iio_read_channel_processed()
696 if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) { in iio_read_channel_processed()
707 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_channel_processed()
723 if (!iio_channel_has_available(chan->channel, info)) in iio_channel_read_avail()
724 return -EINVAL; in iio_channel_read_avail()
726 return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel, in iio_channel_read_avail()
736 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_avail_channel_attribute()
737 if (!chan->indio_dev->info) { in iio_read_avail_channel_attribute()
738 ret = -ENODEV; in iio_read_avail_channel_attribute()
744 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_avail_channel_attribute()
761 ret = -EINVAL; in iio_read_avail_channel_raw()
794 return -EINVAL; in iio_channel_read_max()
797 *val = vals[--length]; in iio_channel_read_max()
799 if (vals[--length] > *val) in iio_channel_read_max()
805 return -EINVAL; in iio_channel_read_max()
819 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_read_max_channel_raw()
820 if (!chan->indio_dev->info) { in iio_read_max_channel_raw()
821 ret = -ENODEV; in iio_read_max_channel_raw()
827 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_read_max_channel_raw()
838 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_get_channel_type()
839 if (chan->indio_dev->info == NULL) { in iio_get_channel_type()
840 ret = -ENODEV; in iio_get_channel_type()
844 *type = chan->channel->type; in iio_get_channel_type()
846 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_get_channel_type()
855 return chan->indio_dev->info->write_raw(chan->indio_dev, in iio_channel_write()
856 chan->channel, val, val2, info); in iio_channel_write()
864 mutex_lock(&chan->indio_dev->info_exist_lock); in iio_write_channel_attribute()
865 if (chan->indio_dev->info == NULL) { in iio_write_channel_attribute()
866 ret = -ENODEV; in iio_write_channel_attribute()
872 mutex_unlock(&chan->indio_dev->info_exist_lock); in iio_write_channel_attribute()
889 if (!chan->channel->ext_info) in iio_get_channel_ext_info_count()
892 for (ext_info = chan->channel->ext_info; ext_info->name; ext_info++) in iio_get_channel_ext_info_count()
905 if (!chan->channel->ext_info) in iio_lookup_ext_info()
908 for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { in iio_lookup_ext_info()
909 if (!strcmp(attr, ext_info->name)) in iio_lookup_ext_info()
923 return -EINVAL; in iio_read_channel_ext_info()
925 return ext_info->read(chan->indio_dev, ext_info->private, in iio_read_channel_ext_info()
926 chan->channel, buf); in iio_read_channel_ext_info()
937 return -EINVAL; in iio_write_channel_ext_info()
939 return ext_info->write(chan->indio_dev, ext_info->private, in iio_write_channel_ext_info()
940 chan->channel, buf, len); in iio_write_channel_ext_info()