50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * arch/sh/lib64/udelay.c
 | |
|  *
 | |
|  * Delay routines, using a pre-computed "loops_per_jiffy" value.
 | |
|  *
 | |
|  * Copyright (C) 2000, 2001  Paolo Alberelli
 | |
|  * Copyright (C) 2003, 2004  Paul Mundt
 | |
|  *
 | |
|  * This file is subject to the terms and conditions of the GNU General Public
 | |
|  * License.  See the file "COPYING" in the main directory of this archive
 | |
|  * for more details.
 | |
|  */
 | |
| #include <linux/sched.h>
 | |
| #include <asm/param.h>
 | |
| 
 | |
| /*
 | |
|  * Use only for very small delays (< 1 msec).
 | |
|  *
 | |
|  * The active part of our cycle counter is only 32-bits wide, and
 | |
|  * we're treating the difference between two marks as signed.  On
 | |
|  * a 1GHz box, that's about 2 seconds.
 | |
|  */
 | |
| 
 | |
| void __delay(unsigned long loops)
 | |
| {
 | |
| 	long long dummy;
 | |
| 	__asm__ __volatile__("gettr	tr0, %1\n\t"
 | |
| 			     "pta	$+4, tr0\n\t"
 | |
| 			     "addi	%0, -1, %0\n\t"
 | |
| 			     "bne	%0, r63, tr0\n\t"
 | |
| 			     "ptabs	%1, tr0\n\t":"=r"(loops),
 | |
| 			     "=r"(dummy)
 | |
| 			     :"0"(loops));
 | |
| }
 | |
| 
 | |
| void __const_udelay(unsigned long xloops)
 | |
| {
 | |
| 	__delay(xloops * (HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy));
 | |
| }
 | |
| 
 | |
| void __udelay(unsigned long usecs)
 | |
| {
 | |
| 	__const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */
 | |
| }
 | |
| 
 | |
| void __ndelay(unsigned long nsecs)
 | |
| {
 | |
| 	__const_udelay(nsecs * 0x00000005);
 | |
| }
 |