From ed7eb5aad7d4e4945fac664c9b67d0db2a8a3db8 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sat, 12 Aug 2017 19:49:30 -0700 Subject: [PATCH] MIPS: CPS: Introduce register modify (set/clear/change) accessors 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 Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/17004/ Signed-off-by: Ralf Baechle --- arch/mips/include/asm/mips-cps.h | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/mips/include/asm/mips-cps.h b/arch/mips/include/asm/mips-cps.h index 6ced7ba102b6..7ae32ad15599 100644 --- a/arch/mips/include/asm/mips-cps.h +++ b/arch/mips/include/asm/mips-cps.h @@ -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__ */ -- 2.20.1