summaryrefslogtreecommitdiff
path: root/cpu/sh4/time.c
diff options
context:
space:
mode:
authorNobuhiro Iwamatsu <iwamatsu@nigauri.org>2007-09-23 02:12:30 +0900
committerNobuhiro Iwamatsu <iwamatsu@nigauri.org>2007-09-23 02:12:30 +0900
commitb02bad128669e567fce87d8df823b06a0144b8db (patch)
treee388d06d722b283d09260ceab22f9cc342216f94 /cpu/sh4/time.c
parentb8685affe614ccf5f4ec66252b30e2e524d18948 (diff)
downloadu-boot-imx-b02bad128669e567fce87d8df823b06a0144b8db.zip
u-boot-imx-b02bad128669e567fce87d8df823b06a0144b8db.tar.gz
u-boot-imx-b02bad128669e567fce87d8df823b06a0144b8db.tar.bz2
sh: Update core code of SuperH.
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Diffstat (limited to 'cpu/sh4/time.c')
-rw-r--r--cpu/sh4/time.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/cpu/sh4/time.c b/cpu/sh4/time.c
index b6e4d02..5f8a3a0 100644
--- a/cpu/sh4/time.c
+++ b/cpu/sh4/time.c
@@ -1,4 +1,7 @@
/*
+ * (C) Copyright 2007
+ * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
* (C) Copyright 2003
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
@@ -31,7 +34,15 @@ static void tmu_timer_start (unsigned int timer)
if (timer > 2)
return;
- *((volatile unsigned char *) TSTR0) |= (1 << timer);
+ *((volatile unsigned char *) TSTR) |= (1 << timer);
+}
+
+static void tmu_timer_stop (unsigned int timer)
+{
+ u8 val = *((volatile u8 *)TSTR);
+ if (timer > 2)
+ return;
+ *((volatile unsigned char *)TSTR) = val &~(1 << timer);
}
int timer_init (void)
@@ -39,7 +50,8 @@ int timer_init (void)
/* Divide clock by 4 */
*(volatile u16 *)TCR0 = 0;
- tmu_timer_start (0);
+ tmu_timer_stop(0);
+ tmu_timer_start(0);
return 0;
}
@@ -51,15 +63,12 @@ int timer_init (void)
*/
unsigned long long get_ticks (void)
{
- return (0 - *((volatile unsigned int *) TCNT0));
+ return (0 - *((volatile u32 *) TCNT0));
}
unsigned long get_timer (unsigned long base)
{
- unsigned long n =
- *((volatile unsigned int *)TCNT0) ;
-
- return ((int)n - base ) < 0 ? ( TMU_MAX_COUNTER - ( base -n )):(n - base );
+ return ((0 - *((volatile u32 *) TCNT0)) - base);
}
void set_timer (unsigned long t)
@@ -69,19 +78,15 @@ void set_timer (unsigned long t)
void reset_timer (void)
{
+ tmu_timer_stop(0);
set_timer (0);
+ tmu_timer_start(0);
}
void udelay (unsigned long usec)
{
unsigned int start = get_timer (0);
- unsigned int end = 0;
- if (usec > 1000000)
- end = ((usec/100000) * CFG_HZ) / 10;
- else if (usec > 1000)
- end = ((usec/100) * CFG_HZ) / 10000;
- else
- end = (usec * CFG_HZ) / 1000000;
+ unsigned int end = start + (usec * ((CFG_HZ + 500000) / 1000000));
while (get_timer (0) < end)
continue;
@@ -91,4 +96,3 @@ unsigned long get_tbclk (void)
{
return CFG_HZ;
}
-