Skip to content

Commit ec7957a

Browse files
linuswbebarino
authored andcommitted
clk: versatile: sp810: support reentrance
Despite care take to allocate clocks state containers the SP810 driver actually just supports creating one instance: all clocks registered for every instance will end up with the exact same name and __clk_init() will fail. Rename the timclken<0> .. timclken<n> to sp810_<instance>_<n> so every clock on every instance gets a unique name. This is necessary for the RealView PBA8 which has two SP810 blocks: the second block will not register its clocks unless every clock on every instance is unique and results in boot logs like this: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at ../drivers/clk/versatile/clk-sp810.c:137 clk_sp810_of_setup+0x110/0x154() Modules linked in: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.5.0-rc2-00030-g352718fc39f6-dirty torvalds#225 Hardware name: ARM RealView Machine (Device Tree Support) [<c00167f8>] (unwind_backtrace) from [<c0013204>] (show_stack+0x10/0x14) [<c0013204>] (show_stack) from [<c01a049c>] (dump_stack+0x84/0x9c) [<c01a049c>] (dump_stack) from [<c0024990>] (warn_slowpath_common+0x74/0xb0) [<c0024990>] (warn_slowpath_common) from [<c0024a68>] (warn_slowpath_null+0x1c/0x24) [<c0024a68>] (warn_slowpath_null) from [<c051eb44>] (clk_sp810_of_setup+0x110/0x154) [<c051eb44>] (clk_sp810_of_setup) from [<c051e3a4>] (of_clk_init+0x12c/0x1c8) [<c051e3a4>] (of_clk_init) from [<c0504714>] (time_init+0x20/0x2c) [<c0504714>] (time_init) from [<c0501b18>] (start_kernel+0x244/0x3c4) [<c0501b18>] (start_kernel) from [<7000807c>] (0x7000807c) ---[ end trace cb88537fdc8fa200 ]--- Cc: Michael Turquette <[email protected]> Cc: Pawel Moll <[email protected]> Fixes: 6e973d2 "clk: vexpress: Add separate SP810 driver" Signed-off-by: Linus Walleij <[email protected]> Signed-off-by: Stephen Boyd <[email protected]>
1 parent 2da5f5d commit ec7957a

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/clk/versatile/clk-sp810.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ static void __init clk_sp810_of_setup(struct device_node *node)
9292
int num = ARRAY_SIZE(parent_names);
9393
char name[12];
9494
struct clk_init_data init;
95+
static int instance;
9596
int i;
9697
bool deprecated;
9798

@@ -117,7 +118,7 @@ static void __init clk_sp810_of_setup(struct device_node *node)
117118
deprecated = !of_find_property(node, "assigned-clock-parents", NULL);
118119

119120
for (i = 0; i < ARRAY_SIZE(sp810->timerclken); i++) {
120-
snprintf(name, ARRAY_SIZE(name), "timerclken%d", i);
121+
snprintf(name, sizeof(name), "sp810_%d_%d", instance, i);
121122

122123
sp810->timerclken[i].sp810 = sp810;
123124
sp810->timerclken[i].channel = i;
@@ -138,5 +139,6 @@ static void __init clk_sp810_of_setup(struct device_node *node)
138139
}
139140

140141
of_clk_add_provider(node, clk_sp810_timerclken_of_get, sp810);
142+
instance++;
141143
}
142144
CLK_OF_DECLARE(sp810, "arm,sp810", clk_sp810_of_setup);

0 commit comments

Comments
 (0)