Skip to content

Commit

Permalink
clockevents: ARM sp804: obtain sp804 timer rate via clks
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Russell King <[email protected]>
  • Loading branch information
Russell King committed May 23, 2011
1 parent 57cc4f7 commit 23828a7
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 8 deletions.
16 changes: 8 additions & 8 deletions arch/arm/common/timer-sp.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,6 @@

#include <asm/hardware/arm_timer.h>

/*
* These timers are currently always setup to be clocked at 1MHz.
*/
#define TIMER_FREQ_KHZ (1000)
#define TIMER_RELOAD (TIMER_FREQ_KHZ * 1000 / HZ)

static long __init sp804_get_clock_rate(const char *name)
{
struct clk *clk;
Expand Down Expand Up @@ -84,6 +78,7 @@ void __init sp804_clocksource_init(void __iomem *base, const char *name)


static void __iomem *clkevt_base;
static unsigned long clkevt_reload;

/*
* IRQ handler for the timer
Expand All @@ -109,7 +104,7 @@ static void sp804_set_mode(enum clock_event_mode mode,

switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
writel(TIMER_RELOAD, clkevt_base + TIMER_LOAD);
writel(clkevt_reload, clkevt_base + TIMER_LOAD);
ctrl |= TIMER_CTRL_PERIODIC | TIMER_CTRL_ENABLE;
break;

Expand Down Expand Up @@ -158,12 +153,17 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq,
const char *name)
{
struct clock_event_device *evt = &sp804_clockevent;
long rate = sp804_get_clock_rate(name);

if (rate < 0)
return;

clkevt_base = base;
clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ);

evt->name = name;
evt->irq = irq;
evt->mult = div_sc(TIMER_FREQ_KHZ, NSEC_PER_MSEC, evt->shift);
evt->mult = div_sc(rate, NSEC_PER_SEC, evt->shift);
evt->max_delta_ns = clockevent_delta2ns(0xffffffff, evt);
evt->min_delta_ns = clockevent_delta2ns(0xf, evt);

Expand Down
4 changes: 4 additions & 0 deletions arch/arm/mach-vexpress/ct-ca9x4.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,10 @@ static struct clk_lookup lookups[] = {
{ /* CLCD */
.dev_id = "ct:clcd",
.clk = &osc1_clk,
}, { /* SP804 timers */
.dev_id = "sp804",
.con_id = "ct-timer0",
.clk = &ct_sp804_clk,
}, { /* SP804 timers */
.dev_id = "sp804",
.con_id = "ct-timer1",
Expand Down
4 changes: 4 additions & 0 deletions arch/arm/mach-vexpress/v2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,10 @@ static struct clk_lookup v2m_lookups[] = {
}, { /* CLCD */
.dev_id = "mb:clcd",
.clk = &osc1_clk,
}, { /* SP804 timers */
.dev_id = "sp804",
.con_id = "v2m-timer0",
.clk = &v2m_sp804_clk,
}, { /* SP804 timers */
.dev_id = "sp804",
.con_id = "v2m-timer1",
Expand Down

0 comments on commit 23828a7

Please sign in to comment.