|
@@ -29,45 +29,40 @@
|
|
|
#include "pmsu.h"
|
|
|
#include "coherency.h"
|
|
|
|
|
|
+static struct clk *__init get_cpu_clk(int cpu)
|
|
|
+{
|
|
|
+ struct clk *cpu_clk;
|
|
|
+ struct device_node *np = of_get_cpu_node(cpu, NULL);
|
|
|
+
|
|
|
+ if (WARN(!np, "missing cpu node\n"))
|
|
|
+ return NULL;
|
|
|
+ cpu_clk = of_clk_get(np, 0);
|
|
|
+ if (WARN_ON(IS_ERR(cpu_clk)))
|
|
|
+ return NULL;
|
|
|
+ return cpu_clk;
|
|
|
+}
|
|
|
+
|
|
|
void __init set_secondary_cpus_clock(void)
|
|
|
{
|
|
|
- int thiscpu;
|
|
|
+ int thiscpu, cpu;
|
|
|
unsigned long rate;
|
|
|
- struct clk *cpu_clk = NULL;
|
|
|
- struct device_node *np = NULL;
|
|
|
+ struct clk *cpu_clk;
|
|
|
|
|
|
thiscpu = smp_processor_id();
|
|
|
- for_each_node_by_type(np, "cpu") {
|
|
|
- int err;
|
|
|
- int cpu;
|
|
|
-
|
|
|
- err = of_property_read_u32(np, "reg", &cpu);
|
|
|
- if (WARN_ON(err))
|
|
|
- return;
|
|
|
-
|
|
|
- if (cpu == thiscpu) {
|
|
|
- cpu_clk = of_clk_get(np, 0);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (WARN_ON(IS_ERR(cpu_clk)))
|
|
|
+ cpu_clk = get_cpu_clk(thiscpu);
|
|
|
+ if (!cpu_clk)
|
|
|
return;
|
|
|
clk_prepare_enable(cpu_clk);
|
|
|
rate = clk_get_rate(cpu_clk);
|
|
|
|
|
|
/* set all the other CPU clk to the same rate than the boot CPU */
|
|
|
- for_each_node_by_type(np, "cpu") {
|
|
|
- int err;
|
|
|
- int cpu;
|
|
|
-
|
|
|
- err = of_property_read_u32(np, "reg", &cpu);
|
|
|
- if (WARN_ON(err))
|
|
|
+ for_each_possible_cpu(cpu) {
|
|
|
+ if (cpu == thiscpu)
|
|
|
+ continue;
|
|
|
+ cpu_clk = get_cpu_clk(cpu);
|
|
|
+ if (!cpu_clk)
|
|
|
return;
|
|
|
-
|
|
|
- if (cpu != thiscpu) {
|
|
|
- cpu_clk = of_clk_get(np, 0);
|
|
|
- clk_set_rate(cpu_clk, rate);
|
|
|
- }
|
|
|
+ clk_set_rate(cpu_clk, rate);
|
|
|
}
|
|
|
}
|
|
|
|