 b070a03f64
			
		
	
	
	b070a03f64
	
	
	
		
			
			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));
 | |
| }
 |