MIPS: CPS: Introduce register modify (set/clear/change) accessors
authorPaul Burton <paul.burton@imgtec.com>
Sun, 13 Aug 2017 02:49:30 +0000 (19:49 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 29 Aug 2017 22:57:26 +0000 (00:57 +0200)
For read-write registers introduce accessor functions that simplify the
task of modifying a subset of bits within the register. set_* functions
set bits to 1, clear_* functions clear bits to 0 & change_* functions
set bits specified in a mask to an arbitrary value.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17004/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/mips-cps.h

index 6ced7ba102b65410b4b73b6b439c65b669378a1c..7ae32ad1559988398641a3b6067fd5864ebef1c6 100644 (file)
@@ -71,6 +71,26 @@ static inline void write_##unit##_##name(uint##sz##_t val)           \
        }                                                               \
 }
 
+#define CPS_ACCESSOR_M(unit, sz, name)                                 \
+static inline void change_##unit##_##name(uint##sz##_t mask,           \
+                                         uint##sz##_t val)             \
+{                                                                      \
+       uint##sz##_t reg_val = read_##unit##_##name();                  \
+       reg_val &= ~mask;                                               \
+       reg_val |= val;                                                 \
+       write_##unit##_##name(reg_val);                                 \
+}                                                                      \
+                                                                       \
+static inline void set_##unit##_##name(uint##sz##_t val)               \
+{                                                                      \
+       change_##unit##_##name(val, val);                               \
+}                                                                      \
+                                                                       \
+static inline void clear_##unit##_##name(uint##sz##_t val)             \
+{                                                                      \
+       change_##unit##_##name(val, 0);                                 \
+}
+
 #define CPS_ACCESSOR_RO(unit, sz, off, name)                           \
        CPS_ACCESSOR_A(unit, off, name)                                 \
        CPS_ACCESSOR_R(unit, sz, name)
@@ -82,6 +102,7 @@ static inline void write_##unit##_##name(uint##sz##_t val)           \
 #define CPS_ACCESSOR_RW(unit, sz, off, name)                           \
        CPS_ACCESSOR_A(unit, off, name)                                 \
        CPS_ACCESSOR_R(unit, sz, name)                                  \
-       CPS_ACCESSOR_W(unit, sz, name)
+       CPS_ACCESSOR_W(unit, sz, name)                                  \
+       CPS_ACCESSOR_M(unit, sz, name)
 
 #endif /* __MIPS_ASM_MIPS_CPS_H__ */