diff --git a/drivers/gpio/gpio_qmsi.c b/drivers/gpio/gpio_qmsi.c index 16563a10b07..02bec6665ab 100644 --- a/drivers/gpio/gpio_qmsi.c +++ b/drivers/gpio/gpio_qmsi.c @@ -399,6 +399,14 @@ static inline int gpio_qmsi_disable_callback(struct device *port, return 0; } +static uint32_t gpio_qmsi_get_pending_int(struct device *dev) +{ + const struct gpio_qmsi_config *gpio_config = dev->config->config_info; + qm_gpio_t gpio = gpio_config->gpio; + + return QM_GPIO[gpio]->gpio_intstatus; +} + static const struct gpio_driver_api api_funcs = { .config = gpio_qmsi_config, .write = gpio_qmsi_write, @@ -406,6 +414,7 @@ static const struct gpio_driver_api api_funcs = { .manage_callback = gpio_qmsi_manage_callback, .enable_callback = gpio_qmsi_enable_callback, .disable_callback = gpio_qmsi_disable_callback, + .get_pending_int = gpio_qmsi_get_pending_int, }; static int gpio_qmsi_init(struct device *port) diff --git a/include/gpio.h b/include/gpio.h index 1e2aacaf425..e503a92c66f 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -194,6 +194,7 @@ typedef int (*gpio_enable_callback_t)(struct device *port, typedef int (*gpio_disable_callback_t)(struct device *port, int access_op, uint32_t pin); +typedef uint32_t (*gpio_api_get_pending_int)(struct device *dev); struct gpio_driver_api { gpio_config_t config; @@ -202,6 +203,7 @@ struct gpio_driver_api { gpio_manage_callback_t manage_callback; gpio_enable_callback_t enable_callback; gpio_disable_callback_t disable_callback; + gpio_api_get_pending_int get_pending_int; }; /** * @endcond @@ -394,6 +396,27 @@ static inline int gpio_port_disable_callback(struct device *port) return api->disable_callback(port, GPIO_ACCESS_BY_PORT, 0); } +/** + * @brief Function to get pending interrupts + * + * The purpose of this function is to return the interrupt + * status register for the device. + * This is especially useful when waking up from + * low power states to check the wake up source. + * + * @param dev Pointer to the device structure for the driver instance. + * + * @retval status != 0 if at least one gpio interrupt is pending. + * @retval 0 if no gpio interrupt is pending. + */ +static inline int gpio_get_pending_int(struct device *dev) +{ + struct gpio_driver_api *api; + + api = (struct gpio_driver_api *)dev->driver_api; + return api->get_pending_int(dev); +} + struct gpio_pin_config { char *gpio_controller; uint32_t gpio_pin;