Messages in this thread Patch in this message | | | From | Vishal Badole <> | Subject | [PATCH v3] Common clock: To list active consumers of clocks | Date | Tue, 28 Jun 2022 10:38:42 +0530 |
| |
This feature lists the clock consumer's name and per-user enable count in clock summary. Using this feature user can easily check which device has acquired a perticular clock and it is enabled by respective device or not. for example: debian@beaglebone:~$ cat /sys/kernel/debug/clk/clk_summary enable prepare protect duty hardware per-user clock count count count rate accuracy phase cycle enable consumer count ---------------------------------------------------------------------------------------------------------------------------- clk_mcasp0_fixed 0 0 0 24576000 0 0 50000 Y deviceless 0 deviceless 0 clk_mcasp0 0 0 0 24576000 0 0 50000 N simple-audio-card,cpu 0 deviceless 0
Co-developed-by: Chinmoy Ghosh <chinmoyghosh2001@gmail.com> Signed-off-by: Chinmoy Ghosh <chinmoyghosh2001@gmail.com> Co-developed-by: Mintu Patel <mintupatel89@gmail.com> Signed-off-by: Mintu Patel <mintupatel89@gmail.com> Co-developed-by: Vimal Kumar <vimal.kumar32@gmail.com> Signed-off-by: Vimal Kumar <vimal.kumar32@gmail.com> Signed-off-by: Vishal Badole <badolevishal1116@gmail.com> --- drivers/clk/clk.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index ed11918..6c4249e 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -102,6 +102,7 @@ struct clk { unsigned long min_rate; unsigned long max_rate; unsigned int exclusive_count; + unsigned int enable_count; struct hlist_node clks_node; }; @@ -1015,6 +1016,10 @@ void clk_disable(struct clk *clk) return; clk_core_disable_lock(clk->core); + + if (clk->enable_count > 0) + clk->enable_count--; + } EXPORT_SYMBOL_GPL(clk_disable); @@ -1176,10 +1181,16 @@ EXPORT_SYMBOL_GPL(clk_restore_context); */ int clk_enable(struct clk *clk) { + int ret; + if (!clk) return 0; - return clk_core_enable_lock(clk->core); + ret = clk_core_enable_lock(clk->core); + if (!ret) + clk->enable_count++; + + return ret; } EXPORT_SYMBOL_GPL(clk_enable); @@ -2960,28 +2971,41 @@ static void clk_summary_show_one(struct seq_file *s, struct clk_core *c, int level) { int phase; + struct clk *clk_user; + int multi_node = 0; - seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu ", + seq_printf(s, "%*s%-*s %-7d %-8d %-8d %-11lu %-10lu ", level * 3 + 1, "", - 30 - level * 3, c->name, + 35 - level * 3, c->name, c->enable_count, c->prepare_count, c->protect_count, clk_core_get_rate_recalc(c), clk_core_get_accuracy_recalc(c)); phase = clk_core_get_phase(c); if (phase >= 0) - seq_printf(s, "%5d", phase); + seq_printf(s, "%-5d", phase); else seq_puts(s, "-----"); - seq_printf(s, " %6d", clk_core_get_scaled_duty_cycle(c, 100000)); + seq_printf(s, " %-6d", clk_core_get_scaled_duty_cycle(c, 100000)); if (c->ops->is_enabled) - seq_printf(s, " %9c\n", clk_core_is_enabled(c) ? 'Y' : 'N'); + seq_printf(s, " %5c ", clk_core_is_enabled(c) ? 'Y' : 'N'); else if (!c->ops->enable) - seq_printf(s, " %9c\n", 'Y'); + seq_printf(s, " %5c ", 'Y'); else - seq_printf(s, " %9c\n", '?'); + seq_printf(s, " %5c ", '?'); + + hlist_for_each_entry(clk_user, &c->clks, clks_node) { + seq_printf(s, "%*s%-*s %-4d\n", + level * 3 + 2 + 105 * multi_node, "", + 30, + clk_user->dev_id ? clk_user->dev_id : "deviceless", + clk_user->enable_count); + + multi_node = 1; + } + } static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c, @@ -3002,9 +3026,9 @@ static int clk_summary_show(struct seq_file *s, void *data) struct clk_core *c; struct hlist_head **lists = (struct hlist_head **)s->private; - seq_puts(s, " enable prepare protect duty hardware\n"); - seq_puts(s, " clock count count count rate accuracy phase cycle enable\n"); - seq_puts(s, "-------------------------------------------------------------------------------------------------------\n"); + seq_puts(s, " enable prepare protect duty hardware per-user\n"); + seq_puts(s, " clock count count count rate accuracy phase cycle enable consumer count\n"); + seq_puts(s, "-------------------------------------------------------------------------------------------------------------------------------------------\n"); clk_prepare_lock(); -- 2.7.4
| |