at v2.6.16-rc2 50 lines 1.2 kB view raw
1/* 2 * include/asm-xtensa/delay.h 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file "COPYING" in the main directory of this archive 6 * for more details. 7 * 8 * Copyright (C) 2001 - 2005 Tensilica Inc. 9 * 10 */ 11 12#ifndef _XTENSA_DELAY_H 13#define _XTENSA_DELAY_H 14 15#include <linux/config.h> 16#include <asm/processor.h> 17#include <asm/param.h> 18 19extern unsigned long loops_per_jiffy; 20 21static inline void __delay(unsigned long loops) 22{ 23 /* 2 cycles per loop. */ 24 __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b" 25 : "=r" (loops) : "0" (loops)); 26} 27 28static __inline__ u32 xtensa_get_ccount(void) 29{ 30 u32 ccount; 31 asm volatile ("rsr %0, 234; # CCOUNT\n" : "=r" (ccount)); 32 return ccount; 33} 34 35/* For SMP/NUMA systems, change boot_cpu_data to something like 36 * local_cpu_data->... where local_cpu_data points to the current 37 * cpu. */ 38 39static __inline__ void udelay (unsigned long usecs) 40{ 41 unsigned long start = xtensa_get_ccount(); 42 unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ)); 43 44 /* Note: all variables are unsigned (can wrap around)! */ 45 while (((unsigned long)xtensa_get_ccount()) - start < cycles) 46 ; 47} 48 49#endif 50