Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / arm / lib / bitops.h
index 4a83ab6..b8c14e9 100644 (file)
@@ -1,8 +1,40 @@
+#include <linux/config.h>
+
+#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K)
+       .macro  bitop, instr
+       mov     r2, #1
+       and     r3, r0, #7              @ Get bit offset
+       add     r1, r1, r0, lsr #3      @ Get byte offset
+       mov     r3, r2, lsl r3
+1:     ldrexb  r2, [r1]
+       \instr  r2, r2, r3
+       strexb  r0, r2, [r1]
+       cmp     r0, #0
+       bne     1b
+       mov     pc, lr
+       .endm
+
+       .macro  testop, instr, store
+       and     r3, r0, #7              @ Get bit offset
+       mov     r2, #1
+       add     r1, r1, r0, lsr #3      @ Get byte offset
+       mov     r3, r2, lsl r3          @ create mask
+1:     ldrexb  r2, [r1]
+       ands    r0, r2, r3              @ save old value of bit
+       \instr  r2, r2, r3                      @ toggle bit
+       strexb  ip, r2, [r1]
+       cmp     ip, #0
+       bne     1b
+       cmp     r0, #0
+       movne   r0, #1
+2:     mov     pc, lr
+       .endm
+#else
        .macro  bitop, instr
        and     r2, r0, #7
        mov     r3, #1
        mov     r3, r3, lsl r2
-       save_and_disable_irqs ip, r2
+       save_and_disable_irqs ip
        ldrb    r2, [r1, r0, lsr #3]
        \instr  r2, r2, r3
        strb    r2, [r1, r0, lsr #3]
@@ -22,7 +54,7 @@
        add     r1, r1, r0, lsr #3
        and     r3, r0, #7
        mov     r0, #1
-       save_and_disable_irqs ip, r2
+       save_and_disable_irqs ip
        ldrb    r2, [r1]
        tst     r2, r0, lsl r3
        \instr  r2, r2, r0, lsl r3
@@ -31,3 +63,4 @@
        moveq   r0, #0
        mov     pc, lr
        .endm
+#endif