72 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #ifndef __ASM_SH_ATOMIC_IRQ_H
 | ||
|  | #define __ASM_SH_ATOMIC_IRQ_H
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * To get proper branch prediction for the main line, we must branch | ||
|  |  * forward to code at the end of this object's .text section, then | ||
|  |  * branch back to restart the operation. | ||
|  |  */ | ||
|  | static inline void atomic_add(int i, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	*(long *)v += i; | ||
|  | 	local_irq_restore(flags); | ||
|  | } | ||
|  | 
 | ||
|  | static inline void atomic_sub(int i, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	*(long *)v -= i; | ||
|  | 	local_irq_restore(flags); | ||
|  | } | ||
|  | 
 | ||
|  | static inline int atomic_add_return(int i, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long temp, flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	temp = *(long *)v; | ||
|  | 	temp += i; | ||
|  | 	*(long *)v = temp; | ||
|  | 	local_irq_restore(flags); | ||
|  | 
 | ||
|  | 	return temp; | ||
|  | } | ||
|  | 
 | ||
|  | static inline int atomic_sub_return(int i, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long temp, flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	temp = *(long *)v; | ||
|  | 	temp -= i; | ||
|  | 	*(long *)v = temp; | ||
|  | 	local_irq_restore(flags); | ||
|  | 
 | ||
|  | 	return temp; | ||
|  | } | ||
|  | 
 | ||
|  | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	*(long *)v &= ~mask; | ||
|  | 	local_irq_restore(flags); | ||
|  | } | ||
|  | 
 | ||
|  | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | ||
|  | { | ||
|  | 	unsigned long flags; | ||
|  | 
 | ||
|  | 	local_irq_save(flags); | ||
|  | 	*(long *)v |= mask; | ||
|  | 	local_irq_restore(flags); | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* __ASM_SH_ATOMIC_IRQ_H */
 |