| 1 |
|
| 2 | |
| 3 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
|
| 4 | *
|
| 5 | * Delay routines using pre computed loops_per_jiffy value.
|
| 6 | *
|
| 7 | * vineetg: Feb 2012
|
| 8 | * -Rewrote in "C" to avoid dealing with availability of H/w MPY
|
| 9 | * -Also reduced the num of MPY operations from 3 to 2
|
| 10 | *
|
| 11 | * Amit Bhor: Codito Technologies 2004
|
| 12 |
|
| 13 |
|
| 14 | #ifndef __ASM_ARC_UDELAY_H
|
| 15 | #define __ASM_ARC_UDELAY_H
|
| 16 |
|
| 17 | #include <asm-generic/types.h>
|
| 18 | #include <asm/param.h>
|
| 19 |
|
| 20 | extern unsigned long loops_per_jiffy;
|
| 21 |
|
| 22 | static inline void __delay(unsigned long loops)
|
| 23 | {
|
| 24 | __asm__ __volatile__(
|
| 25 | " mov lp_count, %0 \n"
|
| 26 | " lp 1f \n"
|
| 27 | " nop \n"
|
| 28 | "1: \n"
|
| 29 | :
|
| 30 | : "r"(loops)
|
| 31 | : "lp_count");
|
| 32 | }
|
| 33 |
|
| 34 | extern void __bad_udelay(void);
|
| 35 |
|
| 36 | |
| 37 | * Normal Math for computing loops in "N" usecs
|
| 38 | * -we have precomputed @loops_per_jiffy
|
| 39 | * -1 sec has HZ jiffies
|
| 40 | * loops per "N" usecs = ((loops_per_jiffy * HZ / 1000000) * N)
|
| 41 | *
|
| 42 | * Approximate Division by multiplication:
|
| 43 | * -Mathematically if we multiply and divide a number by same value the
|
| 44 | * result remains unchanged: In this case, we use 2^32
|
| 45 | * -> (loops_per_N_usec * 2^32 ) / 2^32
|
| 46 | * -> (((loops_per_jiffy * HZ / 1000000) * N) * 2^32) / 2^32
|
| 47 | * -> (loops_per_jiffy * HZ * N * 4295) / 2^32
|
| 48 | *
|
| 49 | * -Divide by 2^32 is very simply right shift by 32
|
| 50 | * -We simply need to ensure that the multiply per above eqn happens in
|
| 51 | * 64-bit precision (if CPU doesn't support it - gcc can emaulate it)
|
| 52 |
|
| 53 |
|
| 54 | static inline void __udelay(unsigned long usecs)
|
| 55 | {
|
| 56 | unsigned long loops;
|
| 57 |
|
| 58 | |
| 59 | * HZ * 4295 is pre-evaluated by gcc - hence only 2 mpy ops
|
| 60 |
|
| 61 | loops = ((u64) usecs * 4295 * HZ * loops_per_jiffy) >> 32;
|
| 62 |
|
| 63 | __delay(loops);
|
| 64 | }
|
| 65 |
|
| 66 | #define udelay(n) (__builtin_constant_p(n) ? ((n) > 20000 ? __bad_udelay() \
|
| 67 | : __udelay(n)) : __udelay(n))
|
| 68 |
|
| 69 | #endif
|