diff --git a/include/minix/mmio.h b/include/minix/mmio.h index 8c23a3520..60a41c952 100644 --- a/include/minix/mmio.h +++ b/include/minix/mmio.h @@ -1,6 +1,7 @@ #ifndef __MMIO_H__ #define __MMIO_H__ +#define REG16(x)(*((volatile uint16_t *)(x))) #define REG(x)(*((volatile uint32_t *)(x))) #define BIT(x)(0x1 << x) @@ -30,4 +31,32 @@ set32(uint32_t address, uint32_t mask, uint32_t value) val |= (value & mask); write32(address, val); } + +/* Write a uint16_t value to a memory address. */ +static inline void +write16(uint32_t address, uint16_t value) +{ + REG16(address) = value; +} + +/* Read an uint16_t from a memory address */ +static inline uint16_t +read16(uint32_t address) +{ + return REG16(address); +} + +/* Set a 16 bits value depending on a mask */ +static inline void +set16(uint32_t address, uint16_t mask, uint16_t value) +{ + uint16_t val; + val = read16(address); + /* clear the bits */ + val &= ~(mask); + /* apply the value using the mask */ + val |= (value & mask); + write16(address, val); +} + #endif /* __MMIO_H__ */