1 #include <lunaix/device.h>
2 #include <asm-generic/isrm.h>
3 #include <lunaix/syslog.h>
5 #include <asm/x86_pmio.h>
9 LOG_MODULE("16x50-isa");
11 static DEFINE_LLIST(com_ports);
14 com_irq_handler(const struct hart_state* hstate)
16 int vector = hart_vector_stamp(hstate);
17 uart_handle_irq_overlap(vector, &com_ports);
21 upiom_init(struct device_def* def)
23 int irq3 = 3, irq4 = 4;
24 u16_t ioports[] = { 0x3F8, 0x2F8, 0x3E8, 0x2E8 };
25 int* irqs[] = { &irq4, &irq3, &irq4, &irq3 };
27 struct uart16550* uart = NULL;
31 for (size_t i = 0; i < 4; i++) {
34 uart = uart16x50_pmio_create(base);
36 WARN("port 0x%x not accessible", base);
43 * Since these irqs are overlapped, this particular setup is needed
44 * to avoid double-bind
46 uart->iv = isrm_bindirq(irq, com_irq_handler);
47 *((volatile int*)irqs[i]) = 0;
50 INFO("base: 0x%x, irq=%d",
53 uart_create_serial(uart, &def->class, &com_ports, "S");
59 static struct device_def uart_pmio_def = {
60 .class = DEVCLASS(DEVIF_SOC, DEVFN_CHAR, DEV_UART16550),
61 .name = "16550 UART (PIO)",
64 EXPORT_DEVICE(uart16550_pmio, &uart_pmio_def, load_onboot);