diff mbox

[v3,05/16] ARM: mvebu: remove device tree parsing for cpu nodes

Message ID 1374492747-13879-6-git-send-email-Sudeep.KarkadaNagesha@arm.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Sudeep KarkadaNagesha July 22, 2013, 11:32 a.m. UTC
From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Currently set_secondary_cpus_clock assume the CPU logical ordering
and the MPDIR in DT are same, which is incorrect.

Since the CPU device nodes can be retrieved in the logical ordering
using the DT helper, we can remove the devices tree parsing.

This patch removes DT parsing by making use of of_get_cpu_node.

Cc: Gregory Clement <gregory.clement@free-electrons.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Jason Cooper <jason@lakedaemon.net>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm/mach-mvebu/platsmp.c | 52 ++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 28 deletions(-)

Comments

Sudeep KarkadaNagesha Aug. 1, 2013, 9:54 a.m. UTC | #1
On 22/07/13 12:32, Sudeep KarkadaNagesha wrote:
> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> 
> Currently set_secondary_cpus_clock assume the CPU logical ordering
> and the MPDIR in DT are same, which is incorrect.
> 
> Since the CPU device nodes can be retrieved in the logical ordering
> using the DT helper, we can remove the devices tree parsing.
> 
> This patch removes DT parsing by making use of of_get_cpu_node.
> 
> Cc: Gregory Clement <gregory.clement@free-electrons.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Jason Cooper <jason@lakedaemon.net>
> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Hi Gregory/Andrew/Jason,

Does this change look fine for mvebu?
If yes, can I have your ACKs ?

Regards,
Sudeep
> ---
>  arch/arm/mach-mvebu/platsmp.c | 52 ++++++++++++++++++++-----------------------
>  1 file changed, 24 insertions(+), 28 deletions(-)
> 
> diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
> index ce81d30..001dd42 100644
> --- a/arch/arm/mach-mvebu/platsmp.c
> +++ b/arch/arm/mach-mvebu/platsmp.c
> @@ -23,51 +23,47 @@
>  #include <linux/of.h>
>  #include <linux/mbus.h>
>  #include <asm/cacheflush.h>
> +#include <asm/prom.h>
>  #include <asm/smp_plat.h>
>  #include "common.h"
>  #include "armada-370-xp.h"
>  #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);
> +
> +	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);
>  	}
>  }
>  
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jason Cooper Aug. 1, 2013, 12:02 p.m. UTC | #2
Sudeep,

On Thu, Aug 01, 2013 at 10:54:44AM +0100, Sudeep KarkadaNagesha wrote:
> On 22/07/13 12:32, Sudeep KarkadaNagesha wrote:
> > From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> > 
> > Currently set_secondary_cpus_clock assume the CPU logical ordering
> > and the MPDIR in DT are same, which is incorrect.
> > 
> > Since the CPU device nodes can be retrieved in the logical ordering
> > using the DT helper, we can remove the devices tree parsing.
> > 
> > This patch removes DT parsing by making use of of_get_cpu_node.
> > 
> > Cc: Gregory Clement <gregory.clement@free-electrons.com>
> > Cc: Andrew Lunn <andrew@lunn.ch>
> > Cc: Jason Cooper <jason@lakedaemon.net>
> > Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> 
> Hi Gregory/Andrew/Jason,
> 
> Does this change look fine for mvebu?
> If yes, can I have your ACKs ?

Gregory is the one best suited to review/Ack this.  He'll be back on
Monday.

thx,

Jason.

> 
> Regards,
> Sudeep
> > ---
> >  arch/arm/mach-mvebu/platsmp.c | 52 ++++++++++++++++++++-----------------------
> >  1 file changed, 24 insertions(+), 28 deletions(-)
> > 
> > diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
> > index ce81d30..001dd42 100644
> > --- a/arch/arm/mach-mvebu/platsmp.c
> > +++ b/arch/arm/mach-mvebu/platsmp.c
> > @@ -23,51 +23,47 @@
> >  #include <linux/of.h>
> >  #include <linux/mbus.h>
> >  #include <asm/cacheflush.h>
> > +#include <asm/prom.h>
> >  #include <asm/smp_plat.h>
> >  #include "common.h"
> >  #include "armada-370-xp.h"
> >  #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);
> > +
> > +	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);
> >  	}
> >  }
> >  
> > 
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sudeep KarkadaNagesha Aug. 5, 2013, 4:28 p.m. UTC | #3
On 01/08/13 13:02, Jason Cooper wrote:
> Sudeep,
> 
> On Thu, Aug 01, 2013 at 10:54:44AM +0100, Sudeep KarkadaNagesha wrote:
>> On 22/07/13 12:32, Sudeep KarkadaNagesha wrote:
>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>
>>> Currently set_secondary_cpus_clock assume the CPU logical ordering
>>> and the MPDIR in DT are same, which is incorrect.
>>>
>>> Since the CPU device nodes can be retrieved in the logical ordering
>>> using the DT helper, we can remove the devices tree parsing.
>>>
>>> This patch removes DT parsing by making use of of_get_cpu_node.
>>>
>>> Cc: Gregory Clement <gregory.clement@free-electrons.com>
>>> Cc: Andrew Lunn <andrew@lunn.ch>
>>> Cc: Jason Cooper <jason@lakedaemon.net>
>>> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>
>> Hi Gregory/Andrew/Jason,
>>
>> Does this change look fine for mvebu?
>> If yes, can I have your ACKs ?
> 
> Gregory is the one best suited to review/Ack this.  He'll be back on
> Monday.
> 
Hi Gregory,

Can you please review this patch ?

