- use the clk_summary file of CCF for showing clocks - add option to show active or all clocks
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org --- clocks.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------------ display.c | 3 +++ display.h | 1 + 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/clocks.c b/clocks.c index 95acf57..a0510b4 100644 --- a/clocks.c +++ b/clocks.c @@ -287,9 +287,8 @@ static int clock_print_header(void) int ret;
if(clock_fw == CCF) { - if (asprintf(&buf, "%-35s %-10s %-12s %-10s %-11s %-15s %-14s %-14s", - "Name", "Flags", "Rate", "Usecount", "Children", "Prepare_Count", - "Enable_Count", "Notifier_Count") < 0) + if (asprintf(&buf, "%-30s %-10s %-12s %-10s (clock toggle key-'c')", + "Name", "Enable_Count", "Prepare_Count", "Rate") < 0) return -1; } else { @@ -297,23 +296,57 @@ static int clock_print_header(void) "Name", "Flags", "Rate", "Usecount", "Children") < 0) return -1; } - ret = display_column_name(buf); - free(buf);
return ret; }
+/* + * Display clocks by refering the clk_summary file of CCF + */ +static int display_clk_summary() +{ + FILE *fp; + char line[256]; + int afterheader; + char clock[30]; + int enable_cnt,prepare_cnt,rate; + + afterheader = 0; + fp = fopen("/sys/kernel/debug/clk/clk_summary","r"); + if (fp == NULL) { + printf("error: failed to open clock tree file\n"); + return -1; + } + + while (NULL != fgets(line,256,fp)) { + if (afterheader > 1) { + sscanf(line,"%s %d %d %d",clock,&enable_cnt,&prepare_cnt,&rate); + if (active_clks) { + if (enable_cnt) + display_print_line(CLOCK,afterheader, + line,0,clock_tree); + } + else + display_print_line(CLOCK,afterheader,line,1,clock_tree); + } + afterheader++; + } + return 0; +} + static int clock_print_info(struct tree *tree) { int ret, line = 0;
display_reset_cursor(CLOCK); - clock_print_header();
- ret = tree_for_each(tree, clock_print_info_cb, &line); + if (clock_fw == CCF) + ret = display_clk_summary(); + else + ret = tree_for_each(tree, clock_print_info_cb, &line);
display_refresh_pad(CLOCK);
@@ -426,8 +459,10 @@ int clock_init(void)
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; + active_clks = true; strcpy(clk_dir_path[MAX],clk_dir_path[CCF]); } else if(!access(clk_dir_path[OCF], F_OK)) { @@ -437,12 +472,15 @@ int clock_init(void) else return -1;
- clock_tree = tree_load(clk_dir_path[MAX], NULL, false); - if (!clock_tree) - return -1; + /* Not preparing tree for CCF, will use the clk_summary file */ + if(clock_fw != CCF) { + clock_tree = tree_load(clk_dir_path[MAX], NULL, false); + if (!clock_tree) + return -1;
- if (fill_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 e9f4bf6..98544e6 100644 --- a/display.c +++ b/display.c @@ -416,6 +416,9 @@ static int display_keystroke(int fd, void *data) case 'r': case 'R': return display_refresh(current_win, true); + case 'c': + active_clks = active_clks ? false : true; + return display_refresh(current_win, true); default: return 0; } diff --git a/display.h b/display.h index 6362a48..24c9d59 100644 --- a/display.h +++ b/display.h @@ -33,4 +33,5 @@ extern int display_init(int wdefault); extern int display_register(int win, struct display_ops *ops); extern int display_column_name(const char *line);
+bool active_clks; #define NAME_MAX 255