nios2: add clear and set bits macros
PATCH 1/1 nios2: add clear and set bits macros
These macros can be used to clear and set multiple bits in a register using a single call.
--- arch/nios2/include/asm/io.h | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)
arch/nios2/include/asm/io.h +57 -0
@@ -116,4 +116,61 @@ static inline void outsl (unsigned long port, const void *src, unsigned long cou while (count--) outl (*p++, port); } +/* +* 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 out_arch (type,endian,a,v) __raw_write##type(cpu_to_##endian(v),a) +#define in_arch (type,endian,a) endian##_to_cpu(__raw_read##type(a)) + +#define out_le64 (a,v) out_arch(q,le64,a,v) +#define out_le32 (a,v) out_arch(l,le32,a,v) +#define out_le16 (a,v) out_arch(w,le16,a,v) + +#define in_le64 (a) in_arch(q,le64,a) +#define in_le32 (a) in_arch(l,le32,a) +#define in_le16 (a) in_arch(w,le16,a) + +#define out_be32 (a,v) out_arch(l,be32,a,v) +#define out_be16 (a,v) out_arch(w,be16,a,v) + +#define in_be32 (a) in_arch(l,be32,a) +#define in_be16 (a) in_arch(w,be16,a) + +#define out_8 (a,v) __raw_writeb(v,a) +#define in_8 (a) __raw_readb(a) + +#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) + +#define clrbits_le32 (addr, clear) clrbits(le32, addr, clear) +#define setbits_le32 (addr, set) setbits(le32, addr, set) +#define clrsetbits_le32 (addr, clear, set) clrsetbits(le32, addr, clear, set) + +#define clrbits_be16 (addr, clear) clrbits(be16, addr, clear) +#define setbits_be16 (addr, set) setbits(be16, addr, set) +#define clrsetbits_be16 (addr, clear, set) clrsetbits(be16, addr, clear, set) + +#define clrbits_le16 (addr, clear) clrbits(le16, addr, clear) +#define setbits_le16 (addr, set) setbits(le16, addr, set) +#define clrsetbits_le16 (addr, clear, set) clrsetbits(le16, addr, clear, set) + +#define clrbits_8 (addr, clear) clrbits(8, addr, clear) +#define setbits_8 (addr, set) setbits(8, addr, set) +#define clrsetbits_8 (addr, clear, set) clrsetbits(8, addr, clear, set) +#endif /* __ASM_NIOS2_IO_H_ */
Signature · 1 line
2.1.4
PATCH 1/1 nios2: add clear and set bits macros
Quoted 4 lines · Thomas Chou
These macros can be used to clear and set multiple bits in a register using a single call.
Signed-off-by Thomas Chou <[email protected]>
Looks pretty standard,
Best regards,
Marek Vasut
PATCH 1/1 nios2: add clear and set bits macros
In reply to Thomas ChouHi Thomas,
Quoted 4 lines · thomas at wytron.com.tw
These macros can be used to clear and set multiple bits in a register using a single call.
Signed-off-by Thomas Chou <[email protected]>
Thanks for the patch.
Sorry for the late comments as noticed all my mail for last few days was stuck in mail server.
Quoted 14 lines
--- arch/nios2/include/asm/io.h | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)arch/nios2/include/asm/io.h +2
-0@@ -116,4 +116,61 @@ static inline void outsl (unsigned long port, const void *src, unsigned long couwhile (count--)outl (*p++, port); } +/* +* Clear and set bits in one shot. These macros can be used to clear and
arch/nios2/include/asm/io.h static inline void outsl (unsigned long port, const void *src, unsigned long cou · line 130
Quoted 10 lines
arch/nios2/include/asm/io.h +10
-0+* 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 out_arch (type,endian,a,v) __raw_write##type(cpu_to_##endian(v),a) +#define in_arch (type,endian,a) endian##_to_cpu(__raw_read##type(a)) + +#define out_le64 (a,v) out_arch(q,le64,a,v)
The 64bit support (q) is not yet available. This will break if someone using this.
arch/nios2/include/asm/io.h static inline void outsl (unsigned long port, const void *src, unsigned long cou · line 134
Quoted 4 lines
arch/nios2/include/asm/io.h +4
-0+#define out_le32 (a,v) out_arch(l,le32,a,v) +#define out_le16 (a,v) out_arch(w,le16,a,v) + +#define in_le64 (a) in_arch(q,le64,a)
same as above
Thanks
Chin Liang
Quoted 42 lines
arch/nios2/include/asm/io.h +41
-0+#define in_le32 (a) in_arch(l,le32,a) +#define in_le16 (a) in_arch(w,le16,a) + +#define out_be32 (a,v) out_arch(l,be32,a,v) +#define out_be16 (a,v) out_arch(w,be16,a,v) + +#define in_be32 (a) in_arch(l,be32,a) +#define in_be16 (a) in_arch(w,be16,a) + +#define out_8 (a,v) __raw_writeb(v,a) +#define in_8 (a) __raw_readb(a) + +#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) + +#define clrbits_le32 (addr, clear) clrbits(le32, addr, clear) +#define setbits_le32 (addr, set) setbits(le32, addr, set) +#define clrsetbits_le32 (addr, clear, set) clrsetbits(le32, addr, clear, set) + +#define clrbits_be16 (addr, clear) clrbits(be16, addr, clear) +#define setbits_be16 (addr, set) setbits(be16, addr, set) +#define clrsetbits_be16 (addr, clear, set) clrsetbits(be16, addr, clear, set) + +#define clrbits_le16 (addr, clear) clrbits(le16, addr, clear) +#define setbits_le16 (addr, set) setbits(le16, addr, set) +#define clrsetbits_le16 (addr, clear, set) clrsetbits(le16, addr, clear, set) + +#define clrbits_8 (addr, clear) clrbits(8, addr, clear) +#define setbits_8 (addr, set) setbits(8, addr, set) +#define clrsetbits_8 (addr, clear, set) clrsetbits(8, addr, clear, set) +#endif /* __ASM_NIOS2_IO_H_ */
PATCH 1/1 nios2: add clear and set bits macros
Hi Chin Liang,
Quoted 4 lines · Chin Liang See
Quoted 1 line
+#define
out_le64(a,v)out_arch(q,le64,a,v)The 64bit support (q) is not yet available. This will break if someone using this.
Yes, they should be deleted for nios2. Thanks for your review.
Best regards,
Thomas
PATCH v2 1/1 nios2: add clear and set bits macros
In reply to Thomas ChouThese macros can be used to clear and set multiple bits in a register using a single call.
---
v2
remove unsupported 64 btis macros as Chin Liang suggested.
arch/nios2/include/asm/io.h | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+)
arch/nios2/include/asm/io.h +55 -0
@@ -116,4 +116,59 @@ static inline void outsl (unsigned long port, const void *src, unsigned long cou while (count--) outl (*p++, port); } +/* +* 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 out_arch (type,endian,a,v) __raw_write##type(cpu_to_##endian(v),a) +#define in_arch (type,endian,a) endian##_to_cpu(__raw_read##type(a)) + +#define out_le32 (a,v) out_arch(l,le32,a,v) +#define out_le16 (a,v) out_arch(w,le16,a,v) + +#define in_le32 (a) in_arch(l,le32,a) +#define in_le16 (a) in_arch(w,le16,a) + +#define out_be32 (a,v) out_arch(l,be32,a,v) +#define out_be16 (a,v) out_arch(w,be16,a,v) + +#define in_be32 (a) in_arch(l,be32,a) +#define in_be16 (a) in_arch(w,be16,a) + +#define out_8 (a,v) __raw_writeb(v,a) +#define in_8 (a) __raw_readb(a) + +#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) + +#define clrbits_le32 (addr, clear) clrbits(le32, addr, clear) +#define setbits_le32 (addr, set) setbits(le32, addr, set) +#define clrsetbits_le32 (addr, clear, set) clrsetbits(le32, addr, clear, set) + +#define clrbits_be16 (addr, clear) clrbits(be16, addr, clear) +#define setbits_be16 (addr, set) setbits(be16, addr, set) +#define clrsetbits_be16 (addr, clear, set) clrsetbits(be16, addr, clear, set) + +#define clrbits_le16 (addr, clear) clrbits(le16, addr, clear) +#define setbits_le16 (addr, set) setbits(le16, addr, set) +#define clrsetbits_le16 (addr, clear, set) clrsetbits(le16, addr, clear, set) + +#define clrbits_8 (addr, clear) clrbits(8, addr, clear) +#define setbits_8 (addr, set) setbits(8, addr, set) +#define clrsetbits_8 (addr, clear, set) clrsetbits(8, addr, clear, set) +#endif /* __ASM_NIOS2_IO_H_ */
Signature · 1 line
2.1.4
PATCH v2 1/1 nios2: add clear and set bits macros
Hi Thomas,
Quoted 9 lines · thomas at wytron.com.tw
These macros can be used to clear and set multiple bits in a register using a single call.
Signed-off-by Thomas Chou <[email protected]>Reviewed-by Marek Vasut <[email protected]>---
v2
remove unsupported 64 btis macros as Chin Liang suggested.
Thanks
Chin Liang
PATCH v2 1/1 nios2: add clear and set bits macros
In reply to Thomas ChouQuoted 12 lines · Thomas Chou
These macros can be used to clear and set multiple bits in a register using a single call.
Signed-off-by Thomas Chou <[email protected]>Reviewed-by Marek Vasut <[email protected]>---
v2
remove unsupported 64 btis macros as Chin Liang suggested.arch/nios2/include/asm/io.h | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+)
Applied to u-boot-nios.