summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDino Li <dino.li@ite.com.tw>2015-11-10 19:38:18 +0800
committerchrome-bot <chrome-bot@chromium.org>2015-11-12 17:54:58 -0800
commitf175ca810ac71fcfeae36273826c843314637164 (patch)
treee696a570a1c0b851d1aa8c8a26e06acf9d6ffebe
parentfe3189a56f4e7a13f5a76c15b705122d1ccdc488 (diff)
downloadchrome-ec-f175ca810ac71fcfeae36273826c843314637164.tar.gz
it8380dev: modify uart ISR
Because UART interrupt is rising-edge triggered, and we need to clear UART IER and restore IER state to make sure interrupt can be triggered again when following situation occur: [ISR start] [process rx] [process tx] [ISR end] RX 0 1 0 1 1 TX 0 1 1 0 0 uart_int_event 0 1 1 1 1 uart_ier 1 1 1 1 1 uart_s1 (0 -> 1) 1 1 1 (keep high) uart_int_event = (RX | TX) uart_s1 = (uart_int_event & uart_ier) UART interrupt = (uart_s1 0->1) Signed-off-by: Dino Li <dino.li@ite.com.tw> BRANCH=none BUG=none TEST=fixed. Change-Id: I6498876780aba33795022fa6ecbb77e1c6468146 Reviewed-on: https://chromium-review.googlesource.com/311563 Commit-Ready: Dino Li <dino.li@ite.com.tw> Tested-by: Dino Li <dino.li@ite.com.tw> Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--chip/it83xx/uart.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/chip/it83xx/uart.c b/chip/it83xx/uart.c
index 4d8f9cbe98..207b6cdb40 100644
--- a/chip/it83xx/uart.c
+++ b/chip/it83xx/uart.c
@@ -104,12 +104,18 @@ void uart_enable_interrupt(void)
static void uart_ec_interrupt(void)
{
+ uint8_t uart_ier;
+
/* clear interrupt status */
task_clear_pending_irq(IT83XX_IRQ_UART1);
/* Read input FIFO until empty, then fill output FIFO */
uart_process_input();
uart_process_output();
+
+ uart_ier = IT83XX_UART_IER(UART_PORT);
+ IT83XX_UART_IER(UART_PORT) = 0;
+ IT83XX_UART_IER(UART_PORT) = uart_ier;
}
DECLARE_IRQ(IT83XX_IRQ_UART1, uart_ec_interrupt, 1);