On 19/03/16 15:36, Chen-Yu Tsai wrote: Hi Chen-Yu,
> Hi, > > On Fri, Mar 18, 2016 at 5:44 PM, Andre Przywara <andre.przyw...@arm.com> > wrote: >> From: Jens Kuske <jensku...@gmail.com> >> >> Currently, the sunxi clock driver gets the name for the base factor clock >> of divs clocks from the name field in factors_data. This prevents reusing >> of the factor clock for clocks with same properties, but different name. >> >> This commit makes the divs setup function try to get a name from >> clock-output-names in the devicetree. It also removes the name field where >> possible and merges the sun4i PLL5 and PLL6 clocks. >> >> [Andre: Make temporary name allocation dynamic.] >> >> Signed-off-by: Jens Kuske <jensku...@gmail.com> >> Signed-off-by: Andre Przywara <andre.przyw...@arm.com> >> --- >> Hi Maxime, >> >> sorry for the post during the merge window, but I wanted to get this >> going again: >> This is basically Jens' patch, but I removed the fixed 8 character >> name length limitation. >> Briefly tested on BananaPi and Pine64. >> >> Cheers, >> Andre. > > This patch looks good overall. Thanks! >> >> drivers/clk/sunxi/clk-sunxi.c | 40 +++++++++++++++++++++++++++++----------- >> 1 file changed, 29 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c >> index 99f60ef..8dbc5aa 100644 >> --- a/drivers/clk/sunxi/clk-sunxi.c >> +++ b/drivers/clk/sunxi/clk-sunxi.c >> @@ -523,21 +523,12 @@ static const struct factors_data sun4i_pll5_data >> __initconst = { >> .enable = 31, >> .table = &sun4i_pll5_config, >> .getter = sun4i_get_pll5_factors, >> - .name = "pll5", >> -}; >> - >> -static const struct factors_data sun4i_pll6_data __initconst = { >> - .enable = 31, >> - .table = &sun4i_pll5_config, >> - .getter = sun4i_get_pll5_factors, >> - .name = "pll6", >> }; >> >> static const struct factors_data sun6i_a31_pll6_data __initconst = { >> .enable = 31, >> .table = &sun6i_a31_pll6_config, >> .getter = sun6i_a31_get_pll6_factors, >> - .name = "pll6x2", >> }; >> >> static const struct factors_data sun5i_a13_ahb_data __initconst = { >> @@ -894,7 +885,7 @@ static const struct divs_data pll5_divs_data __initconst >> = { >> }; >> >> static const struct divs_data pll6_divs_data __initconst = { >> - .factors = &sun4i_pll6_data, >> + .factors = &sun4i_pll5_data, >> .ndivs = 4, >> .div = { >> { .shift = 0, .table = pll6_sata_tbl, .gate = 14 }, /* M, >> SATA */ >> @@ -936,6 +927,8 @@ static struct clk ** __init sunxi_divs_clk_setup(struct >> device_node *node, >> struct clk_gate *gate = NULL; >> struct clk_fixed_factor *fix_factor; >> struct clk_divider *divider; >> + struct factors_data factors = *data->factors; >> + char *derived_name = NULL; >> void __iomem *reg; >> int ndivs = SUNXI_DIVS_MAX_QTY, i = 0; >> int flags, clkflags; >> @@ -944,9 +937,34 @@ static struct clk ** __init sunxi_divs_clk_setup(struct >> device_node *node, >> if (data->ndivs) >> ndivs = data->ndivs; >> >> + /* Try to find a name for base factor clock */ >> + for (i = 0; i < ndivs; i++) { >> + if (data->div[i].self) { >> + of_property_read_string_index(node, >> "clock-output-names", >> + i, &factors.name); >> + break; >> + } >> + } >> + /* If we don't have a .self clk use the first output-name up to '_' >> */ >> + if (factors.name == NULL) { >> + char *endp; >> + >> + of_property_read_string_index(node, "clock-output-names", >> + 0, &clk_name); >> + endp = strchr(clk_name, '_'); >> + if (endp) { >> + derived_name = kstrndup(clk_name, endp - clk_name, >> + GFP_KERNEL); >> + factors.name = derived_name; >> + } else { >> + factors.name = clk_name; > > I wonder when we'd run into this case. Well, with the current DTs we wouldn't, but I rather have this line in here than provoking a kernel NULL pointer dereference if someone happens to name the first clock without an underscore in it. Maxime, are you happy with this patch for 4.7? Shall I rebase and repost? Cheers, Andre. > >> + } >> + } >> + >> /* Set up factor clock that we will be dividing */ >> - pclk = sunxi_factors_clk_setup(node, data->factors); >> + pclk = sunxi_factors_clk_setup(node, &factors); >> parent = __clk_get_name(pclk); >> + kfree(derived_name); >> >> reg = of_iomap(node, 0); >> >> -- >> 2.7.3 >> > -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.