MIPS: implement bit manipulating I/O accessors
authorDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Fri, 15 Jan 2016 14:54:48 +0000 (15:54 +0100)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Sat, 16 Jan 2016 20:06:46 +0000 (21:06 +0100)
Add support for functions clrbits_X(), setbits_X() and clrsetbits_X()
on MIPS.

Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
arch/mips/include/asm/io.h

index eb06afafaed1dcbc1f97895ba7b4554d142d4375..b8ac5a5ac5417b68c481c5019438587e907ca6f2 100644 (file)
@@ -541,4 +541,59 @@ static inline void unmap_physmem(void *vaddr, unsigned long flags)
 {
 }
 
+#define __BUILD_CLRBITS(bwlq, sfx, end, type)                          \
+                                                                       \
+static inline void clrbits_##sfx(volatile void __iomem *mem, type clr) \
+{                                                                      \
+       type __val = __raw_read##bwlq(mem);                             \
+       __val = end##_to_cpu(__val);                                    \
+       __val &= ~clr;                                                  \
+       __val = cpu_to_##end(__val);                                    \
+       __raw_write##bwlq(__val, mem);                                  \
+}
+
+#define __BUILD_SETBITS(bwlq, sfx, end, type)                          \
+                                                                       \
+static inline void setbits_##sfx(volatile void __iomem *mem, type set) \
+{                                                                      \
+       type __val = __raw_read##bwlq(mem);                             \
+       __val = end##_to_cpu(__val);                                    \
+       __val |= set;                                                   \
+       __val = cpu_to_##end(__val);                                    \
+       __raw_write##bwlq(__val, mem);                                  \
+}
+
+#define __BUILD_CLRSETBITS(bwlq, sfx, end, type)                       \
+                                                                       \
+static inline void clrsetbits_##sfx(volatile void __iomem *mem,                \
+                                       type clr, type set)             \
+{                                                                      \
+       type __val = __raw_read##bwlq(mem);                             \
+       __val = end##_to_cpu(__val);                                    \
+       __val &= ~clr;                                                  \
+       __val |= set;                                                   \
+       __val = cpu_to_##end(__val);                                    \
+       __raw_write##bwlq(__val, mem);                                  \
+}
+
+#define BUILD_CLRSETBITS(bwlq, sfx, end, type)                         \
+                                                                       \
+__BUILD_CLRBITS(bwlq, sfx, end, type)                                  \
+__BUILD_SETBITS(bwlq, sfx, end, type)                                  \
+__BUILD_CLRSETBITS(bwlq, sfx, end, type)
+
+#define __to_cpu(v)            (v)
+#define cpu_to__(v)            (v)
+
+BUILD_CLRSETBITS(b, 8, _, u8)
+BUILD_CLRSETBITS(w, le16, le16, u16)
+BUILD_CLRSETBITS(w, be16, be16, u16)
+BUILD_CLRSETBITS(w, 16, _, u16)
+BUILD_CLRSETBITS(l, le32, le32, u32)
+BUILD_CLRSETBITS(l, be32, be32, u32)
+BUILD_CLRSETBITS(l, 32, _, u32)
+BUILD_CLRSETBITS(q, le64, le64, u64)
+BUILD_CLRSETBITS(q, be64, be64, u64)
+BUILD_CLRSETBITS(q, 64, _, u64)
+
 #endif /* _ASM_IO_H */