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

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

commit a1c2de3997787d48e011a237829ddc51094d0b77
Author: raiden00pl <[email protected]>
AuthorDate: Thu Oct 22 16:36:21 2026 +0200

    arch/arm/nrf54l: one GRTC device per interrupt group
    
    The GRTC has four interrupt lines, each with its own enable mask, but
    the driver served only line 0.  Give each interrupt group its device so
    a second user keeps its own line while the system timer uses group 0.
    
    Assisted-by: Claude Code
    Signed-off-by: raiden00pl <[email protected]>
---
 arch/arm/src/nrf54l/nrf54l_grtc.c | 65 ++++++++++++++++++++++-----------------
 arch/arm/src/nrf54l/nrf54l_grtc.h |  6 ++++
 2 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/arch/arm/src/nrf54l/nrf54l_grtc.c 
b/arch/arm/src/nrf54l/nrf54l_grtc.c
index 41f08f76bcb..3ea5fbc5fe6 100644
--- a/arch/arm/src/nrf54l/nrf54l_grtc.c
+++ b/arch/arm/src/nrf54l/nrf54l_grtc.c
@@ -50,6 +50,7 @@ struct nrf54l_grtc_priv_s
   struct nrf54l_grtc_ops_s *ops;
   uint32_t                  base;
   uint32_t                  irq;
+  uint8_t                   group;      /* Interrupt group of this device */
   uint8_t                   chan;
   bool                      inuse;
 };
@@ -115,19 +116,32 @@ struct nrf54l_grtc_ops_s nrf54l_grtc_ops =
   .getbase    = nrf54l_grtc_getbase,
 };
 
-/* GRTC */
+/* One GRTC device per interrupt group, the counter and the compare
+ * channels are shared
+ */
 
-struct nrf54l_grtc_priv_s g_nrf54l_grtc_priv =
-{
-  .ops   = &nrf54l_grtc_ops,
-  .base  = NRF54L_GRTC_BASE,
-  .irq   = NRF54L_IRQ_GRTC_0,
 #ifdef CONFIG_NRF54L_SOFTDEVICE_CONTROLLER
-  .chan  = 7,
+#  define NRF54L_GRTC_CHAN 7
 #else
-  .chan  = 12,
+#  define NRF54L_GRTC_CHAN 12
 #endif
-  .inuse = false,
+
+#define NRF54L_GRTC_DEV(n)                      \
+  {                                             \
+    .ops   = &nrf54l_grtc_ops,                  \
+    .base  = NRF54L_GRTC_BASE,                  \
+    .irq   = NRF54L_IRQ_GRTC_##n,               \
+    .group = (n),                               \
+    .chan  = NRF54L_GRTC_CHAN,                  \
+    .inuse = false,                             \
+  }
+
+struct nrf54l_grtc_priv_s g_nrf54l_grtc_priv[NRF54L_GRTC_NGROUPS] =
+{
+  NRF54L_GRTC_DEV(0),
+  NRF54L_GRTC_DEV(1),
+  NRF54L_GRTC_DEV(2),
+  NRF54L_GRTC_DEV(3),
 };
 
 /****************************************************************************
@@ -436,8 +450,9 @@ errout:
 
 static int nrf54l_grtc_enableint(struct nrf54l_grtc_dev_s *dev, uint8_t s)
 {
-  uint32_t regval = 0;
-  int      ret    = OK;
+  struct nrf54l_grtc_priv_s *grtc   = (struct nrf54l_grtc_priv_s *)dev;
+  uint32_t                   regval = 0;
+  int                        ret    = OK;
 
   DEBUGASSERT(dev);
 
@@ -450,7 +465,7 @@ static int nrf54l_grtc_enableint(struct nrf54l_grtc_dev_s 
*dev, uint8_t s)
       goto errout;
     }
 
-  nrf54l_grtc_putreg(dev, NRF54L_GRTC_INTENSET_OFFSET(0), regval);
+  nrf54l_grtc_putreg(dev, NRF54L_GRTC_INTENSET_OFFSET(grtc->group), regval);
 
 errout:
   return ret;
@@ -462,8 +477,9 @@ errout:
 
 static int nrf54l_grtc_disableint(struct nrf54l_grtc_dev_s *dev, uint8_t s)
 {
-  uint32_t regval = 0;
-  int      ret    = OK;
+  struct nrf54l_grtc_priv_s *grtc   = (struct nrf54l_grtc_priv_s *)dev;
+  uint32_t                   regval = 0;
+  int                        ret    = OK;
 
   DEBUGASSERT(dev);
 
@@ -476,7 +492,7 @@ static int nrf54l_grtc_disableint(struct nrf54l_grtc_dev_s 
*dev, uint8_t s)
       goto errout;
     }
 
-  nrf54l_grtc_putreg(dev, NRF54L_GRTC_INTENCLR_OFFSET(0), regval);
+  nrf54l_grtc_putreg(dev, NRF54L_GRTC_INTENCLR_OFFSET(grtc->group), regval);
 
 errout:
   return ret;
@@ -551,7 +567,7 @@ static uint32_t nrf54l_grtc_getbase(struct 
nrf54l_grtc_dev_s *dev)
  * Name: nrf54l_grtc_init
  *
  * Description:
- *   Initialize GRTC device
+ *   Initialize the GRTC device of the given interrupt group
  *
  ****************************************************************************/
 
@@ -562,21 +578,14 @@ struct nrf54l_grtc_dev_s *nrf54l_grtc_init(int grtc)
 
   /* Get GRTC instance */
 
-  switch (grtc)
+  if (grtc < 0 || grtc >= NRF54L_GRTC_NGROUPS)
     {
-      case 0:
-        {
-          priv = &g_nrf54l_grtc_priv;
-          break;
-        }
-
-      default:
-        {
-          rtcerr("ERROR: unsupported GRTC %d\n", grtc);
-          goto errout;
-        }
+      rtcerr("ERROR: unsupported GRTC %d\n", grtc);
+      goto errout;
     }
 
+  priv = &g_nrf54l_grtc_priv[grtc];
+
   if (priv->inuse != false)
     {
       /* GRTC already in use */
diff --git a/arch/arm/src/nrf54l/nrf54l_grtc.h 
b/arch/arm/src/nrf54l/nrf54l_grtc.h
index 3d34b187fc7..28172808b7d 100644
--- a/arch/arm/src/nrf54l/nrf54l_grtc.h
+++ b/arch/arm/src/nrf54l/nrf54l_grtc.h
@@ -53,6 +53,10 @@
 #define NRF54L_GRTC_ACKINT(d, s)            ((d)->ops->ackint(d, s))
 #define NRF54L_GRTC_GETBASE(d)              ((d)->ops->getbase(d))
 
+/* Interrupt groups, each with its own interrupt line and enable mask */
+
+#define NRF54L_GRTC_NGROUPS   (4)
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
@@ -134,6 +138,8 @@ struct nrf54l_grtc_ops_s
  * Public Function Prototypes
  ****************************************************************************/
 
+/* grtc is the interrupt group, 0 to NRF54L_GRTC_NGROUPS - 1 */
+
 struct nrf54l_grtc_dev_s *nrf54l_grtc_init(int grtc);
 int nrf54l_grtc_deinit(struct nrf54l_grtc_dev_s *dev);
 

Reply via email to