X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Farm%2Fmach-clps711x%2Ftime.c;h=428493dd4687a73c6512ba1a3ec4ed2716e8407a;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=8a02e18a899ad912ac80b0ee3be389821ed3a523;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c index 8a02e18a8..428493dd4 100644 --- a/arch/arm/mach-clps711x/time.c +++ b/arch/arm/mach-clps711x/time.c @@ -18,12 +18,18 @@ */ #include #include +#include +#include +#include #include +#include +#include #include #include -extern unsigned long (*gettimeoffset)(void); +#include + /* * gettimeoffset() returns time since last timer tick, in usecs. @@ -38,20 +44,43 @@ static unsigned long clps711x_gettimeoffset(void) return (hwticks * (tick_nsec / 1000)) / LATCH; } -void __init clps711x_setup_timer(void) +/* + * IRQ handler for the timer + */ +static irqreturn_t +p720t_timer_interrupt(int irq, void *dev_id) +{ + write_seqlock(&xtime_lock); + timer_tick(); + write_sequnlock(&xtime_lock); + return IRQ_HANDLED; +} + +static struct irqaction clps711x_timer_irq = { + .name = "CLPS711x Timer Tick", + .flags = IRQF_DISABLED | IRQF_TIMER, + .handler = p720t_timer_interrupt, +}; + +static void __init clps711x_timer_init(void) { struct timespec tv; unsigned int syscon; - gettimeoffset = clps711x_gettimeoffset; - syscon = clps_readl(SYSCON1); syscon |= SYSCON1_TC2S | SYSCON1_TC2M; clps_writel(syscon, SYSCON1); clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */ + setup_irq(IRQ_TC2OI, &clps711x_timer_irq); + tv.tv_nsec = 0; tv.tv_sec = clps_readl(RTCDR); do_settimeofday(&tv); } + +struct sys_timer clps711x_timer = { + .init = clps711x_timer_init, + .offset = clps711x_gettimeoffset, +};