Regards,
Sudeep
>>> ---
>>>  arch/arm/mach-mvebu/platsmp.c | 52 ++++++++++++++++++++-----------------------
>>>  1 file changed, 24 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
>>> index ce81d30..001dd42 100644
>>> --- a/arch/arm/mach-mvebu/platsmp.c
>>> +++ b/arch/arm/mach-mvebu/platsmp.c
>>> @@ -23,51 +23,47 @@
>>>  #include <linux/of.h>
>>>  #include <linux/mbus.h>
>>>  #include <asm/cacheflush.h>
>>> +#include <asm/prom.h>
>>>  #include <asm/smp_plat.h>
>>>  #include "common.h"
>>>  #include "armada-370-xp.h"
>>>  #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);
>>> +
>>> +	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);
>>>  	}
>>>  }
>>>  
>>>
>>
>>
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Gregory CLEMENT Aug. 6, 2013, 8:25 a.m. UTC | #4
On 05/08/2013 18:28, Sudeep KarkadaNagesha wrote:
> On 01/08/13 13:02, Jason Cooper wrote:
>> Sudeep,
>>
>> On Thu, Aug 01, 2013 at 10:54:44AM +0100, Sudeep KarkadaNagesha wrote:
>>> On 22/07/13 12:32, Sudeep KarkadaNagesha wrote:
>>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>>
>>>> Currently set_secondary_cpus_clock assume the CPU logical ordering
>>>> and the MPDIR in DT are same, which is incorrect.
>>>>
>>>> Since the CPU device nodes can be retrieved in the logical ordering
>>>> using the DT helper, we can remove the devices tree parsing.
>>>>
>>>> This patch removes DT parsing by making use of of_get_cpu_node.
>>>>
>>>> Cc: Gregory Clement <gregory.clement@free-electrons.com>
>>>> Cc: Andrew Lunn <andrew@lunn.ch>
>>>> Cc: Jason Cooper <jason@lakedaemon.net>
>>>> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>
>>> Hi Gregory/Andrew/Jason,
>>>
>>> Does this change look fine for mvebu?
>>> If yes, can I have your ACKs ?
>>
>> Gregory is the one best suited to review/Ack this.  He'll be back on
>> Monday.
>>
> Hi Gregory,
> 
> Can you please review this patch ?

Your patch is a nice improvement, I reviewed it and I also tested it on the
Armada XP DB board.

You can add my:
Acked-by: Gregory Clement <gregory.clement@free-electrons.com>

> 
> Regards,
> Sudeep
>>>> ---
>>>>  arch/arm/mach-mvebu/platsmp.c | 52 ++++++++++++++++++++-----------------------
>>>>  1 file changed, 24 insertions(+), 28 deletions(-)
>>>>
>>>> diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
>>>> index ce81d30..001dd42 100644
>>>> --- a/arch/arm/mach-mvebu/platsmp.c
>>>> +++ b/arch/arm/mach-mvebu/platsmp.c
>>>> @@ -23,51 +23,47 @@
>>>>  #include <linux/of.h>
>>>>  #include <linux/mbus.h>
>>>>  #include <asm/cacheflush.h>
>>>> +#include <asm/prom.h>
>>>>  #include <asm/smp_plat.h>
>>>>  #include "common.h"
>>>>  #include "armada-370-xp.h"
>>>>  #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);
>>>> +
>>>> +	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);
>>>>  	}
>>>>  }
>>>>  
>>>>
>>>
>>>
>>
> 
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
Sudeep KarkadaNagesha Aug. 6, 2013, 9:02 a.m. UTC | #5
On 06/08/13 09:25, Gregory CLEMENT wrote:
> On 05/08/2013 18:28, Sudeep KarkadaNagesha wrote:
>> On 01/08/13 13:02, Jason Cooper wrote:
>>> Sudeep,
>>>
>>> On Thu, Aug 01, 2013 at 10:54:44AM +0100, Sudeep KarkadaNagesha wrote:
>>>> On 22/07/13 12:32, Sudeep KarkadaNagesha wrote:
>>>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>>>
>>>>> Currently set_secondary_cpus_clock assume the CPU logical ordering
>>>>> and the MPDIR in DT are same, which is incorrect.
>>>>>
>>>>> Since the CPU device nodes can be retrieved in the logical ordering
>>>>> using the DT helper, we can remove the devices tree parsing.
>>>>>
>>>>> This patch removes DT parsing by making use of of_get_cpu_node.
>>>>>
>>>>> Cc: Gregory Clement <gregory.clement@free-electrons.com>
>>>>> Cc: Andrew Lunn <andrew@lunn.ch>
>>>>> Cc: Jason Cooper <jason@lakedaemon.net>
>>>>> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>>
>>>> Hi Gregory/Andrew/Jason,
>>>>
>>>> Does this change look fine for mvebu?
>>>> If yes, can I have your ACKs ?
>>>
>>> Gregory is the one best suited to review/Ack this.  He'll be back on
>>> Monday.
>>>
>> Hi Gregory,
>>
>> Can you please review this patch ?
> 
> Your patch is a nice improvement, I reviewed it and I also tested it on the
> Armada XP DB board.
> 
> You can add my:
> Acked-by: Gregory Clement <gregory.clement@free-electrons.com>

Thanks Gregory.

Regards,
Sudeep


--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
index ce81d30..001dd42 100644
--- a/arch/arm/mach-mvebu/platsmp.c
+++ b/arch/arm/mach-mvebu/platsmp.c
@@ -23,51 +23,47 @@ 
 #include <linux/of.h>
 #include <linux/mbus.h>
 #include <asm/cacheflush.h>
+#include <asm/prom.h>
 #include <asm/smp_plat.h>
 #include "common.h"
 #include "armada-370-xp.h"
 #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);
+
+	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);
 	}
 }