|
@@ -1,4 +1,7 @@
|
|
/*
|
|
/*
|
|
|
|
+ * (C) Copyright 2009
|
|
|
|
+ * Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
|
|
|
|
+ *
|
|
* (C) Copyright 2007-2008
|
|
* (C) Copyright 2007-2008
|
|
* Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
|
|
* Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
|
|
*
|
|
*
|
|
@@ -25,11 +28,30 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <common.h>
|
|
#include <common.h>
|
|
|
|
+#include <div64.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/processor.h>
|
|
|
|
+#include <asm/clk.h>
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
|
|
|
|
#define TMU_MAX_COUNTER (~0UL)
|
|
#define TMU_MAX_COUNTER (~0UL)
|
|
-static int clk_adj = 1;
|
|
|
|
|
|
+
|
|
|
|
+static ulong timer_freq;
|
|
|
|
+
|
|
|
|
+static inline unsigned long long tick_to_time(unsigned long long tick)
|
|
|
|
+{
|
|
|
|
+ tick *= CONFIG_SYS_HZ;
|
|
|
|
+ do_div(tick, timer_freq);
|
|
|
|
+
|
|
|
|
+ return tick;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline unsigned long long usec_to_tick(unsigned long long usec)
|
|
|
|
+{
|
|
|
|
+ usec *= timer_freq;
|
|
|
|
+ do_div(usec, 1000000);
|
|
|
|
+
|
|
|
|
+ return usec;
|
|
|
|
+}
|
|
|
|
|
|
static void tmu_timer_start (unsigned int timer)
|
|
static void tmu_timer_start (unsigned int timer)
|
|
{
|
|
{
|
|
@@ -65,15 +87,12 @@ int timer_init (void)
|
|
break;
|
|
break;
|
|
case 4:
|
|
case 4:
|
|
default:
|
|
default:
|
|
- bit = 0;
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
writew(readw(TCR0) | bit, TCR0);
|
|
writew(readw(TCR0) | bit, TCR0);
|
|
|
|
|
|
- /* Clock adjustment calc */
|
|
|
|
- clk_adj = (int)(1.0 / ((1.0 / CONFIG_SYS_HZ) * 1000000));
|
|
|
|
- if (clk_adj < 1)
|
|
|
|
- clk_adj = 1;
|
|
|
|
|
|
+ /* Calc clock rate */
|
|
|
|
+ timer_freq = get_tmu0_clk_rate() >> ((bit + 1) * 2);
|
|
|
|
|
|
tmu_timer_stop(0);
|
|
tmu_timer_stop(0);
|
|
tmu_timer_start(0);
|
|
tmu_timer_start(0);
|
|
@@ -86,24 +105,22 @@ unsigned long long get_ticks (void)
|
|
return 0 - readl(TCNT0);
|
|
return 0 - readl(TCNT0);
|
|
}
|
|
}
|
|
|
|
|
|
-static unsigned long get_usec (void)
|
|
|
|
-{
|
|
|
|
- return (0 - readl(TCNT0));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void udelay (unsigned long usec)
|
|
void udelay (unsigned long usec)
|
|
{
|
|
{
|
|
- unsigned int start = get_usec();
|
|
|
|
- unsigned int end = start + (usec * clk_adj);
|
|
|
|
|
|
+ unsigned long long tmp;
|
|
|
|
+ ulong tmo;
|
|
|
|
+
|
|
|
|
+ tmo = usec_to_tick(usec);
|
|
|
|
+ tmp = get_ticks() + tmo; /* get current timestamp */
|
|
|
|
|
|
- while (get_usec() < end)
|
|
|
|
- continue;
|
|
|
|
|
|
+ while (get_ticks() < tmp) /* loop till event */
|
|
|
|
+ /*NOP*/;
|
|
}
|
|
}
|
|
|
|
|
|
unsigned long get_timer (unsigned long base)
|
|
unsigned long get_timer (unsigned long base)
|
|
{
|
|
{
|
|
/* return msec */
|
|
/* return msec */
|
|
- return ((get_usec() / clk_adj) / 1000) - base;
|
|
|
|
|
|
+ return tick_to_time(get_ticks()) - base;
|
|
}
|
|
}
|
|
|
|
|
|
void set_timer (unsigned long t)
|
|
void set_timer (unsigned long t)
|
|
@@ -120,5 +137,5 @@ void reset_timer (void)
|
|
|
|
|
|
unsigned long get_tbclk (void)
|
|
unsigned long get_tbclk (void)
|
|
{
|
|
{
|
|
- return CONFIG_SYS_HZ;
|
|
|
|
|
|
+ return timer_freq;
|
|
}
|
|
}
|