]> err.no Git - linux-2.6/blobdiff - drivers/serial/8250.c
ide: add ->set_irq method
[linux-2.6] / drivers / serial / 8250.c
index ac4f20cbfe41e4623eb2d7e4a1de18124ce34c3d..27f34a9f9cb750297ea6527ce5d181b47b0ca660 100644 (file)
@@ -1287,7 +1287,7 @@ static void serial8250_enable_ms(struct uart_port *port)
 static void
 receive_chars(struct uart_8250_port *up, unsigned int *status)
 {
-       struct tty_struct *tty = up->port.info->tty;
+       struct tty_struct *tty = up->port.info->port.tty;
        unsigned char ch, lsr = *status;
        int max_count = 256;
        char flag;
@@ -1874,7 +1874,9 @@ static int serial8250_startup(struct uart_port *port)
                 * the interrupt is enabled.  Delays are necessary to
                 * allow register changes to become visible.
                 */
-               spin_lock_irqsave(&up->port.lock, flags);
+               spin_lock(&up->port.lock);
+               if (up->port.flags & UPF_SHARE_IRQ)
+                       disable_irq_nosync(up->port.irq);
 
                wait_for_xmitr(up, UART_LSR_THRE);
                serial_out_sync(up, UART_IER, UART_IER_THRI);
@@ -1886,7 +1888,9 @@ static int serial8250_startup(struct uart_port *port)
                iir = serial_in(up, UART_IIR);
                serial_out(up, UART_IER, 0);
 
-               spin_unlock_irqrestore(&up->port.lock, flags);
+               if (up->port.flags & UPF_SHARE_IRQ)
+                       enable_irq(up->port.irq);
+               spin_unlock(&up->port.lock);
 
                /*
                 * If the interrupt is not reasserted, setup a timer to