summaryrefslogtreecommitdiff
path: root/chip/it83xx/intc.c
diff options
context:
space:
mode:
authorDino Li <dino.li@ite.com.tw>2016-01-27 13:44:58 +0800
committerchrome-bot <chrome-bot@chromium.org>2016-01-28 00:02:03 -0800
commita313fc9b1aff224f1229f22dafa7564516eb330c (patch)
treef3acaed6efa6d3de6c694ae9e1f69f453f5f6c31 /chip/it83xx/intc.c
parent347f516d8444a95e0506640f116e102828b89527 (diff)
downloadchrome-ec-a313fc9b1aff224f1229f22dafa7564516eb330c.tar.gz
chip: it83xx: fix EC interrupt vector registers issue
We have a limitation for EC interrupt vector registers. System may read incorrect interrupt number in ISR so we need to add a workaround to prevent it. The following is a example that got incorrect interrupt number: 1. REG IVCTx = 0x10. (no interrupt pending) 2. EC INT6 interrupt occurs (IVCTx = 0x16) and jump to ISR. 3. Read interrupt vector register to determine interrupt number. 4. Higher priority interrupt of same interrupt group occurs (for example: INT134, IVCTx = 0x96) while the system is reading the interrupt vector register for EC INT6, we may end up with an incorrect interrupt number between 0x16 and 0x96. Signed-off-by: Dino Li <dino.li@ite.com.tw> BRANCH=none BUG=none TEST=1. EC interrupts work normally: WUI (GPIO interrupt), timer, uart, LPC, I2C, and PECI. 2. Console command 'taskinfo'. Change-Id: I54e61f417ad506eb3b4cd5d0652f64eed9a28a17 Reviewed-on: https://chromium-review.googlesource.com/322097 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>
Diffstat (limited to 'chip/it83xx/intc.c')
-rw-r--r--chip/it83xx/intc.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/chip/it83xx/intc.c b/chip/it83xx/intc.c
index 37d2f18c35..4bfa1686b7 100644
--- a/chip/it83xx/intc.c
+++ b/chip/it83xx/intc.c
@@ -12,7 +12,7 @@
void intc_cpu_int_group_5(void)
{
/* Determine interrupt number. */
- int intc_group_5 = IT83XX_INTC_IVCT5 - 16;
+ int intc_group_5 = intc_get_ec_int();
switch (intc_group_5) {
#ifdef CONFIG_LPC
@@ -38,7 +38,7 @@ DECLARE_IRQ(CPU_INT_GROUP_5, intc_cpu_int_group_5, 2);
void intc_cpu_int_group_4(void)
{
/* Determine interrupt number. */
- int intc_group_4 = IT83XX_INTC_IVCT4 - 16;
+ int intc_group_4 = intc_get_ec_int();
switch (intc_group_4) {
#ifdef CONFIG_LPC
@@ -71,7 +71,7 @@ DECLARE_IRQ(CPU_INT_GROUP_4, intc_cpu_int_group_4, 2);
void intc_cpu_int_group_12(void)
{
/* Determine interrupt number. */
- int intc_group_12 = IT83XX_INTC_IVCT12 - 16;
+ int intc_group_12 = intc_get_ec_int();
switch (intc_group_12) {
#ifdef CONFIG_PECI
@@ -88,7 +88,7 @@ DECLARE_IRQ(CPU_INT_GROUP_12, intc_cpu_int_group_12, 2);
void intc_cpu_int_group_6(void)
{
/* Determine interrupt number. */
- int intc_group_6 = IT83XX_INTC_IVCT6 - 16;
+ int intc_group_6 = intc_get_ec_int();
switch (intc_group_6) {