clk: fix crash on clk_set_rate clean rate cache
authorChristian Marangi <ansuelsmth@gmail.com>
Sat, 15 Mar 2025 09:24:14 +0000 (10:24 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 30 Apr 2025 13:50:18 +0000 (07:50 -0600)
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>
drivers/clk/clk-uclass.c

index 4b3d812..bc4d762 100644 (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);
        }