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>
This commit is contained in:
Dino Li
2015-11-10 19:38:18 +08:00
committed by chrome-bot
parent fe3189a56f
commit f175ca810a

View File

@@ -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);