diff options
| author | Minkyu Kang <mk7.kang@samsung.com> | 2009-11-10 20:23:50 +0900 | 
|---|---|---|
| committer | Tom Rix <Tom.Rix@windriver.com> | 2009-11-27 16:26:13 -0600 | 
| commit | 940032260914076b1594906334b2e3f7af6fb7cf (patch) | |
| tree | af65a7cb7baa954825df8d53edde882c38de7f8f | |
| parent | 9ebfdc202275bcd9eb4af56e32bfb4253ff1b781 (diff) | |
| download | olio-uboot-2014.01-940032260914076b1594906334b2e3f7af6fb7cf.tar.xz olio-uboot-2014.01-940032260914076b1594906334b2e3f7af6fb7cf.zip | |
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>
| -rw-r--r-- | drivers/serial/serial_s5pc1xx.c | 22 | 
1 files changed, 16 insertions, 6 deletions
| diff --git a/drivers/serial/serial_s5pc1xx.c b/drivers/serial/serial_s5pc1xx.c index 68c06a919..73669a9f1 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; -	if (readl(&uart->uerstat) & 0xf) -		return 1; +	/* +	 * 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; -	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;  	} |