| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | #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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter += i; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void atomic_sub(int i, atomic_t *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter -= i; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int atomic_add_return(int i, atomic_t *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long temp, flags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	temp = v->counter; | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | 	temp += i; | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter = temp; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return temp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int atomic_sub_return(int i, atomic_t *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long temp, flags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	temp = v->counter; | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | 	temp -= i; | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter = temp; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return temp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter &= ~mask; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-20 21:14:38 +00:00
										 |  |  | 	v->counter |= mask; | 
					
						
							| 
									
										
										
										
											2009-06-13 22:23:27 +01:00
										 |  |  | 	raw_local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2006-12-07 20:33:38 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __ASM_SH_ATOMIC_IRQ_H */
 |