1 #ifndef __ASM_SH_IRQFLAGS_H 2 #define __ASM_SH_IRQFLAGS_H 3 4 static inline void raw_local_irq_enable(void) 5 { 6 unsigned long __dummy0, __dummy1; 7 8 __asm__ __volatile__ ( 9 "stc sr, %0\n\t" 10 "and %1, %0\n\t" 11 #ifdef CONFIG_CPU_HAS_SR_RB 12 "stc r6_bank, %1\n\t" 13 "or %1, %0\n\t" 14 #endif 15 "ldc %0, sr\n\t" 16 : "=&r" (__dummy0), "=r" (__dummy1) 17 : "1" (~0x000000f0) 18 : "memory" 19 ); 20 } 21 22 static inline void raw_local_irq_disable(void) 23 { 24 unsigned long flags; 25 26 __asm__ __volatile__ ( 27 "stc sr, %0\n\t" 28 "or #0xf0, %0\n\t" 29 "ldc %0, sr\n\t" 30 : "=&z" (flags) 31 : /* no inputs */ 32 : "memory" 33 ); 34 } 35 36 static inline void set_bl_bit(void) 37 { 38 unsigned long __dummy0, __dummy1; 39 40 __asm__ __volatile__ ( 41 "stc sr, %0\n\t" 42 "or %2, %0\n\t" 43 "and %3, %0\n\t" 44 "ldc %0, sr\n\t" 45 : "=&r" (__dummy0), "=r" (__dummy1) 46 : "r" (0x10000000), "r" (0xffffff0f) 47 : "memory" 48 ); 49 } 50 51 static inline void clear_bl_bit(void) 52 { 53 unsigned long __dummy0, __dummy1; 54 55 __asm__ __volatile__ ( 56 "stc sr, %0\n\t" 57 "and %2, %0\n\t" 58 "ldc %0, sr\n\t" 59 : "=&r" (__dummy0), "=r" (__dummy1) 60 : "1" (~0x10000000) 61 : "memory" 62 ); 63 } 64 65 static inline unsigned long __raw_local_save_flags(void) 66 { 67 unsigned long flags; 68 69 __asm__ __volatile__ ( 70 "stc sr, %0\n\t" 71 "and #0xf0, %0\n\t" 72 : "=&z" (flags) 73 : /* no inputs */ 74 : "memory" 75 ); 76 77 return flags; 78 } 79 80 #define raw_local_save_flags(flags) \ 81 do { (flags) = __raw_local_save_flags(); } while (0) 82 83 static inline int raw_irqs_disabled_flags(unsigned long flags) 84 { 85 return (flags != 0); 86 } 87 88 static inline int raw_irqs_disabled(void) 89 { 90 unsigned long flags = __raw_local_save_flags(); 91 92 return raw_irqs_disabled_flags(flags); 93 } 94 95 static inline unsigned long __raw_local_irq_save(void) 96 { 97 unsigned long flags, __dummy; 98 99 __asm__ __volatile__ ( 100 "stc sr, %1\n\t" 101 "mov %1, %0\n\t" 102 "or #0xf0, %0\n\t" 103 "ldc %0, sr\n\t" 104 "mov %1, %0\n\t" 105 "and #0xf0, %0\n\t" 106 : "=&z" (flags), "=&r" (__dummy) 107 : /* no inputs */ 108 : "memory" 109 ); 110 111 return flags; 112 } 113 114 #define raw_local_irq_save(flags) \ 115 do { (flags) = __raw_local_irq_save(); } while (0) 116 117 #define local_irq_save raw_local_irq_save 118 119 static inline void raw_local_irq_restore(unsigned long flags) 120 { 121 if ((flags & 0xf0) != 0xf0) 122 raw_local_irq_enable(); 123 } 124 #define local_irq_restore raw_local_irq_restore 125 126 #endif /* __ASM_SH_IRQFLAGS_H */ 127