[PATCH v3 6/7] ARM: smp_twd: add clock api support

Rob Herring robherring2 at gmail.com
Tue Mar 15 08:40:58 EDT 2011


Colin,

On 03/14/2011 09:35 PM, Colin Cross wrote:
> On Tue, Mar 8, 2011 at 3:34 PM, Rob Herring<robherring2 at gmail.com>  wrote:
>> From: Rob Herring<rob.herring at calxeda.com>
>>
>> The private timer freq is currently dynamically detected
>> using jiffies count to determine the rate. This method adds
>> a delay to boot-up, so use the clock api instead to get the
>> clock rate.
>>
>> Signed-off-by: Rob Herring<rob.herring at calxeda.com>
>> ---
>> v3: Save struct clk pointer for later use (cpufreq).
>>
>>   arch/arm/include/asm/smp_twd.h |    1 +
>>   arch/arm/kernel/smp_twd.c      |   14 ++++++++++++++
>>   2 files changed, 15 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h
>> index fed9981..6b0f591 100644
>> --- a/arch/arm/include/asm/smp_twd.h
>> +++ b/arch/arm/include/asm/smp_twd.h
>> @@ -24,5 +24,6 @@ extern void __iomem *twd_base;
>>
>>   int twd_timer_ack(void);
>>   void twd_timer_setup(struct clock_event_device *);
>> +void twd_timer_init(void __iomem *base);
>>
>>   #endif
>> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
>> index 60636f4..cce1171 100644
>> --- a/arch/arm/kernel/smp_twd.c
>> +++ b/arch/arm/kernel/smp_twd.c
>> @@ -8,6 +8,8 @@
>>   * it under the terms of the GNU General Public License version 2 as
>>   * published by the Free Software Foundation.
>>   */
>> +#include<linux/clk.h>
>> +#include<linux/err.h>
>>   #include<linux/init.h>
>>   #include<linux/kernel.h>
>>   #include<linux/delay.h>
>> @@ -24,6 +26,7 @@
>>   /* set up by the platform code */
>>   void __iomem *twd_base;
>>
>> +static struct clk *twd_clk;
>>   static unsigned long twd_timer_rate;
>>
>>   static void twd_set_mode(enum clock_event_mode mode,
>> @@ -142,3 +145,14 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
>>
>>         clockevents_register_device(clk);
>>   }
>> +
>> +void __init twd_timer_init(void __iomem *base)
>> +{
>> +       twd_clk = clk_get_sys("smp_twd", NULL);
>> +       if (!IS_ERR(twd_clk))
>> +               twd_timer_rate = clk_get_rate(twd_clk);
>> +       else
>> +               twd_clk = NULL;
>> +
>> +       twd_base = base;
>> +}
> Why not leave the old twd_base intitialization and put the clock stuff
> in twd_timer_setup?

Well the original patch had base addr and a struct clk pointer passed in 
for this function. So replacing the variable setting in platform code 
with this function made sense then. Setting variables like twd_base 
directly is generally disliked.

twd_timer_setup is called for each core, so it is probably cleaner to 
have global init and per core init separate. Although, the clock could 
be per core in future chips.

>
> Would it make sense to drop twd_calibrate_rate entirely and require a twd clock?

Yes I would like to, but the clock needs to be added to every platform 
before twd_calibrate_rate could be removed.

Rob



More information about the linux-arm-kernel mailing list