aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@linaro.org>2016-02-22 15:02:57 +0100
committerDaniel Lezcano <daniel.lezcano@linaro.org>2016-02-22 15:02:57 +0100
commitd42d7ad53a619b4dd2fc3e9194721fd8b0c6de0a (patch)
treefef07011a5bdc2893761ea888494b47c7964b941
parent1eedd480214d97dd80defc19b0849ea45cd692ef (diff)
Fix display error on screen
The previous patch was reverted and is replaced by this one. Instead of dancing around with global flag telling if a subsys succeed or not and write a error, let's try to initialize the subsystem each time a display is requested and output an error occurs. That makes the code a bit nicer and give the opportunity to fix the problem at the system level (eg. mount debugfs) without restarting powerdebug. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
-rw-r--r--clocks.c64
-rw-r--r--display.c9
-rw-r--r--display.h2
-rw-r--r--gpio.c123
-rw-r--r--regulator.c43
-rw-r--r--sensor.c29
-rw-r--r--tree.c4
7 files changed, 168 insertions, 106 deletions
diff --git a/clocks.c b/clocks.c
index b57de3d..c115d8e 100644
--- a/clocks.c
+++ b/clocks.c
@@ -360,6 +360,39 @@ static int clock_select(void)
return 0;
}
+static int clock_info_load(void)
+{
+ char clk_dir_path[MAX+1][PATH_MAX];
+
+ if (clock_tree)
+ return 0;
+
+ if (locate_debugfs(clk_dir_path[CCF]) || locate_debugfs(clk_dir_path[OCF]))
+ return -1;
+
+ sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]);
+ sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
+ if (!access(clk_dir_path[CCF], F_OK)) {
+ clock_fw = CCF;
+ strcpy(clk_dir_path[MAX],clk_dir_path[CCF]);
+ }
+ else if(!access(clk_dir_path[OCF], F_OK)) {
+ clock_fw = OCF;
+ strcpy(clk_dir_path[MAX],clk_dir_path[OCF]);
+ }
+ else
+ return -1;
+
+ clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
+ if (!clock_tree)
+ return -1;
+
+ if (fill_clock_tree())
+ return -1;
+
+ return 0;
+}
+
/*
* Read the clock information and fill the tree with the information
* found in the files. Then print the result to the text based interface
@@ -367,6 +400,12 @@ static int clock_select(void)
*/
static int clock_display(bool refresh)
{
+ if (clock_info_load()) {
+ display_print_error(CLOCK, 0, "Failed to read clock info");
+ return 0; /* we don't want this to be a critical error */
+ }
+
+
if (refresh && read_clock_info(clock_tree))
return -1;
@@ -449,33 +488,8 @@ static struct display_ops clock_ops = {
*/
int clock_init(struct powerdebug_options *options)
{
- char clk_dir_path[MAX+1][PATH_MAX];
-
if (!(options->flags & CLOCK_OPTION))
return 0;
- if (locate_debugfs(clk_dir_path[CCF]) || locate_debugfs(clk_dir_path[OCF]))
- return -1;
-
- sprintf(clk_dir_path[CCF], "%s/clk", clk_dir_path[CCF]);
- sprintf(clk_dir_path[OCF], "%s/clock", clk_dir_path[OCF]);
- if (!access(clk_dir_path[CCF], F_OK)) {
- clock_fw = CCF;
- strcpy(clk_dir_path[MAX],clk_dir_path[CCF]);
- }
- else if(!access(clk_dir_path[OCF], F_OK)) {
- clock_fw = OCF;
- strcpy(clk_dir_path[MAX],clk_dir_path[OCF]);
- }
- else
- return -1;
-
- clock_tree = tree_load(clk_dir_path[MAX], NULL, false);
- if (!clock_tree)
- return -1;
-
- if (fill_clock_tree())
- return -1;
-
return display_register(CLOCK, &clock_ops);
}
diff --git a/display.c b/display.c
index 8f44334..e34d083 100644
--- a/display.c
+++ b/display.c
@@ -303,6 +303,15 @@ int display_print_line(int win, int line, char *str, int bold, void *data)
return 0;
}
+int display_print_error(int window, int line, char *str)
+{
+ display_reset_cursor(window);
+ display_print_line(window, line, str, 0, NULL);
+ display_refresh_pad(window);
+
+ return 0;
+}
+
static int display_find_keystroke(int fd, void *data);
struct find_data {
diff --git a/display.h b/display.h
index 46095cb..6083c53 100644
--- a/display.h
+++ b/display.h
@@ -34,6 +34,8 @@ struct powerdebug_options;
extern int display_print_line(int window, int line, char *str,
int bold, void *data);
+extern int display_print_error(int window, int line, char *str);
+
extern int display_refresh_pad(int window);
extern int display_reset_cursor(int window);
extern void *display_get_row_data(int window);
diff --git a/gpio.c b/gpio.c
index 7024347..d7df0e3 100644
--- a/gpio.c
+++ b/gpio.c
@@ -262,8 +262,76 @@ static int gpio_print_info(struct tree *tree)
return ret;
}
+void export_free_gpios(void)
+{
+ FILE *fgpio, *fgpio_export;
+ int i, gpio_max = 0;
+ char *line = NULL;
+ ssize_t nrread;
+ size_t len = 0;
+
+ fgpio = fopen("/sys/kernel/debug/gpio", "r");
+ if (!fgpio) {
+ printf("failed to read debugfs gpio file\n");
+ return;
+ }
+
+ fgpio_export = fopen("/sys/class/gpio/export", "w");
+ if (!fgpio_export) {
+ printf("failed to write open gpio-export file\n");
+ goto out;
+ }
+
+ /* export the gpios */
+ while ((nrread = getline(&line, &len, fgpio)) != -1) {
+ if (strstr(line, "GPIOs"))
+ sscanf(line, "%*[^-]-%d", &gpio_max);
+ }
+
+ printf("log: total gpios = %d\n", gpio_max);
+ for (i = 0 ; i <= gpio_max ; i++) {
+ char command[50] = "";
+
+ sprintf(command, "echo %d > /sys/class/gpio/export", i);
+ if (system(command) < 0)
+ printf("error: failed to export gpio-%d\n", i);
+ }
+
+ free(line);
+
+ if (fgpio)
+ fclose(fgpio);
+out:
+ if (fgpio_export)
+ fclose(fgpio_export);
+
+ return;
+}
+
+static int gpio_load_info(void)
+{
+ if (gpio_tree)
+ return 0;
+
+ export_free_gpios();
+
+ gpio_tree = tree_load(SYSFS_GPIO, gpio_filter_cb, false);
+ if (!gpio_tree)
+ return -1;
+
+ if (fill_gpio_tree())
+ return -1;
+
+ return 0;
+}
+
static int gpio_display(bool refresh)
{
+ if (gpio_load_info()) {
+ display_print_error(GPIO, 0, "Failed to read gpio info");
+ return 0; /* we don't want this to be a critical error */
+ }
+
if (refresh && read_gpio_info(gpio_tree))
return -1;
@@ -320,52 +388,6 @@ static struct display_ops gpio_ops = {
.change = gpio_change,
};
-void export_free_gpios(void)
-{
- FILE *fgpio, *fgpio_export;
- int i, gpio_max = 0;
- char *line = NULL;
- ssize_t nrread;
- size_t len = 0;
-
- fgpio = fopen("/sys/kernel/debug/gpio", "r");
- if (!fgpio) {
- printf("failed to read debugfs gpio file\n");
- return;
- }
-
- fgpio_export = fopen("/sys/class/gpio/export", "w");
- if (!fgpio_export) {
- printf("failed to write open gpio-export file\n");
- goto out;
- }
-
- /* export the gpios */
- while ((nrread = getline(&line, &len, fgpio)) != -1) {
- if (strstr(line, "GPIOs"))
- sscanf(line, "%*[^-]-%d", &gpio_max);
- }
-
- printf("log: total gpios = %d\n", gpio_max);
- for (i = 0 ; i <= gpio_max ; i++) {
- char command[50] = "";
-
- sprintf(command, "echo %d > /sys/class/gpio/export", i);
- if (system(command) < 0)
- printf("error: failed to export gpio-%d\n", i);
- }
-
- free(line);
-
- if (fgpio)
- fclose(fgpio);
-out:
- if (fgpio_export)
- fclose(fgpio_export);
-
- return;
-}
-
/*
* Initialize the gpio framework
*/
@@ -374,14 +396,5 @@ int gpio_init(struct powerdebug_options *options)
if (!(options->flags & GPIO_OPTION))
return 0;
- export_free_gpios();
-
- gpio_tree = tree_load(SYSFS_GPIO, gpio_filter_cb, false);
- if (!gpio_tree)
- return -1;
-
- if (fill_gpio_tree())
- return -1;
-
return display_register(GPIO, &gpio_ops);
}
diff --git a/regulator.c b/regulator.c
index 1f7aefd..5fba6f1 100644
--- a/regulator.c
+++ b/regulator.c
@@ -223,14 +223,6 @@ static int regulator_print_info(struct tree *tree)
return ret;
}
-static int regulator_display(bool refresh)
-{
- if (refresh && read_regulator_info(reg_tree))
- return -1;
-
- return regulator_print_info(reg_tree);
-}
-
static int fill_regulator_cb(struct tree *t, void *data)
{
struct regulator_info *reg;
@@ -254,21 +246,42 @@ static int fill_regulator_tree(void)
return tree_for_each(reg_tree, fill_regulator_cb, NULL);
}
-static struct display_ops regulator_ops = {
- .display = regulator_display,
-};
-
-int regulator_init(struct powerdebug_options *options)
+static int regulator_info_load(void)
{
- if (!(options->flags & REGULATOR_OPTION))
+ if (reg_tree)
return 0;
reg_tree = tree_load(SYSFS_REGULATOR, regulator_filter_cb, false);
if (!reg_tree)
return -1;
-
+
if (fill_regulator_tree())
return -1;
+ return 0;
+}
+
+static int regulator_display(bool refresh)
+{
+ if (regulator_info_load()) {
+ display_print_error(REGULATOR, 0, "Failed to read regulator info");
+ return 0; /* we don't want this to be a critical error */
+ }
+
+ if (refresh && read_regulator_info(reg_tree))
+ return -1;
+
+ return regulator_print_info(reg_tree);
+}
+
+static struct display_ops regulator_ops = {
+ .display = regulator_display,
+};
+
+int regulator_init(struct powerdebug_options *options)
+{
+ if (!(options->flags & REGULATOR_OPTION))
+ return 0;
+
return display_register(REGULATOR, &regulator_ops);
}
diff --git a/sensor.c b/sensor.c
index fd8100e..cdc86b2 100644
--- a/sensor.c
+++ b/sensor.c
@@ -276,9 +276,29 @@ static int sensor_print_info(struct tree *tree)
return ret;
}
+static int sensor_load_info(void)
+{
+ if (sensor_tree)
+ return 0;
+
+ sensor_tree = tree_load(SYSFS_SENSOR, sensor_filter_cb, false);
+ if (!sensor_tree)
+ return -1;
+
+ if (fill_sensor_tree())
+ return -1;
+
+ return 0;
+}
+
static int sensor_display(bool refresh)
{
- if (refresh && read_sensor_info(sensor_tree))
+ if (sensor_load_info()) {
+ display_print_error(SENSOR, 0, "Failed to read sensor info");
+ return 0;
+ }
+
+ if (refresh && read_sensor_info(sensor_tree))
return -1;
return sensor_print_info(sensor_tree);
@@ -293,12 +313,5 @@ int sensor_init(struct powerdebug_options *options)
if (!(options->flags & SENSOR_OPTION))
return 0;
- sensor_tree = tree_load(SYSFS_SENSOR, sensor_filter_cb, false);
- if (!sensor_tree)
- return -1;
-
- if (fill_sensor_tree())
- return -1;
-
return display_register(SENSOR, &sensor_ops);
}
diff --git a/tree.c b/tree.c
index 2728a2d..76f132f 100644
--- a/tree.c
+++ b/tree.c
@@ -127,10 +127,8 @@ static int tree_scan(struct tree *tree, tree_filter_t filter, bool follow)
int ret = 0;
dir = opendir(tree->path);
- if (!dir) {
- printf("error: unable to open directory %s\n", tree->path);
+ if (!dir)
return -1;
- }
while (!readdir_r(dir, &dirent, &direntp)) {