cpm_uart: fix non-console port startup bug
PATCH 1/1 cpm_uart: fix non-console port startup bug
after UART interrupt handler is installed and rx is enabled, if an rx interrupt comes before hardware init, rx->cur will be updated. Then the hardware init will reset BD and make rx->cur out of sync, move the hardware init code before request_irq.
Signed-off-by Xiaotian Feng <[email protected]>
---
(quoted diff) +0 -0
b/drivers/serial/cpm_uart/cpm_uart_core.c
index bde4b4b..5c6ef51 100644
drivers/serial/cpm_uart/cpm_uart_core.c +12 -0
@@ -406,6 +406,18 @@ static int cpm_uart_startup(struct uart_port *port)pr_debug ("CPM uart[%d]:startup\n" , port->line); +/* If the port is not the console, make sure rx is disabled. */ +if (!(pinfo->flags &FLAG_CONSOLE )) { +/* Disable UART rx */ +if (IS_SMC (pinfo)) { +clrbits16 (&pinfo->smcp->smc_smcmr,SMCMR_REN ); +clrbits8 (&pinfo->smcp->smc_smcm,SMCM_RX ); + }else { +clrbits32 (&pinfo->sccp->scc_gsmrl,SCC_GSMRL_ENR ); +clrbits16 (&pinfo->sccp->scc_sccm,UART_SCCM_RX ); + } +cpm_line_cr_cmd (pinfo,CPM_CR_INIT_TRX ); + }/* Install interrupt handler. */ retval =request_irq (port->irq, cpm_uart_int,0 ,"cpm_uart" , port);if (retval)
@@ -420,8 +432,6 @@ static int cpm_uart_startup(struct uart_port *port) setbits32(&pinfo->sccp->scc_gsmrl, (SCC_GSMRL_ENR |
SCC_GSMRL_ENT));
}- if (!(pinfo->flags & FLAG_CONSOLE))
- cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX);
return 0;}