aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/common/timer-sp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/common/timer-sp.c')
-rw-r--r--arch/arm/common/timer-sp.c30
1 files changed, 6 insertions, 24 deletions
diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c
index 6ef3342153b9..445b05ee8511 100644
--- a/arch/arm/common/timer-sp.c
+++ b/arch/arm/common/timer-sp.c
@@ -32,35 +32,17 @@
32#define TIMER_FREQ_KHZ (1000) 32#define TIMER_FREQ_KHZ (1000)
33#define TIMER_RELOAD (TIMER_FREQ_KHZ * 1000 / HZ) 33#define TIMER_RELOAD (TIMER_FREQ_KHZ * 1000 / HZ)
34 34
35static void __iomem *clksrc_base;
36
37static cycle_t sp804_read(struct clocksource *cs)
38{
39 return ~readl(clksrc_base + TIMER_VALUE);
40}
41
42static struct clocksource clocksource_sp804 = {
43 .name = "timer3",
44 .rating = 200,
45 .read = sp804_read,
46 .mask = CLOCKSOURCE_MASK(32),
47 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
48};
49
50void __init sp804_clocksource_init(void __iomem *base) 35void __init sp804_clocksource_init(void __iomem *base)
51{ 36{
52 struct clocksource *cs = &clocksource_sp804;
53
54 clksrc_base = base;
55
56 /* setup timer 0 as free-running clocksource */ 37 /* setup timer 0 as free-running clocksource */
57 writel(0, clksrc_base + TIMER_CTRL); 38 writel(0, base + TIMER_CTRL);
58 writel(0xffffffff, clksrc_base + TIMER_LOAD); 39 writel(0xffffffff, base + TIMER_LOAD);
59 writel(0xffffffff, clksrc_base + TIMER_VALUE); 40 writel(0xffffffff, base + TIMER_VALUE);
60 writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, 41 writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
61 clksrc_base + TIMER_CTRL); 42 base + TIMER_CTRL);
62 43
63 clocksource_register_khz(cs, TIMER_FREQ_KHZ); 44 clocksource_mmio_init(base + TIMER_VALUE, "timer3",
45 TIMER_FREQ_KHZ * 1000, 200, 32, clocksource_mmio_readl_down);
64} 46}
65 47
66 48