| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | #ifndef __ASM_ARM_IRQFLAGS_H
 | 
					
						
							|  |  |  | #define __ASM_ARM_IRQFLAGS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __KERNEL__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/ptrace.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * CPU interrupt mask handling. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | #ifdef CONFIG_CPU_V7M
 | 
					
						
							|  |  |  | #define IRQMASK_REG_NAME_R "primask"
 | 
					
						
							|  |  |  | #define IRQMASK_REG_NAME_W "primask"
 | 
					
						
							|  |  |  | #define IRQMASK_I_BIT	1
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define IRQMASK_REG_NAME_R "cpsr"
 | 
					
						
							|  |  |  | #define IRQMASK_REG_NAME_W "cpsr_c"
 | 
					
						
							|  |  |  | #define IRQMASK_I_BIT	PSR_I_BIT
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | #if __LINUX_ARM_ARCH__ >= 6
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | static inline unsigned long arch_local_irq_save(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	asm volatile( | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | 		"	mrs	%0, " IRQMASK_REG_NAME_R "	@ arch_local_irq_save\n" | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 		"	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"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Enable IRQs | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 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"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Disable IRQs | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 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"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | static inline unsigned long arch_local_save_flags(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 	asm volatile( | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | 		"	mrs	%0, " IRQMASK_REG_NAME_R "	@ local_save_flags" | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 		: "=r" (flags) : : "memory", "cc"); | 
					
						
							|  |  |  | 	return flags; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * restore saved IRQ & FIQ state | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | static inline void arch_local_irq_restore(unsigned long flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	asm volatile( | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | 		"	msr	" IRQMASK_REG_NAME_W ", %0	@ local_irq_restore" | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | 		: | 
					
						
							|  |  |  | 		: "r" (flags) | 
					
						
							|  |  |  | 		: "memory", "cc"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | static inline int arch_irqs_disabled_flags(unsigned long flags) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | 	return flags & IRQMASK_I_BIT; | 
					
						
							| 
									
										
										
										
											2010-10-07 14:08:55 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-27 12:07:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-21 18:06:41 +01:00
										 |  |  | #endif /* ifdef __KERNEL__ */
 | 
					
						
							|  |  |  | #endif /* ifndef __ASM_ARM_IRQFLAGS_H */
 |