s5pc1xx: serial: fix the error check logic
authorMinkyu Kang <mk7.kang@samsung.com>
Tue, 10 Nov 2009 11:23:50 +0000 (20:23 +0900)
committerTom Rix <Tom.Rix@windriver.com>
Fri, 27 Nov 2009 22:26:13 +0000 (16:26 -0600)
Because of Frame error, Parity error and Overrun error are occured only receive
operation, need to masking when error checking.

Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
drivers/serial/serial_s5pc1xx.c

index 68c06a9190fc687671192cb4e954af93429f24ab..73669a9f1704b581480d8257797082df786e28ad 100644 (file)
@@ -98,14 +98,24 @@ int serial_init_dev(const int dev_index)
        return 0;
 }
 
-static int serial_err_check(const int dev_index)
+static int serial_err_check(const int dev_index, int op)
 {
        struct s5pc1xx_uart *const uart = s5pc1xx_get_base_uart(dev_index);
+       unsigned int mask;
+
+       /*
+        * UERSTAT
+        * Break Detect [3]
+        * Frame Err    [2] : receive operation
+        * Parity Err   [1] : receive operation
+        * Overrun Err  [0] : receive operation
+        */
+       if (op)
+               mask = 0x8;
+       else
+               mask = 0xf;
 
-       if (readl(&uart->uerstat) & 0xf)
-               return 1;
-
-       return 0;
+       return readl(&uart->uerstat) & mask;
 }
 
 /*
@@ -119,7 +129,7 @@ int serial_getc_dev(const int dev_index)
 
        /* wait for character to arrive */
        while (!(readl(&uart->utrstat) & 0x1)) {
-               if (serial_err_check(dev_index))
+               if (serial_err_check(dev_index, 0))
                        return 0;
        }
 
@@ -135,7 +145,7 @@ void serial_putc_dev(const char c, const int dev_index)
 
        /* wait for room in the tx FIFO */
        while (!(readl(&uart->utrstat) & 0x2)) {
-               if (serial_err_check(dev_index))
+               if (serial_err_check(dev_index, 1))
                        return;
        }