summaryrefslogtreecommitdiffstats
path: root/arch/ppc/include
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-05-02 10:09:49 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-05-02 10:09:49 +0200
commit608a9633e477df8acfe5b7a3fddb2d91bb9230c2 (patch)
tree73eb568349fce1b7096b6fa47392591e43c3f502 /arch/ppc/include
parent272704fcf364f17e80d5a445f2c42e65d2e4d23a (diff)
downloadbarebox-608a9633e477df8acfe5b7a3fddb2d91bb9230c2.tar.gz
barebox-608a9633e477df8acfe5b7a3fddb2d91bb9230c2.tar.xz
ppc: add clr/setbits operations
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/ppc/include')
-rw-r--r--arch/ppc/include/asm/io.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/ppc/include/asm/io.h b/arch/ppc/include/asm/io.h
index 052ae152e9..13187cae24 100644
--- a/arch/ppc/include/asm/io.h
+++ b/arch/ppc/include/asm/io.h
@@ -176,6 +176,26 @@ extern inline void out_be32(volatile unsigned *addr, int val)
__asm__ __volatile__("stw%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
}
+/*
+ * Clear and set bits in one shot. These macros can be used to clear and
+ * set multiple bits in a register using a single call. These macros can
+ * also be used to set a multiple-bit bit pattern using a mask, by
+ * specifying the mask in the 'clear' parameter and the new bit pattern
+ * in the 'set' parameter.
+ */
+#define clrbits(type, addr, clear) \
+ out_##type((addr), in_##type(addr) & ~(clear))
+
+#define setbits(type, addr, set) \
+ out_##type((addr), in_##type(addr) | (set))
+
+#define clrsetbits(type, addr, clear, set) \
+ out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
+
+#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
+#define setbits_be32(addr, set) setbits(be32, addr, set)
+#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
+
/* these ones were originally in config.h */
unsigned char in8(unsigned int);
void out8(unsigned int, unsigned char);