It allows dropping downstream patch renaming DT nodes. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> (cherry picked from commit 77d9cce604d32005ddb90e91c6cc9b9cf35068d7)
73 lines
2.6 KiB
Diff
73 lines
2.6 KiB
Diff
From 1b24a132eba7a1c19475ba2510ec1c00af3ff914 Mon Sep 17 00:00:00 2001
|
|
From: Florian Fainelli <f.fainelli@gmail.com>
|
|
Date: Mon, 5 Sep 2022 09:15:03 -0700
|
|
Subject: [PATCH] clk: iproc: Do not rely on node name for correct PLL setup
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
After commit 31fd9b79dc58 ("ARM: dts: BCM5301X: update CRU block
|
|
description") a warning from clk-iproc-pll.c was generated due to a
|
|
duplicate PLL name as well as the console stopped working. Upon closer
|
|
inspection it became clear that iproc_pll_clk_setup() used the Device
|
|
Tree node unit name as an unique identifier as well as a parent name to
|
|
parent all clocks under the PLL.
|
|
|
|
BCM5301X was the first platform on which that got noticed because of the
|
|
DT node unit name renaming but the same assumptions hold true for any
|
|
user of the iproc_pll_clk_setup() function.
|
|
|
|
The first 'clock-output-names' property is always guaranteed to be
|
|
unique as well as providing the actual desired PLL clock name, so we
|
|
utilize that to register the PLL and as a parent name of all children
|
|
clock.
|
|
|
|
Fixes: 5fe225c105fd ("clk: iproc: add initial common clock support")
|
|
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
|
Link: https://lore.kernel.org/r/20220905161504.1526-1-f.fainelli@gmail.com
|
|
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
|
|
---
|
|
drivers/clk/bcm/clk-iproc-pll.c | 12 ++++++++----
|
|
1 file changed, 8 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/clk/bcm/clk-iproc-pll.c
|
|
+++ b/drivers/clk/bcm/clk-iproc-pll.c
|
|
@@ -736,6 +736,7 @@ void iproc_pll_clk_setup(struct device_n
|
|
const char *parent_name;
|
|
struct iproc_clk *iclk_array;
|
|
struct clk_hw_onecell_data *clk_data;
|
|
+ const char *clk_name;
|
|
|
|
if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl))
|
|
return;
|
|
@@ -783,7 +784,12 @@ void iproc_pll_clk_setup(struct device_n
|
|
iclk = &iclk_array[0];
|
|
iclk->pll = pll;
|
|
|
|
- init.name = node->name;
|
|
+ ret = of_property_read_string_index(node, "clock-output-names",
|
|
+ 0, &clk_name);
|
|
+ if (WARN_ON(ret))
|
|
+ goto err_pll_register;
|
|
+
|
|
+ init.name = clk_name;
|
|
init.ops = &iproc_pll_ops;
|
|
init.flags = 0;
|
|
parent_name = of_clk_get_parent_name(node, 0);
|
|
@@ -803,13 +809,11 @@ void iproc_pll_clk_setup(struct device_n
|
|
goto err_pll_register;
|
|
|
|
clk_data->hws[0] = &iclk->hw;
|
|
+ parent_name = clk_name;
|
|
|
|
/* now initialize and register all leaf clocks */
|
|
for (i = 1; i < num_clks; i++) {
|
|
- const char *clk_name;
|
|
-
|
|
memset(&init, 0, sizeof(init));
|
|
- parent_name = node->name;
|
|
|
|
ret = of_property_read_string_index(node, "clock-output-names",
|
|
i, &clk_name);
|