diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2020-06-02 10:53:52 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-06-03 10:03:33 +0200 |
commit | b5c9540d791921b9093096aec84017cd2828b93c (patch) | |
tree | 2c4f484ba3536aa3e22ad21fe848a86440eef687 | |
parent | 54d47eb7e91274bb3edd8ac4b2e87db6d6f95c43 (diff) | |
download | barebox-b5c9540d791921b9093096aec84017cd2828b93c.tar.gz barebox-b5c9540d791921b9093096aec84017cd2828b93c.tar.xz |
include: asm-generic: provide (in|out)_(le|be)(16|32) helpers for all archs
These U-Boot style bitwise operations macros will be needed for
COMPILE_TEST-compiled drivers on platforms except for ARM. Add fallback
definitions there, based on the ARM ones.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | include/asm-generic/bitio.h | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/include/asm-generic/bitio.h b/include/asm-generic/bitio.h new file mode 100644 index 0000000000..e88dbd7b85 --- /dev/null +++ b/include/asm-generic/bitio.h @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#ifndef __ASM_GENERIC_BITIO_H +#define __ASM_GENERIC_BITIO_H + +#include <asm-generic/io.h> + +/* + * 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. + */ + +#ifndef out_arch +#define out_arch(type,endian,a,v) __raw_write##type(cpu_to_##endian(v),a) +#endif + +#ifndef in_arch +#define in_arch(type,endian,a) endian##_to_cpu(__raw_read##type(a)) +#endif + +#ifndef out_le64 +#define out_le64(a,v) out_arch(q,le64,a,v) +#endif + +#ifndef out_le32 +#define out_le32(a,v) out_arch(l,le32,a,v) +#endif + +#ifndef out_le16 +#define out_le16(a,v) out_arch(w,le16,a,v) +#endif + +#ifndef in_le64 +#define in_le64(a) in_arch(q,le64,a) +#endif + +#ifndef in_le32 +#define in_le32(a) in_arch(l,le32,a) +#endif + +#ifndef in_le16 +#define in_le16(a) in_arch(w,le16,a) +#endif + +#ifndef out_be32 +#define out_be32(a,v) out_arch(l,be32,a,v) +#endif + +#ifndef out_be16 +#define out_be16(a,v) out_arch(w,be16,a,v) +#endif + +#ifndef in_be32 +#define in_be32(a) in_arch(l,be32,a) +#endif + +#ifndef in_be16 +#define in_be16(a) in_arch(w,be16,a) +#endif + +#ifndef out_8 +#define out_8(a,v) __raw_writeb(v,a) +#endif + +#ifndef in_8 +#define in_8(a) __raw_readb(a) +#endif + +#ifndef clrbits +#define clrbits(type, addr, clear) \ + out_##type((addr), in_##type(addr) & ~(clear)) +#endif + +#ifndef setbits +#define setbits(type, addr, set) \ + out_##type((addr), in_##type(addr) | (set)) +#endif + +#define clrsetbits(type, addr, clear, set) \ + out_##type((addr), (in_##type(addr) & ~(clear)) | (set)) + +#ifndef clrbits_be32 +#define clrbits_be32(addr, clear) clrbits(be32, addr, clear) +#endif + +#ifndef setbits_be32 +#define setbits_be32(addr, set) setbits(be32, addr, set) +#endif + +#ifndef clrsetbits_be32 +#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set) +#endif + +#ifndef clrbits_le32 +#define clrbits_le32(addr, clear) clrbits(le32, addr, clear) +#endif + +#ifndef setbits_le32 +#define setbits_le32(addr, set) setbits(le32, addr, set) +#endif + +#ifndef clrsetbits_le32 +#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set) +#endif + +#ifndef clrbits_be16 +#define clrbits_be16(addr, clear) clrbits(be16, addr, clear) +#endif + +#ifndef setbits_be16 +#define setbits_be16(addr, set) setbits(be16, addr, set) +#endif + +#ifndef clrsetbits_be16 +#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set) +#endif + +#ifndef clrbits_le16 +#define clrbits_le16(addr, clear) clrbits(le16, addr, clear) +#endif + +#ifndef setbits_le16 +#define setbits_le16(addr, set) setbits(le16, addr, set) +#endif + +#ifndef clrsetbits_le16 +#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set) +#endif + +#ifndef clrbits_8 +#define clrbits_8(addr, clear) clrbits(8, addr, clear) +#endif + +#ifndef setbits_8 +#define setbits_8(addr, set) setbits(8, addr, set) +#endif + +#ifndef clrsetbits_8 +#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set) +#endif + +#endif /* __ASM_GENERIC_IO_H */ |