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.k...@samsung.com>
---
 drivers/serial/serial_s5pc1xx.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/serial/serial_s5pc1xx.c b/drivers/serial/serial_s5pc1xx.c
index 68c06a9..e06234d 100644
--- a/drivers/serial/serial_s5pc1xx.c
+++ b/drivers/serial/serial_s5pc1xx.c
@@ -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;
        }
 
-- 
1.5.4.3
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to