diff options
author | Dino Li <dino.li@ite.com.tw> | 2015-11-10 19:38:18 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-11-12 17:54:58 -0800 |
commit | f175ca810ac71fcfeae36273826c843314637164 (patch) | |
tree | e696a570a1c0b851d1aa8c8a26e06acf9d6ffebe | |
parent | fe3189a56f4e7a13f5a76c15b705122d1ccdc488 (diff) | |
download | chrome-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.c | 6 |
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); |