Blame view

kernel/linux-rt-4.4.41/arch/arc/include/asm/delay.h 1.9 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  /*
   * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * Delay routines using pre computed loops_per_jiffy value.
   *
   * vineetg: Feb 2012
   *  -Rewrote in "C" to avoid dealing with availability of H/w MPY
   *  -Also reduced the num of MPY operations from 3 to 2
   *
   * Amit Bhor: Codito Technologies 2004
   */
  
  #ifndef __ASM_ARC_UDELAY_H
  #define __ASM_ARC_UDELAY_H
  
  #include <asm/param.h>		/* HZ */
  
  static inline void __delay(unsigned long loops)
  {
  	__asm__ __volatile__(
  	"	mov lp_count, %0	
  "
  	"	lp  1f			
  "
  	"	nop			
  "
  	"1:				
  "
  	: : "r"(loops));
  }
  
  extern void __bad_udelay(void);
  
  /*
   * Normal Math for computing loops in "N" usecs
   *  -we have precomputed @loops_per_jiffy
   *  -1 sec has HZ jiffies
   * loops per "N" usecs = ((loops_per_jiffy * HZ / 1000000) * N)
   *
   * Approximate Division by multiplication:
   *  -Mathematically if we multiply and divide a number by same value the
   *   result remains unchanged:  In this case, we use 2^32
   *  -> (loops_per_N_usec * 2^32 ) / 2^32
   *  -> (((loops_per_jiffy * HZ / 1000000) * N) * 2^32) / 2^32
   *  -> (loops_per_jiffy * HZ * N * 4295) / 2^32
   *
   *  -Divide by 2^32 is very simply right shift by 32
   *  -We simply need to ensure that the multiply per above eqn happens in
   *   64-bit precision (if CPU doesn't support it - gcc can emaulate it)
   */
  
  static inline void __udelay(unsigned long usecs)
  {
  	unsigned long loops;
  
  	/* (u64) cast ensures 64 bit MPY - real or emulated
  	 * HZ * 4295 is pre-evaluated by gcc - hence only 2 mpy ops
  	 */
  	loops = ((u64) usecs * 4295 * HZ * loops_per_jiffy) >> 32;
  
  	__delay(loops);
  }
  
  #define udelay(n) (__builtin_constant_p(n) ? ((n) > 20000 ? __bad_udelay() \
  				: __udelay(n)) : __udelay(n))
  
  #endif /* __ASM_ARC_UDELAY_H */