aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/wait.h
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/common/wait.h')
-rw-r--r--tmk_core/common/wait.h89
1 files changed, 58 insertions, 31 deletions
diff --git a/tmk_core/common/wait.h b/tmk_core/common/wait.h
index 0b3fd755a..28224fe3a 100644
--- a/tmk_core/common/wait.h
+++ b/tmk_core/common/wait.h
@@ -15,44 +15,71 @@ extern "C" {
15 15
16# define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t" 16# define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
17 17
18__attribute__((always_inline)) 18__attribute__((always_inline)) static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */
19static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */
20 /* The argument n must be a constant expression. 19 /* The argument n must be a constant expression.
21 * That way, compiler optimization will remove unnecessary code. */ 20 * That way, compiler optimization will remove unnecessary code. */
22 if (n < 1) { return; } 21 if (n < 1) {
22 return;
23 }
23 if (n > 8) { 24 if (n > 8) {
24 unsigned int n8 = n/8; 25 unsigned int n8 = n / 8;
25 n = n - n8*8; 26 n = n - n8 * 8;
26 switch (n8) { 27 switch (n8) {
27 case 16: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 28 case 16:
28 case 15: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 29 asm volatile(CLOCK_DELAY_NOP8::: "memory");
29 case 14: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 30 case 15:
30 case 13: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 31 asm volatile(CLOCK_DELAY_NOP8::: "memory");
31 case 12: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 32 case 14:
32 case 11: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 33 asm volatile(CLOCK_DELAY_NOP8::: "memory");
33 case 10: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 34 case 13:
34 case 9: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 35 asm volatile(CLOCK_DELAY_NOP8::: "memory");
35 case 8: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 36 case 12:
36 case 7: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 37 asm volatile(CLOCK_DELAY_NOP8::: "memory");
37 case 6: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 38 case 11:
38 case 5: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 39 asm volatile(CLOCK_DELAY_NOP8::: "memory");
39 case 4: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 40 case 10:
40 case 3: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 41 asm volatile(CLOCK_DELAY_NOP8::: "memory");
41 case 2: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 42 case 9:
42 case 1: asm volatile (CLOCK_DELAY_NOP8::: "memory"); 43 asm volatile(CLOCK_DELAY_NOP8::: "memory");
43 case 0: break; 44 case 8:
45 asm volatile(CLOCK_DELAY_NOP8::: "memory");
46 case 7:
47 asm volatile(CLOCK_DELAY_NOP8::: "memory");
48 case 6:
49 asm volatile(CLOCK_DELAY_NOP8::: "memory");
50 case 5:
51 asm volatile(CLOCK_DELAY_NOP8::: "memory");
52 case 4:
53 asm volatile(CLOCK_DELAY_NOP8::: "memory");
54 case 3:
55 asm volatile(CLOCK_DELAY_NOP8::: "memory");
56 case 2:
57 asm volatile(CLOCK_DELAY_NOP8::: "memory");
58 case 1:
59 asm volatile(CLOCK_DELAY_NOP8::: "memory");
60 case 0:
61 break;
44 } 62 }
45 } 63 }
46 switch (n) { 64 switch (n) {
47 case 8: asm volatile ("nop"::: "memory"); 65 case 8:
48 case 7: asm volatile ("nop"::: "memory"); 66 asm volatile("nop" ::: "memory");
49 case 6: asm volatile ("nop"::: "memory"); 67 case 7:
50 case 5: asm volatile ("nop"::: "memory"); 68 asm volatile("nop" ::: "memory");
51 case 4: asm volatile ("nop"::: "memory"); 69 case 6:
52 case 3: asm volatile ("nop"::: "memory"); 70 asm volatile("nop" ::: "memory");
53 case 2: asm volatile ("nop"::: "memory"); 71 case 5:
54 case 1: asm volatile ("nop"::: "memory"); 72 asm volatile("nop" ::: "memory");
55 case 0: break; 73 case 4:
74 asm volatile("nop" ::: "memory");
75 case 3:
76 asm volatile("nop" ::: "memory");
77 case 2:
78 asm volatile("nop" ::: "memory");
79 case 1:
80 asm volatile("nop" ::: "memory");
81 case 0:
82 break;
56 } 83 }
57} 84}
58#endif 85#endif