This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 14d95eb131 arch/risc-v/esp32c3: Add RTC interrupt support
14d95eb131 is described below

commit 14d95eb13126bcc1545f0913bad71c0c462d1d3a
Author: Lucas Saavedra Vaz <[email protected]>
AuthorDate: Tue Feb 7 21:40:41 2023 -0300

    arch/risc-v/esp32c3: Add RTC interrupt support
---
 arch/risc-v/include/esp32c3/irq.h          |  29 +++-
 arch/risc-v/src/esp32c3/Kconfig            |   7 +
 arch/risc-v/src/esp32c3/Make.defs          |   2 +-
 arch/risc-v/src/esp32c3/esp32c3_irq.c      |   5 +
 arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.c | 267 +++++++++++++++++++++++++++++
 arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.h | 149 ++++++++++++++++
 arch/risc-v/src/esp32c3/esp32c3_wdt.c      |  98 +++++++----
 7 files changed, 519 insertions(+), 38 deletions(-)

diff --git a/arch/risc-v/include/esp32c3/irq.h 
b/arch/risc-v/include/esp32c3/irq.h
index 20dc46e377..b778f7859d 100644
--- a/arch/risc-v/include/esp32c3/irq.h
+++ b/arch/risc-v/include/esp32c3/irq.h
@@ -209,8 +209,33 @@
 #  define ESP32C3_NIRQ_GPIO           0
 #endif
 
-/* Total number of IRQs: ecall + Number of peripheral IRQs + GPIOs IRQs. */
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
 
-#define NR_IRQS  (RISCV_NIRQ_INTERRUPTS + ESP32C3_NIRQ_PERIPH + 
ESP32C3_NIRQ_GPIO)
+/* Second level RTC interrupts.  RTC interrupts are decoded and dispatched
+ * as a second level of decoding:  The first level dispatches to the RTC
+ * interrupt handler.  The second to the decoded RTC interrupt handler.
+ * A third level might be required to be implemented on the driver.
+ */
+
+#  define ESP32C3_NIRQ_RTCIO              9
+
+#  define ESP32C3_FIRST_RTCIOIRQ          
(RISCV_NIRQ_INTERRUPTS+ESP32C3_NIRQ_PERIPH+ESP32C3_NIRQ_GPIO)
+#  define ESP32C3_LAST_RTCIOIRQ           
(ESP32C3_FIRST_RTCIOIRQ+ESP32C3_NIRQ_RTCIO-1)
+#  define ESP32C3_IRQ_RTC_SLP_WAKEUP      (ESP32C3_FIRST_RTCIOIRQ+0)
+#  define ESP32C3_IRQ_RTC_SLP_REJECT      (ESP32C3_FIRST_RTCIOIRQ+1)
+#  define ESP32C3_IRQ_RTC_WDT             (ESP32C3_FIRST_RTCIOIRQ+2)
+#  define ESP32C3_IRQ_RTC_BROWN_OUT       (ESP32C3_FIRST_RTCIOIRQ+3)
+#  define ESP32C3_IRQ_RTC_MAIN_TIMER      (ESP32C3_FIRST_RTCIOIRQ+4)
+#  define ESP32C3_IRQ_RTC_SWD             (ESP32C3_FIRST_RTCIOIRQ+5)
+#  define ESP32C3_IRQ_RTC_XTAL32K_DEAD    (ESP32C3_FIRST_RTCIOIRQ+6)
+#  define ESP32C3_IRQ_RTC_GLITCH_DET      (ESP32C3_FIRST_RTCIOIRQ+7)
+#  define ESP32C3_IRQ_RTC_BBPLL_CAL       (ESP32C3_FIRST_RTCIOIRQ+8)
+#else
+#  define ESP32C3_NIRQ_RTCIO              0
+#endif
+
+/* Total number of IRQs: ecall + Peripheral IRQs + GPIOs IRQs + RTCIO IRQs. */
+
+#define NR_IRQS  (RISCV_NIRQ_INTERRUPTS + ESP32C3_NIRQ_PERIPH + 
ESP32C3_NIRQ_GPIO + ESP32C3_NIRQ_RTCIO)
 
 #endif /* __ARCH_RISCV_INCLUDE_ESP32C3_IRQ_H */
