struct uart_port *port = &ourport->port;
        struct tty_struct *tty = port->state->port.tty;
        unsigned int ufcon, ch, flag, ufstat, uerstat;
+       unsigned long flags;
        int max_count = 64;
 
+       spin_lock_irqsave(&port->lock, flags);
+
        while (max_count-- > 0) {
                ufcon = rd_regl(port, S3C2410_UFCON);
                ufstat = rd_regl(port, S3C2410_UFSTAT);
        tty_flip_buffer_push(tty);
 
  out:
+       spin_unlock_irqrestore(&port->lock, flags);
        return IRQ_HANDLED;
 }
 
        struct s3c24xx_uart_port *ourport = id;
        struct uart_port *port = &ourport->port;
        struct circ_buf *xmit = &port->state->xmit;
+       unsigned long flags;
        int count = 256;
 
+       spin_lock_irqsave(&port->lock, flags);
+
        if (port->x_char) {
                wr_regb(port, S3C2410_UTXH, port->x_char);
                port->icount.tx++;
                port->icount.tx++;
        }
 
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) {
+               spin_unlock(&port->lock);
                uart_write_wakeup(port);
+               spin_lock(&port->lock);
+       }
 
        if (uart_circ_empty(xmit))
                s3c24xx_serial_stop_tx(port);
 
  out:
+       spin_unlock_irqrestore(&port->lock, flags);
        return IRQ_HANDLED;
 }
 
        struct s3c24xx_uart_port *ourport = id;
        struct uart_port *port = &ourport->port;
        unsigned int pend = rd_regl(port, S3C64XX_UINTP);
-       unsigned long flags;
        irqreturn_t ret = IRQ_HANDLED;
 
-       spin_lock_irqsave(&port->lock, flags);
        if (pend & S3C64XX_UINTM_RXD_MSK) {
                ret = s3c24xx_serial_rx_chars(irq, id);
                wr_regl(port, S3C64XX_UINTP, S3C64XX_UINTM_RXD_MSK);
                ret = s3c24xx_serial_tx_chars(irq, id);
                wr_regl(port, S3C64XX_UINTP, S3C64XX_UINTM_TXD_MSK);
        }
-       spin_unlock_irqrestore(&port->lock, flags);
        return ret;
 }