1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* IIO - useful set of util functionality
2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Copyright (c) 2008 Jonathan Cameron
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * This program is free software; you can redistribute it and/or modify it
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * under the terms of the GNU General Public License version 2 as published by
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * the Free Software Foundation.
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* Made up value to limit allocation sizes */
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h>
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdlib.h>
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <ctype.h>
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h>
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdint.h>
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define IIO_MAX_NAME_LENGTH 30
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_TYPE_FILE "%s_type"
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroconst char *iio_dir = "/sys/bus/iio/devices/";
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * iioutils_break_up_name() - extract generic name from full channel name
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @full_name: the full channel name
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: the output generic channel name
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int iioutils_break_up_name(const char *full_name,
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				  char **generic_name)
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *current;
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *w, *r;
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *working;
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	current = strdup(full_name);
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	working = strtok(current, "_\0");
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	w = working;
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	r = working;
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (*r != '\0') {
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (!isdigit(*r)) {
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			*w = *r;
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			w++;
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		r++;
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*w = '\0';
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*generic_name = strdup(working);
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(current);
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * struct iio_channel_info - information about a given channel
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @name: channel name
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: general name for channel type
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @scale: scale factor to be applied for conversion to si units
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @offset: offset to be applied for conversion to si units
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @index: the channel index in the buffer output
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @bytes: number of bytes occupied in buffer output
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @mask: a bit mask for the raw output
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @is_signed: is the raw value stored signed
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @enabled: is this channel enabled
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct iio_channel_info {
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *name;
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *generic_name;
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	float scale;
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	float offset;
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned index;
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned bytes;
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned bits_used;
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned shift;
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	uint64_t mask;
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned be;
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned is_signed;
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned enabled;
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned location;
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * iioutils_get_type() - find and process _type attribute data
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @is_signed: output whether channel is signed
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @bytes: output how many bytes the channel storage occupies
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @mask: output a bit mask for the raw data
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @be: big endian
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @device_dir: the iio device directory
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @name: the channel name
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: the channel type name
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int iioutils_get_type(unsigned *is_signed,
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     unsigned *bytes,
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     unsigned *bits_used,
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     unsigned *shift,
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     uint64_t *mask,
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     unsigned *be,
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     const char *device_dir,
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     const char *name,
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			     const char *generic_name)
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *sysfsfp;
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *scan_el_dir, *builtname, *builtname_generic, *filename = 0;
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char signchar, endianchar;
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	unsigned padint;
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_ret;
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&builtname, FORMAT_TYPE_FILE, name);
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_scan_el_dir;
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&builtname_generic, FORMAT_TYPE_FILE, generic_name);
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_builtname;
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(scan_el_dir);
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_builtname_generic;
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL)
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		/*
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		 * Do we allow devices to override a generic name with
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		 * a specific one?
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		 */
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if ((strcmp(builtname, ent->d_name) == 0) ||
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		    (strcmp(builtname_generic, ent->d_name) == 0)) {
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = asprintf(&filename,
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       "%s/%s", scan_el_dir, ent->d_name);
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_closedir;
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sysfsfp = fopen(filename, "r");
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (sysfsfp == NULL) {
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				printf("failed to open %s\n", filename);
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -errno;
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_free_filename;
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = fscanf(sysfsfp,
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				     "%ce:%c%u/%u>>%u",
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				     &endianchar,
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				     &signchar,
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				     bits_used,
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				     &padint, shift);
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				printf("failed to pass scan type description\n");
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				return ret;
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			*be = (endianchar == 'b');
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			*bytes = padint / 8;
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (*bits_used == 64)
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				*mask = ~0;
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			else
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				*mask = (1 << *bits_used) - 1;
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (signchar == 's')
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				*is_signed = 1;
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			else
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				*is_signed = 0;
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fclose(sysfsfp);
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			free(filename);
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			filename = 0;
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_filename:
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (filename)
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		free(filename);
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_closedir:
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	closedir(dp);
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname_generic:
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(builtname_generic);
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname:
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(builtname);
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_scan_el_dir:
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(scan_el_dir);
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int iioutils_get_param_float(float *output,
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				    const char *param_name,
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				    const char *device_dir,
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				    const char *name,
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				    const char *generic_name)
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *sysfsfp;
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *builtname, *builtname_generic;
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *filename = NULL;
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&builtname, "%s_%s", name, param_name);
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_ret;
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&builtname_generic,
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		       "%s_%s", generic_name, param_name);
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_builtname;
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(device_dir);
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_builtname_generic;
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL)
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if ((strcmp(builtname, ent->d_name) == 0) ||
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		    (strcmp(builtname_generic, ent->d_name) == 0)) {
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = asprintf(&filename,
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       "%s/%s", device_dir, ent->d_name);
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_closedir;
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sysfsfp = fopen(filename, "r");
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (!sysfsfp) {
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -errno;
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_free_filename;
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fscanf(sysfsfp, "%f", output);
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			break;
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_filename:
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (filename)
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		free(filename);
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_closedir:
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	closedir(dp);
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname_generic:
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(builtname_generic);
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname:
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(builtname);
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * bsort_channel_array_by_index() - reorder so that the array is in index order
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline void bsort_channel_array_by_index(struct iio_channel_info **ci_array,
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					 int cnt)
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	struct iio_channel_info temp;
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int x, y;
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	for (x = 0; x < cnt; x++)
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		for (y = 0; y < (cnt - 1); y++)
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if ((*ci_array)[y].index > (*ci_array)[y+1].index) {
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				temp = (*ci_array)[y + 1];
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				(*ci_array)[y + 1] = (*ci_array)[y];
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				(*ci_array)[y] = temp;
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * build_channel_array() - function to figure out what channels are present
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @device_dir: the IIO device directory in sysfs
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int build_channel_array(const char *device_dir,
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      struct iio_channel_info **ci_array,
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      int *counter)
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *sysfsfp;
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int count, i;
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	struct iio_channel_info *current;
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *scan_el_dir;
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *filename;
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*counter = 0;
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_ret;
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(scan_el_dir);
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_name;
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL)
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			   "_en") == 0) {
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = asprintf(&filename,
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       "%s/%s", scan_el_dir, ent->d_name);
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_close_dir;
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sysfsfp = fopen(filename, "r");
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (sysfsfp == NULL) {
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -errno;
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_close_dir;
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fscanf(sysfsfp, "%u", &ret);
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("%s, %d\n", filename, ret);
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret == 1)
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				(*counter)++;
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fclose(sysfsfp);
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			free(filename);
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*ci_array = malloc(sizeof(**ci_array) * (*counter));
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (*ci_array == NULL) {
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_close_dir;
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	closedir(dp);
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(scan_el_dir);
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	//seekdir(dp, 0);
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	count = 0;
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL) {
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			   "_en") == 0) {
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			current = &(*ci_array)[count++];
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = asprintf(&filename,
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       "%s/%s", scan_el_dir, ent->d_name);
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				/* decrement count to avoid freeing name */
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				count--;
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sysfsfp = fopen(filename, "r");
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (sysfsfp == NULL) {
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -errno;
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fscanf(sysfsfp, "%u", &current->enabled);
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fclose(sysfsfp);
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (!current->enabled) {
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				count--;
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				continue;
357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			current->scale = 1.0;
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			current->offset = 0;
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			current->name = strndup(ent->d_name,
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						strlen(ent->d_name) -
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						strlen("_en"));
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (current->name == NULL) {
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			/* Get the generic and specific name elements */
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = iioutils_break_up_name(current->name,
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						     &current->generic_name);
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret) {
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = asprintf(&filename,
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       "%s/%s_index",
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       scan_el_dir,
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				       current->name);
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0) {
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				ret = -ENOMEM;
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sysfsfp = fopen(filename, "r");
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fscanf(sysfsfp, "%u", &current->index);
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fclose(sysfsfp);
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			free(filename);
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			/* Find the scale */
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = iioutils_get_param_float(&current->scale,
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       "scale",
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       device_dir,
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       current->name,
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       current->generic_name);
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0)
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = iioutils_get_param_float(&current->offset,
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       "offset",
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       device_dir,
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       current->name,
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						       current->generic_name);
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (ret < 0)
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				goto error_cleanup_array;
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = iioutils_get_type(&current->is_signed,
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						&current->bytes,
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						&current->bits_used,
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						&current->shift,
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						&current->mask,
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						&current->be,
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						device_dir,
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						current->name,
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						current->generic_name);
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	closedir(dp);
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	/* reorder so that the array is in index order */
418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	bsort_channel_array_by_index(ci_array, *counter);
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_cleanup_array:
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	for (i = count - 1;  i >= 0; i--)
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		free((*ci_array)[i].name);
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(*ci_array);
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_close_dir:
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	closedir(dp);
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_name:
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(scan_el_dir);
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int _write_sysfs_int(char *filename, char *basedir, int val, int verify)
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *sysfsfp;
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int test;
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	//char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char temp[200];
441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = 0;
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL)
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "w");
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("failed to open write %s\n", temp);
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("ERROR1=%d\n", ret);
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		while(1);
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fprintf(sysfsfp, "%d", val);
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (verify) {
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		sysfsfp = fopen(temp, "r");
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (sysfsfp == NULL) {
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("failed to open read %s\n", temp);
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = -errno;
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("ERROR2=%d\n", ret);
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			while(1);
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			goto error_free;
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		fscanf(sysfsfp, "%d", &test);
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (test != val) {
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("Possible failure in int write %d to %s%s\n",
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				val,
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				basedir,
469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				filename);
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = -1;
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	//free(temp);
476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_int(char *filename, char *basedir, int val)
480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return _write_sysfs_int(filename, basedir, val, 0);
482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_int_and_verify(char *filename, char *basedir, int val)
485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	printf("echo %d > %s/%s\n", val, basedir, filename);
487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return _write_sysfs_int(filename, basedir, val, 1);
488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int write_sysfs_int64(char *filename, char *basedir, long long val)
491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *sysfsfp;
494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int test;
495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	//char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char temp[200];
497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = 0;
498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL)
499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "w");
502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("failed to open write %s\n", temp);
504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("ERROR1=%d\n", ret);
506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		while(1);
507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fprintf(sysfsfp, "%lld", val);
510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	//free(temp);
514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint _write_sysfs_string(char *filename, char *basedir, char *val, int verify)
518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret = 0;
520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE  *sysfsfp;
521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL) {
523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("Memory allocation failed\n");
524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "w");
528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("Could not open %s\n", temp);
530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fprintf(sysfsfp, "%s", val);
534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (verify) {
536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		sysfsfp = fopen(temp, "r");
537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (sysfsfp == NULL) {
538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("could not open file to verify\n");
539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = -errno;
540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			goto error_free;
541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		fscanf(sysfsfp, "%s", temp);
543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strcmp(temp, val) != 0) {
544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			printf("Possible failure in string write of %s "
545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				"Should be %s "
546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				"written to %s\%s\n",
547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				temp,
548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				val,
549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				basedir,
550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				filename);
551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			ret = -1;
552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(temp);
556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * write_sysfs_string_and_verify() - string write, readback and verify
562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @filename: name of file to write to
563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @basedir: the sysfs directory in which the file is to be found
564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @val: the string to write
565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_string_and_verify(char *filename, char *basedir, char *val)
567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return _write_sysfs_string(filename, basedir, val, 1);
569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_string(char *filename, char *basedir, char *val)
572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return _write_sysfs_string(filename, basedir, val, 0);
574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
575c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
576c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint read_sysfs_posint(char *filename, char *basedir)
577c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
578c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
579c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE  *sysfsfp;
580c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
581c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL) {
582c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("Memory allocation failed");
583c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
584c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
585c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
586c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "r");
587c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
588c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
589c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
590c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
591c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fscanf(sysfsfp, "%d\n", &ret);
592c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
593c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
594c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(temp);
595c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
596c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
597c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
598c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarolong long read_sysfs_poslonglong(char *filename, char *basedir)
599c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
600c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	long long ret;
601c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE  *sysfsfp;
602c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
603c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL) {
604c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("Memory allocation failed");
605c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
606c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
607c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
608c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "r");
609c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
610c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
611c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
612c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
613c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fscanf(sysfsfp, "%lld\n", &ret);
614c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
615c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
616c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(temp);
617c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
618c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
619c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
620c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint read_sysfs_float(char *filename, char *basedir, float *val)
621c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
622c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	float ret = 0;
623c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE  *sysfsfp;
624c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
625c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (temp == NULL) {
626c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		printf("Memory allocation failed");
627c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENOMEM;
628c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
629c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sprintf(temp, "%s/%s", basedir, filename);
630c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	sysfsfp = fopen(temp, "r");
631c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (sysfsfp == NULL) {
632c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
633c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free;
634c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
635c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fscanf(sysfsfp, "%f\n", val);
636c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(sysfsfp);
637c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free:
638c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	free(temp);
639c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return ret;
640c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
641c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable(const char *device_dir,
642c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      struct iio_channel_info **ci_array,
643c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      int *counter)
644c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
645c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
646c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
647c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
648c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *scan_el_dir;
649c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
650c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*counter = 0;
651c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
652c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
653c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
654c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_ret;
655c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
656c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(scan_el_dir);
657c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
658c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
659c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_name;
660c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
661c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL)
662c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
663c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			   "_en") == 0) {
664c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			write_sysfs_int_and_verify((char *)ent->d_name, scan_el_dir, 1);
665c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
666c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
667c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
668c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_name:
669c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return -1;
670c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
671c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint disable_q_out(const char *device_dir,
672c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      struct iio_channel_info **ci_array,
673c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			      int *counter) {
674c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
675c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int ret;
676c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
677c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *scan_el_dir;
678c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
679c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	*counter = 0;
680c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
681c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (ret < 0) {
682c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -ENOMEM;
683c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_ret;
684c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
685c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(scan_el_dir);
686c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
687c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		ret = -errno;
688c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		goto error_free_name;
689c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
690c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL)
691c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strncmp(ent->d_name, "in_quaternion", strlen("in_quaternion")) == 0) {
692c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			write_sysfs_int_and_verify((char *)ent->d_name, scan_el_dir, 0);
693c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
694c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
695c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
696c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_name:
697c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return -1;
698c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
699c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
700c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
701