diff --git a/arch/risc-v/src/esp32c3/Kconfig b/arch/risc-v/src/esp32c3/Kconfig
index 1d0bee2140..a2866074d5 100644
--- a/arch/risc-v/src/esp32c3/Kconfig
+++ b/arch/risc-v/src/esp32c3/Kconfig
@@ -193,6 +193,12 @@ config ESP32C3_GPIO_IRQ
        ---help---
                Enable support for interrupting GPIO pins
 
+config ESP32C3_RTCIO_IRQ
+       bool "RTC IO interrupts"
+       default n
+       ---help---
+               Enable support for RTC peripherals interrupts.
+
 config ESP32C3_UART0
        bool "UART0"
        default y
@@ -279,6 +285,7 @@ config ESP32C3_RWDT
        bool "RTC Watchdog Timer"
        default n
        select ESP32C3_WDT
+       select ESP32C3_RTCIO_IRQ
        ---help---
                Includes RWDT. This watchdog timer is from the RTC module.
                When it is selected, if the developer sets it to reset on 
expiration
diff --git a/arch/risc-v/src/esp32c3/Make.defs 
b/arch/risc-v/src/esp32c3/Make.defs
index e9a775d3df..003eeaa42e 100644
--- a/arch/risc-v/src/esp32c3/Make.defs
+++ b/arch/risc-v/src/esp32c3/Make.defs
@@ -36,7 +36,7 @@ CMN_ASRCS := $(filter-out riscv_vectors.S,$(CMN_ASRCS))
 
 CHIP_CSRCS  = esp32c3_allocateheap.c esp32c3_start.c esp32c3_wdt.c 
esp32c3_idle.c
 CHIP_CSRCS += esp32c3_irq.c esp32c3_libc_stubs.c
-CHIP_CSRCS += esp32c3_clockconfig.c esp32c3_gpio.c
+CHIP_CSRCS += esp32c3_clockconfig.c esp32c3_gpio.c esp32c3_rtc_gpio.c
 CHIP_CSRCS += esp32c3_lowputc.c esp32c3_serial.c
 CHIP_CSRCS += esp32c3_systemreset.c esp32c3_resetcause.c
 CHIP_CSRCS += esp32c3_uid.c esp32c3_perf.c
diff --git a/arch/risc-v/src/esp32c3/esp32c3_irq.c 
b/arch/risc-v/src/esp32c3/esp32c3_irq.c
index c27e40e2c0..888f6b35fb 100644
--- a/arch/risc-v/src/esp32c3/esp32c3_irq.c
+++ b/arch/risc-v/src/esp32c3/esp32c3_irq.c
@@ -40,6 +40,7 @@
 #include "esp32c3.h"
 #include "esp32c3_attr.h"
 #include "esp32c3_gpio.h"
+#include "esp32c3_rtc_gpio.h"
 
 #include "esp32c3_irq.h"
 
@@ -234,6 +235,10 @@ void up_irqinitialize(void)
   esp32c3_gpioirqinitialize();
 #endif
 
+  /* Initialize RTCIO interrupt support */
+
+  esp32c3_rtcioirqinitialize();
+
 #ifndef CONFIG_SUPPRESS_INTERRUPTS
 
   /* And finally, enable interrupts */
