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>
		
			
				
	
	
		
			27 lines
		
	
	
	
		
			581 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
	
		
			581 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
#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));
 | 
						|
}
 |