Unifying External Interrupt System (#51)
[lunaix-os.git] / lunaix-os / hal / char / uart / 16x50_mmio.c
1 #include <lunaix/device.h>
2 #include <lunaix/mm/mmio.h>
3
4 #include "16x50.h"
5
6 static u32_t
7 uart_mmio_regread(struct uart16550* uart, ptr_t regoff)
8 {
9     return (u32_t)(*(u8_t*)(uart->base_addr + regoff));
10 }
11
12 static void
13 uart_mmio_regwrite(struct uart16550* uart, ptr_t regoff, u32_t val)
14 {
15     *(u8_t*)(uart->base_addr + regoff) = (u8_t)val;
16 }
17
18 struct uart16550*
19 uart16x50_mmio_create(ptr_t base, ptr_t size)
20 {
21     ptr_t mmio_base;
22     struct uart16550* uart;
23
24     base = ioremap(base, size);
25     uart = uart_alloc(base);
26     uart->read_reg = uart_mmio_regread;
27     uart->write_reg = uart_mmio_regwrite;
28
29     if (!uart_testport(uart, 0xe3)) {
30         iounmap(base, size);
31         uart_free(uart);
32         return NULL;
33     }
34
35     uart_enable_fifo(uart, UART_FIFO8);
36
37     return uart;
38 }