[PATCH v7 1/7] clk: rockchip: rk3588: fix CLK_NR_CLKS usage
Tao Huang
huangtao at rock-chips.com
Thu Dec 14 00:42:32 PST 2023
On 2023/12/14 上午2:46, Sebastian Reichel wrote:
> 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 at collabora.com>
> ---
> drivers/clk/rockchip/clk-rk3588.c | 5 ++++-
> drivers/clk/rockchip/clk.c | 17 +++++++++++++++++
> drivers/clk/rockchip/clk.h | 2 ++
> 3 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/clk/rockchip/clk-rk3588.c b/drivers/clk/rockchip/clk-rk3588.c
> index 6994165e0395..0b60ae78f9d8 100644
> --- a/drivers/clk/rockchip/clk-rk3588.c
> +++ b/drivers/clk/rockchip/clk-rk3588.c
> @@ -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);
> diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
> index 4059d9365ae6..043458b7c579 100644
> --- a/drivers/clk/rockchip/clk.c
> +++ b/drivers/clk/rockchip/clk.c
> @@ -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 int idx;
> + unsigned long max;
smatch report warning: uninitialized symbol 'max'.
And make sure this function return correct number, for example, when nr_clk == 0.
> +
> + 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)
> diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h
> index 758ebaf2236b..fd3b476dedda 100644
> --- a/drivers/clk/rockchip/clk.h
> +++ b/drivers/clk/rockchip/clk.h
> @@ -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);
More information about the Linux-rockchip
mailing list