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