rework external irq system, introduce hierarchical irq
[lunaix-os.git] / lunaix-os / hal / char / uart / 16x50.h
index addedfaa828de493b192aa2e507e742a89ea722c..4a2c8a5b61e9b6012b380ffbd68db82fdfbf076d 100644 (file)
@@ -2,6 +2,7 @@
 #define __LUNAIX_16550_H
 
 #include <hal/serial.h>
 #define __LUNAIX_16550_H
 
 #include <hal/serial.h>
+#include <hal/irq.h>
 #include <lunaix/types.h>
 
 #define UART_rRxTX 0
 #include <lunaix/types.h>
 
 #define UART_rRxTX 0
@@ -69,7 +70,8 @@ struct uart16550
     struct llist_header local_ports;
     struct serial_dev* sdev;
     ptr_t base_addr;
     struct llist_header local_ports;
     struct serial_dev* sdev;
     ptr_t base_addr;
-    int iv;
+    unsigned int base_clk;
+    irq_t irq;
 
     struct
     {
 
     struct
     {
@@ -118,12 +120,12 @@ void
 uart_free(struct uart16550*);
 
 static inline int
 uart_free(struct uart16550*);
 
 static inline int
-uart_baud_divisor(struct uart16550* uart, int div)
+uart_baud_divisor(struct uart16550* uart, unsigned int div)
 {
     u32_t rlc = uart->read_reg(uart, UART_rLC);
 
     uart->write_reg(uart, UART_rLC, UART_rLC_DLAB | rlc);
 {
     u32_t rlc = uart->read_reg(uart, UART_rLC);
 
     uart->write_reg(uart, UART_rLC, UART_rLC_DLAB | rlc);
-    u8_t ls = (div & 0xff), ms = (div & 0xff00) >> 8;
+    u8_t ls = (div & 0x00ff), ms = (div & 0xff00) >> 8;
 
     uart->write_reg(uart, UART_rLS, ls);
     uart->write_reg(uart, UART_rMS, ms);
 
     uart->write_reg(uart, UART_rLS, ls);
     uart->write_reg(uart, UART_rMS, ms);
@@ -226,10 +228,10 @@ int
 uart_general_tx(struct serial_dev* sdev, u8_t* data, size_t len);
 
 void
 uart_general_tx(struct serial_dev* sdev, u8_t* data, size_t len);
 
 void
-uart_handle_irq_overlap(int iv, struct llist_header* ports);
+uart_handle_irq_overlap(irq_t irq, struct llist_header* ports);
 
 void
 
 void
-uart_handle_irq(int iv, struct uart16550 *uart);
+uart_handle_irq(irq_t irq, struct uart16550 *uart);
 
 static inline struct serial_dev*
 uart_create_serial(struct uart16550* uart, struct devclass* class, 
 
 static inline struct serial_dev*
 uart_create_serial(struct uart16550* uart, struct devclass* class,