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:
6b7fd3128f71 ("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>
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);
}