| .. | .. | 
|---|
| 14 | 14 |   * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). | 
|---|
| 15 | 15 |   */ | 
|---|
| 16 | 16 |   | 
|---|
 | 17 | +#include <asm/rmwcc.h>  | 
|---|
 | 18 | +  | 
|---|
| 17 | 19 |  #define ADDR (*(volatile long *)addr) | 
|---|
| 18 | 20 |   | 
|---|
| 19 | 21 |  /** | 
|---|
| .. | .. | 
|---|
| 29 | 31 |   */ | 
|---|
| 30 | 32 |  static inline void sync_set_bit(long nr, volatile unsigned long *addr) | 
|---|
| 31 | 33 |  { | 
|---|
| 32 |  | -	asm volatile("lock; bts %1,%0"  | 
|---|
 | 34 | +	asm volatile("lock; " __ASM_SIZE(bts) " %1,%0"  | 
|---|
| 33 | 35 |  		     : "+m" (ADDR) | 
|---|
| 34 | 36 |  		     : "Ir" (nr) | 
|---|
| 35 | 37 |  		     : "memory"); | 
|---|
| .. | .. | 
|---|
| 47 | 49 |   */ | 
|---|
| 48 | 50 |  static inline void sync_clear_bit(long nr, volatile unsigned long *addr) | 
|---|
| 49 | 51 |  { | 
|---|
| 50 |  | -	asm volatile("lock; btr %1,%0"  | 
|---|
 | 52 | +	asm volatile("lock; " __ASM_SIZE(btr) " %1,%0"  | 
|---|
| 51 | 53 |  		     : "+m" (ADDR) | 
|---|
| 52 | 54 |  		     : "Ir" (nr) | 
|---|
| 53 | 55 |  		     : "memory"); | 
|---|
| .. | .. | 
|---|
| 64 | 66 |   */ | 
|---|
| 65 | 67 |  static inline void sync_change_bit(long nr, volatile unsigned long *addr) | 
|---|
| 66 | 68 |  { | 
|---|
| 67 |  | -	asm volatile("lock; btc %1,%0"  | 
|---|
 | 69 | +	asm volatile("lock; " __ASM_SIZE(btc) " %1,%0"  | 
|---|
| 68 | 70 |  		     : "+m" (ADDR) | 
|---|
| 69 | 71 |  		     : "Ir" (nr) | 
|---|
| 70 | 72 |  		     : "memory"); | 
|---|
| .. | .. | 
|---|
| 78 | 80 |   * This operation is atomic and cannot be reordered. | 
|---|
| 79 | 81 |   * It also implies a memory barrier. | 
|---|
| 80 | 82 |   */ | 
|---|
| 81 |  | -static inline int sync_test_and_set_bit(long nr, volatile unsigned long *addr)  | 
|---|
 | 83 | +static inline bool sync_test_and_set_bit(long nr, volatile unsigned long *addr)  | 
|---|
| 82 | 84 |  { | 
|---|
| 83 |  | -	unsigned char oldbit;  | 
|---|
| 84 |  | -  | 
|---|
| 85 |  | -	asm volatile("lock; bts %2,%1\n\tsetc %0"  | 
|---|
| 86 |  | -		     : "=qm" (oldbit), "+m" (ADDR)  | 
|---|
| 87 |  | -		     : "Ir" (nr) : "memory");  | 
|---|
| 88 |  | -	return oldbit;  | 
|---|
 | 85 | +	return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(bts), *addr, c, "Ir", nr);  | 
|---|
| 89 | 86 |  } | 
|---|
| 90 | 87 |   | 
|---|
| 91 | 88 |  /** | 
|---|
| .. | .. | 
|---|
| 98 | 95 |   */ | 
|---|
| 99 | 96 |  static inline int sync_test_and_clear_bit(long nr, volatile unsigned long *addr) | 
|---|
| 100 | 97 |  { | 
|---|
| 101 |  | -	unsigned char oldbit;  | 
|---|
| 102 |  | -  | 
|---|
| 103 |  | -	asm volatile("lock; btr %2,%1\n\tsetc %0"  | 
|---|
| 104 |  | -		     : "=qm" (oldbit), "+m" (ADDR)  | 
|---|
| 105 |  | -		     : "Ir" (nr) : "memory");  | 
|---|
| 106 |  | -	return oldbit;  | 
|---|
 | 98 | +	return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(btr), *addr, c, "Ir", nr);  | 
|---|
| 107 | 99 |  } | 
|---|
| 108 | 100 |   | 
|---|
| 109 | 101 |  /** | 
|---|
| .. | .. | 
|---|
| 116 | 108 |   */ | 
|---|
| 117 | 109 |  static inline int sync_test_and_change_bit(long nr, volatile unsigned long *addr) | 
|---|
| 118 | 110 |  { | 
|---|
| 119 |  | -	unsigned char oldbit;  | 
|---|
| 120 |  | -  | 
|---|
| 121 |  | -	asm volatile("lock; btc %2,%1\n\tsetc %0"  | 
|---|
| 122 |  | -		     : "=qm" (oldbit), "+m" (ADDR)  | 
|---|
| 123 |  | -		     : "Ir" (nr) : "memory");  | 
|---|
| 124 |  | -	return oldbit;  | 
|---|
 | 111 | +	return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(btc), *addr, c, "Ir", nr);  | 
|---|
| 125 | 112 |  } | 
|---|
| 126 | 113 |   | 
|---|
| 127 | 114 |  #define sync_test_bit(nr, addr) test_bit(nr, addr) | 
|---|