summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraf Yang <graf.yang@analog.com>2009-05-19 04:40:08 -0400
committerMike Frysinger <vapier@gentoo.org>2009-05-19 04:57:33 -0400
commitec01481ddc4cf302c7f6d760b776ca94819ec21e (patch)
tree0c57e843e25af067d1cdfe16d33793e5fcc8a5ed
parentc06326c73bf90e48a8e1cf8893ad31c575423f50 (diff)
Blackfin: fix timer_init()/timer_reset()
The timer_init() function was not using the right csync instruction, nor was it doing it right after disabling the core timer. The timer_reset() function would reset the timestamp, but not the actual timer, so there was a common edge case where get_timer() return a jump of one timestamp (couple milliseconds) right after resetting. This caused many functions to improperly timeout right away. Signed-off-by: Graf Yang <graf.yang@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--cpu/blackfin/interrupts.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/cpu/blackfin/interrupts.c b/cpu/blackfin/interrupts.c
index d4dd636101..bf6fb4b4cf 100644
--- a/cpu/blackfin/interrupts.c
+++ b/cpu/blackfin/interrupts.c
@@ -95,11 +95,12 @@ void udelay(unsigned long usec)
int timer_init(void)
{
*pTCNTL = 0x1;
+ CSYNC();
*pTSCALE = 0x0;
*pTCOUNT = MAX_TIM_LOAD;
*pTPERIOD = MAX_TIM_LOAD;
*pTCNTL = 0x7;
- asm("CSYNC;");
+ CSYNC();
timestamp = 0;
last_time = 0;
@@ -151,5 +152,5 @@ ulong get_timer(ulong base)
void reset_timer(void)
{
- timestamp = 0;
+ timer_init();
}