#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)
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__ */