int                     rx_dma_rng_buf_len;
        unsigned int            dma_tx_nents;
        wait_queue_head_t       dma_wait;
+       bool                    is_cs7; /* Set to true when character size is 7 */
+                                       /* and the parity is enabled            */
 };
 
 struct lpuart_soc_data {
                                flg = TTY_OVERRUN;
                }
 
+               if (sport->is_cs7)
+                       rx &= 0x7F;
+
                if (tty_insert_flip_char(port, rx, flg) == 0)
                        sport->port.icount.buf_overrun++;
        }
        }
 }
 
+static int lpuart_tty_insert_flip_string(struct tty_port *port,
+       unsigned char *chars, size_t size, bool is_cs7)
+{
+       int i;
+
+       if (is_cs7)
+               for (i = 0; i < size; i++)
+                       chars[i] &= 0x7F;
+       return tty_insert_flip_string(port, chars, size);
+}
+
 static void lpuart_copy_rx_to_tty(struct lpuart_port *sport)
 {
        struct tty_port *port = &sport->port.state->port;
        if (ring->head < ring->tail) {
                count = sport->rx_sgl.length - ring->tail;
 
-               copied = tty_insert_flip_string(port, ring->buf + ring->tail, count);
+               copied = lpuart_tty_insert_flip_string(port, ring->buf + ring->tail,
+                                       count, sport->is_cs7);
                if (copied != count)
                        sport->port.icount.buf_overrun++;
                ring->tail = 0;
        /* Finally we read data from tail to head */
        if (ring->tail < ring->head) {
                count = ring->head - ring->tail;
-               copied = tty_insert_flip_string(port, ring->buf + ring->tail, count);
+               copied = lpuart_tty_insert_flip_string(port, ring->buf + ring->tail,
+                                       count, sport->is_cs7);
                if (copied != count)
                        sport->port.icount.buf_overrun++;
                /* Wrap ring->head if needed */
        ctrl = old_ctrl = lpuart32_read(&sport->port, UARTCTRL);
        bd = lpuart32_read(&sport->port, UARTBAUD);
        modem = lpuart32_read(&sport->port, UARTMODIR);
+       sport->is_cs7 = false;
        /*
         * only support CS8 and CS7, and for CS7 must enable PE.
         * supported mode:
        lpuart32_write(&sport->port, ctrl, UARTCTRL);
        /* restore control register */
 
+       if ((ctrl & (UARTCTRL_PE | UARTCTRL_M)) == UARTCTRL_PE)
+               sport->is_cs7 = true;
+
        if (old && sport->lpuart_dma_rx_use) {
                if (!lpuart_start_rx_dma(sport))
                        rx_dma_timer_init(sport);