[PATCH] powerpc: add setclrbits macros

Subsystems: the rest

STALE6935d

3 messages, 2 authors, 2007-08-17 · open the first message on its own page

[PATCH] powerpc: add setclrbits macros

From: Timur Tabi <hidden>
Date: 2007-08-16 22:43:38

This patch adds the setclrbits_xxx() macros, which are used to set and clear
multiple bits in a single read-modify-write operation.  Specify the bits
to set in the 'set' parameter and the bits to clear in the 'clear' parameter.
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.  There are big-endian and little-endian versions for 8, 16,
32, and 64 bits.

Signed-off-by: Timur Tabi <redacted>
---

Changed the macros from setmaskedbits_xxx to setclrbits_xxx and added a comment
indicating the expanded functionality.

 include/asm-powerpc/io.h |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h
index bb8d965..58c8b96 100644
--- a/include/asm-powerpc/io.h
+++ b/include/asm-powerpc/io.h
@@ -734,6 +734,33 @@ static inline void * bus_to_virt(unsigned long address)
 #define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) |  (_v))
 #define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
 
+/* Set and clear bits in one shot.  These macros can be used to clear and
+ * set multiple bits in a register using a single read-modify-write.  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.
+ */
+
+#ifdef __powerpc64__
+#define setclrbits_be64(addr, set, clear) \
+	out_be64((addr), (in_be64(addr) & ~(clear)) | (set))
+#define setclrbits_le64(addr, set, clear) \
+	out_le64((addr), (in_le64(addr) & ~(clear)) | (set))
+#endif
+
+#define setclrbits_be32(addr, set, clear) \
+	out_be32((addr), (in_be32(addr) & ~(clear)) | (set))
+#define setclrbits_be16(addr, set, clear) \
+	out_be16((addr), (in_be16(addr) & ~(clear)) | (set))
+
+#define setclrbits_le32(addr, set, clear) \
+	out_le32((addr), (in_le32(addr) & ~(clear)) | (set))
+#define setclrbits_le16(addr, set, clear) \
+	out_le16((addr), (in_le16(addr) & ~(clear)) | (set))
+
+#define setclrbits_8(addr, set, clear) \
+	out_8((addr), (in_8(addr) & ~(clear)) | (set))
+
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_POWERPC_IO_H */
-- 
1.5.2.4

Re: [PATCH] powerpc: add setclrbits macros

From: Geert Uytterhoeven <hidden>
Date: 2007-08-17 06:44:36

On Thu, 16 Aug 2007, Timur Tabi wrote:
This patch adds the setclrbits_xxx() macros, which are used to set and clear
multiple bits in a single read-modify-write operation.  Specify the bits
to set in the 'set' parameter and the bits to clear in the 'clear' parameter.
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.  There are big-endian and little-endian versions for 8, 16,
32, and 64 bits.
Sorry for nitpicking again, but since the clear is done before the set (cfr.
the expanded functionality), perhaps they should be changed to
clrsetbits_X(addr, clear, set)?
quoted hunk
Signed-off-by: Timur Tabi <redacted>
---

Changed the macros from setmaskedbits_xxx to setclrbits_xxx and added a comment
indicating the expanded functionality.

 include/asm-powerpc/io.h |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h
index bb8d965..58c8b96 100644
--- a/include/asm-powerpc/io.h
+++ b/include/asm-powerpc/io.h
@@ -734,6 +734,33 @@ static inline void * bus_to_virt(unsigned long address)
 #define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) |  (_v))
 #define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
 
+/* Set and clear bits in one shot.  These macros can be used to clear and
+ * set multiple bits in a register using a single read-modify-write.  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.
+ */
+
+#ifdef __powerpc64__
+#define setclrbits_be64(addr, set, clear) \
+	out_be64((addr), (in_be64(addr) & ~(clear)) | (set))
+#define setclrbits_le64(addr, set, clear) \
+	out_le64((addr), (in_le64(addr) & ~(clear)) | (set))
+#endif
+
+#define setclrbits_be32(addr, set, clear) \
+	out_be32((addr), (in_be32(addr) & ~(clear)) | (set))
+#define setclrbits_be16(addr, set, clear) \
+	out_be16((addr), (in_be16(addr) & ~(clear)) | (set))
+
+#define setclrbits_le32(addr, set, clear) \
+	out_le32((addr), (in_le32(addr) & ~(clear)) | (set))
+#define setclrbits_le16(addr, set, clear) \
+	out_le16((addr), (in_le16(addr) & ~(clear)) | (set))
+
+#define setclrbits_8(addr, set, clear) \
+	out_8((addr), (in_8(addr) & ~(clear)) | (set))
+
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_POWERPC_IO_H */
-- 
1.5.2.4
With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

Re: [PATCH] powerpc: add setclrbits macros

From: Timur Tabi <hidden>
Date: 2007-08-17 16:03:51

Geert Uytterhoeven wrote:
Sorry for nitpicking again, but since the clear is done before the set (cfr.
the expanded functionality), perhaps they should be changed to
clrsetbits_X(addr, clear, set)?
*sigh*

You're right.  New patch coming soon.

-- 
Timur Tabi
Linux Kernel Developer @ Freescale
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help