From f175ca810ac71fcfeae36273826c843314637164 Mon Sep 17 00:00:00 2001 From: Dino Li Date: Tue, 10 Nov 2015 19:38:18 +0800 Subject: 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 BRANCH=none BUG=none TEST=fixed. Change-Id: I6498876780aba33795022fa6ecbb77e1c6468146 Reviewed-on: https://chromium-review.googlesource.com/311563 Commit-Ready: Dino Li Tested-by: Dino Li Reviewed-by: Randall Spangler --- chip/it83xx/uart.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'chip') 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); -- cgit v1.2.1