diff options
Diffstat (limited to 'arch/arm/include/asm/irqflags.h')
-rw-r--r-- | arch/arm/include/asm/irqflags.h | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/arm/include/asm/irqflags.h b/arch/arm/include/asm/irqflags.h index 1e6cca55c750..3b763d6652a0 100644 --- a/arch/arm/include/asm/irqflags.h +++ b/arch/arm/include/asm/irqflags.h | |||
@@ -8,6 +8,16 @@ | |||
8 | /* | 8 | /* |
9 | * CPU interrupt mask handling. | 9 | * CPU interrupt mask handling. |
10 | */ | 10 | */ |
11 | #ifdef CONFIG_CPU_V7M | ||
12 | #define IRQMASK_REG_NAME_R "primask" | ||
13 | #define IRQMASK_REG_NAME_W "primask" | ||
14 | #define IRQMASK_I_BIT 1 | ||
15 | #else | ||
16 | #define IRQMASK_REG_NAME_R "cpsr" | ||
17 | #define IRQMASK_REG_NAME_W "cpsr_c" | ||
18 | #define IRQMASK_I_BIT PSR_I_BIT | ||
19 | #endif | ||
20 | |||
11 | #if __LINUX_ARM_ARCH__ >= 6 | 21 | #if __LINUX_ARM_ARCH__ >= 6 |
12 | 22 | ||
13 | static inline unsigned long arch_local_irq_save(void) | 23 | static inline unsigned long arch_local_irq_save(void) |
@@ -15,7 +25,7 @@ static inline unsigned long arch_local_irq_save(void) | |||
15 | unsigned long flags; | 25 | unsigned long flags; |
16 | 26 | ||
17 | asm volatile( | 27 | asm volatile( |
18 | " mrs %0, cpsr @ arch_local_irq_save\n" | 28 | " mrs %0, " IRQMASK_REG_NAME_R " @ arch_local_irq_save\n" |
19 | " cpsid i" | 29 | " cpsid i" |
20 | : "=r" (flags) : : "memory", "cc"); | 30 | : "=r" (flags) : : "memory", "cc"); |
21 | return flags; | 31 | return flags; |
@@ -129,7 +139,7 @@ static inline unsigned long arch_local_save_flags(void) | |||
129 | { | 139 | { |
130 | unsigned long flags; | 140 | unsigned long flags; |
131 | asm volatile( | 141 | asm volatile( |
132 | " mrs %0, cpsr @ local_save_flags" | 142 | " mrs %0, " IRQMASK_REG_NAME_R " @ local_save_flags" |
133 | : "=r" (flags) : : "memory", "cc"); | 143 | : "=r" (flags) : : "memory", "cc"); |
134 | return flags; | 144 | return flags; |
135 | } | 145 | } |
@@ -140,7 +150,7 @@ static inline unsigned long arch_local_save_flags(void) | |||
140 | static inline void arch_local_irq_restore(unsigned long flags) | 150 | static inline void arch_local_irq_restore(unsigned long flags) |
141 | { | 151 | { |
142 | asm volatile( | 152 | asm volatile( |
143 | " msr cpsr_c, %0 @ local_irq_restore" | 153 | " msr " IRQMASK_REG_NAME_W ", %0 @ local_irq_restore" |
144 | : | 154 | : |
145 | : "r" (flags) | 155 | : "r" (flags) |
146 | : "memory", "cc"); | 156 | : "memory", "cc"); |
@@ -148,8 +158,8 @@ static inline void arch_local_irq_restore(unsigned long flags) | |||
148 | 158 | ||
149 | static inline int arch_irqs_disabled_flags(unsigned long flags) | 159 | static inline int arch_irqs_disabled_flags(unsigned long flags) |
150 | { | 160 | { |
151 | return flags & PSR_I_BIT; | 161 | return flags & IRQMASK_I_BIT; |
152 | } | 162 | } |
153 | 163 | ||
154 | #endif | 164 | #endif /* ifdef __KERNEL__ */ |
155 | #endif | 165 | #endif /* ifndef __ASM_ARM_IRQFLAGS_H */ |