serial/imx: support to handle break character
authorHui Wang <jason77.wang@gmail.com>
Wed, 24 Aug 2011 09:41:47 +0000 (17:41 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 24 Aug 2011 22:27:59 +0000 (15:27 -0700)
The imx UART hardware controller can identify BREAK character and the
imx_set_termios() can accept BRKINT set by users, but current existing
imx_rxint() can't pass BREAK character and TTY_BREAK to the tty layer
as other serial drivers do (8250.c omap_serial.c).

Here add code to handle BREAK character and pass it to tty layer.

To detect error occurrence, i use URXD_ERR to replace (URXD_OVRRUN |
URXD_FRMERR | ...) because any kind of error occurs, URXD_ERR will
always be set to 1.

I put the URXD_BRK to the first place to check since when BREAK error
occurs, not only URXD_BRK is set to 1, but also URXD_PRERR and
URXD_FRMERR are all set to 1. This arrangement can filter out fake
parity and frame errors when BREAK error occurs.

Signed-off-by: Hui Wang <jason77.wang@gmail.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/serial/imx.c

index 7e91b3d368cd1ddc26e07e5a6de42b6b94752121..54ffdc6243f9bb2d529e16e80f450d33c28710ee 100644 (file)
@@ -508,8 +508,10 @@ static irqreturn_t imx_rxint(int irq, void *dev_id)
                if (uart_handle_sysrq_char(&sport->port, (unsigned char)rx))
                        continue;
 
-               if (rx & (URXD_PRERR | URXD_OVRRUN | URXD_FRMERR) ) {
-                       if (rx & URXD_PRERR)
+               if (unlikely(rx & URXD_ERR)) {
+                       if (rx & URXD_BRK)
+                               sport->port.icount.brk++;
+                       else if (rx & URXD_PRERR)
                                sport->port.icount.parity++;
                        else if (rx & URXD_FRMERR)
                                sport->port.icount.frame++;
@@ -524,7 +526,9 @@ static irqreturn_t imx_rxint(int irq, void *dev_id)
 
                        rx &= sport->port.read_status_mask;
 
-                       if (rx & URXD_PRERR)
+                       if (rx & URXD_BRK)
+                               flg = TTY_BREAK;
+                       else if (rx & URXD_PRERR)
                                flg = TTY_PARITY;
                        else if (rx & URXD_FRMERR)
                                flg = TTY_FRAME;