serial: samsung: introduce s3c24xx_serial_rx_drain_fifo() function
[firefly-linux-kernel-4.4.55.git] / drivers / tty / serial / samsung.c
index dc4be54088535dce216bd14f3f6254d705dc2448..1d7dd8605b22c49f61b500e0aad06c5c40af8885 100644 (file)
@@ -621,16 +621,12 @@ finish:
        return IRQ_HANDLED;
 }
 
-static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id)
+static void s3c24xx_serial_rx_drain_fifo(struct s3c24xx_uart_port *ourport)
 {
-       struct s3c24xx_uart_port *ourport = dev_id;
        struct uart_port *port = &ourport->port;
        unsigned int ufcon, ch, flag, ufstat, uerstat;
-       unsigned long flags;
        int max_count = port->fifosize;
 
-       spin_lock_irqsave(&port->lock, flags);
-
        while (max_count-- > 0) {
                ufcon = rd_regl(port, S3C2410_UFCON);
                ufstat = rd_regl(port, S3C2410_UFSTAT);
@@ -654,9 +650,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id)
                                        ufcon |= S3C2410_UFCON_RESETRX;
                                        wr_regl(port, S3C2410_UFCON, ufcon);
                                        rx_enabled(port) = 1;
-                                       spin_unlock_irqrestore(&port->lock,
-                                                       flags);
-                                       goto out;
+                                       return;
                                }
                                continue;
                        }
@@ -702,10 +696,19 @@ static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id)
                                 ch, flag);
        }
 
-       spin_unlock_irqrestore(&port->lock, flags);
        tty_flip_buffer_push(&port->state->port);
+}
+
+static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id)
+{
+       struct s3c24xx_uart_port *ourport = dev_id;
+       struct uart_port *port = &ourport->port;
+       unsigned long flags;
+
+       spin_lock_irqsave(&port->lock, flags);
+       s3c24xx_serial_rx_drain_fifo(ourport);
+       spin_unlock_irqrestore(&port->lock, flags);
 
-out:
        return IRQ_HANDLED;
 }