149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief    Provides helpful file IO wrappers for use with sysfs.
349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @details  Based on Jonathan Cameron's @e iio_utils.h.
449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <string.h>
749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdlib.h>
849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <ctype.h>
949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdio.h>
1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdint.h>
1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <dirent.h>
1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h>
1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <unistd.h>
1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "inv_sysfs_utils.h"
1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* General TODO list:
1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Select more reasonable string lengths or use fseek and malloc.
1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_sysfs_write() - Write an integer to a file.
2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @filename:	Path to file.
2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Value to write to file.
2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_sysfs_write(char *filename, long data)
2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	FILE *fp;
2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!filename)
3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -1;
3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	fp = fopen(filename, "w");
3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!fp)
3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -errno;
3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = fprintf(fp, "%ld", data);
3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	fclose(fp);
3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_sysfs_read() - Read a string from a file.
4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @filename:	Path to file.
4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @num_bytes:	Number of bytes to read.
4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Data from file.
4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_sysfs_read(char *filename, long num_bytes, char *data)
4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	FILE *fp;
5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!filename)
5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -1;
5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	fp = fopen(filename, "r");
5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!fp)
5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -errno;
5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = fread(data, 1, num_bytes, fp);
5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	fclose(fp);
6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_buffer() - Read data from ring buffer.
6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @fd:	File descriptor for buffer file.
6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Data in hardware units.
6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @timestamp:	Time when data was read from device. Use NULL if unsupported.
6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_buffer(int fd, long *data, long long *timestamp)
7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[35];
7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = read(fd, str, sizeof(str));
7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!count)
7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!timestamp)
7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]);
8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	else
8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1],
8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow			&data[2], timestamp);
8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < (timestamp?4:3))
8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_raw() - Read raw data.
9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Data in hardware units.
9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @timestamp:	Time when data was read from device. Use NULL if unsupported.
9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_raw(const struct inv_sysfs_names_s *names, long *data,
9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	long long *timestamp)
9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[40];
10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->raw_data, sizeof(str), str);
10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (!timestamp)
10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]);
10749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	else
10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1],
10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow			&data[2], timestamp);
11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < (timestamp?4:3))
11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_temperature_raw() - Read temperature.
11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Data in hardware units.
11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @timestamp:	Time when data was read from device.
12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temperature_raw(const struct inv_sysfs_names_s *names, short *data,
12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	long long *timestamp)
12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[25];
12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->temperature, sizeof(str), str);
12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%hd%lld", &data[0], timestamp);
13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 2)
13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_fifo_rate() - Read fifo rate.
13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Fifo rate.
14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_fifo_rate(const struct inv_sysfs_names_s *names, short *data)
14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[8];
14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->fifo_rate, sizeof(str), str);
14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%hd", data);
15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 1)
15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_power_state() - Read power state.
15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_power_state(const struct inv_sysfs_names_s *names, char *data)
16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[2];
16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->power_state, sizeof(str), str);
16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%hd", (short*)data);
17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 1)
17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_scale() - Read scale.
17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_scale(const struct inv_sysfs_names_s *names, float *data)
18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[5];
18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->scale, sizeof(str), str);
18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%f", data);
19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 1)
19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_temp_scale() - Read temperature scale.
19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
20349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_scale(const struct inv_sysfs_names_s *names, short *data)
20449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
20549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[4];
20649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->temp_scale, sizeof(str), str);
20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%hd", data);
21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 1)
21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_temp_offset() - Read temperature offset.
21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_offset(const struct inv_sysfs_names_s *names, short *data)
22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	char str[4];
22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_sysfs_read((char*)names->temp_offset, sizeof(str), str);
22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 0)
23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return count;
23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = sscanf(str, "%hd", data);
23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (count < 1)
23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		return -EAGAIN;
23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_q16() - Get data as q16 fixed point.
23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @timestamp:	Time when data was read from device.
24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_q16(const struct inv_sysfs_names_s *names, long *data,
24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	long long *timestamp)
24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count;
24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	short raw[3];
24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	float scale;
25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count = inv_read_raw(names, (long*)raw, timestamp);
25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count += inv_read_scale(names, &scale);
25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	data[0] = (long)(raw[0] * (65536.f / scale));
25349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	data[1] = (long)(raw[1] * (65536.f / scale));
25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	data[2] = (long)(raw[2] * (65536.f / scale));
25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
25749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_read_q16() - Get temperature data as q16 fixed point.
26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 if device is on.
26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @timestamp:	Time when data was read from device.
26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes read or a negative error code.
26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_q16(const struct inv_sysfs_names_s *names, long *data,
26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	long long *timestamp)
26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	int count = 0;
26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	short raw;
27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	static short scale, offset;
27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	static unsigned char first_read = 1;
27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	if (first_read) {
27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count += inv_read_temp_scale(names, &scale);
27549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		count += inv_read_temp_offset(names, &offset);
27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow		first_read = 0;
27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	}
27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	count += inv_read_temperature_raw(names, &raw, timestamp);
27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	data[0] = (long)((35 + ((float)(raw - offset) / scale)) * 65536.f);
28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
28149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return count;
28249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
28549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_write_fifo_rate() - Write fifo rate.
28649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Fifo rate.
28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_fifo_rate(const struct inv_sysfs_names_s *names, short data)
29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return inv_sysfs_write((char*)names->fifo_rate, (long)data);
29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
29649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_write_buffer_enable() - Enable/disable buffer in /dev.
29749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	Fifo rate.
29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
30149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_buffer_enable(const struct inv_sysfs_names_s *names, char data)
30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return inv_sysfs_write((char*)names->enable, (long)data);
30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  inv_write_power_state() - Turn device on/off.
30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @names:	Names of sysfs files.
30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @data:	1 to turn on.
31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  Returns number of bytes written or a negative error code.
31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_power_state(const struct inv_sysfs_names_s *names, char data)
31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow	return inv_sysfs_write((char*)names->power_state, (long)data);
31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
31649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
31749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
319