| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-11-28 20:19:38 +09:00
										 |  |  |  * arch/sh/lib64/udelay.c | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | void __delay(unsigned long loops) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	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)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-08 17:36:57 +09:00
										 |  |  | void __const_udelay(unsigned long xloops) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | 	__delay(xloops * (HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy)); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | void __udelay(unsigned long usecs) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | 	__const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | void __ndelay(unsigned long nsecs) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-03-06 17:23:15 +09:00
										 |  |  | 	__const_udelay(nsecs * 0x00000005); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } |