clk: rockchip: rk3588: fix CLK_NR_CLKS usage
authorSebastian Reichel <sebastian.reichel@collabora.com>
Fri, 26 Jan 2024 18:18:22 +0000 (19:18 +0100)
committerHeiko Stuebner <heiko@sntech.de>
Tue, 27 Feb 2024 16:04:58 +0000 (17:04 +0100)
CLK_NR_CLKS is not part of the DT bindings and needs to be removed
from it, just like it recently happened for other platforms. This
takes care of it by introducing a new function identifying the
maximum used clock ID at runtime.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Link: https://lore.kernel.org/r/20240126182919.48402-2-sebastian.reichel@collabora.com
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
drivers/clk/rockchip/clk-rk3588.c
drivers/clk/rockchip/clk.c
drivers/clk/rockchip/clk.h

index 6994165e03957c89000addbf1479f18ebbbe26fc..0b60ae78f9d88601fa7939dc96ef583e142e8d4b 100644 (file)
@@ -2458,15 +2458,18 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
 static void __init rk3588_clk_init(struct device_node *np)
 {
        struct rockchip_clk_provider *ctx;
+       unsigned long clk_nr_clks;
        void __iomem *reg_base;
 
+       clk_nr_clks = rockchip_clk_find_max_clk_id(rk3588_clk_branches,
+                                       ARRAY_SIZE(rk3588_clk_branches)) + 1;
        reg_base = of_iomap(np, 0);
        if (!reg_base) {
                pr_err("%s: could not map cru region\n", __func__);
                return;
        }
 
-       ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
+       ctx = rockchip_clk_init(np, reg_base, clk_nr_clks);
        if (IS_ERR(ctx)) {
                pr_err("%s: rockchip clk init failed\n", __func__);
                iounmap(reg_base);
index 4059d9365ae642e3e967138e67b9e664c15b6851..73d2cbdc716b45d4e9b9825ba2778e39e8e280cf 100644 (file)
@@ -429,6 +429,23 @@ void rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
 }
 EXPORT_SYMBOL_GPL(rockchip_clk_register_plls);
 
+unsigned long rockchip_clk_find_max_clk_id(struct rockchip_clk_branch *list,
+                                          unsigned int nr_clk)
+{
+       unsigned long max = 0;
+       unsigned int idx;
+
+       for (idx = 0; idx < nr_clk; idx++, list++) {
+               if (list->id > max)
+                       max = list->id;
+               if (list->child && list->child->id > max)
+                       max = list->id;
+       }
+
+       return max;
+}
+EXPORT_SYMBOL_GPL(rockchip_clk_find_max_clk_id);
+
 void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
                                    struct rockchip_clk_branch *list,
                                    unsigned int nr_clk)
index 758ebaf2236bfa5ed50f9e7853cc16827a1a7105..fd3b476dedda9a8620fa4be2b1f7a7ece2da2be2 100644 (file)
@@ -973,6 +973,8 @@ struct rockchip_clk_provider *rockchip_clk_init(struct device_node *np,
                        void __iomem *base, unsigned long nr_clks);
 void rockchip_clk_of_add_provider(struct device_node *np,
                                struct rockchip_clk_provider *ctx);
+unsigned long rockchip_clk_find_max_clk_id(struct rockchip_clk_branch *list,
+                                          unsigned int nr_clk);
 void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
                                    struct rockchip_clk_branch *list,
                                    unsigned int nr_clk);