Skip to content

Commit 8520495

Browse files
Tero Kristobebarino
authored andcommitted
clk: ti: clkctrl: convert subclocks to use proper names also
Addition of the new internal API to get the clkctrl names missed adding the same conversion in place for the subclocks. This leads into missed parent/child relationships (i.e. orphaned clocks) with mixed node name handling, for example with omap4/omap5 where the l4_per clocks are using new naming, but rest are using old. Fix by converting the subclock registration to pick correct names for the clocks also. Fixes: 6c30905 ("clk: ti: clkctrl: Fix hidden dependency to node name") Signed-off-by: Tero Kristo <[email protected]> Link: https://lkml.kernel.org/r/[email protected] Acked-by: Tony Lindgren <[email protected]> Signed-off-by: Stephen Boyd <[email protected]>
1 parent dc6dbd5 commit 8520495

File tree

1 file changed

+48
-50
lines changed

1 file changed

+48
-50
lines changed

drivers/clk/ti/clkctrl.c

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -255,24 +255,53 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
255255
return entry->clk;
256256
}
257257

258+
/* Get clkctrl clock base name based on clkctrl_name or dts node */
259+
static const char * __init clkctrl_get_clock_name(struct device_node *np,
260+
const char *clkctrl_name,
261+
int offset, int index,
262+
bool legacy_naming)
263+
{
264+
char *clock_name;
265+
266+
/* l4per-clkctrl:1234:0 style naming based on clkctrl_name */
267+
if (clkctrl_name && !legacy_naming) {
268+
clock_name = kasprintf(GFP_KERNEL, "%s-clkctrl:%04x:%d",
269+
clkctrl_name, offset, index);
270+
strreplace(clock_name, '_', '-');
271+
272+
return clock_name;
273+
}
274+
275+
/* l4per:1234:0 old style naming based on clkctrl_name */
276+
if (clkctrl_name)
277+
return kasprintf(GFP_KERNEL, "%s_cm:clk:%04x:%d",
278+
clkctrl_name, offset, index);
279+
280+
/* l4per_cm:1234:0 old style naming based on parent node name */
281+
if (legacy_naming)
282+
return kasprintf(GFP_KERNEL, "%pOFn:clk:%04x:%d",
283+
np->parent, offset, index);
284+
285+
/* l4per-clkctrl:1234:0 style naming based on node name */
286+
return kasprintf(GFP_KERNEL, "%pOFn:%04x:%d", np, offset, index);
287+
}
288+
258289
static int __init
259290
_ti_clkctrl_clk_register(struct omap_clkctrl_provider *provider,
260291
struct device_node *node, struct clk_hw *clk_hw,
261292
u16 offset, u8 bit, const char * const *parents,
262-
int num_parents, const struct clk_ops *ops)
293+
int num_parents, const struct clk_ops *ops,
294+
const char *clkctrl_name)
263295
{
264296
struct clk_init_data init = { NULL };
265297
struct clk *clk;
266298
struct omap_clkctrl_clk *clkctrl_clk;
267299
int ret = 0;
268300

269-
if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
270-
init.name = kasprintf(GFP_KERNEL, "%pOFn:%pOFn:%04x:%d",
271-
node->parent, node, offset,
272-
bit);
273-
else
274-
init.name = kasprintf(GFP_KERNEL, "%pOFn:%04x:%d", node,
275-
offset, bit);
301+
init.name = clkctrl_get_clock_name(node, clkctrl_name, offset, bit,
302+
ti_clk_get_features()->flags &
303+
TI_CLK_CLKCTRL_COMPAT);
304+
276305
clkctrl_clk = kzalloc(sizeof(*clkctrl_clk), GFP_KERNEL);
277306
if (!init.name || !clkctrl_clk) {
278307
ret = -ENOMEM;
@@ -309,7 +338,7 @@ static void __init
309338
_ti_clkctrl_setup_gate(struct omap_clkctrl_provider *provider,
310339
struct device_node *node, u16 offset,
311340
const struct omap_clkctrl_bit_data *data,
312-
void __iomem *reg)
341+
void __iomem *reg, const char *clkctrl_name)
313342
{
314343
struct clk_hw_omap *clk_hw;
315344

@@ -322,15 +351,15 @@ _ti_clkctrl_setup_gate(struct omap_clkctrl_provider *provider,
322351

323352
if (_ti_clkctrl_clk_register(provider, node, &clk_hw->hw, offset,
324353
data->bit, data->parents, 1,
325-
&omap_gate_clk_ops))
354+
&omap_gate_clk_ops, clkctrl_name))
326355
kfree(clk_hw);
327356
}
328357

