diff options
| author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2009-05-15 23:47:02 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2009-06-12 20:39:48 +0200 | 
| commit | b54384e3ba6b5535751f317fcd3940a53eed0d3a (patch) | |
| tree | 2a2027057af7b2bf1817d530b2ee33ca33e4d660 /cpu/ixp/timer.c | |
| parent | 5b4bebe1d20c4f2b70d48b06aed1016785efcc25 (diff) | |
| download | olio-uboot-2014.01-b54384e3ba6b5535751f317fcd3940a53eed0d3a.tar.xz olio-uboot-2014.01-b54384e3ba6b5535751f317fcd3940a53eed0d3a.zip | |
arm: timer and interrupt init rework
actually the timer init use the interrupt_init as init callback
which make the interrupt and timer implementation difficult to follow
so now rename it as int timer_init(void) and use interrupt_init for interrupt
btw also remane the corresponding file to the functionnality implemented
as ixp arch implement two timer - one based on interrupt - so all the timer
related code is moved to timer.c
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Diffstat (limited to 'cpu/ixp/timer.c')
| -rw-r--r-- | cpu/ixp/timer.c | 54 | 
1 files changed, 54 insertions, 0 deletions
| diff --git a/cpu/ixp/timer.c b/cpu/ixp/timer.c index deb227a1a..685614966 100644 --- a/cpu/ixp/timer.c +++ b/cpu/ixp/timer.c @@ -32,6 +32,54 @@  #include <common.h>  #include <asm/arch/ixp425.h> +#ifdef CONFIG_TIMER_IRQ + +#define FREQ		66666666 +#define CLOCK_TICK_RATE	(((FREQ / CONFIG_SYS_HZ & ~IXP425_OST_RELOAD_MASK) + 1) * CONFIG_SYS_HZ) +#define LATCH		((CLOCK_TICK_RATE + CONFIG_SYS_HZ/2) / CONFIG_SYS_HZ)	/* For divider */ + +/* + * When interrupts are enabled, use timer 2 for time/delay generation... + */ + +static volatile ulong timestamp; + +static void timer_isr(void *data) +{ +	unsigned int *pTime = (unsigned int *)data; + +	(*pTime)++; + +	/* +	 * Reset IRQ source +	 */ +	*IXP425_OSST = IXP425_OSST_TIMER_2_PEND; +} + +ulong get_timer (ulong base) +{ +	return timestamp - base; +} + +void reset_timer (void) +{ +	timestamp = 0; +} + +int timer_init (void) +{ +	/* install interrupt handler for timer */ +	irq_install_handler(IXP425_TIMER_2_IRQ, timer_isr, (void *)×tamp); + +	/* setup the Timer counter value */ +	*IXP425_OSRT2 = (LATCH & ~IXP425_OST_RELOAD_MASK) | IXP425_OST_ENABLE; + +	/* enable timer irq */ +	*IXP425_ICMR = (1 << IXP425_TIMER_2_IRQ); + +	return 0; +} +#else  ulong get_timer (ulong base)  {         return get_timer_masked () - base; @@ -79,3 +127,9 @@ ulong get_timer_masked (void)  	}  	return (reload_constant - current);  } + +int timer_init(void) +{ +	return 0; +} +#endif |