Merge remote-tracking branches 'asoc/fix/atmel', 'asoc/fix/fsl', 'asoc/fix/tegra...
[linux-drm-fsl-dcu.git] / Documentation / mic / mpssd / sysfs.c
1 /*
2  * Intel MIC Platform Software Stack (MPSS)
3  *
4  * Copyright(c) 2013 Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License, version 2, as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * The full GNU General Public License is included in this distribution in
16  * the file called "COPYING".
17  *
18  * Intel MIC User Space Tools.
19  */
20
21 #include "mpssd.h"
22
23 #define PAGE_SIZE 4096
24
25 char *
26 readsysfs(char *dir, char *entry)
27 {
28         char filename[PATH_MAX];
29         char value[PAGE_SIZE];
30         char *string = NULL;
31         int fd;
32         int len;
33
34         if (dir == NULL)
35                 snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
36         else
37                 snprintf(filename, PATH_MAX,
38                          "%s/%s/%s", MICSYSFSDIR, dir, entry);
39
40         fd = open(filename, O_RDONLY);
41         if (fd < 0) {
42                 mpsslog("Failed to open sysfs entry '%s': %s\n",
43                         filename, strerror(errno));
44                 return NULL;
45         }
46
47         len = read(fd, value, sizeof(value));
48         if (len < 0) {
49                 mpsslog("Failed to read sysfs entry '%s': %s\n",
50                         filename, strerror(errno));
51                 goto readsys_ret;
52         }
53         if (len == 0)
54                 goto readsys_ret;
55
56         value[len - 1] = '\0';
57
58         string = malloc(strlen(value) + 1);
59         if (string)
60                 strcpy(string, value);
61
62 readsys_ret:
63         close(fd);
64         return string;
65 }
66
67 int
68 setsysfs(char *dir, char *entry, char *value)
69 {
70         char filename[PATH_MAX];
71         char *oldvalue;
72         int fd, ret = 0;
73
74         if (dir == NULL)
75                 snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
76         else
77                 snprintf(filename, PATH_MAX, "%s/%s/%s",
78                          MICSYSFSDIR, dir, entry);
79
80         oldvalue = readsysfs(dir, entry);
81
82         fd = open(filename, O_RDWR);
83         if (fd < 0) {
84                 ret = errno;
85                 mpsslog("Failed to open sysfs entry '%s': %s\n",
86                         filename, strerror(errno));
87                 goto done;
88         }
89
90         if (!oldvalue || strcmp(value, oldvalue)) {
91                 if (write(fd, value, strlen(value)) < 0) {
92                         ret = errno;
93                         mpsslog("Failed to write new sysfs entry '%s': %s\n",
94                                 filename, strerror(errno));
95                 }
96         }
97         close(fd);
98 done:
99         if (oldvalue)
100                 free(oldvalue);
101         return ret;
102 }