329358
static void __init
330359
_ti_clkctrl_setup_mux(struct omap_clkctrl_provider *provider,
331360
struct device_node *node, u16 offset,
332361
const struct omap_clkctrl_bit_data *data,
333-
void __iomem *reg)
362+
void __iomem *reg, const char *clkctrl_name)
334363
{
335364
struct clk_omap_mux *mux;
336365
int num_parents = 0;
@@ -357,15 +386,15 @@ _ti_clkctrl_setup_mux(struct omap_clkctrl_provider *provider,
357386

358387
if (_ti_clkctrl_clk_register(provider, node, &mux->hw, offset,
359388
data->bit, data->parents, num_parents,
360-
&ti_clk_mux_ops))
389+
&ti_clk_mux_ops, clkctrl_name))
361390
kfree(mux);
362391
}
363392

364393
static void __init
365394
_ti_clkctrl_setup_div(struct omap_clkctrl_provider *provider,
366395
struct device_node *node, u16 offset,
367396
const struct omap_clkctrl_bit_data *data,
368-
void __iomem *reg)
397+
void __iomem *reg, const char *clkctrl_name)
369398
{
370399
struct clk_omap_divider *div;
371400
const struct omap_clkctrl_div_data *div_data = data->data;
@@ -393,15 +422,15 @@ _ti_clkctrl_setup_div(struct omap_clkctrl_provider *provider,
393422

394423
if (_ti_clkctrl_clk_register(provider, node, &div->hw, offset,
395424
data->bit, data->parents, 1,
396-
&ti_clk_divider_ops))
425+
&ti_clk_divider_ops, clkctrl_name))
397426
kfree(div);
398427
}
399428

400429
static void __init
401430
_ti_clkctrl_setup_subclks(struct omap_clkctrl_provider *provider,
402431
struct device_node *node,
403432
const struct omap_clkctrl_reg_data *data,
404-
void __iomem *reg)
433+
void __iomem *reg, const char *clkctrl_name)
405434
{
406435
const struct omap_clkctrl_bit_data *bits = data->bit_data;
407436

@@ -412,17 +441,17 @@ _ti_clkctrl_setup_subclks(struct omap_clkctrl_provider *provider,
412441
switch (bits->type) {
413442
case TI_CLK_GATE:
414443
_ti_clkctrl_setup_gate(provider, node, data->offset,
415-
bits, reg);
444+
bits, reg, clkctrl_name);
416445
break;
417446

418447
case TI_CLK_DIVIDER:
419448
_ti_clkctrl_setup_div(provider, node, data->offset,
420-
bits, reg);
449+
bits, reg, clkctrl_name);
421450
break;
422451

423452
case TI_CLK_MUX:
424453
_ti_clkctrl_setup_mux(provider, node, data->offset,
425-
bits, reg);
454+
bits, reg, clkctrl_name);
426455
break;
427456

428457
default:
@@ -465,37 +494,6 @@ static char * __init clkctrl_get_name(struct device_node *np)
465494
return NULL;
466495
}
467496

468-
/* Get clkctrl clock base name based on clkctrl_name or dts node */
469-
static const char * __init clkctrl_get_clock_name(struct device_node *np,
470-
const char *clkctrl_name,
471-
int offset, int index,
472-
bool legacy_naming)
473-
{
474-
char *clock_name;
475-
476-
/* l4per-clkctrl:1234:0 style naming based on clkctrl_name */
477-
if (clkctrl_name && !legacy_naming) {
478-
clock_name = kasprintf(GFP_KERNEL, "%s-clkctrl:%04x:%d",
479-
clkctrl_name, offset, index);
480-
strreplace(clock_name, '_', '-');
481-
482-
return clock_name;
483-
}
484-
485-
/* l4per:1234:0 old style naming based on clkctrl_name */
486-
if (clkctrl_name)
487-
return kasprintf(GFP_KERNEL, "%s_cm:clk:%04x:%d",
488-
clkctrl_name, offset, index);
489-
490-
/* l4per_cm:1234:0 old style naming based on parent node name */
491-
if (legacy_naming)
492-
return kasprintf(GFP_KERNEL, "%pOFn:clk:%04x:%d",
493-
np->parent, offset, index);
494-
495-
/* l4per-clkctrl:1234:0 style naming based on node name */
496-
return kasprintf(GFP_KERNEL, "%pOFn:%04x:%d", np, offset, index);
497-
}
498-
499497
static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
500498
{
501499
struct omap_clkctrl_provider *provider;
@@ -663,7 +661,7 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
663661
hw->enable_reg.ptr = provider->base + reg_data->offset;
664662

665663
_ti_clkctrl_setup_subclks(provider, node, reg_data,
666-
hw->enable_reg.ptr);
664+
hw->enable_reg.ptr, clkctrl_name);
667665

668666
if (reg_data->flags & CLKF_SW_SUP)
669667
hw->enable_bit = MODULEMODE_SWCTRL;

0 commit comments

Comments
 (0)