mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
cmd: clk: probe the clock before dump them
The clock UCLASS need to be probed to allow availability of the
private data (struct clk *), get in show_clks() with dev_get_clk_ptr()
before use them.
Without this patch the clock dump can cause crash because all the
private data are not available before calling the API clk_get_rate().
It is the case for the SCMI clocks, priv->channel is needed for
scmi_clk_get_rate() and it is initialized only in scmi_clk_probe().
This issue causes a crash for "clk dump" command on STM32MP135F-DK board
for SCMI clock not yet probed.
Fixes: 1a725e2290
("clk: fix clock tree dump to properly dump out every registered clock")
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Sean Anderson <seanga2@gmail.com>
Link: https://lore.kernel.org/r/20221213145708.v2.1.Ia0bc6b272f1e2e3f37873c61d79138c2663c4055@changeid
This commit is contained in:
parent
4a18d23039
commit
c40251c120
1 changed files with 5 additions and 10 deletions
15
cmd/clk.c
15
cmd/clk.c
|
@ -22,7 +22,7 @@ static void show_clks(struct udevice *dev, int depth, int last_flag)
|
||||||
u32 rate;
|
u32 rate;
|
||||||
|
|
||||||
clkp = dev_get_clk_ptr(dev);
|
clkp = dev_get_clk_ptr(dev);
|
||||||
if (device_get_uclass_id(dev) == UCLASS_CLK && clkp) {
|
if (clkp) {
|
||||||
parent = clk_get_parent(clkp);
|
parent = clk_get_parent(clkp);
|
||||||
if (!IS_ERR(parent) && depth == -1)
|
if (!IS_ERR(parent) && depth == -1)
|
||||||
return;
|
return;
|
||||||
|
@ -49,10 +49,11 @@ static void show_clks(struct udevice *dev, int depth, int last_flag)
|
||||||
printf("%s\n", dev->name);
|
printf("%s\n", dev->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(child, &dev->child_head, sibling_node) {
|
device_foreach_child_probe(child, dev) {
|
||||||
|
if (device_get_uclass_id(child) != UCLASS_CLK)
|
||||||
|
continue;
|
||||||
if (child == dev)
|
if (child == dev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
is_last = list_is_last(&child->sibling_node, &dev->child_head);
|
is_last = list_is_last(&child->sibling_node, &dev->child_head);
|
||||||
show_clks(child, depth, (last_flag << 1) | is_last);
|
show_clks(child, depth, (last_flag << 1) | is_last);
|
||||||
}
|
}
|
||||||
|
@ -61,17 +62,11 @@ static void show_clks(struct udevice *dev, int depth, int last_flag)
|
||||||
int __weak soc_clk_dump(void)
|
int __weak soc_clk_dump(void)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
struct uclass *uc;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = uclass_get(UCLASS_CLK, &uc);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
printf(" Rate Usecnt Name\n");
|
printf(" Rate Usecnt Name\n");
|
||||||
printf("------------------------------------------\n");
|
printf("------------------------------------------\n");
|
||||||
|
|
||||||
uclass_foreach_dev(dev, uc)
|
uclass_foreach_dev_probe(UCLASS_CLK, dev)
|
||||||
show_clks(dev, -1, 0);
|
show_clks(dev, -1, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue