aboutsummaryrefslogtreecommitdiff
path: root/regulator.c
diff options
context:
space:
mode:
authorAmit Arora <amit.arora@linaro.org>2010-12-02 12:23:14 +0530
committerAmit Arora <amit.arora@linaro.org>2010-12-02 12:23:14 +0530
commit175527852cbe004893bc6f0cb59f4e9702db85ba (patch)
tree681e5a8cf41aa4848c65d78eaaaafb8e290ac71e /regulator.c
parent83ae6cbe2dc075e16bba51b0f8d641bad97b8fd3 (diff)
downloadpowerdebug-175527852cbe004893bc6f0cb59f4e9702db85ba.tar.gz
Move around code to more logical destination
Diffstat (limited to 'regulator.c')
-rw-r--r--regulator.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/regulator.c b/regulator.c
new file mode 100644
index 0000000..56b0b06
--- /dev/null
+++ b/regulator.c
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (C) 2010, Linaro
+ * Copyright (C) 2010, IBM Corporation
+ *
+ * This file is part of PowerDebug.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Amit Arora <amit.arora@linaro.org> (IBM Corporation)
+ * - initial API and implementation
+ *******************************************************************************/
+
+#include "regulator.h"
+
+int init_regulator_ds(void)
+{
+ DIR *regdir;
+ struct dirent *item;
+
+ regdir = opendir("/sys/class/regulator");
+ if (!regdir)
+ return(1);
+ while((item = readdir(regdir))) {
+ if (strncmp(item->d_name, "regulator", 9))
+ continue;
+
+ numregulators++;
+ }
+ closedir(regdir);
+
+ regulators_info = (struct regulator_info *)malloc(numregulators*
+ sizeof(struct regulator_info));
+ if (!regulators_info) {
+ fprintf(stderr, "init_regulator_ds: Not enough memory to "
+ "read information for %d regulators!\n", numregulators);
+ return(1);
+ }
+
+ return(0);
+}
+
+void print_string_val(char *name, char *val)
+{
+ printf("\t%s=%s", name, val);
+ if(!strchr(val, '\n'))
+ printf("\n");
+}
+
+void print_regulator_info(int verbose)
+{
+ int i;
+
+ for (i=0; i<numregulators; i++) {
+ printf("Regulator %d:\n", i+1);
+ print_string_val("name", regulators_info[i].name);
+ if (strcmp(regulators_info[i].status, ""))
+ print_string_val("status", regulators_info[i].status);
+ if (strcmp(regulators_info[i].state, ""))
+ print_string_val("state", regulators_info[i].state);
+
+ if (!verbose)
+ continue;
+
+ if (strcmp(regulators_info[i].type, ""))
+ print_string_val("type", regulators_info[i].type);
+ if (strcmp(regulators_info[i].opmode, ""))
+ print_string_val("opmode", regulators_info[i].opmode);
+
+ if (regulators_info[i].microvolts)
+ printf("\tmicrovolts=%d\n",
+ regulators_info[i].microvolts);
+ if (regulators_info[i].min_microvolts)
+ printf("\tmin_microvolts=%d\n",
+ regulators_info[i].min_microvolts);
+ if (regulators_info[i].max_microvolts)
+ printf("\tmax_microvolts=%d\n",
+ regulators_info[i].max_microvolts);
+
+ if (regulators_info[i].microamps)
+ printf("\tmicroamps=%d\n",
+ regulators_info[i].microamps);
+ if (regulators_info[i].min_microamps)
+ printf("\tmin_microamps=%d\n",
+ regulators_info[i].min_microamps);
+ if (regulators_info[i].max_microamps)
+ printf("\tmax_microamps=%d\n",
+ regulators_info[i].max_microamps);
+ if (regulators_info[i].requested_microamps)
+ printf("\trequested_microamps=%d\n",
+ regulators_info[i].requested_microamps);
+
+ if (regulators_info[i].num_users)
+ printf("\tnum_users=%d\n",
+ regulators_info[i].num_users);
+ printf("\n");
+ }
+
+ if (!numregulators && verbose) {
+ printf("Could not find regulator information!");
+ printf(" Looks like /sys/class/regulator is empty.\n\n");
+ }
+}
+
+void read_info_from_dirent(struct dirent *ritem, char *str, int idx)
+{
+ if (!strcmp(ritem->d_name, "name"))
+ strcpy(regulators_info[idx].name, str);
+ if (!strcmp(ritem->d_name, "state"))
+ strcpy(regulators_info[idx].state, str);
+ if (!strcmp(ritem->d_name, "status"))
+ strcpy(regulators_info[idx].status, str);
+
+ if (!strcmp(ritem->d_name, "type"))
+ strcpy(regulators_info[idx].type, str);
+ if (!strcmp(ritem->d_name, "opmode"))
+ strcpy(regulators_info[idx].opmode, str);
+
+ if (!strcmp(ritem->d_name, "microvolts"))
+ regulators_info[idx].microvolts = atoi(str);
+ if (!strcmp(ritem->d_name, "min_microvolts"))
+ regulators_info[idx].min_microvolts = atoi(str);
+ if (!strcmp(ritem->d_name, "max_microvolts"))
+ regulators_info[idx].max_microvolts = atoi(str);
+
+ if (!strcmp(ritem->d_name, "microamps"))
+ regulators_info[idx].microamps = atoi(str);
+ if (!strcmp(ritem->d_name, "min_microamps"))
+ regulators_info[idx].min_microamps = atoi(str);
+ if (!strcmp(ritem->d_name, "max_microamps"))
+ regulators_info[idx].max_microamps = atoi(str);
+ if (!strcmp(ritem->d_name, "requested_microamps"))
+ regulators_info[idx].requested_microamps = atoi(str);
+
+ if (!strcmp(ritem->d_name, "num_users"))
+ regulators_info[idx].num_users = atoi(str);
+}
+
+int read_regulator_info(void)
+{
+ FILE *file = NULL;
+ DIR *regdir, *dir;
+ int len, count = 0, ret = 0;
+ char line[1024], filename[1024], *fptr;
+ struct dirent *item, *ritem;
+
+ regdir = opendir("/sys/class/regulator");
+ if (!regdir)
+ return(1);
+ while((item = readdir(regdir))) {
+ if (strlen(item->d_name) < 3)
+ continue;
+
+ if (strncmp(item->d_name, "regulator", 9))
+ continue;
+
+ len = sprintf(filename, "/sys/class/regulator/%s",
+ item->d_name);
+
+ dir = opendir(filename);
+ if (!dir)
+ continue;
+ count++;
+
+ if (count > numregulators) {
+ ret = 1;
+ goto exit;
+ }
+
+ strcpy(regulators_info[count-1].name, item->d_name);
+ while((ritem = readdir(dir))) {
+ if (strlen(ritem->d_name) < 3)
+ continue;
+
+ sprintf(filename + len, "/%s", ritem->d_name);
+ file = fopen(filename, "r");
+ if (!file)
+ continue;
+ memset(line, 0, 1024);
+ fptr = fgets(line, 1024, file);
+ fclose(file);
+ if (!fptr)
+ continue;
+ read_info_from_dirent(ritem, fptr, count - 1);
+ }
+exit:
+ closedir(dir);
+ if (ret)
+ break;
+ }
+ closedir(regdir);
+
+ return ret;
+}