Commit 1b24a132 authored by Florian Fainelli's avatar Florian Fainelli Committed by Stephen Boyd

clk: iproc: Do not rely on node name for correct PLL setup

After commit 31fd9b79 ("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: 5fe225c1 ("clk: iproc: add initial common clock support")
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Acked-by: default avatarRafał Miłecki <rafal@milecki.pl>
Link: https://lore.kernel.org/r/20220905161504.1526-1-f.fainelli@gmail.comSigned-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 4014e916
...@@ -726,6 +726,7 @@ void iproc_pll_clk_setup(struct device_node *node, ...@@ -726,6 +726,7 @@ void iproc_pll_clk_setup(struct device_node *node,
const char *parent_name; const char *parent_name;
struct iproc_clk *iclk_array; struct iproc_clk *iclk_array;
struct clk_hw_onecell_data *clk_data; struct clk_hw_onecell_data *clk_data;
const char *clk_name;
if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl)) if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl))
return; return;
...@@ -773,7 +774,12 @@ void iproc_pll_clk_setup(struct device_node *node, ...@@ -773,7 +774,12 @@ void iproc_pll_clk_setup(struct device_node *node,
iclk = &iclk_array[0]; iclk = &iclk_array[0];
iclk->pll = pll; 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.ops = &iproc_pll_ops;
init.flags = 0; init.flags = 0;
parent_name = of_clk_get_parent_name(node, 0); parent_name = of_clk_get_parent_name(node, 0);
...@@ -793,13 +799,11 @@ void iproc_pll_clk_setup(struct device_node *node, ...@@ -793,13 +799,11 @@ void iproc_pll_clk_setup(struct device_node *node,
goto err_pll_register; goto err_pll_register;
clk_data->hws[0] = &iclk->hw; clk_data->hws[0] = &iclk->hw;
parent_name = clk_name;
/* now initialize and register all leaf clocks */ /* now initialize and register all leaf clocks */
for (i = 1; i < num_clks; i++) { for (i = 1; i < num_clks; i++) {
const char *clk_name;
memset(&init, 0, sizeof(init)); memset(&init, 0, sizeof(init));
parent_name = node->name;
ret = of_property_read_string_index(node, "clock-output-names", ret = of_property_read_string_index(node, "clock-output-names",
i, &clk_name); i, &clk_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment