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