aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Delaunay2022-12-13 14:57:10 +0100
committerSean Anderson2023-02-12 13:37:56 -0500
commitc40251c120fac5a85fb445b6b2c7db5d18792e2a (patch)
tree8e98c53773cf04dc3b3dcd75929372f89c48fc80
parent4a18d2303927a22f356c9be102a2c8b4a3df43fa (diff)
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: 1a725e229096 ("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
-rw-r--r--cmd/clk.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/cmd/clk.c b/cmd/clk.c
index a483fd89812..ff7c7649a15 100644
--- a/cmd/clk.c
+++ b/cmd/clk.c
@@ -22,7 +22,7 @@ static void show_clks(struct udevice *dev, int depth, int last_flag)
u32 rate;
clkp = dev_get_clk_ptr(dev);
- if (device_get_uclass_id(dev) == UCLASS_CLK && clkp) {
+ if (clkp) {
parent = clk_get_parent(clkp);
if (!IS_ERR(parent) && depth == -1)
return;
@@ -49,10 +49,11 @@ static void show_clks(struct udevice *dev, int depth, int last_flag)
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)
continue;
-
is_last = list_is_last(&child->sibling_node, &dev->child_head);
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)
{
struct udevice *dev;
- struct uclass *uc;
- int ret;
-
- ret = uclass_get(UCLASS_CLK, &uc);
- if (ret)
- return ret;
printf(" Rate Usecnt Name\n");
printf("------------------------------------------\n");
- uclass_foreach_dev(dev, uc)
+ uclass_foreach_dev_probe(UCLASS_CLK, dev)
show_clks(dev, -1, 0);
return 0;