drivers: esp32: esp_intr_alloc return condition
Add checks to return value of esp_intr_alloc to avoid drivers init
returning 0 when interrupt allocation fails.
Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
diff --git a/drivers/can/can_esp32_twai.c b/drivers/can/can_esp32_twai.c
index ee6a85d..fb44006 100644
--- a/drivers/can/can_esp32_twai.c
+++ b/drivers/can/can_esp32_twai.c
@@ -203,11 +203,15 @@
can_esp32_twai_write_reg32(dev, TWAI_CLOCK_DIVIDER_REG, twai_config->cdr32);
#endif /* !CONFIG_SOC_SERIES_ESP32 */
- esp_intr_alloc(twai_config->irq_source,
+ err = esp_intr_alloc(twai_config->irq_source,
ESP_PRIO_TO_FLAGS(twai_config->irq_priority) | ESP_INTR_FLAG_IRAM,
can_esp32_twai_isr, (void *)dev, NULL);
- return 0;
+ if (err != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", err);
+ }
+
+ return err;
}
const struct can_driver_api can_esp32_twai_driver_api = {
diff --git a/drivers/counter/counter_esp32_rtc.c b/drivers/counter/counter_esp32_rtc.c
index 4382a8b..4de0086 100644
--- a/drivers/counter/counter_esp32_rtc.c
+++ b/drivers/counter/counter_esp32_rtc.c
@@ -63,13 +63,17 @@
(clock_control_subsys_t)ESP32_CLOCK_CONTROL_SUBSYS_RTC_SLOW,
&data->clk_src_freq);
- esp_intr_alloc(cfg->irq_source,
- ESP_PRIO_TO_FLAGS(cfg->irq_priority),
- (ESP32_COUNTER_RTC_ISR_HANDLER)counter_esp32_isr,
- (void *)dev,
- NULL);
+ int ret = esp_intr_alloc(cfg->irq_source,
+ ESP_PRIO_TO_FLAGS(cfg->irq_priority),
+ (ESP32_COUNTER_RTC_ISR_HANDLER)counter_esp32_isr,
+ (void *)dev,
+ NULL);
- return 0;
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ }
+
+ return ret;
}
static int counter_esp32_start(const struct device *dev)
diff --git a/drivers/counter/counter_esp32_tmr.c b/drivers/counter/counter_esp32_tmr.c
index 0dfd3fd..06e8c8a 100644
--- a/drivers/counter/counter_esp32_tmr.c
+++ b/drivers/counter/counter_esp32_tmr.c
@@ -96,13 +96,17 @@
timer_ll_set_reload_value(data->hal_ctx.dev, data->hal_ctx.timer_id, 0);
timer_ll_enable_counter(data->hal_ctx.dev, data->hal_ctx.timer_id, cfg->config.counter_en);
- esp_intr_alloc(cfg->irq_source,
- ESP_PRIO_TO_FLAGS(cfg->irq_priority),
- (ISR_HANDLER)counter_esp32_isr, (void *)dev, NULL);
-
k_spin_unlock(&lock, key);
- return 0;
+ int ret = esp_intr_alloc(cfg->irq_source,
+ ESP_PRIO_TO_FLAGS(cfg->irq_priority),
+ (ISR_HANDLER)counter_esp32_isr, (void *)dev, NULL);
+
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ }
+
+ return ret;
}
static int counter_esp32_start(const struct device *dev)
diff --git a/drivers/gpio/gpio_esp32.c b/drivers/gpio/gpio_esp32.c
index 1cec57b..a63a0e3 100644
--- a/drivers/gpio/gpio_esp32.c
+++ b/drivers/gpio/gpio_esp32.c
@@ -478,12 +478,17 @@
static bool isr_connected;
if (!isr_connected) {
- esp_intr_alloc(DT_IRQ_BY_IDX(DT_NODELABEL(gpio0), 0, irq),
+ int ret = esp_intr_alloc(DT_IRQ_BY_IDX(DT_NODELABEL(gpio0), 0, irq),
ESP_PRIO_TO_FLAGS(DT_IRQ_BY_IDX(DT_NODELABEL(gpio0), 0, priority)),
(ISR_HANDLER)gpio_esp32_isr,
(void *)dev,
NULL);
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ return ret;
+ }
+
isr_connected = true;
}
diff --git a/drivers/i2c/i2c_esp32.c b/drivers/i2c/i2c_esp32.c
index 7f14772..7f74250 100644
--- a/drivers/i2c/i2c_esp32.c
+++ b/drivers/i2c/i2c_esp32.c
@@ -762,12 +762,17 @@
clock_control_on(config->clock_dev, config->clock_subsys);
- esp_intr_alloc(config->irq_source,
+ ret = esp_intr_alloc(config->irq_source,
ESP_PRIO_TO_FLAGS(config->irq_priority) | ESP_INTR_FLAG_IRAM,
i2c_esp32_isr,
(void *)dev,
NULL);
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ return ret;
+ }
+
i2c_hal_master_init(&data->hal);
i2c_esp32_configure_data_mode(dev);
diff --git a/drivers/ipm/ipm_esp32.c b/drivers/ipm/ipm_esp32.c
index faf23c8..1cfe21d 100644
--- a/drivers/ipm/ipm_esp32.c
+++ b/drivers/ipm/ipm_esp32.c
@@ -208,6 +208,7 @@
{
struct esp32_ipm_data *data = (struct esp32_ipm_data *)dev->data;
struct esp32_ipm_config *cfg = (struct esp32_ipm_config *)dev->config;
+ int ret;
data->this_core_id = esp_core_id();
data->other_core_id = (data->this_core_id == 0) ? 1 : 0;
@@ -219,22 +220,34 @@
/* pro_cpu is responsible to initialize the lock of shared memory */
if (data->this_core_id == 0) {
- esp_intr_alloc(cfg->irq_source_pro_cpu,
- ESP_PRIO_TO_FLAGS(cfg->irq_priority_pro_cpu) | ESP_INTR_FLAG_IRAM,
- (intr_handler_t)esp32_ipm_isr,
- (void *)dev,
- NULL);
+ ret = esp_intr_alloc(cfg->irq_source_pro_cpu,
+ ESP_PRIO_TO_FLAGS(cfg->irq_priority_pro_cpu) |
+ ESP_INTR_FLAG_IRAM,
+ (intr_handler_t)esp32_ipm_isr,
+ (void *)dev,
+ NULL);
+
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ return ret;
+ }
atomic_set(&data->control->lock, ESP32_IPM_LOCK_FREE_VAL);
} else {
/* app_cpu wait for initialization from pro_cpu, then takes it,
* after that releases
*/
- esp_intr_alloc(cfg->irq_source_app_cpu,
- ESP_PRIO_TO_FLAGS(cfg->irq_priority_app_cpu) | ESP_INTR_FLAG_IRAM,
- (intr_handler_t)esp32_ipm_isr,
- (void *)dev,
- NULL);
+ ret = esp_intr_alloc(cfg->irq_source_app_cpu,
+ ESP_PRIO_TO_FLAGS(cfg->irq_priority_app_cpu) |
+ ESP_INTR_FLAG_IRAM,
+ (intr_handler_t)esp32_ipm_isr,
+ (void *)dev,
+ NULL);
+
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ return ret;
+ }
LOG_DBG("Waiting CPU0 to sync");
while (!atomic_cas(&data->control->lock,
diff --git a/drivers/pwm/pwm_mc_esp32.c b/drivers/pwm/pwm_mc_esp32.c
index 0b6bbcf0..2f8db7d 100644
--- a/drivers/pwm/pwm_mc_esp32.c
+++ b/drivers/pwm/pwm_mc_esp32.c
@@ -87,7 +87,7 @@
uint8_t prescale_timer2;
struct mcpwm_esp32_channel_config channel_config[MCPWM_CHANNEL_NUM];
#ifdef CONFIG_PWM_CAPTURE
- void (*irq_config_func)(const struct device *dev);
+ int (*irq_config_func)(const struct device *dev);
#endif /* CONFIG_PWM_CAPTURE */
};
@@ -435,9 +435,13 @@
mcpwm_ll_group_flush_shadow(data->hal.dev);
#ifdef CONFIG_PWM_CAPTURE
- config->irq_config_func(dev);
+ ret = config->irq_config_func(dev);
+
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ }
#endif /* CONFIG_PWM_CAPTURE */
- return 0;
+ return ret;
}
#ifdef CONFIG_PWM_CAPTURE
@@ -531,12 +535,14 @@
#ifdef CONFIG_PWM_CAPTURE
#define IRQ_CONFIG_FUNC(idx) \
- static void mcpwm_esp32_irq_config_func_##idx(const struct device *dev) \
+ static int mcpwm_esp32_irq_config_func_##idx(const struct device *dev) \
{ \
- esp_intr_alloc(DT_INST_IRQ_BY_IDX(idx, 0, irq), \
+ int ret; \
+ ret = esp_intr_alloc(DT_INST_IRQ_BY_IDX(idx, 0, irq), \
ESP_PRIO_TO_FLAGS(DT_INST_IRQ_BY_IDX(idx, 0, priority)) | \
ESP_INTR_FLAG_IRAM, \
(intr_handler_t)mcpwm_esp32_isr, (void *)dev, NULL); \
+ return ret; \
}
#define CAPTURE_INIT(idx) .irq_config_func = mcpwm_esp32_irq_config_func_##idx
#else
diff --git a/drivers/serial/serial_esp32_usb.c b/drivers/serial/serial_esp32_usb.c
index 31f1b36..2c730cd 100644
--- a/drivers/serial/serial_esp32_usb.c
+++ b/drivers/serial/serial_esp32_usb.c
@@ -107,8 +107,12 @@
int ret = clock_control_on(config->clock_dev, config->clock_subsys);
+ if (ret != 0) {
+ return ret;
+ }
+
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
- esp_intr_alloc(config->irq_source,
+ ret = esp_intr_alloc(config->irq_source,
ESP_PRIO_TO_FLAGS(config->irq_priority),
(ISR_HANDLER)serial_esp32_usb_isr,
(void *)dev, NULL);
diff --git a/drivers/spi/spi_esp32_spim.c b/drivers/spi/spi_esp32_spim.c
index 7efa047..25ba630 100644
--- a/drivers/spi/spi_esp32_spim.c
+++ b/drivers/spi/spi_esp32_spim.c
@@ -244,11 +244,16 @@
spi_ll_disable_int(cfg->spi);
spi_ll_clear_int_stat(cfg->spi);
- esp_intr_alloc(cfg->irq_source,
+ err = esp_intr_alloc(cfg->irq_source,
ESP_PRIO_TO_FLAGS(cfg->irq_priority) | ESP_INTR_FLAG_IRAM,
(ISR_HANDLER)spi_esp32_isr,
(void *)dev,
NULL);
+
+ if (err != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", err);
+ return err;
+ }
#endif
err = spi_context_cs_configure_all(&data->ctx);
diff --git a/drivers/timer/esp32_sys_timer.c b/drivers/timer/esp32_sys_timer.c
index d657cc0..f745ff7 100644
--- a/drivers/timer/esp32_sys_timer.c
+++ b/drivers/timer/esp32_sys_timer.c
@@ -143,12 +143,18 @@
static int sys_clock_driver_init(void)
{
- esp_intr_alloc(DT_IRQ_BY_IDX(DT_NODELABEL(systimer0), 0, irq),
+ int ret;
+
+ ret = esp_intr_alloc(DT_IRQ_BY_IDX(DT_NODELABEL(systimer0), 0, irq),
ESP_PRIO_TO_FLAGS(DT_IRQ_BY_IDX(DT_NODELABEL(systimer0), 0, priority)),
sys_timer_isr,
NULL,
NULL);
+ if (ret != 0) {
+ return ret;
+ }
+
systimer_hal_init(&systimer_hal);
systimer_hal_connect_alarm_counter(&systimer_hal,
SYSTIMER_ALARM_OS_TICK_CORE0, SYSTIMER_COUNTER_OS_TICK);
diff --git a/drivers/watchdog/wdt_esp32.c b/drivers/watchdog/wdt_esp32.c
index 62119e7..20ae12c 100644
--- a/drivers/watchdog/wdt_esp32.c
+++ b/drivers/watchdog/wdt_esp32.c
@@ -167,11 +167,16 @@
wdt_hal_init(&data->hal, config->wdt_inst, MWDT_TICK_PRESCALER, true);
- esp_intr_alloc(config->irq_source,
- ESP_PRIO_TO_FLAGS(cfg->irq_priority),
- (ISR_HANDLER)wdt_esp32_isr,
- (void *)dev,
- NULL);
+ int ret = esp_intr_alloc(config->irq_source,
+ ESP_PRIO_TO_FLAGS(config->irq_priority),
+ (ISR_HANDLER)wdt_esp32_isr,
+ (void *)dev,
+ NULL);
+
+ if (ret != 0) {
+ LOG_ERR("could not allocate interrupt (err %d)", ret);
+ return ret;
+ }
#ifndef CONFIG_WDT_DISABLE_AT_BOOT
wdt_esp32_enable(dev);