diff options
-rw-r--r-- | arch/arm/mach-mvebu/platsmp.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c index ce81d3031405..594b63db4215 100644 --- a/arch/arm/mach-mvebu/platsmp.c +++ b/arch/arm/mach-mvebu/platsmp.c | |||
@@ -29,45 +29,40 @@ | |||
29 | #include "pmsu.h" | 29 | #include "pmsu.h" |
30 | #include "coherency.h" | 30 | #include "coherency.h" |
31 | 31 | ||
32 | static struct clk *__init get_cpu_clk(int cpu) | ||
33 | { | ||
34 | struct clk *cpu_clk; | ||
35 | struct device_node *np = of_get_cpu_node(cpu, NULL); | ||
36 | |||
37 | if (WARN(!np, "missing cpu node\n")) | ||
38 | return NULL; | ||
39 | cpu_clk = of_clk_get(np, 0); | ||
40 | if (WARN_ON(IS_ERR(cpu_clk))) | ||
41 | return NULL; | ||
42 | return cpu_clk; | ||
43 | } | ||
44 | |||
32 | void __init set_secondary_cpus_clock(void) | 45 | void __init set_secondary_cpus_clock(void) |
33 | { | 46 | { |
34 | int thiscpu; | 47 | int thiscpu, cpu; |
35 | unsigned long rate; | 48 | unsigned long rate; |
36 | struct clk *cpu_clk = NULL; | 49 | struct clk *cpu_clk; |
37 | struct device_node *np = NULL; | ||
38 | 50 | ||
39 | thiscpu = smp_processor_id(); | 51 | thiscpu = smp_processor_id(); |
40 | for_each_node_by_type(np, "cpu") { | 52 | cpu_clk = get_cpu_clk(thiscpu); |
41 | int err; | 53 | if (!cpu_clk) |
42 | int cpu; | ||
43 | |||
44 | err = of_property_read_u32(np, "reg", &cpu); | ||
45 | if (WARN_ON(err)) | ||
46 | return; | ||
47 | |||
48 | if (cpu == thiscpu) { | ||
49 | cpu_clk = of_clk_get(np, 0); | ||
50 | break; | ||
51 | } | ||
52 | } | ||
53 | if (WARN_ON(IS_ERR(cpu_clk))) | ||
54 | return; | 54 | return; |
55 | clk_prepare_enable(cpu_clk); | 55 | clk_prepare_enable(cpu_clk); |
56 | rate = clk_get_rate(cpu_clk); | 56 | rate = clk_get_rate(cpu_clk); |
57 | 57 | ||
58 | /* set all the other CPU clk to the same rate than the boot CPU */ | 58 | /* set all the other CPU clk to the same rate than the boot CPU */ |
59 | for_each_node_by_type(np, "cpu") { | 59 | for_each_possible_cpu(cpu) { |
60 | int err; | 60 | if (cpu == thiscpu) |
61 | int cpu; | 61 | continue; |
62 | 62 | cpu_clk = get_cpu_clk(cpu); | |
63 | err = of_property_read_u32(np, "reg", &cpu); | 63 | if (!cpu_clk) |
64 | if (WARN_ON(err)) | ||
65 | return; | 64 | return; |
66 | 65 | clk_set_rate(cpu_clk, rate); | |
67 | if (cpu != thiscpu) { | ||
68 | cpu_clk = of_clk_get(np, 0); | ||
69 | clk_set_rate(cpu_clk, rate); | ||
70 | } | ||
71 | } | 66 | } |
72 | } | 67 | } |
73 | 68 | ||