Commit dcce5cc7 authored by Vishal Badole's avatar Vishal Badole Committed by Stephen Boyd
Browse files

clk: Show active consumers of clocks in debugfs



This feature lists the clock consumer's name and respective connection
id. Using this feature user can easily check that which user has
acquired and enabled a particular clock.

Usage:
>> cat /sys/kernel/debug/clk/clk_summary
                      enable  prepare  protect
                                                                          duty  hardware                            Connection
   clock               count    count    count    rate   accuracy phase  cycle    enable   consumer                         Id
------------------------------------------------------------------------------------------------------------------------------
 clk_mcasp0_fixed         0        0        0    24576000          0      0  50000     Y   deviceless                     of_clk_get_from_provider
                                                                                           deviceless                     no_connection_id
    clk_mcasp0            0        0        0    24576000          0      0  50000     N      simple-audio-card,cpu           no_connection_id
                                                                                              deviceless                      no_connection_id

Co-developed-by: default avatarChinmoy Ghosh <chinmoyghosh2001@gmail.com>
Signed-off-by: default avatarChinmoy Ghosh <chinmoyghosh2001@gmail.com>
Co-developed-by: default avatarMintu Patel <mintupatel89@gmail.com>
Signed-off-by: default avatarMintu Patel <mintupatel89@gmail.com>
Co-developed-by: default avatarVimal Kumar <vimal.kumar32@gmail.com>
Signed-off-by: default avatarVimal Kumar <vimal.kumar32@gmail.com>
Signed-off-by: default avatarVishal Badole <badolevishal1116@gmail.com>
Link: https://lore.kernel.org/r/1669569799-8526-1-git-send-email-badolevishal1116@gmail.com


Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 0bb80ecc
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -3188,28 +3188,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  %-25s\n",
			   level * 3 + 2 + 105 * multi_node, "",
			   30,
			   clk_user->dev_id ? clk_user->dev_id : "deviceless",
			   clk_user->con_id ? clk_user->con_id : "no_connection_id");

		multi_node = 1;
	}

}

static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
@@ -3230,9 +3243,10 @@ static int clk_summary_show(struct seq_file *s, void *data)
	struct clk_core *c;
	struct hlist_head **lists = 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                            connection\n");
	seq_puts(s, "   clock                          count    count    count        rate   accuracy phase  cycle    enable   consumer                         id\n");
	seq_puts(s, "---------------------------------------------------------------------------------------------------------------------------------------------\n");


	clk_prepare_lock();