Blame view

include/asm-xtensa/delay.h 1.16 KB
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * include/asm-xtensa/delay.h
   *
   * 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.
   *
   * Copyright (C) 2001 - 2005 Tensilica Inc.
   *
   */
  
  #ifndef _XTENSA_DELAY_H
  #define _XTENSA_DELAY_H
  
  #include <linux/config.h>
  #include <asm/processor.h>
  #include <asm/param.h>
  
  extern unsigned long loops_per_jiffy;
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
20
  static inline void __delay(unsigned long loops)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
21
22
  {
    /* 2 cycles per loop. */
9ec55a9bd   Chris Zankel   [PATCH] xtensa: F...
23
    __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b"
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  			: "=r" (loops) : "0" (loops));
  }
  
  static __inline__ u32 xtensa_get_ccount(void)
  {
  	u32 ccount;
  	asm volatile ("rsr %0, 234; # CCOUNT
  " : "=r" (ccount));
  	return ccount;
  }
  
  /* For SMP/NUMA systems, change boot_cpu_data to something like
   * local_cpu_data->... where local_cpu_data points to the current
   * cpu. */
  
  static __inline__ void udelay (unsigned long usecs)
  {
  	unsigned long start = xtensa_get_ccount();
  	unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ));
  
  	/* Note: all variables are unsigned (can wrap around)! */
  	while (((unsigned long)xtensa_get_ccount()) - start < cycles)
  		;
  }
  
  #endif