Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clockevents: ARM sp804: obtain sp804 timer rate via clks

This allows platforms to specify the rate of the SP804 clockevent via
the clk subsystem. While ARM boards clock these at 1MHz, BCMRing also
has SP804 timers but are clocked at different rates.

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

+16 -8
+8 -8
arch/arm/common/timer-sp.c
··· 28 28 29 29 #include <asm/hardware/arm_timer.h> 30 30 31 - /* 32 - * These timers are currently always setup to be clocked at 1MHz. 33 - */ 34 - #define TIMER_FREQ_KHZ (1000) 35 - #define TIMER_RELOAD (TIMER_FREQ_KHZ * 1000 / HZ) 36 - 37 31 static long __init sp804_get_clock_rate(const char *name) 38 32 { 39 33 struct clk *clk; ··· 78 84 79 85 80 86 static void __iomem *clkevt_base; 87 + static unsigned long clkevt_reload; 81 88 82 89 /* 83 90 * IRQ handler for the timer ··· 104 109 105 110 switch (mode) { 106 111 case CLOCK_EVT_MODE_PERIODIC: 107 - writel(TIMER_RELOAD, clkevt_base + TIMER_LOAD); 112 + writel(clkevt_reload, clkevt_base + TIMER_LOAD); 108 113 ctrl |= TIMER_CTRL_PERIODIC | TIMER_CTRL_ENABLE; 109 114 break; 110 115 ··· 153 158 const char *name) 154 159 { 155 160 struct clock_event_device *evt = &sp804_clockevent; 161 + long rate = sp804_get_clock_rate(name); 162 + 163 + if (rate < 0) 164 + return; 156 165 157 166 clkevt_base = base; 167 + clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ); 158 168 159 169 evt->name = name; 160 170 evt->irq = irq; 161 - evt->mult = div_sc(TIMER_FREQ_KHZ, NSEC_PER_MSEC, evt->shift); 171 + evt->mult = div_sc(rate, NSEC_PER_SEC, evt->shift); 162 172 evt->max_delta_ns = clockevent_delta2ns(0xffffffff, evt); 163 173 evt->min_delta_ns = clockevent_delta2ns(0xf, evt); 164 174
+4
arch/arm/mach-vexpress/ct-ca9x4.c
··· 152 152 .clk = &osc1_clk, 153 153 }, { /* SP804 timers */ 154 154 .dev_id = "sp804", 155 + .con_id = "ct-timer0", 156 + .clk = &ct_sp804_clk, 157 + }, { /* SP804 timers */ 158 + .dev_id = "sp804", 155 159 .con_id = "ct-timer1", 156 160 .clk = &ct_sp804_clk, 157 161 },
+4
arch/arm/mach-vexpress/v2m.c
··· 370 370 .clk = &osc1_clk, 371 371 }, { /* SP804 timers */ 372 372 .dev_id = "sp804", 373 + .con_id = "v2m-timer0", 374 + .clk = &v2m_sp804_clk, 375 + }, { /* SP804 timers */ 376 + .dev_id = "sp804", 373 377 .con_id = "v2m-timer1", 374 378 .clk = &v2m_sp804_clk, 375 379 },