mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-11-04 10:21:25 +01:00 
			
		
		
		
	arm: Define test_and_set_bit and test_and_clear bit for ARM
Needed for (e.g.) ubifs support to work. Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
This commit is contained in:
		
							parent
							
								
									52d61227b6
								
							
						
					
					
						commit
						a6e19d69f6
					
				@ -17,6 +17,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef __KERNEL__
 | 
					#ifdef __KERNEL__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/proc/system.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define smp_mb__before_clear_bit()	do { } while (0)
 | 
					#define smp_mb__before_clear_bit()	do { } while (0)
 | 
				
			||||||
#define smp_mb__after_clear_bit()	do { } while (0)
 | 
					#define smp_mb__after_clear_bit()	do { } while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -37,8 +39,6 @@ static inline void __change_bit(int nr, volatile void *addr)
 | 
				
			|||||||
	*p ^= mask;
 | 
						*p ^= mask;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int test_and_set_bit(int nr, volatile void * addr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int __test_and_set_bit(int nr, volatile void *addr)
 | 
					static inline int __test_and_set_bit(int nr, volatile void *addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long mask = BIT_MASK(nr);
 | 
						unsigned long mask = BIT_MASK(nr);
 | 
				
			||||||
@ -49,7 +49,17 @@ static inline int __test_and_set_bit(int nr, volatile void *addr)
 | 
				
			|||||||
	return (old & mask) != 0;
 | 
						return (old & mask) != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int test_and_clear_bit(int nr, volatile void * addr);
 | 
					static inline int test_and_set_bit(int nr, volatile void * addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
						int out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local_irq_save(flags);
 | 
				
			||||||
 | 
						out = __test_and_set_bit(nr, addr);
 | 
				
			||||||
 | 
						local_irq_restore(flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return out;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int __test_and_clear_bit(int nr, volatile void *addr)
 | 
					static inline int __test_and_clear_bit(int nr, volatile void *addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -61,6 +71,18 @@ static inline int __test_and_clear_bit(int nr, volatile void *addr)
 | 
				
			|||||||
	return (old & mask) != 0;
 | 
						return (old & mask) != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int test_and_clear_bit(int nr, volatile void * addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
						int out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local_irq_save(flags);
 | 
				
			||||||
 | 
						out = __test_and_clear_bit(nr, addr);
 | 
				
			||||||
 | 
						local_irq_restore(flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return out;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int test_and_change_bit(int nr, volatile void * addr);
 | 
					extern int test_and_change_bit(int nr, volatile void * addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int __test_and_change_bit(int nr, volatile void *addr)
 | 
					static inline int __test_and_change_bit(int nr, volatile void *addr)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user