clk: Fix debugfs clk_possible_parents for clks without parent string names
Following the commitfc0c209c14
("clk: Allow parents to be specified without string names"), the parent name string is not always populated. Instead, fetch the parents clk_core struct using the appropriate helper, and read its name directly. If that fails, go through the possible sources of parent names. The order in which they are used is different from how parents are looked up, with the global name having precedence over local fw_name and indices. This makes more sense as a) the parent_maps structure does not differentiate between legacy global names and fallback global names, and b) global names likely provide more information than local fw_names. Fixes:fc0c209c14
("clk: Allow parents to be specified without string names") Signed-off-by: Chen-Yu Tsai <wens@csie.org>
This commit is contained in:
parent
a188339ca5
commit
2d156b78ce
@ -3000,12 +3000,50 @@ DEFINE_SHOW_ATTRIBUTE(clk_flags);
|
||||
static int possible_parents_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct clk_core *core = s->private;
|
||||
struct clk_core *parent;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < core->num_parents - 1; i++)
|
||||
seq_printf(s, "%s ", core->parents[i].name);
|
||||
/*
|
||||
* Go through the following options to fetch a parent's name.
|
||||
*
|
||||
* 1. Fetch the registered parent clock and use its name
|
||||
* 2. Use the global (fallback) name if specified
|
||||
* 3. Use the local fw_name if provided
|
||||
* 4. Fetch parent clock's clock-output-name if DT index was set
|
||||
*
|
||||
* This may still fail in some cases, such as when the parent is
|
||||
* specified directly via a struct clk_hw pointer, but it isn't
|
||||
* registered (yet).
|
||||
*/
|
||||
for (i = 0; i < core->num_parents - 1; i++) {
|
||||
parent = clk_core_get_parent_by_index(core, i);
|
||||
if (parent)
|
||||
seq_printf(s, "%s ", parent->name);
|
||||
else if (core->parents[i].name)
|
||||
seq_printf(s, "%s ", core->parents[i].name);
|
||||
else if (core->parents[i].fw_name)
|
||||
seq_printf(s, "<%s>(fw) ", core->parents[i].fw_name);
|
||||
else if (core->parents[i].index >= 0)
|
||||
seq_printf(s, "%s ",
|
||||
of_clk_get_parent_name(core->of_node,
|
||||
core->parents[i].index));
|
||||
else
|
||||
seq_puts(s, "(missing) ");
|
||||
}
|
||||
|
||||
seq_printf(s, "%s\n", core->parents[i].name);
|
||||
parent = clk_core_get_parent_by_index(core, i);
|
||||
if (parent)
|
||||
seq_printf(s, "%s", parent->name);
|
||||
else if (core->parents[i].name)
|
||||
seq_printf(s, "%s", core->parents[i].name);
|
||||
else if (core->parents[i].fw_name)
|
||||
seq_printf(s, "<%s>(fw)", core->parents[i].fw_name);
|
||||
else if (core->parents[i].index >= 0)
|
||||
seq_printf(s, "%s",
|
||||
of_clk_get_parent_name(core->of_node,
|
||||
core->parents[i].index));
|
||||
else
|
||||
seq_puts(s, "(missing)");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user