2009-05-11 21:43:36 +08:00
|
|
|
#include <asm/timex.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
#include <variant/hardware.h>
|
|
|
|
|
|
|
|
#define LOOPS 10
|
|
|
|
void platform_calibrate_ccount(void)
|
|
|
|
{
|
|
|
|
u32 uninitialized_var(a);
|
|
|
|
u32 uninitialized_var(u);
|
|
|
|
u32 b;
|
|
|
|
u32 tstamp = S6_REG_GREG1 + S6_GREG1_GLOBAL_TIMER;
|
|
|
|
int i = LOOPS+1;
|
|
|
|
do {
|
|
|
|
u32 t = u;
|
|
|
|
asm volatile(
|
|
|
|
"1: l32i %0, %2, 0 ;"
|
|
|
|
" beq %0, %1, 1b ;"
|
|
|
|
: "=&a"(u) : "a"(t), "a"(tstamp));
|
2013-06-17 16:29:44 +08:00
|
|
|
b = get_ccount();
|
2009-05-11 21:43:36 +08:00
|
|
|
if (i == LOOPS)
|
|
|
|
a = b;
|
|
|
|
} while (--i >= 0);
|
|
|
|
b -= a;
|
2013-06-17 16:29:43 +08:00
|
|
|
ccount_freq = b * (100000UL / LOOPS);
|
2009-05-11 21:43:36 +08:00
|
|
|
}
|