summaryrefslogtreecommitdiff
path: root/drivers/serial/serial_s5pc1xx.c
diff options
context:
space:
mode:
authorMinkyu Kang <mk7.kang@samsung.com>2009-11-10 20:23:50 +0900
committerTom Rix <Tom.Rix@windriver.com>2009-11-27 16:26:13 -0600
commit940032260914076b1594906334b2e3f7af6fb7cf (patch)
treeaf65a7cb7baa954825df8d53edde882c38de7f8f /drivers/serial/serial_s5pc1xx.c
parent9ebfdc202275bcd9eb4af56e32bfb4253ff1b781 (diff)
s5pc1xx: serial: fix the error check logic
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>
Diffstat (limited to 'drivers/serial/serial_s5pc1xx.c')
-rw-r--r--drivers/serial/serial_s5pc1xx.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/serial/serial_s5pc1xx.c b/drivers/serial/serial_s5pc1xx.c
index 68c06a9190..73669a9f17 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;
}