summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-01-22 09:21:02 -0800
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-01-22 09:21:02 -0800
commitb4a2c87dada12010239b4d5f8f9bc0eb964a614f (patch)
treeb33903197ae17defc3d61b8d8d744a3e87c22686 /include
parente45521a8d44da2c4efd17fc8e853f7917e99b57a (diff)
parente89debcd18a3ef74b27894e479d6b9e658fc6de6 (diff)
downloadlinux-b4a2c87dada12010239b4d5f8f9bc0eb964a614f.tar.bz2
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: [POWERPC] Update defconfigs [POWERPC] atomic_dec_if_positive sign extension fix [POWERPC] Fix OF node refcnt underflow in 836x and 832x platform code [POWERPC] Make it blatantly clear; mpc5200 device tree is not yet stable [POWERPC] Fix broken DMA on non-LPAR pSeries [POWERPC] Fix cell's mmio nvram to properly parse device tree [POWERPC] Remove bogus sanity check in pci -> OF node code
Diffstat (limited to 'include')
-rw-r--r--include/asm-powerpc/atomic.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/include/asm-powerpc/atomic.h b/include/asm-powerpc/atomic.h
index 53283e2540b3..f038e33e6d48 100644
--- a/include/asm-powerpc/atomic.h
+++ b/include/asm-powerpc/atomic.h
@@ -207,7 +207,8 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
/*
* Atomically test *v and decrement if it is greater than 0.
- * The function returns the old value of *v minus 1.
+ * The function returns the old value of *v minus 1, even if
+ * the atomic variable, v, was not decremented.
*/
static __inline__ int atomic_dec_if_positive(atomic_t *v)
{
@@ -216,14 +217,15 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)
__asm__ __volatile__(
LWSYNC_ON_SMP
"1: lwarx %0,0,%1 # atomic_dec_if_positive\n\
- addic. %0,%0,-1\n\
+ cmpwi %0,1\n\
+ addi %0,%0,-1\n\
blt- 2f\n"
PPC405_ERR77(0,%1)
" stwcx. %0,0,%1\n\
bne- 1b"
ISYNC_ON_SMP
"\n\
-2:" : "=&r" (t)
+2:" : "=&b" (t)
: "r" (&v->counter)
: "cc", "memory");