diff options
-rw-r--r-- | chip/g/gpio.c | 7 | ||||
-rw-r--r-- | chip/host/gpio.c | 5 | ||||
-rw-r--r-- | chip/it83xx/intc.h | 1 | ||||
-rw-r--r-- | chip/lm4/gpio.c | 12 | ||||
-rw-r--r-- | chip/mec1322/gpio.c | 18 | ||||
-rw-r--r-- | chip/npcx/gpio.c | 14 | ||||
-rw-r--r-- | chip/stm32/gpio.c | 12 | ||||
-rw-r--r-- | include/gpio.h | 10 |
8 files changed, 78 insertions, 1 deletions
diff --git a/chip/g/gpio.c b/chip/g/gpio.c index 23c551c945..122f7f1f24 100644 --- a/chip/g/gpio.c +++ b/chip/g/gpio.c @@ -256,6 +256,13 @@ int gpio_disable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + const struct gpio_info *g = gpio_list + signal; + GR_GPIO_CLRINTSTAT(g->port) = g->mask; + return EC_SUCCESS; +} + void gpio_pre_init(void) { const struct gpio_info *g = gpio_list; diff --git a/chip/host/gpio.c b/chip/host/gpio.c index c6c415a084..60ef32d22a 100644 --- a/chip/host/gpio.c +++ b/chip/host/gpio.c @@ -60,6 +60,11 @@ test_mockable int gpio_enable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +test_mockable int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + return EC_SUCCESS; +} + test_mockable void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags) { diff --git a/chip/it83xx/intc.h b/chip/it83xx/intc.h index 642571bb26..8c6d35aa02 100644 --- a/chip/it83xx/intc.h +++ b/chip/it83xx/intc.h @@ -20,7 +20,6 @@ void lpcrst_interrupt(enum gpio_signal signal); void peci_interrupt(void); void adc_interrupt(void); void i2c_interrupt(int port); -int gpio_clear_pending_interrupt(enum gpio_signal signal); void clock_sleep_mode_wakeup_isr(void); int clock_ec_wake_from_sleep(void); void __enter_hibernate(uint32_t seconds, uint32_t microseconds); diff --git a/chip/lm4/gpio.c b/chip/lm4/gpio.c index 1b1e0a80c6..e90eb2bf4f 100644 --- a/chip/lm4/gpio.c +++ b/chip/lm4/gpio.c @@ -170,6 +170,18 @@ int gpio_disable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + const struct gpio_info *g = gpio_list + signal; + + /* Fail if no interrupt handler */ + if (signal >= GPIO_IH_COUNT) + return EC_ERROR_INVAL; + + LM4_GPIO_ICR(g->port) |= g->mask; + return EC_SUCCESS; +} + #ifdef CONFIG_LOW_POWER_IDLE /** * Convert GPIO port to a mask that can be used to set the diff --git a/chip/mec1322/gpio.c b/chip/mec1322/gpio.c index 0d59dc5849..4df46dd6d8 100644 --- a/chip/mec1322/gpio.c +++ b/chip/mec1322/gpio.c @@ -173,6 +173,24 @@ int gpio_disable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + int i, port, girq_id, bit_id; + + if (gpio_list[signal].mask == 0) + return EC_SUCCESS; + + i = GPIO_MASK_TO_NUM(gpio_list[signal].mask); + port = gpio_list[signal].port; + girq_id = int_map[port].girq_id; + bit_id = (port - int_map[port].port_offset) * 8 + i; + + /* Clear interrupt source sticky status bit even if not enabled */ + MEC1322_INT_SOURCE(girq_id) |= 1 << bit_id; + + return EC_SUCCESS; +} + void gpio_pre_init(void) { int i; diff --git a/chip/npcx/gpio.c b/chip/npcx/gpio.c index fc5fad8b36..57bd687c51 100644 --- a/chip/npcx/gpio.c +++ b/chip/npcx/gpio.c @@ -669,6 +669,20 @@ int gpio_disable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + const struct gpio_info *g = gpio_list + signal; + struct gpio_wui_gpio_info wui = gpio_find_wui_from_io(g->port, g->mask); + + /* Clear pending interrupt for this signal */ + if (wui.valid) + NPCX_WKPCL(wui.table, wui.group) |= (1 << wui.bit); + else + return EC_ERROR_PARAM1; + + return EC_SUCCESS; +} + void gpio_pre_init(void) { const struct gpio_info *g = gpio_list; diff --git a/chip/stm32/gpio.c b/chip/stm32/gpio.c index 7767fbf324..69f3cadb4e 100644 --- a/chip/stm32/gpio.c +++ b/chip/stm32/gpio.c @@ -98,6 +98,18 @@ int gpio_enable_interrupt(enum gpio_signal signal) return EC_SUCCESS; } +int gpio_clear_pending_interrupt(enum gpio_signal signal) +{ + const struct gpio_info *g = gpio_list + signal; + + if (!g->mask || signal >= GPIO_IH_COUNT) + return EC_ERROR_INVAL; + + STM32_EXTI_PR |= g->mask; + + return EC_SUCCESS; +} + /*****************************************************************************/ /* Interrupt handler */ diff --git a/include/gpio.h b/include/gpio.h index b588659a88..919c7c8c80 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -216,6 +216,16 @@ int gpio_enable_interrupt(enum gpio_signal signal); int gpio_disable_interrupt(enum gpio_signal signal); /** + * Clear pending interrupts for the signal. + * + * The signal must have been defined with an interrupt handler. + * + * @param signal Signal to clear interrupts for + * @return EC_SUCCESS, or non-zero on error. + */ +int gpio_clear_pending_interrupt(enum gpio_signal signal); + +/** * Set flags for GPIO(s) by port and mask. * * Use gpio_set_flags() to set flags for an individual GPIO by id. |