|  | #ifndef __ASM_ARM_IRQFLAGS_H | 
|  | #define __ASM_ARM_IRQFLAGS_H | 
|  |  | 
|  | #ifdef __KERNEL__ | 
|  |  | 
|  | #include <asm/ptrace.h> | 
|  |  | 
|  | /* | 
|  | * CPU interrupt mask handling. | 
|  | */ | 
|  | #if __LINUX_ARM_ARCH__ >= 6 | 
|  |  | 
|  | static inline unsigned long arch_local_irq_save(void) | 
|  | { | 
|  | unsigned long flags; | 
|  |  | 
|  | asm volatile( | 
|  | "	mrs	%0, cpsr	@ arch_local_irq_save\n" | 
|  | "	cpsid	i" | 
|  | : "=r" (flags) : : "memory", "cc"); | 
|  | return flags; | 
|  | } | 
|  |  | 
|  | static inline void arch_local_irq_enable(void) | 
|  | { | 
|  | asm volatile( | 
|  | "	cpsie i			@ arch_local_irq_enable" | 
|  | : | 
|  | : | 
|  | : "memory", "cc"); | 
|  | } | 
|  |  | 
|  | static inline void arch_local_irq_disable(void) | 
|  | { | 
|  | asm volatile( | 
|  | "	cpsid i			@ arch_local_irq_disable" | 
|  | : | 
|  | : | 
|  | : "memory", "cc"); | 
|  | } | 
|  |  | 
|  | #define local_fiq_enable()  __asm__("cpsie f	@ __stf" : : : "memory", "cc") | 
|  | #define local_fiq_disable() __asm__("cpsid f	@ __clf" : : : "memory", "cc") | 
|  | #else | 
|  |  | 
|  | /* | 
|  | * Save the current interrupt enable state & disable IRQs | 
|  | */ | 
|  | static inline unsigned long arch_local_irq_save(void) | 
|  | { | 
|  | unsigned long flags, temp; | 
|  |  | 
|  | asm volatile( | 
|  | "	mrs	%0, cpsr	@ arch_local_irq_save\n" | 
|  | "	orr	%1, %0, #128\n" | 
|  | "	msr	cpsr_c, %1" | 
|  | : "=r" (flags), "=r" (temp) | 
|  | : | 
|  | : "memory", "cc"); | 
|  | return flags; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Enable IRQs | 
|  | */ | 
|  | static inline void arch_local_irq_enable(void) | 
|  | { | 
|  | unsigned long temp; | 
|  | asm volatile( | 
|  | "	mrs	%0, cpsr	@ arch_local_irq_enable\n" | 
|  | "	bic	%0, %0, #128\n" | 
|  | "	msr	cpsr_c, %0" | 
|  | : "=r" (temp) | 
|  | : | 
|  | : "memory", "cc"); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Disable IRQs | 
|  | */ | 
|  | static inline void arch_local_irq_disable(void) | 
|  | { | 
|  | unsigned long temp; | 
|  | asm volatile( | 
|  | "	mrs	%0, cpsr	@ arch_local_irq_disable\n" | 
|  | "	orr	%0, %0, #128\n" | 
|  | "	msr	cpsr_c, %0" | 
|  | : "=r" (temp) | 
|  | : | 
|  | : "memory", "cc"); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Enable FIQs | 
|  | */ | 
|  | #define local_fiq_enable()					\ | 
|  | ({							\ | 
|  | unsigned long temp;				\ | 
|  | __asm__ __volatile__(					\ | 
|  | "mrs	%0, cpsr		@ stf\n"		\ | 
|  | "	bic	%0, %0, #64\n"					\ | 
|  | "	msr	cpsr_c, %0"					\ | 
|  | : "=r" (temp)						\ | 
|  | :							\ | 
|  | : "memory", "cc");					\ | 
|  | }) | 
|  |  | 
|  | /* | 
|  | * Disable FIQs | 
|  | */ | 
|  | #define local_fiq_disable()					\ | 
|  | ({							\ | 
|  | unsigned long temp;				\ | 
|  | __asm__ __volatile__(					\ | 
|  | "mrs	%0, cpsr		@ clf\n"		\ | 
|  | "	orr	%0, %0, #64\n"					\ | 
|  | "	msr	cpsr_c, %0"					\ | 
|  | : "=r" (temp)						\ | 
|  | :							\ | 
|  | : "memory", "cc");					\ | 
|  | }) | 
|  |  | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * Save the current interrupt enable state. | 
|  | */ | 
|  | static inline unsigned long arch_local_save_flags(void) | 
|  | { | 
|  | unsigned long flags; | 
|  | asm volatile( | 
|  | "	mrs	%0, cpsr	@ local_save_flags" | 
|  | : "=r" (flags) : : "memory", "cc"); | 
|  | return flags; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * restore saved IRQ & FIQ state | 
|  | */ | 
|  | static inline void arch_local_irq_restore(unsigned long flags) | 
|  | { | 
|  | asm volatile( | 
|  | "	msr	cpsr_c, %0	@ local_irq_restore" | 
|  | : | 
|  | : "r" (flags) | 
|  | : "memory", "cc"); | 
|  | } | 
|  |  | 
|  | static inline int arch_irqs_disabled_flags(unsigned long flags) | 
|  | { | 
|  | return flags & PSR_I_BIT; | 
|  | } | 
|  |  | 
|  | #endif | 
|  | #endif |