xtensa: implement ccount calibration for s6000
Calculate core frequency from timers at boot time instead of assuming a fixed frequency. This is useful as the true frequency is set up by the boot loader, thus variable. Signed-off-by: Oskar Schirmer <os@emlix.com> Signed-off-by: Chris Zankel <chris@zankel.net>
This commit is contained in:
parent
d15f05eb8c
commit
b070a03f64
3 changed files with 29 additions and 0 deletions
|
@ -80,6 +80,7 @@ config XTENSA_VARIANT_S6000
|
|||
bool "s6000 - Stretch software configurable processor"
|
||||
select VARIANT_IRQ_SWITCH
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select XTENSA_CALIBRATE_CCOUNT
|
||||
endchoice
|
||||
|
||||
config XTENSA_UNALIGNED_USER
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# s6000 Makefile
|
||||
|
||||
obj-y += irq.o gpio.o
|
||||
obj-$(CONFIG_XTENSA_CALIBRATE_CCOUNT) += delay.o
|
||||
|
|
27
arch/xtensa/variants/s6000/delay.c
Normal file
27
arch/xtensa/variants/s6000/delay.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include <asm/delay.h>
|
||||
#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));
|
||||
b = xtensa_get_ccount();
|
||||
if (i == LOOPS)
|
||||
a = b;
|
||||
} while (--i >= 0);
|
||||
b -= a;
|
||||
nsec_per_ccount = (LOOPS * 10000) / b;
|
||||
ccount_per_jiffy = b * (100000UL / (LOOPS * HZ));
|
||||
}
|
Loading…
Reference in a new issue