| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * include/asm-v850/delay.h -- Delay routines, using a pre-computed | 
|  | 3 | * 	"loops_per_second" value | 
|  | 4 | * | 
|  | 5 | *  Copyright (C) 2001,03  NEC Corporation | 
|  | 6 | *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org> | 
|  | 7 | *  Copyright (C) 1994 Hamish Macdonald | 
|  | 8 | * | 
|  | 9 | * This file is subject to the terms and conditions of the GNU General | 
|  | 10 | * Public License.  See the file COPYING in the main directory of this | 
|  | 11 | * archive for more details. | 
|  | 12 | */ | 
|  | 13 |  | 
|  | 14 | #ifndef __V850_DELAY_H__ | 
|  | 15 | #define __V850_DELAY_H__ | 
|  | 16 |  | 
|  | 17 | #include <asm/param.h> | 
|  | 18 |  | 
|  | 19 | extern __inline__ void __delay(unsigned long loops) | 
|  | 20 | { | 
|  | 21 | if (loops) | 
|  | 22 | __asm__ __volatile__ ("1: add -1, %0; bnz 1b" | 
|  | 23 | : "=r" (loops) : "0" (loops)); | 
|  | 24 | } | 
|  | 25 |  | 
|  | 26 | /* | 
|  | 27 | * Use only for very small delays ( < 1 msec).  Should probably use a | 
|  | 28 | * lookup table, really, as the multiplications take much too long with | 
|  | 29 | * short delays.  This is a "reasonable" implementation, though (and the | 
|  | 30 | * first constant multiplications gets optimized away if the delay is | 
|  | 31 | * a constant) | 
|  | 32 | */ | 
|  | 33 |  | 
|  | 34 | extern unsigned long loops_per_jiffy; | 
|  | 35 |  | 
|  | 36 | extern __inline__ void udelay(unsigned long usecs) | 
|  | 37 | { | 
|  | 38 | register unsigned long full_loops, part_loops; | 
|  | 39 |  | 
|  | 40 | full_loops = ((usecs * HZ) / 1000000) * loops_per_jiffy; | 
|  | 41 | usecs %= (1000000 / HZ); | 
|  | 42 | part_loops = (usecs * HZ * loops_per_jiffy) / 1000000; | 
|  | 43 |  | 
|  | 44 | __delay(full_loops + part_loops); | 
|  | 45 | } | 
|  | 46 |  | 
|  | 47 | #endif /* __V850_DELAY_H__ */ |