From 4eb173005960e650e4aa4ee7738e78cf824ea6ce Mon Sep 17 00:00:00 2001 From: Jonny Gellhaar Date: Sat, 1 Feb 2025 19:49:30 +0100 Subject: [PATCH] silabs: allow configuring of zero latency gpio irq Make it possible to enable zero latency GPIO IRQ mode through Kconfig. Signed-off-by: Jonny Gellhaar --- drivers/gpio/Kconfig.gecko | 11 +++++++++++ drivers/gpio/gpio_gecko.c | 11 +++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/Kconfig.gecko b/drivers/gpio/Kconfig.gecko index 744370f676c59..176e76bb99c14 100644 --- a/drivers/gpio/Kconfig.gecko +++ b/drivers/gpio/Kconfig.gecko @@ -1,6 +1,7 @@ # Gecko GPIO configuration options # Copyright (c) 2017 Christian Taedcke +# Copyright (c) 2025 Jonny Gellhaar # SPDX-License-Identifier: Apache-2.0 menuconfig GPIO_GECKO @@ -15,3 +16,13 @@ config GPIO_GECKO_COMMON_INIT_PRIORITY int "Common initialization priority" depends on GPIO_GECKO default 39 + +config GPIO_GECKO_ZERO_LATENCY_IRQ + bool "Cofigure GPIO as Zephyr zero latency IRQ" + default n + depends on GPIO_GECKO + select ZERO_LATENCY_IRQS + help + Make sure to read documentatino of zero latency IRQ and its + implications and potential dangers. Do not call kernel API + from the GPIO inerrupt callback. diff --git a/drivers/gpio/gpio_gecko.c b/drivers/gpio/gpio_gecko.c index 1771329119d1f..1e28058a308c7 100644 --- a/drivers/gpio/gpio_gecko.c +++ b/drivers/gpio/gpio_gecko.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017, Christian Taedcke + * Copyright (c) 2025, Jonny Gellhaar * * SPDX-License-Identifier: Apache-2.0 */ @@ -391,6 +392,12 @@ DEVICE_DT_DEFINE(DT_INST(0, silabs_gecko_gpio), PRE_KERNEL_1, CONFIG_GPIO_GECKO_COMMON_INIT_PRIORITY, &gpio_gecko_common_driver_api); +#ifdef CONFIG_GPIO_GECKO_ZERO_LATENCY_IRQ +#define CONFIGURED_FLAGS IRQ_ZERO_LATENCY +#else +#define CONFIGURED_FLAGS 0u +#endif /* CONFIG_GPIO_GECKO_ZERO_LATENCY_IRQ */ + static int gpio_gecko_common_init(const struct device *dev) { #ifdef CONFIG_SOC_GECKO_DEV_INIT @@ -400,12 +407,12 @@ static int gpio_gecko_common_init(const struct device *dev) IRQ_CONNECT(GPIO_EVEN_IRQn, DT_IRQ_BY_NAME(DT_INST(0, silabs_gecko_gpio), gpio_even, priority), gpio_gecko_common_isr, - DEVICE_DT_GET(DT_INST(0, silabs_gecko_gpio)), 0); + DEVICE_DT_GET(DT_INST(0, silabs_gecko_gpio)), CONFIGURED_FLAGS); IRQ_CONNECT(GPIO_ODD_IRQn, DT_IRQ_BY_NAME(DT_INST(0, silabs_gecko_gpio), gpio_odd, priority), gpio_gecko_common_isr, - DEVICE_DT_GET(DT_INST(0, silabs_gecko_gpio)), 0); + DEVICE_DT_GET(DT_INST(0, silabs_gecko_gpio)), CONFIGURED_FLAGS); irq_enable(GPIO_EVEN_IRQn); irq_enable(GPIO_ODD_IRQn);