Message ID | 20220905161504.1526-1-f.fainelli@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] clk: iproc: Do not rely on node name for correct PLL setup | expand |
Quoting Florian Fainelli (2022-09-05 09:15:03) > 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> > --- Applied to clk-fixes
diff --git a/drivers/clk/bcm/clk-iproc-pll.c b/drivers/clk/bcm/clk-iproc-pll.c index 1a098db12062..680f9d8d357c 100644 --- a/drivers/clk/bcm/clk-iproc-pll.c +++ b/drivers/clk/bcm/clk-iproc-pll.c @@ -726,6 +726,7 @@ void iproc_pll_clk_setup(struct device_node *node, 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; @@ -773,7 +774,12 @@ void iproc_pll_clk_setup(struct device_node *node, 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); @@ -793,13 +799,11 @@ void iproc_pll_clk_setup(struct device_node *node, 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);