Loading...
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #ifndef __ASM_SH_IRQFLAGS_H #define __ASM_SH_IRQFLAGS_H static inline void raw_local_irq_enable(void) { unsigned long __dummy0, __dummy1; __asm__ __volatile__ ( "stc sr, %0\n\t" "and %1, %0\n\t" #ifdef CONFIG_CPU_HAS_SR_RB "stc r6_bank, %1\n\t" "or %1, %0\n\t" #endif "ldc %0, sr\n\t" : "=&r" (__dummy0), "=r" (__dummy1) : "1" (~0x000000f0) : "memory" ); } static inline void raw_local_irq_disable(void) { unsigned long flags; __asm__ __volatile__ ( "stc sr, %0\n\t" "or #0xf0, %0\n\t" "ldc %0, sr\n\t" : "=&z" (flags) : /* no inputs */ : "memory" ); } static inline void set_bl_bit(void) { unsigned long __dummy0, __dummy1; __asm__ __volatile__ ( "stc sr, %0\n\t" "or %2, %0\n\t" "and %3, %0\n\t" "ldc %0, sr\n\t" : "=&r" (__dummy0), "=r" (__dummy1) : "r" (0x10000000), "r" (0xffffff0f) : "memory" ); } static inline void clear_bl_bit(void) { unsigned long __dummy0, __dummy1; __asm__ __volatile__ ( "stc sr, %0\n\t" "and %2, %0\n\t" "ldc %0, sr\n\t" : "=&r" (__dummy0), "=r" (__dummy1) : "1" (~0x10000000) : "memory" ); } static inline unsigned long __raw_local_save_flags(void) { unsigned long flags; __asm__ __volatile__ ( "stc sr, %0\n\t" "and #0xf0, %0\n\t" : "=&z" (flags) : /* no inputs */ : "memory" ); return flags; } #define raw_local_save_flags(flags) \ do { (flags) = __raw_local_save_flags(); } while (0) static inline int raw_irqs_disabled_flags(unsigned long flags) { return (flags != 0); } static inline int raw_irqs_disabled(void) { unsigned long flags = __raw_local_save_flags(); return raw_irqs_disabled_flags(flags); } static inline unsigned long __raw_local_irq_save(void) { unsigned long flags, __dummy; __asm__ __volatile__ ( "stc sr, %1\n\t" "mov %1, %0\n\t" "or #0xf0, %0\n\t" "ldc %0, sr\n\t" "mov %1, %0\n\t" "and #0xf0, %0\n\t" : "=&z" (flags), "=&r" (__dummy) : /* no inputs */ : "memory" ); return flags; } #define raw_local_irq_save(flags) \ do { (flags) = __raw_local_irq_save(); } while (0) #define local_irq_save raw_local_irq_save static inline void raw_local_irq_restore(unsigned long flags) { if ((flags & 0xf0) != 0xf0) raw_local_irq_enable(); } #define local_irq_restore raw_local_irq_restore #endif /* __ASM_SH_IRQFLAGS_H */ |