From 283b932e78e3288ab9b0f10a45881f2d3353c0a1 Mon Sep 17 00:00:00 2001 From: Christophe Leroy Date: Mon, 24 Sep 2012 08:39:44 +0200 Subject: [PATCH] --- yaml --- r: 325785 b: refs/heads/master c: 6e62bdc07e1b397704354cf3bd58950943ecaaf1 h: refs/heads/master i: 325783: 4ad1f52056daf45efae922f87b116aa557532aec v: v3 --- [refs] | 2 +- trunk/drivers/tty/serial/cpm_uart/cpm_uart_core.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 1c06ad7f9fd4..e4955f98180e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fbbb9d9646f04768d0176f75e7fc93d29457b5db +refs/heads/master: 6e62bdc07e1b397704354cf3bd58950943ecaaf1 diff --git a/trunk/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/trunk/drivers/tty/serial/cpm_uart/cpm_uart_core.c index 7f6a1c7cb3de..d0dd9194cecc 100644 --- a/trunk/drivers/tty/serial/cpm_uart/cpm_uart_core.c +++ b/trunk/drivers/tty/serial/cpm_uart/cpm_uart_core.c @@ -501,6 +501,7 @@ static void cpm_uart_set_termios(struct uart_port *port, struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; smc_t __iomem *smcp = pinfo->smcp; scc_t __iomem *sccp = pinfo->sccp; + int maxidl; pr_debug("CPM uart[%d]:set_termios\n", port->line); @@ -511,6 +512,17 @@ static void cpm_uart_set_termios(struct uart_port *port, else pinfo->rx_fifosize = RX_BUF_SIZE; + /* MAXIDL is the timeout after which a receive buffer is closed + * when not full if no more characters are received. + * We calculate it from the baudrate so that the duration is + * always the same at standard rates: about 4ms. + */ + maxidl = baud / 2400; + if (maxidl < 1) + maxidl = 1; + if (maxidl > 0x10) + maxidl = 0x10; + /* Character length programmed into the mode register is the * sum of: 1 start bit, number of data bits, 0 or 1 parity bit, * 1 or 2 stop bits, minus 1. @@ -611,6 +623,7 @@ static void cpm_uart_set_termios(struct uart_port *port, * SMC/SCC receiver is disabled. */ out_be16(&pinfo->smcup->smc_mrblr, pinfo->rx_fifosize); + out_be16(&pinfo->smcup->smc_maxidl, maxidl); /* Set the mode register. We want to keep a copy of the * enables, because we want to put them back if they were @@ -623,6 +636,7 @@ static void cpm_uart_set_termios(struct uart_port *port, SMCMR_SM_UART | prev_mode); } else { out_be16(&pinfo->sccup->scc_genscc.scc_mrblr, pinfo->rx_fifosize); + out_be16(&pinfo->sccup->scc_maxidl, maxidl); out_be16(&sccp->scc_psmr, (sbits << 12) | scval); }