clk: fix crash on clk_set_rate clean rate cache

It's currently possible to make the bootloader crash on calling
clk_set_rate caused by the loop in clk_clean_rate_cache.

The loop assume that every child of the clock node are also clock
device but this is not always the case. For example it's common for a
clock to bind to a reset device or also expose a syscon if the clock
register map is also used to apply special configuration.

In such case, on accessing a device as a clock, the bootloader crash. To
correctly handle this, check if the child device is actually a clock and
ignore otherwise.

Fixes: 6b7fd3128f ("clk: fix set_rate to clean up cached rates for the hierarchy")
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Michael Trimarchi <michael@amarulasolutions.com>
This commit is contained in:
Christian Marangi
2025-03-15 10:24:14 +01:00
committed by Tom Rini
parent a6da395b5d
commit aa96cda0a5

View File

@@ -572,6 +572,9 @@ static void clk_clean_rate_cache(struct clk *clk)
clk->rate = 0;
list_for_each_entry(child_dev, &clk->dev->child_head, sibling_node) {
if (device_get_uclass_id(child_dev) != UCLASS_CLK)
continue;
clkp = dev_get_clk_ptr(child_dev);
clk_clean_rate_cache(clkp);
}