X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/9daf4fcdae88f72af60aeb0c7722841af02233d4..836d44ecb7a2c37427f6baf8b25e872e9e943d5b:/lunaix-os/hal/char/uart/16x50_isa.c diff --git a/lunaix-os/hal/char/uart/16x50_isa.c b/lunaix-os/hal/char/uart/16x50_isa.c index 3958223..c24c1d0 100644 --- a/lunaix-os/hal/char/uart/16x50_isa.c +++ b/lunaix-os/hal/char/uart/16x50_isa.c @@ -11,10 +11,9 @@ LOG_MODULE("16x50-isa"); static DEFINE_LLIST(com_ports); static void -com_irq_handler(const struct hart_state* hstate) +com_irq_handler(irq_t irq, const struct hart_state* hstate) { - int vector = hart_vector_stamp(hstate); - uart_handle_irq_overlap(vector, &com_ports); + uart_handle_irq_overlap(irq, &com_ports); } int @@ -25,6 +24,7 @@ isa16x50_create_once(struct device_def* def) int* irqs[] = { &irq4, &irq3, &irq4, &irq3 }; struct uart16550* uart = NULL; + struct serial_dev* sdev; ptr_t base; // COM 1...4 @@ -37,20 +37,20 @@ isa16x50_create_once(struct device_def* def) continue; } + sdev = uart_create_serial(uart, &def->class, &com_ports, "S"); + int irq = *irqs[i]; if (irq) { /* * Since these irqs are overlapped, this particular setup is needed * to avoid double-bind */ - uart->iv = isrm_bindirq(irq, com_irq_handler); + uart->irq = irq_declare_line(com_irq_handler, irq, NULL); + irq_assign(irq_owning_domain(sdev->dev), uart->irq); *((volatile int*)irqs[i]) = 0; } - - INFO("base: 0x%x, irq=%d", - base, irq, uart->iv); - - uart_create_serial(uart, &def->class, &com_ports, "S"); + + INFO("base: 0x%x, irq=%d", base, irq); } return 0;