summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/g/gpio.c7
-rw-r--r--chip/host/gpio.c5
-rw-r--r--chip/it83xx/intc.h1
-rw-r--r--chip/lm4/gpio.c12
-rw-r--r--chip/mec1322/gpio.c18
-rw-r--r--chip/npcx/gpio.c14
-rw-r--r--chip/stm32/gpio.c12
-rw-r--r--include/gpio.h10
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.