[PATCH] clk: mvebu: fix sscg node lookup
Gregory CLEMENT
gregory.clement at free-electrons.com
Tue Sep 16 08:31:29 PDT 2014
Hi Thomas,
On 16/09/2014 17:15, Thomas Petazzoni wrote:
> Commit 15917b16022427c53755abff4dc7051f3076dd7a ("clk: mvebu: Fix clk
> frequency value if SSCG is enabled") introduced some logic in the
> common mvebu clock code to adjust the clock frequency according to the
> configuration of the SSCG.
>
> In order to do this, it looks up for a DT node called "sscg" and maps
> it before accessing the SSCG configuration register.
>
> However, the lookup is currently done using:
>
> sscg_np = of_find_node_by_name(np, "sscg");
>
> where "np" is a pointer to the DT node of the clock for which we are
> calculating the adjusted frequency. This means that if the "sscg" node
> is *after* the clock node in the Device Tree, it works fine (and
> that's the case for Armada 370).
>
> However, if it turns out that the "sscg" node is *before* the clock
> node in the Device Tree, it won't work because the sscg node will not
> be found.
>
> What we really want here is a search of the entire Device Tree, not
> only starting from the clock node, so instead of passing "np" as first
> argument of of_find_node_by_name(), we simply need to pass
> NULL. Passing a non-NULL argument is typically used in a loop, so that
> the search for the next matching node starts right after the node that
> was matched.
>
> This makes the "np" argument to the kirkwood_fix_sscg_deviation()
> function unnecessary, which leads to further cleanups.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> Fixes: 15917b1602242 ("clk: mvebu: Fix clk frequency value if SSCG is enabled")
Thanks for this fix.
Acked-by: Gregory CLEMENT <gregory.clement at free-electrons.com>
> ---
> Jason, this is a fix that applies on your mvebu/drivers-clk branch.
>
> drivers/clk/mvebu/common.c | 6 +++---
> drivers/clk/mvebu/common.h | 4 ++--
> 2 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/clk/mvebu/common.c b/drivers/clk/mvebu/common.c
> index 354bbad..f902c18 100644
> --- a/drivers/clk/mvebu/common.c
> +++ b/drivers/clk/mvebu/common.c
> @@ -41,7 +41,7 @@ static struct clk_onecell_data clk_data;
> * chosen following the dt convention: using the first known SoC
> * compatible with it.
> */
> -u32 kirkwood_fix_sscg_deviation(struct device_node *np, u32 system_clk)
> +u32 kirkwood_fix_sscg_deviation(u32 system_clk)
> {
> struct device_node *sscg_np = NULL;
> void __iomem *sscg_map;
> @@ -49,7 +49,7 @@ u32 kirkwood_fix_sscg_deviation(struct device_node *np, u32 system_clk)
> s32 low_bound, high_bound;
> u64 freq_swing_half;
>
> - sscg_np = of_find_node_by_name(np, "sscg");
> + sscg_np = of_find_node_by_name(NULL, "sscg");
> if (sscg_np == NULL) {
> pr_err("cannot get SSCG register node\n");
> return system_clk;
> @@ -142,7 +142,7 @@ void __init mvebu_coreclk_setup(struct device_node *np,
>
> if (desc->is_sscg_enabled && desc->fix_sscg_deviation
> && desc->is_sscg_enabled(base))
> - rate = desc->fix_sscg_deviation(np, rate);
> + rate = desc->fix_sscg_deviation(rate);
>
> clk_data.clks[1] = clk_register_fixed_rate(NULL, cpuclk_name, NULL,
> CLK_IS_ROOT, rate);
> diff --git a/drivers/clk/mvebu/common.h b/drivers/clk/mvebu/common.h
> index 59efaa8..989ab14 100644
> --- a/drivers/clk/mvebu/common.h
> +++ b/drivers/clk/mvebu/common.h
> @@ -29,7 +29,7 @@ struct coreclk_soc_desc {
> u32 (*get_cpu_freq)(void __iomem *sar);
> void (*get_clk_ratio)(void __iomem *sar, int id, int *mult, int *div);
> bool (*is_sscg_enabled)(void __iomem *sar);
> - u32 (*fix_sscg_deviation)(struct device_node *np, u32 system_clk);
> + u32 (*fix_sscg_deviation)(u32 system_clk);
> const struct coreclk_ratio *ratios;
> int num_ratios;
> };
> @@ -51,5 +51,5 @@ void __init mvebu_clk_gating_setup(struct device_node *np,
> * This function is shared among the Kirkwood, Armada 370, Armada XP
> * and Armada 375 SoC
> */
> -u32 kirkwood_fix_sscg_deviation(struct device_node *np, u32 system_clk);
> +u32 kirkwood_fix_sscg_deviation(u32 system_clk);
> #endif
>
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
More information about the linux-arm-kernel
mailing list