diff options
-rw-r--r-- | chip/lm4/uart.c | 9 | ||||
-rw-r--r-- | chip/stm32/uart.c | 9 | ||||
-rw-r--r-- | common/uart_buffering.c | 11 | ||||
-rw-r--r-- | include/uart.h | 9 |
4 files changed, 15 insertions, 23 deletions
diff --git a/chip/lm4/uart.c b/chip/lm4/uart.c index c7d320928c..ff24718a07 100644 --- a/chip/lm4/uart.c +++ b/chip/lm4/uart.c @@ -25,6 +25,10 @@ int uart_init_done(void) void uart_tx_start(void) { + /* If interrupt is already enabled, nothing to do */ + if (LM4_UART_IM(0) & 0x20) + return; + /* * Re-enable the transmit interrupt, then forcibly trigger the * interrupt. This works around a hardware problem with the @@ -40,11 +44,6 @@ void uart_tx_stop(void) LM4_UART_IM(0) &= ~0x20; } -int uart_tx_stopped(void) -{ - return !(LM4_UART_IM(0) & 0x20); -} - void uart_tx_flush(void) { /* Wait for transmit FIFO empty */ diff --git a/chip/stm32/uart.c b/chip/stm32/uart.c index c848f0b20c..3d510c16f1 100644 --- a/chip/stm32/uart.c +++ b/chip/stm32/uart.c @@ -41,6 +41,10 @@ int uart_init_done(void) void uart_tx_start(void) { + /* If interrupt is already enabled, nothing to do */ + if (STM32_USART_CR1(UARTN) & UART_TX_INT_ENABLE) + return; + disable_sleep(SLEEP_MASK_UART); should_stop = 0; STM32_USART_CR1(UARTN) |= UART_TX_INT_ENABLE; @@ -54,11 +58,6 @@ void uart_tx_stop(void) enable_sleep(SLEEP_MASK_UART); } -int uart_tx_stopped(void) -{ - return !(STM32_USART_CR1(UARTN) & UART_TX_INT_ENABLE); -} - void uart_tx_flush(void) { while (!(STM32_USART_SR(UARTN) & STM32_USART_SR_TXE)) diff --git a/common/uart_buffering.c b/common/uart_buffering.c index 784e117503..560e783c41 100644 --- a/common/uart_buffering.c +++ b/common/uart_buffering.c @@ -146,8 +146,7 @@ void uart_process_input(void) } else if (c == CTRL('S')) { /* Software flow control - XON */ uart_suspended = 0; - if (uart_tx_stopped()) - uart_tx_start(); + uart_tx_start(); } else if (rx_buf_next != rx_buf_tail) { /* Buffer all other input */ rx_buf[rx_buf_head] = c; @@ -165,7 +164,7 @@ int uart_putc(int c) { int rv = __tx_char(NULL, c); - if (!uart_suspended && uart_tx_stopped()) + if (!uart_suspended) uart_tx_start(); return rv ? EC_ERROR_OVERFLOW : EC_SUCCESS; @@ -179,7 +178,7 @@ int uart_puts(const char *outstr) break; } - if (!uart_suspended && uart_tx_stopped()) + if (!uart_suspended) uart_tx_start(); /* Successful if we consumed all output */ @@ -190,7 +189,7 @@ int uart_vprintf(const char *format, va_list args) { int rv = vfnprintf(__tx_char, NULL, format, args); - if (!uart_suspended && uart_tx_stopped()) + if (!uart_suspended) uart_tx_start(); return rv; @@ -222,7 +221,7 @@ void uart_flush_output(void) * we're in now. */ uart_process_output(); - } else if (uart_tx_stopped()) { + } else { /* * It's possible we switched from a previous context * which was doing a printf() or puts() but hadn't diff --git a/include/uart.h b/include/uart.h index bada502c8b..9e182002e1 100644 --- a/include/uart.h +++ b/include/uart.h @@ -149,8 +149,8 @@ void uart_enable_interrupt(void); /** * Re-enable the UART transmit interrupt. * - * This also forces triggering an interrupt if the hardware doesn't - * automatically trigger it when the transmit buffer was filled beforehand. + * This also forces triggering a UART interrupt, if the transmit interrupt was + * disabled. */ void uart_tx_start(void); @@ -160,11 +160,6 @@ void uart_tx_start(void); void uart_tx_stop(void); /** - * Return non-zero if the UART transmit interrupt is disabled. - */ -int uart_tx_stopped(void); - -/** * Helper for processing UART input. * * Reads the input FIFO until empty. Intended to be called from the driver |