diff --git a/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.c 
b/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.c
new file mode 100644
index 0000000000..a73209999e
--- /dev/null
+++ b/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.c
@@ -0,0 +1,267 @@
+/****************************************************************************
+ * arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <assert.h>
+#include <debug.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/irq.h>
+
+#include "riscv_internal.h"
+#include "esp32c3_irq.h"
+#include "esp32c3_rtc_gpio.h"
+#include "hardware/esp32c3_rtccntl.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+static int g_rtcio_cpuint;
+static uint32_t last_status;
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: is_valid_rtc_gpio
+ *
+ * Description:
+ *   Determine if the specified rtcio_num is a valid RTC GPIO.
+ *
+ * Input Parameters:
+ *   rtcio_num - RTC GPIO to be checked.
+ *
+ * Returned Value:
+ *   True if valid. False otherwise.
+ *
+ ****************************************************************************/
+
+static inline bool is_valid_rtc_gpio(uint32_t rtcio_num)
+{
+  return (rtcio_num < RTC_GPIO_NUMBER);
+}
+
+/****************************************************************************
+ * Name: rtcio_dispatch
+ *
+ * Description:
+ *   Second level dispatch for the RTC interrupt.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number;
+ *   reg_status - Pointer to a copy of the interrupt status register.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+static void rtcio_dispatch(int irq, uint32_t *reg_status)
+{
+  uint32_t status = *reg_status;
+  uint32_t mask;
+  int i;
+
+  /* Check each bit in the status register */
+
+  for (i = 0; i < ESP32C3_NIRQ_RTCIO && status != 0; i++)
+    {
+      /* Check if there is an interrupt pending for this type */
+
+      mask = (UINT32_C(1) << rtc_irq_reg_shift[i]);
+      if ((status & mask) != 0)
+        {
+          /* Yes... perform the second level dispatch. The IRQ context will
+           * contain the contents of the status register.
+           */
+
+          irq_dispatch(irq + i, (void *)reg_status);
+
+          /* Clear the bit in the status so that we might execute this loop
+           * sooner.
+           */
+
+          status &= ~mask;
+        }
+    }
+}
+#endif
+
+/****************************************************************************
+ * Name: rtcio_interrupt
+ *
+ * Description:
+ *   RTC interrupt handler.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number;
+ *   context - The interrupt context;
+ *   args - The arguments passed to the handler.
+ *
+ * Returned Value:
+ *   Zero (OK).
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+static int rtcio_interrupt(int irq, void *context, void *arg)
+{
+  /* Read and clear the lower RTC interrupt status */
+
+  last_status = getreg32(RTC_CNTL_INT_ST_REG);
+  putreg32(last_status, RTC_CNTL_INT_CLR_REG);
+
+  /* Dispatch pending interrupts in the RTC status register */
+
+  rtcio_dispatch(ESP32C3_FIRST_RTCIOIRQ, &last_status);
+
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqinitialize
+ *
+ * Description:
+ *   Initialize logic to support a second level of interrupt decoding for
+ *   RTC IRQs.
+ *
+ * Input Parameters:
+ *   None.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqinitialize(void)
+{
+  /* Setup the RTCIO interrupt. */
+
+  g_rtcio_cpuint = esp32c3_setup_irq(ESP32C3_PERIPH_RTC_CORE,
+                                     1, ESP32C3_INT_LEVEL);
+  DEBUGASSERT(g_rtcio_cpuint >= 0);
+
+  /* Attach and enable the interrupt handler */
+
+  DEBUGVERIFY(irq_attach(ESP32C3_IRQ_RTC_CORE, rtcio_interrupt, NULL));
+  up_enable_irq(ESP32C3_IRQ_RTC_CORE);
+}
+#endif
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqenable
+ *
+ * Description:
+ *   Enable the interrupt for the specified RTC peripheral IRQ.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqenable(int irq)
+{
+  uintptr_t regaddr = RTC_CNTL_INT_ENA_REG;
+  uint32_t regval;
+  int bit;
+
+  DEBUGASSERT(irq >= ESP32C3_FIRST_RTCIOIRQ &&
+              irq <= ESP32C3_LAST_RTCIOIRQ);
+
+  /* Convert the IRQ number to the corresponding bit */
+
+  bit = rtc_irq_reg_shift[irq - ESP32C3_FIRST_RTCIOIRQ];
+
+  /* Get the address of the GPIO PIN register for this pin */
+
+  up_disable_irq(ESP32C3_IRQ_RTC_CORE);
+
+  regval = getreg32(regaddr) | (UINT32_C(1) << bit);
+  putreg32(regval, regaddr);
+
+  up_enable_irq(ESP32C3_IRQ_RTC_CORE);
+}
+#endif
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqdisable
+ *
+ * Description:
+ *   Disable the interrupt for the specified RTC peripheral IRQ.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqdisable(int irq)
+{
+  uintptr_t regaddr = RTC_CNTL_INT_ENA_REG;
+  uint32_t regval;
+  int bit;
+
+  DEBUGASSERT(irq >= ESP32C3_FIRST_RTCIOIRQ &&
+              irq <= ESP32C3_LAST_RTCIOIRQ);
+
+  /* Convert the IRQ number to the corresponding bit */
+
+  bit = rtc_irq_reg_shift[irq - ESP32C3_FIRST_RTCIOIRQ];
+
+  /* Disable IRQ */
+
+  up_disable_irq(ESP32C3_IRQ_RTC_CORE);
+
+  regval = getreg32(regaddr) & (~(UINT32_C(1) << bit));
+  putreg32(regval, regaddr);
+
+  up_enable_irq(ESP32C3_IRQ_RTC_CORE);
+}
+#endif
\ No newline at end of file
diff --git a/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.h 
b/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.h
new file mode 100644
index 0000000000..cccdfc216c
--- /dev/null
+++ b/arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.h
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * arch/risc-v/src/esp32c3/esp32c3_rtc_gpio.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_ESP32C3_ESP32C3_RTC_GPIO_H
+#define __ARCH_RISCV_SRC_ESP32C3_ESP32C3_RTC_GPIO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "hardware/esp32c3_rtccntl.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* RTC GPIO channels */
+
+#define RTC_GPIO_NUMBER             5
+
+#define RTCIO_GPIO0_CHANNEL         0   /* RTCIO_CHANNEL_0 */
+#define RTCIO_CHANNEL_0_GPIO_NUM    4
+
+#define RTCIO_GPIO1_CHANNEL         1   /* RTCIO_CHANNEL_1 */
+#define RTCIO_CHANNEL_1_GPIO_NUM    5
+
+#define RTCIO_GPIO2_CHANNEL         2   /* RTCIO_CHANNEL_2 */
+#define RTCIO_CHANNEL_2_GPIO_NUM    6
+
+#define RTCIO_GPIO3_CHANNEL         3   /* RTCIO_CHANNEL_3 */
+#define RTCIO_CHANNEL_3_GPIO_NUM    8
+
+#define RTCIO_GPIO4_CHANNEL         4   /* RTCIO_CHANNEL_4 */
+#define RTCIO_CHANNEL_4_GPIO_NUM    9
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+static const int rtc_irq_reg_shift[ESP32C3_NIRQ_RTCIO] =
+{
+  RTC_CNTL_SLP_WAKEUP_INT_ENA_S,
+  RTC_CNTL_SLP_REJECT_INT_ENA_S,
+  RTC_CNTL_WDT_INT_ENA_S,
+  RTC_CNTL_BROWN_OUT_INT_ENA_S,
+  RTC_CNTL_MAIN_TIMER_INT_ENA_S,
+  RTC_CNTL_SWD_INT_ENA_S,
+  RTC_CNTL_XTAL32K_DEAD_INT_ENA_S,
+  RTC_CNTL_GLITCH_DET_INT_ENA_S,
+  RTC_CNTL_BBPLL_CAL_INT_ENA_S
+};
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqinitialize
+ *
+ * Description:
+ *   Initialize logic to support a second level of interrupt decoding for
+ *   RTC IRQs.
+ *
+ * Input Parameters:
+ *   None.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqinitialize(void);
+#else
+#  define esp32c3_rtcioirqinitialize()
+#endif
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqenable
+ *
+ * Description:
+ *   Enable the interrupt for the specified RTC peripheral IRQ.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqenable(int irq);
+#else
+#  define esp32c3_rtcioirqenable(irq)
+#endif
+
+/****************************************************************************
+ * Name: esp32c3_rtcioirqdisable
+ *
+ * Description:
+ *   Disable the interrupt for the specified RTC peripheral IRQ.
+ *
+ * Input Parameters:
+ *   irq - The IRQ number.
+ *
+ * Returned Value:
+ *   None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ESP32C3_RTCIO_IRQ
+void esp32c3_rtcioirqdisable(int irq);
+#else
+#  define esp32c3_rtcioirqdisable(irq)
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_SRC_ESP32C3_ESP32C3_RTC_GPIO_H */
diff --git a/arch/risc-v/src/esp32c3/esp32c3_wdt.c 
b/arch/risc-v/src/esp32c3/esp32c3_wdt.c
index abf70e1738..fe14f4897c 100644
--- a/arch/risc-v/src/esp32c3/esp32c3_wdt.c
+++ b/arch/risc-v/src/esp32c3/esp32c3_wdt.c
@@ -36,6 +36,7 @@
 
 #include "esp32c3_irq.h"
 #include "esp32c3_rtc.h"
