diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-14 20:28:13 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-14 20:28:13 -0400 |
| commit | 2f7989efd4398d92b8adffce2e07dd043a0895fe (patch) | |
| tree | 8acbc880a8908ea18d724f747ea26d0afc2160bf | |
| parent | 6f7dd68b755b215deda5188a2c13c00f4776ea66 (diff) | |
| parent | 0ebe25f90cd99bb1bcf622ec8a841421d48380d6 (diff) | |
Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm:
ARM: 6226/1: fix kprobe bug in ldr instruction emulation
ARM: Update mach-types
ARM: lockdep: fix unannotated irqs-on
ARM: 6184/2: ux500: use neutral PRCMU base
ARM: 6212/1: atomic ops: add memory constraints to inline asm
ARM: 6211/1: atomic ops: fix register constraints for atomic64_add_unless
ARM: 6210/1: Do not rely on reset defaults of L2X0_AUX_CTRL
| -rw-r--r-- | arch/arm/include/asm/atomic.h | 132 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 16 | ||||
| -rw-r--r-- | arch/arm/kernel/kprobes-decode.c | 5 | ||||
| -rw-r--r-- | arch/arm/kernel/process.c | 23 | ||||
| -rw-r--r-- | arch/arm/mach-ux500/clock.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-ux500/cpu-db5500.c | 1 | ||||
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 5 | ||||
| -rw-r--r-- | arch/arm/tools/mach-types | 152 |
8 files changed, 243 insertions, 93 deletions
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index a0162fa9456..7e79503ab89 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h | |||
| @@ -40,12 +40,12 @@ static inline void atomic_add(int i, atomic_t *v) | |||
| 40 | int result; | 40 | int result; |
| 41 | 41 | ||
| 42 | __asm__ __volatile__("@ atomic_add\n" | 42 | __asm__ __volatile__("@ atomic_add\n" |
| 43 | "1: ldrex %0, [%2]\n" | 43 | "1: ldrex %0, [%3]\n" |
| 44 | " add %0, %0, %3\n" | 44 | " add %0, %0, %4\n" |
| 45 | " strex %1, %0, [%2]\n" | 45 | " strex %1, %0, [%3]\n" |
| 46 | " teq %1, #0\n" | 46 | " teq %1, #0\n" |
| 47 | " bne 1b" | 47 | " bne 1b" |
| 48 | : "=&r" (result), "=&r" (tmp) | 48 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 49 | : "r" (&v->counter), "Ir" (i) | 49 | : "r" (&v->counter), "Ir" (i) |
| 50 | : "cc"); | 50 | : "cc"); |
| 51 | } | 51 | } |
| @@ -58,12 +58,12 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
| 58 | smp_mb(); | 58 | smp_mb(); |
| 59 | 59 | ||
| 60 | __asm__ __volatile__("@ atomic_add_return\n" | 60 | __asm__ __volatile__("@ atomic_add_return\n" |
| 61 | "1: ldrex %0, [%2]\n" | 61 | "1: ldrex %0, [%3]\n" |
| 62 | " add %0, %0, %3\n" | 62 | " add %0, %0, %4\n" |
| 63 | " strex %1, %0, [%2]\n" | 63 | " strex %1, %0, [%3]\n" |
| 64 | " teq %1, #0\n" | 64 | " teq %1, #0\n" |
| 65 | " bne 1b" | 65 | " bne 1b" |
| 66 | : "=&r" (result), "=&r" (tmp) | 66 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 67 | : "r" (&v->counter), "Ir" (i) | 67 | : "r" (&v->counter), "Ir" (i) |
| 68 | : "cc"); | 68 | : "cc"); |
| 69 | 69 | ||
| @@ -78,12 +78,12 @@ static inline void atomic_sub(int i, atomic_t *v) | |||
| 78 | int result; | 78 | int result; |
| 79 | 79 | ||
| 80 | __asm__ __volatile__("@ atomic_sub\n" | 80 | __asm__ __volatile__("@ atomic_sub\n" |
| 81 | "1: ldrex %0, [%2]\n" | 81 | "1: ldrex %0, [%3]\n" |
| 82 | " sub %0, %0, %3\n" | 82 | " sub %0, %0, %4\n" |
| 83 | " strex %1, %0, [%2]\n" | 83 | " strex %1, %0, [%3]\n" |
| 84 | " teq %1, #0\n" | 84 | " teq %1, #0\n" |
| 85 | " bne 1b" | 85 | " bne 1b" |
| 86 | : "=&r" (result), "=&r" (tmp) | 86 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 87 | : "r" (&v->counter), "Ir" (i) | 87 | : "r" (&v->counter), "Ir" (i) |
| 88 | : "cc"); | 88 | : "cc"); |
| 89 | } | 89 | } |
| @@ -96,12 +96,12 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
| 96 | smp_mb(); | 96 | smp_mb(); |
| 97 | 97 | ||
| 98 | __asm__ __volatile__("@ atomic_sub_return\n" | 98 | __asm__ __volatile__("@ atomic_sub_return\n" |
| 99 | "1: ldrex %0, [%2]\n" | 99 | "1: ldrex %0, [%3]\n" |
| 100 | " sub %0, %0, %3\n" | 100 | " sub %0, %0, %4\n" |
| 101 | " strex %1, %0, [%2]\n" | 101 | " strex %1, %0, [%3]\n" |
| 102 | " teq %1, #0\n" | 102 | " teq %1, #0\n" |
| 103 | " bne 1b" | 103 | " bne 1b" |
| 104 | : "=&r" (result), "=&r" (tmp) | 104 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 105 | : "r" (&v->counter), "Ir" (i) | 105 | : "r" (&v->counter), "Ir" (i) |
| 106 | : "cc"); | 106 | : "cc"); |
| 107 | 107 | ||
| @@ -118,11 +118,11 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) | |||
| 118 | 118 | ||
| 119 | do { | 119 | do { |
| 120 | __asm__ __volatile__("@ atomic_cmpxchg\n" | 120 | __asm__ __volatile__("@ atomic_cmpxchg\n" |
| 121 | "ldrex %1, [%2]\n" | 121 | "ldrex %1, [%3]\n" |
| 122 | "mov %0, #0\n" | 122 | "mov %0, #0\n" |
| 123 | "teq %1, %3\n" | 123 | "teq %1, %4\n" |
| 124 | "strexeq %0, %4, [%2]\n" | 124 | "strexeq %0, %5, [%3]\n" |
| 125 | : "=&r" (res), "=&r" (oldval) | 125 | : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter) |
| 126 | : "r" (&ptr->counter), "Ir" (old), "r" (new) | 126 | : "r" (&ptr->counter), "Ir" (old), "r" (new) |
| 127 | : "cc"); | 127 | : "cc"); |
| 128 | } while (res); | 128 | } while (res); |
| @@ -137,12 +137,12 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
| 137 | unsigned long tmp, tmp2; | 137 | unsigned long tmp, tmp2; |
| 138 | 138 | ||
| 139 | __asm__ __volatile__("@ atomic_clear_mask\n" | 139 | __asm__ __volatile__("@ atomic_clear_mask\n" |
| 140 | "1: ldrex %0, [%2]\n" | 140 | "1: ldrex %0, [%3]\n" |
| 141 | " bic %0, %0, %3\n" | 141 | " bic %0, %0, %4\n" |
| 142 | " strex %1, %0, [%2]\n" | 142 | " strex %1, %0, [%3]\n" |
| 143 | " teq %1, #0\n" | 143 | " teq %1, #0\n" |
| 144 | " bne 1b" | 144 | " bne 1b" |
| 145 | : "=&r" (tmp), "=&r" (tmp2) | 145 | : "=&r" (tmp), "=&r" (tmp2), "+Qo" (*addr) |
| 146 | : "r" (addr), "Ir" (mask) | 146 | : "r" (addr), "Ir" (mask) |
| 147 | : "cc"); | 147 | : "cc"); |
| 148 | } | 148 | } |
| @@ -249,7 +249,7 @@ static inline u64 atomic64_read(atomic64_t *v) | |||
| 249 | __asm__ __volatile__("@ atomic64_read\n" | 249 | __asm__ __volatile__("@ atomic64_read\n" |
| 250 | " ldrexd %0, %H0, [%1]" | 250 | " ldrexd %0, %H0, [%1]" |
| 251 | : "=&r" (result) | 251 | : "=&r" (result) |
| 252 | : "r" (&v->counter) | 252 | : "r" (&v->counter), "Qo" (v->counter) |
| 253 | ); | 253 | ); |
| 254 | 254 | ||
| 255 | return result; | 255 | return result; |
| @@ -260,11 +260,11 @@ static inline void atomic64_set(atomic64_t *v, u64 i) | |||
| 260 | u64 tmp; | 260 | u64 tmp; |
| 261 | 261 | ||
| 262 | __asm__ __volatile__("@ atomic64_set\n" | 262 | __asm__ __volatile__("@ atomic64_set\n" |
| 263 | "1: ldrexd %0, %H0, [%1]\n" | 263 | "1: ldrexd %0, %H0, [%2]\n" |
| 264 | " strexd %0, %2, %H2, [%1]\n" | 264 | " strexd %0, %3, %H3, [%2]\n" |
| 265 | " teq %0, #0\n" | 265 | " teq %0, #0\n" |
| 266 | " bne 1b" | 266 | " bne 1b" |
| 267 | : "=&r" (tmp) | 267 | : "=&r" (tmp), "=Qo" (v->counter) |
| 268 | : "r" (&v->counter), "r" (i) | 268 | : "r" (&v->counter), "r" (i) |
| 269 | : "cc"); | 269 | : "cc"); |
| 270 | } | 270 | } |
| @@ -275,13 +275,13 @@ static inline void atomic64_add(u64 i, atomic64_t *v) | |||
| 275 | unsigned long tmp; | 275 | unsigned long tmp; |
| 276 | 276 | ||
| 277 | __asm__ __volatile__("@ atomic64_add\n" | 277 | __asm__ __volatile__("@ atomic64_add\n" |
| 278 | "1: ldrexd %0, %H0, [%2]\n" | 278 | "1: ldrexd %0, %H0, [%3]\n" |
| 279 | " adds %0, %0, %3\n" | 279 | " adds %0, %0, %4\n" |
| 280 | " adc %H0, %H0, %H3\n" | 280 | " adc %H0, %H0, %H4\n" |
| 281 | " strexd %1, %0, %H0, [%2]\n" | 281 | " strexd %1, %0, %H0, [%3]\n" |
| 282 | " teq %1, #0\n" | 282 | " teq %1, #0\n" |
| 283 | " bne 1b" | 283 | " bne 1b" |
| 284 | : "=&r" (result), "=&r" (tmp) | 284 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 285 | : "r" (&v->counter), "r" (i) | 285 | : "r" (&v->counter), "r" (i) |
| 286 | : "cc"); | 286 | : "cc"); |
| 287 | } | 287 | } |
| @@ -294,13 +294,13 @@ static inline u64 atomic64_add_return(u64 i, atomic64_t *v) | |||
| 294 | smp_mb(); | 294 | smp_mb(); |
| 295 | 295 | ||
| 296 | __asm__ __volatile__("@ atomic64_add_return\n" | 296 | __asm__ __volatile__("@ atomic64_add_return\n" |
| 297 | "1: ldrexd %0, %H0, [%2]\n" | 297 | "1: ldrexd %0, %H0, [%3]\n" |
| 298 | " adds %0, %0, %3\n" | 298 | " adds %0, %0, %4\n" |
| 299 | " adc %H0, %H0, %H3\n" | 299 | " adc %H0, %H0, %H4\n" |
| 300 | " strexd %1, %0, %H0, [%2]\n" | 300 | " strexd %1, %0, %H0, [%3]\n" |
| 301 | " teq %1, #0\n" | 301 | " teq %1, #0\n" |
| 302 | " bne 1b" | 302 | " bne 1b" |
| 303 | : "=&r" (result), "=&r" (tmp) | 303 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
| 304 | : "r" (&v->counter), "r" (i) | 304 | : "r" (&v->counter), "r" (i) |
| 305 | : "cc"); | 305 | : "cc"); |
| 306 | 306 | ||
| @@ -315,13 +315,13 @@ static inline void atomic64_sub(u64 i, atomic64_t *v) | |||
| 315 | unsigned long tmp; | 315 | unsigned long tmp; |
| 316 | 316 | ||
| 317 | __asm__ __volatile__("@ atomic64_sub\n" | 317 | __asm__ __volatile__("@ atomic64_sub\n" |
| 318 | "1: ldrexd %0, %H0, [%2]\n" | 318 | "1: ldrexd %0, %H0, [%3]\n" |
| 319 | " subs %0, %0, %3\n" | ||