+#include "esp32c3_rtc_gpio.h"
 #include "esp32c3_wdt.h"
 
 /****************************************************************************
@@ -177,7 +178,7 @@ struct esp32c3_wdt_priv_s g_esp32c3_rwdt_priv =
   .ops    = &esp32c3_rwdt_ops,
   .base   = RTC_CNTL_OPTIONS0_REG,
   .periph = ESP32C3_PERIPH_RTC_CORE,
-  .irq    = ESP32C3_IRQ_RTC_CORE,
+  .irq    = ESP32C3_IRQ_RTC_WDT,
   .cpuint = -ENOMEM,
   .inuse  = false,
 };
@@ -738,16 +739,26 @@ static int32_t esp32c3_wdt_setisr(struct 
esp32c3_wdt_dev_s *dev,
 
   if (handler == NULL)
     {
-      if (wdt->cpuint != -ENOMEM)
+#ifdef CONFIG_ESP32C3_RWDT
+      if (wdt->irq == ESP32C3_IRQ_RTC_WDT)
         {
-          /* If a CPU Interrupt was previously allocated,
-           * then deallocate it.
-           */
-
-          up_disable_irq(wdt->cpuint);
+          esp32c3_rtcioirqdisable(wdt->irq);
           irq_detach(wdt->irq);
-          esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
-          wdt->cpuint = -ENOMEM;
+        }
+      else
+#endif
+      if (wdt->cpuint != -ENOMEM)
+        {
+            {
+              /* If a CPU Interrupt was previously allocated,
+               * then deallocate it.
+               */
+
+              up_disable_irq(wdt->cpuint);
+              irq_detach(wdt->irq);
+              esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
+              wdt->cpuint = -ENOMEM;
+            }
         }
     }
 
@@ -755,43 +766,60 @@ static int32_t esp32c3_wdt_setisr(struct 
esp32c3_wdt_dev_s *dev,
 
   else
     {
-      if (wdt->cpuint != -ENOMEM)
+#ifdef CONFIG_ESP32C3_RWDT
+      if (wdt->irq == ESP32C3_IRQ_RTC_WDT)
         {
-          /* Disable the provided CPU interrupt to configure it. */
-
-          up_disable_irq(wdt->cpuint);
+          ret = irq_attach(wdt->irq, handler, arg);
 
-          /* Free CPU interrupt that is attached to this peripheral
-           * because we will get another from esp32c3_setup_irq()
-           */
+          if (ret != OK)
+            {
+              esp32c3_rtcioirqdisable(wdt->irq);
+              tmrerr("ERROR: Failed to associate an IRQ Number");
+            }
 
-          esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
+          esp32c3_rtcioirqenable(wdt->irq);
         }
+      else
+#endif
+        {
+          if (wdt->cpuint != -ENOMEM)
+            {
+              /* Disable the provided CPU interrupt to configure it. */
 
-      wdt->cpuint = esp32c3_setup_irq(wdt->periph,
-                                        ESP32C3_INT_PRIO_DEF,
-                                        ESP32C3_INT_LEVEL);
+              up_disable_irq(wdt->cpuint);
 
-      if (wdt->cpuint < 0)
-        {
-          return wdt->cpuint;
-        }
+              /* Free CPU interrupt that is attached to this peripheral
+               * because we will get another from esp32c3_setup_irq()
+               */
 
-      /* Attach and enable the IRQ. */
+              esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
+            }
 
-      ret = irq_attach(wdt->irq, handler, arg);
-      if (ret != OK)
-        {
-          /* Failed to attach IRQ, so CPU interrupt must be freed. */
+          wdt->cpuint = esp32c3_setup_irq(wdt->periph,
+                                            ESP32C3_INT_PRIO_DEF,
+                                            ESP32C3_INT_LEVEL);
 
-          esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
-          wdt->cpuint = -ENOMEM;
-          return ret;
-        }
+          if (wdt->cpuint < 0)
+            {
+              return wdt->cpuint;
+            }
+
+          /* Attach and enable the IRQ. */
+
+          ret = irq_attach(wdt->irq, handler, arg);
+          if (ret != OK)
+            {
+              /* Failed to attach IRQ, so CPU interrupt must be freed. */
 
-      /* Enable the CPU interrupt that is linked to the WDT. */
+              esp32c3_teardown_irq(wdt->periph, wdt->cpuint);
+              wdt->cpuint = -ENOMEM;
+              return ret;
+            }
 
-      up_enable_irq(wdt->cpuint);
+          /* Enable the CPU interrupt that is linked to the WDT. */
+
+          up_enable_irq(wdt->cpuint);
+        }
     }
 
   return ret;

Reply via email to