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

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

commit 5c113f79b78a47df3343ce08c591683eef69e61f
Author: ouyangxiangzhen <[email protected]>
AuthorDate: Wed Sep 10 15:33:27 2025 +0800

    timers/oneshot: Remove all private callback.
    
    This commit removed all private callback and handle it on the upperhalf
    of oneshot.
    
    Signed-off-by: ouyangxiangzhen <[email protected]>
---
 arch/arm/src/armv7-a/arm_timer.c                   | 20 ++-----------
 arch/arm/src/armv7-r/arm_timer.c                   | 21 ++-----------
 arch/arm/src/armv8-r/arm_timer.c                   | 14 ++-------
 arch/arm/src/sam34/sam4cm_oneshot_lowerhalf.c      | 34 ++++-----------------
 arch/arm/src/sama5/sam_oneshot_lowerhalf.c         | 34 ++++-----------------
 arch/arm/src/samd5e5/sam_oneshot_lowerhalf.c       | 34 ++++-----------------
 arch/arm/src/samv7/sam_oneshot_lowerhalf.c         | 34 ++++-----------------
 arch/arm/src/stm32/stm32_oneshot_lowerhalf.c       | 34 ++++-----------------
 arch/arm/src/stm32h7/stm32_oneshot_lowerhalf.c     | 34 ++++-----------------
 arch/arm/src/stm32l4/stm32l4_oneshot_lowerhalf.c   | 34 ++++-----------------
 arch/arm/src/stm32wb/stm32wb_oneshot_lowerhalf.c   | 34 ++++-----------------
 arch/arm64/src/common/arm64_arch_timer.c           | 11 ++-----
 arch/mips/src/pic32mz/pic32mz_oneshot_lowerhalf.c  | 35 ++++------------------
 arch/risc-v/src/bl602/bl602_oneshot_lowerhalf.c    | 19 ++----------
 arch/risc-v/src/common/espressif/esp_oneshot.c     | 26 ++--------------
 arch/risc-v/src/common/riscv_mtimer.c              | 15 ++--------
 .../src/esp32c3-legacy/esp32c3_oneshot_lowerhalf.c | 32 ++++----------------
 arch/sim/src/sim/sim_oneshot.c                     | 35 ++++++----------------
 arch/sparc/src/bm3803/bm3803_oneshot_lowerhalf.c   | 34 ++++-----------------
 arch/tricore/src/common/tricore_systimer.c         | 14 ++-------
 arch/x86_64/src/intel64/intel64_oneshot_lower.c    | 35 ++++------------------
 arch/xtensa/src/common/xtensa_oneshot.c            | 22 +-------------
 arch/xtensa/src/esp32/esp32_oneshot_lowerhalf.c    | 34 ++++-----------------
 .../xtensa/src/esp32s2/esp32s2_oneshot_lowerhalf.c | 32 ++++----------------
 .../xtensa/src/esp32s3/esp32s3_oneshot_lowerhalf.c | 30 ++++---------------
 drivers/audio/tone.c                               |  3 ++
 drivers/timers/arch_alarm.c                        |  3 ++
 drivers/timers/goldfish_timer.c                    | 23 +-------------
 drivers/timers/oneshot.c                           |  4 +++
 drivers/timers/watchdog.c                          |  2 ++
 include/nuttx/timers/oneshot.h                     | 12 ++++++++
 sched/sched/sched_cpuload_oneshot.c                |  2 ++
 32 files changed, 144 insertions(+), 606 deletions(-)

diff --git a/arch/arm/src/armv7-a/arm_timer.c b/arch/arm/src/armv7-a/arm_timer.c
index 81da492a9b6..f234acb5842 100644
--- a/arch/arm/src/armv7-a/arm_timer.c
+++ b/arch/arm/src/armv7-a/arm_timer.c
@@ -63,8 +63,6 @@ struct arm_timer_lowerhalf_s
 {
   struct oneshot_lowerhalf_s lh;        /* Lower half operations */
   uint32_t                   freq;      /* Timer working clock frequency(Hz) */
-  oneshot_callback_t         callback;  /* Current user interrupt callback */
-  void                       *arg;      /* Argument passed to upper half 
callback */
 
   /* which cpu timer is running, -1 indicate timer stoppd */
 
@@ -180,9 +178,6 @@ static int arm_timer_start(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = up_irq_save();
 
-  lower->callback = callback;
-  lower->arg      = arg;
-
   lower->running = this_cpu();
 
   count = sec_to_count(ts->tv_sec, lower->freq) +
@@ -206,8 +201,6 @@ static int arm_timer_cancel(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = up_irq_save();
 
-  lower->callback = NULL;
-  lower->arg      = NULL;
   lower->running  = -1;
 
   arm_timer_phy_set_irq_mask(true);
@@ -234,23 +227,14 @@ static int arm_timer_current(struct oneshot_lowerhalf_s 
*lower_,
 static int arm_timer_interrupt(int irq, void *context, void *arg)
 {
   struct arm_timer_lowerhalf_s *lower = arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(lower != NULL);
 
   arm_timer_phy_set_irq_mask(true);
 
-  if (lower->callback != NULL && lower->running == this_cpu())
+  if (lower->running == this_cpu())
     {
-      callback        = lower->callback;
-      cbarg           = lower->arg;
-      lower->callback = NULL;
-      lower->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&lower->lh, cbarg);
+      oneshot_process_callback(&lower->lh);
     }
 
   return 0;
diff --git a/arch/arm/src/armv7-r/arm_timer.c b/arch/arm/src/armv7-r/arm_timer.c
index c97f3b7ec7b..62a69e7e3f4 100644
--- a/arch/arm/src/armv7-r/arm_timer.c
+++ b/arch/arm/src/armv7-r/arm_timer.c
@@ -62,8 +62,6 @@ struct arm_timer_lowerhalf_s
 {
   struct oneshot_lowerhalf_s lh;        /* Lower half operations */
   uint32_t                   freq;      /* Timer working clock frequency(Hz) */
-  oneshot_callback_t         callback;  /* Current user interrupt callback */
-  void                       *arg;      /* Argument passed to upper half 
callback */
 
   /* which cpu timer is running, -1 indicate timer stoppd */
 
@@ -173,9 +171,6 @@ static int arm_timer_start(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = up_irq_save();
 
-  lower->callback = callback;
-  lower->arg      = arg;
-
   lower->running = this_cpu();
 
   count = sec_to_count(ts->tv_sec, arm_timer_get_freq()) +
@@ -199,8 +194,6 @@ static int arm_timer_cancel(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = up_irq_save();
 
-  lower->callback = NULL;
-  lower->arg      = NULL;
   lower->running  = -1;
 
   arm_timer_phy_set_irq_mask(true);
@@ -225,23 +218,13 @@ static int arm_timer_current(struct oneshot_lowerhalf_s 
*lower_,
 static int arm_timer_interrupt(int irq, void *context, void *arg)
 {
   struct arm_timer_lowerhalf_s *lower = arg;
-  oneshot_callback_t callback;
-  void *cbarg;
-
   DEBUGASSERT(lower != NULL);
 
   arm_timer_phy_set_irq_mask(true);
 
-  if (lower->callback != NULL && lower->running == this_cpu())
+  if (lower->running == this_cpu())
     {
-      callback        = lower->callback;
-      cbarg           = lower->arg;
-      lower->callback = NULL;
-      lower->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&lower->lh, cbarg);
+      oneshot_process_callback(&lower->lh);
     }
 
   return 0;
diff --git a/arch/arm/src/armv8-r/arm_timer.c b/arch/arm/src/armv8-r/arm_timer.c
index f3119912d75..aacdd9b9e55 100644
--- a/arch/arm/src/armv8-r/arm_timer.c
+++ b/arch/arm/src/armv8-r/arm_timer.c
@@ -80,9 +80,7 @@ struct arm_oneshot_lowerhalf_s
 
   /* Private lower half data follows */
 
-  void *arg;                          /* Argument that is passed to the 
handler */
   uint32_t           frequency;       /* Frequency */
-  oneshot_callback_t callback;        /* Internal handler that receives 
callback */
 };
 
 /****************************************************************************
@@ -146,12 +144,9 @@ static int arm_arch_timer_compare_isr(int irq, void *regs, 
void *arg)
 
   arm_timer_phy_set_irq_mask(true);
 
-  if (priv->callback)
-    {
-      /* Then perform the callback */
+  /* Then perform the callback */
 
-      priv->callback(&priv->lh, priv->arg);
-    }
+  oneshot_process_callback(&priv->lh);
 
   return OK;
 }
@@ -258,11 +253,6 @@ static int arm_start(struct oneshot_lowerhalf_s *lower,
 
   DEBUGASSERT(priv && callback && ts);
 
-  /* Save the new handler and its argument */
-
-  priv->callback = callback;
-  priv->arg = arg;
-
   /* Set the timeout */
 
   count  = arm_timer_phy_count();
diff --git a/arch/arm/src/sam34/sam4cm_oneshot_lowerhalf.c 
b/arch/arm/src/sam34/sam4cm_oneshot_lowerhalf.c
index 7b63804f9ce..be01d5578cb 100644
--- a/arch/arm/src/sam34/sam4cm_oneshot_lowerhalf.c
+++ b/arch/arm/src/sam34/sam4cm_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct sam_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct sam_oneshot_s oneshot;  /* SAM-specific oneshot state */
-  oneshot_callback_t callback;   /* internal handler that receives callback */
-  void *arg;                     /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -112,8 +110,6 @@ static void sam_oneshot_handler(void *arg)
 {
   struct sam_oneshot_lowerhalf_s *priv =
     (struct sam_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -121,21 +117,7 @@ static void sam_oneshot_handler(void *arg)
    * sam_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -211,11 +193,9 @@ static int sam_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = sam_oneshot_start(&priv->oneshot, NULL,
-                                     sam_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = sam_oneshot_start(&priv->oneshot, NULL,
+                            sam_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -262,10 +242,8 @@ static int sam_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/sama5/sam_oneshot_lowerhalf.c 
b/arch/arm/src/sama5/sam_oneshot_lowerhalf.c
index 6ce17a5b054..735eaa0bdce 100644
--- a/arch/arm/src/sama5/sam_oneshot_lowerhalf.c
+++ b/arch/arm/src/sama5/sam_oneshot_lowerhalf.c
@@ -60,8 +60,6 @@ struct sam_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct sam_oneshot_s oneshot;  /* SAM-specific oneshot state */
-  oneshot_callback_t callback;   /* internal handler that receives callback */
-  void *arg;                     /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -114,8 +112,6 @@ static void sam_oneshot_handler(void *arg)
 {
   struct sam_oneshot_lowerhalf_s *priv =
     (struct sam_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -123,21 +119,7 @@ static void sam_oneshot_handler(void *arg)
    * sam_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -213,11 +195,9 @@ static int sam_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = sam_oneshot_start(&priv->oneshot, NULL,
-                                       sam_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = sam_oneshot_start(&priv->oneshot, NULL,
+                            sam_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -264,10 +244,8 @@ static int sam_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/samd5e5/sam_oneshot_lowerhalf.c 
b/arch/arm/src/samd5e5/sam_oneshot_lowerhalf.c
index c41675769b1..e4c8f2cf697 100644
--- a/arch/arm/src/samd5e5/sam_oneshot_lowerhalf.c
+++ b/arch/arm/src/samd5e5/sam_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct sam_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct sam_oneshot_s oneshot;  /* SAM-specific oneshot state */
-  oneshot_callback_t callback;   /* internal handler that receives callback */
-  void *arg;                     /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -112,8 +110,6 @@ static void sam_oneshot_handler(void *arg)
 {
   struct sam_oneshot_lowerhalf_s *priv =
     (struct sam_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -121,21 +117,7 @@ static void sam_oneshot_handler(void *arg)
    * sam_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -211,11 +193,9 @@ static int sam_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = sam_oneshot_start(&priv->oneshot, NULL,
-                                       sam_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = sam_oneshot_start(&priv->oneshot, NULL,
+                            sam_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -262,10 +242,8 @@ static int sam_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/samv7/sam_oneshot_lowerhalf.c 
b/arch/arm/src/samv7/sam_oneshot_lowerhalf.c
index dc736a3ee54..1822c3d27af 100644
--- a/arch/arm/src/samv7/sam_oneshot_lowerhalf.c
+++ b/arch/arm/src/samv7/sam_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct sam_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct sam_oneshot_s oneshot;  /* SAMV7-specific oneshot state */
-  oneshot_callback_t callback;   /* internal handler that receives callback */
-  void *arg;                     /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -112,8 +110,6 @@ static void sam_oneshot_handler(void *arg)
 {
   struct sam_oneshot_lowerhalf_s *priv =
     (struct sam_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -121,21 +117,7 @@ static void sam_oneshot_handler(void *arg)
    * sam_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -211,11 +193,9 @@ static int sam_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = sam_oneshot_start(&priv->oneshot, NULL,
-                                     sam_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = sam_oneshot_start(&priv->oneshot, NULL,
+                            sam_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -262,10 +242,8 @@ static int sam_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = sam_oneshot_cancel(&priv->oneshot, NULL, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/stm32/stm32_oneshot_lowerhalf.c 
b/arch/arm/src/stm32/stm32_oneshot_lowerhalf.c
index f0b6d2ccf95..2d6a2c7e6fd 100644
--- a/arch/arm/src/stm32/stm32_oneshot_lowerhalf.c
+++ b/arch/arm/src/stm32/stm32_oneshot_lowerhalf.c
@@ -57,8 +57,6 @@ struct stm32_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct stm32_oneshot_s oneshot; /* STM32-specific oneshot state */
-  oneshot_callback_t callback;    /* Internal handler that receives callback */
-  void *arg;                      /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -111,8 +109,6 @@ static void stm32_oneshot_handler(void *arg)
 {
   struct stm32_oneshot_lowerhalf_s *priv =
     (struct stm32_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -120,21 +116,7 @@ static void stm32_oneshot_handler(void *arg)
    * stm32_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -210,11 +192,9 @@ static int stm32_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = stm32_oneshot_start(&priv->oneshot,
-                                       stm32_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = stm32_oneshot_start(&priv->oneshot,
+                              stm32_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -261,10 +241,8 @@ static int stm32_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = stm32_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = stm32_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/stm32h7/stm32_oneshot_lowerhalf.c 
b/arch/arm/src/stm32h7/stm32_oneshot_lowerhalf.c
index 545f4ebdcf3..8f80f9bec49 100644
--- a/arch/arm/src/stm32h7/stm32_oneshot_lowerhalf.c
+++ b/arch/arm/src/stm32h7/stm32_oneshot_lowerhalf.c
@@ -57,8 +57,6 @@ struct stm32_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct stm32_oneshot_s oneshot; /* STM32-specific oneshot state */
-  oneshot_callback_t callback;    /* Internal handler that receives callback */
-  void *arg;                      /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -111,8 +109,6 @@ static void stm32_oneshot_handler(void *arg)
 {
   struct stm32_oneshot_lowerhalf_s *priv =
     (struct stm32_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -120,21 +116,7 @@ static void stm32_oneshot_handler(void *arg)
    * stm32_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -210,11 +192,9 @@ static int stm32_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = stm32_oneshot_start(&priv->oneshot,
-                                       stm32_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = stm32_oneshot_start(&priv->oneshot,
+                              stm32_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -261,10 +241,8 @@ static int stm32_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = stm32_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = stm32_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/stm32l4/stm32l4_oneshot_lowerhalf.c 
b/arch/arm/src/stm32l4/stm32l4_oneshot_lowerhalf.c
index 61e75d04ffa..d217c341d5e 100644
--- a/arch/arm/src/stm32l4/stm32l4_oneshot_lowerhalf.c
+++ b/arch/arm/src/stm32l4/stm32l4_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct stm32l4_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct stm32l4_oneshot_s oneshot; /* STM32-specific oneshot state */
-  oneshot_callback_t callback;      /* internal handler that receives callback 
*/
-  void *arg;                        /* Argument that is passed to the handler 
*/
 };
 
 /****************************************************************************
@@ -112,8 +110,6 @@ static void stm32l4_oneshot_handler(void *arg)
 {
   struct stm32l4_oneshot_lowerhalf_s *priv =
     (struct stm32l4_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -121,21 +117,7 @@ static void stm32l4_oneshot_handler(void *arg)
    * stm32l4_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -211,11 +193,9 @@ static int stm32l4_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = stm32l4_oneshot_start(&priv->oneshot,
-                                       stm32l4_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = stm32l4_oneshot_start(&priv->oneshot,
+                                stm32l4_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -262,10 +242,8 @@ static int stm32l4_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = stm32l4_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = stm32l4_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm/src/stm32wb/stm32wb_oneshot_lowerhalf.c 
b/arch/arm/src/stm32wb/stm32wb_oneshot_lowerhalf.c
index 2df58ee753d..cae5981a8e6 100644
--- a/arch/arm/src/stm32wb/stm32wb_oneshot_lowerhalf.c
+++ b/arch/arm/src/stm32wb/stm32wb_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct stm32wb_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct stm32wb_oneshot_s oneshot; /* STM32-specific oneshot state */
-  oneshot_callback_t callback;      /* internal handler that receives callback 
*/
-  void *arg;                        /* Argument that is passed to the handler 
*/
 };
 
 /****************************************************************************
@@ -112,8 +110,6 @@ static void stm32wb_oneshot_handler(void *arg)
 {
   struct stm32wb_oneshot_lowerhalf_s *priv =
     (struct stm32wb_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -121,21 +117,7 @@ static void stm32wb_oneshot_handler(void *arg)
    * stm32wb_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -211,11 +193,9 @@ static int stm32wb_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = stm32wb_oneshot_start(&priv->oneshot,
-                                       stm32wb_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = stm32wb_oneshot_start(&priv->oneshot,
+                                stm32wb_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -262,10 +242,8 @@ static int stm32wb_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = stm32wb_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = stm32wb_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/arm64/src/common/arm64_arch_timer.c 
b/arch/arm64/src/common/arm64_arch_timer.c
index b487221e205..89aa274ca0c 100644
--- a/arch/arm64/src/common/arm64_arch_timer.c
+++ b/arch/arm64/src/common/arm64_arch_timer.c
@@ -69,9 +69,7 @@ struct arm64_oneshot_lowerhalf_s
 
   /* Private lower half data follows */
 
-  void *arg;                          /* Argument that is passed to the 
handler */
   uint64_t frequency;                 /* Frequency in cycle per second */
-  oneshot_callback_t callback;        /* Internal handler that receives 
callback */
 
   /* which cpu timer is running, -1 indicate timer stoppd */
 
@@ -136,11 +134,11 @@ static int arm64_arch_timer_compare_isr(int irq, void 
*regs, void *arg)
 
   arm64_arch_timer_set_irq_mask(true);
 
-  if (priv->callback && priv->running == this_cpu())
+  if (priv->running == this_cpu())
     {
       /* Then perform the callback */
 
-      priv->callback(&priv->lh, priv->arg);
+      oneshot_process_callback(&priv->lh);
     }
 
   return OK;
@@ -247,11 +245,6 @@ static int arm64_start(struct oneshot_lowerhalf_s *lower,
 
   DEBUGASSERT(priv && callback && ts);
 
-  /* Save the new handler and its argument */
-
-  priv->callback = callback;
-  priv->arg = arg;
-
   priv->running = this_cpu();
 
   count  = arm64_arch_timer_count();
diff --git a/arch/mips/src/pic32mz/pic32mz_oneshot_lowerhalf.c 
b/arch/mips/src/pic32mz/pic32mz_oneshot_lowerhalf.c
index da88ae9ee7e..e63b78c034c 100644
--- a/arch/mips/src/pic32mz/pic32mz_oneshot_lowerhalf.c
+++ b/arch/mips/src/pic32mz/pic32mz_oneshot_lowerhalf.c
@@ -56,8 +56,6 @@ struct pic32mz_oneshot_lowerhalf_s
   /* Private lower half data follows */
 
   struct pic32mz_oneshot_s oneshot; /* PIC32MZ-specific oneshot state  */
-  oneshot_callback_t callback;      /* Handler that receives callback  */
-  void *arg;                        /* Argument passed to the handler  */
 };
 
 /****************************************************************************
@@ -110,8 +108,6 @@ static void pic32mz_oneshot_handler(void *arg)
 {
   struct pic32mz_oneshot_lowerhalf_s *priv =
     (struct pic32mz_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -119,21 +115,7 @@ static void pic32mz_oneshot_handler(void *arg)
    * pic32mz_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -212,12 +194,9 @@ static int pic32mz_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = pic32mz_oneshot_start(&priv->oneshot,
-                                         pic32mz_oneshot_handler,
-                                         priv, ts);
+  flags = enter_critical_section();
+  ret   = pic32mz_oneshot_start(&priv->oneshot,
+                                pic32mz_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -264,10 +243,8 @@ static int pic32mz_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = pic32mz_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = pic32mz_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/risc-v/src/bl602/bl602_oneshot_lowerhalf.c 
b/arch/risc-v/src/bl602/bl602_oneshot_lowerhalf.c
index 53d49c2c1d0..f77194ccad4 100644
--- a/arch/risc-v/src/bl602/bl602_oneshot_lowerhalf.c
+++ b/arch/risc-v/src/bl602/bl602_oneshot_lowerhalf.c
@@ -72,8 +72,6 @@ struct bl602_oneshot_lowerhalf_s
 
   /* Private lower half data follows */
 
-  oneshot_callback_t callback; /* Internal handler that receives callback */
-  void *             arg;      /* Argument that is passed to the handler */
   uint8_t            tim;      /* timer tim 0,1 */
   uint8_t            irq;      /* IRQ associated with this timer */
   bool               started;  /* True: Timer has been started */
@@ -129,9 +127,6 @@ static int bl602_oneshot_handler(int irq, void *context, 
void *arg)
   struct bl602_oneshot_lowerhalf_s *priv =
     (struct bl602_oneshot_lowerhalf_s *)arg;
 
-  oneshot_callback_t callback;
-  void *         cbarg;
-
   /* Clear Interrupt Bits */
 
   uint32_t int_id;
@@ -156,13 +151,7 @@ static int bl602_oneshot_handler(int irq, void *context, 
void *arg)
   if ((int_id & TIMER_TMSR2_TMSR_0) != 0)
     {
       putreg32(ticr_val | TIMER_TICR2_TCLR_0, ticr_addr);
-      callback = priv->callback;
-      cbarg    = priv->arg;
-
-      if (callback)
-        {
-          callback(&priv->lh, cbarg);
-        }
+      oneshot_process_callback(&priv->lh);
     }
 
   /* Comparator 1 match interrupt */
@@ -261,9 +250,7 @@ static int bl602_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
+  flags = enter_critical_section();
 
   /* Express the delay in microseconds */
 
@@ -328,8 +315,6 @@ static int bl602_cancel(struct oneshot_lowerhalf_s *lower,
       priv->started = false;
       up_disable_irq(priv->irq);
       bl602_timer_intmask(priv->tim, TIMER_INT_COMP_0, 1);
-      priv->callback = NULL;
-      priv->arg      = NULL;
 
       leave_critical_section(flags);
       return OK;
diff --git a/arch/risc-v/src/common/espressif/esp_oneshot.c 
b/arch/risc-v/src/common/espressif/esp_oneshot.c
index 909ca0ee678..732bd6b283a 100644
--- a/arch/risc-v/src/common/espressif/esp_oneshot.c
+++ b/arch/risc-v/src/common/espressif/esp_oneshot.c
@@ -80,8 +80,6 @@ struct esp_oneshot_lowerhalf_s
 {
   struct oneshot_lowerhalf_s lh;          /* Lower half instance */
   timer_hal_context_t        hal;         /* HAL context */
-  oneshot_callback_t         callback;    /* Current user interrupt callback */
-  void                      *arg;         /* Argument passed to upper half 
callback */
   uint16_t                   resolution;  /* Timer resolution in microseconds 
*/
   bool                       running;     /* True: the timer is running */
 };
@@ -129,8 +127,6 @@ static struct esp_oneshot_lowerhalf_s g_oneshot_lowerhalf =
     {
       .ops = &g_oneshot_ops,
     },
-  .callback = NULL,
-  .arg = NULL
 };
 
 /****************************************************************************
@@ -223,11 +219,6 @@ static int esp_oneshot_start(struct oneshot_lowerhalf_s 
*lower,
       esp_oneshot_cancel(lower, NULL);
     }
 
-  /* Save the new callback and its argument */
-
-  priv->callback = callback;
-  priv->arg      = arg;
-
   /* Retrieve the duration from timespec in microsecond */
 
   timeout_us = (uint64_t)ts->tv_sec * USEC_PER_SEC +
@@ -368,9 +359,7 @@ static int esp_oneshot_cancel(struct oneshot_lowerhalf_s 
*lower,
       ts->tv_nsec  = remaining_us * NSEC_PER_USEC;
     }
 
-  priv->running  = false;
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  priv->running = false;
 
   return OK;
 }
@@ -441,8 +430,6 @@ IRAM_ATTR static int esp_oneshot_isr(int irq, void 
*context, void *arg)
 {
   struct esp_oneshot_lowerhalf_s *priv =
     (struct esp_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *callback_arg;
 
   timer_hal_context_t *hal = &(priv->hal);
   uint32_t intr_status = timer_ll_get_intr_status(hal->dev);
@@ -460,16 +447,9 @@ IRAM_ATTR static int esp_oneshot_isr(int irq, void 
*context, void *arg)
 
   priv->running = false;
 
-  /* Forward the event, clearing out any vestiges */
-
-  callback       = priv->callback;
-  callback_arg   = priv->arg;
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
   /* Call the callback */
 
-  callback(&priv->lh, callback_arg);
+  oneshot_process_callback(&priv->lh);
 
   return OK;
 }
@@ -510,8 +490,6 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan, 
uint16_t resolution)
 
   /* Initialize the elements of lower half state structure */
 
-  lower->callback   = NULL;
-  lower->arg        = NULL;
   lower->resolution = resolution;
   lower->running    = false;
 
diff --git a/arch/risc-v/src/common/riscv_mtimer.c 
b/arch/risc-v/src/common/riscv_mtimer.c
index 4a8946b770b..23167a98658 100644
--- a/arch/risc-v/src/common/riscv_mtimer.c
+++ b/arch/risc-v/src/common/riscv_mtimer.c
@@ -46,8 +46,6 @@ struct riscv_mtimer_lowerhalf_s
   uintreg_t                  mtimecmp;
   uint64_t                   freq;
   uint64_t                   alarm;
-  oneshot_callback_t         callback;
-  void                       *arg;
 };
 
 /****************************************************************************
@@ -154,9 +152,7 @@ static int riscv_mtimer_start(struct oneshot_lowerhalf_s 
*lower,
   alarm = mtime + ts->tv_sec * priv->freq +
           ts->tv_nsec * priv->freq / NSEC_PER_SEC;
 
-  priv->alarm    = alarm;
-  priv->callback = callback;
-  priv->arg      = arg;
+  priv->alarm = alarm;
 
   riscv_mtimer_set_mtimecmp(priv, priv->alarm);
 
@@ -210,9 +206,7 @@ static int riscv_mtimer_cancel(struct oneshot_lowerhalf_s 
*lower,
   ts->tv_sec  = nsec / NSEC_PER_SEC;
   ts->tv_nsec = nsec % NSEC_PER_SEC;
 
-  priv->alarm    = 0;
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  priv->alarm = 0;
 
   up_irq_restore(flags);
 
@@ -257,10 +251,7 @@ static int riscv_mtimer_interrupt(int irq, void *context, 
void *arg)
 {
   struct riscv_mtimer_lowerhalf_s *priv = arg;
 
-  if (priv->callback != NULL)
-    {
-      priv->callback(&priv->lower, priv->arg);
-    }
+  oneshot_process_callback(&priv->lower);
 
   return 0;
 }
diff --git a/arch/risc-v/src/esp32c3-legacy/esp32c3_oneshot_lowerhalf.c 
b/arch/risc-v/src/esp32c3-legacy/esp32c3_oneshot_lowerhalf.c
index 817cedbd70a..dc5f2853b8b 100644
--- a/arch/risc-v/src/esp32c3-legacy/esp32c3_oneshot_lowerhalf.c
+++ b/arch/risc-v/src/esp32c3-legacy/esp32c3_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct esp32c3_oneshot_lowerhalf_s
 
   struct oneshot_lowerhalf_s        lh;   /* Lower half instance */
   struct esp32c3_oneshot_s     oneshot;   /* ESP32-C3-specific oneshot state */
-  oneshot_callback_t          callback;   /* Upper half Interrupt callback */
-  void                        *arg;       /* Argument passed to handler */
   uint16_t                  resolution;
 };
 
@@ -116,11 +114,8 @@ static void esp32c3_oneshot_lh_handler(void *arg)
 {
   struct esp32c3_oneshot_lowerhalf_s *priv =
     (struct esp32c3_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cb_arg;
 
   DEBUGASSERT(priv != NULL);
-  DEBUGASSERT(priv->callback != NULL);
 
   tmrinfo("Oneshot LH handler triggered\n");
 
@@ -128,14 +123,7 @@ static void esp32c3_oneshot_lh_handler(void *arg)
    * restarts the oneshot).
    */
 
-  callback       = priv->callback;
-  cb_arg         = priv->arg;
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
-  /* Then perform the callback */
-
-  callback(&priv->lh, cb_arg);
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -215,13 +203,9 @@ static int oneshot_lh_start(struct oneshot_lowerhalf_s 
*lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = esp32c3_oneshot_start(&priv->oneshot,
-                                         esp32c3_oneshot_lh_handler,
-                                         priv,
-                                         ts);
+  flags = enter_critical_section();
+  ret   = esp32c3_oneshot_start(&priv->oneshot, esp32c3_oneshot_lh_handler,
+                                priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -268,10 +252,8 @@ static int oneshot_lh_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = esp32c3_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = esp32c3_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -358,8 +340,6 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan,
     }
 
   priv->lh.ops     = &g_esp32c3_timer_ops; /* Pointer to the LH operations */
-  priv->callback   = NULL;                 /* No callback yet */
-  priv->arg        = NULL;                 /* No arg yet */
   priv->resolution = resolution;           /* Configured resolution */
 
   /* Initialize esp32c3_oneshot_s structure */
diff --git a/arch/sim/src/sim/sim_oneshot.c b/arch/sim/src/sim/sim_oneshot.c
index 96e85941699..d9b0133cc2c 100644
--- a/arch/sim/src/sim/sim_oneshot.c
+++ b/arch/sim/src/sim/sim_oneshot.c
@@ -62,9 +62,7 @@ struct sim_oneshot_lowerhalf_s
 
   sq_entry_t link;
   struct timespec alarm;
-
-  oneshot_callback_t callback; /* internal handler that receives callback */
-  void *arg;                   /* Argument that is passed to the handler */
+  int running;
 };
 
 /****************************************************************************
@@ -223,8 +221,6 @@ static void sim_process_tick(sq_entry_t *entry)
 {
   struct sim_oneshot_lowerhalf_s *priv =
     container_of(entry, struct sim_oneshot_lowerhalf_s, link);
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -238,20 +234,10 @@ static void sim_process_tick(sq_entry_t *entry)
 
   sim_reset_alarm(&priv->alarm);
 
-  if (priv->callback)
+  if (priv->running == 1)
     {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
+      priv->running = 0;
+      oneshot_process_callback(&priv->lh);
     }
 }
 
@@ -315,12 +301,10 @@ static int sim_start(struct oneshot_lowerhalf_s *lower,
 
   flags = enter_critical_section();
 
-  clock_ticks2time(&priv->alarm,
-                   host_gettime(false) / NSEC_PER_TICK +
-                   clock_time2ticks(ts));
+  priv->running = 1;
 
-  priv->callback = callback;
-  priv->arg      = arg;
+  sim_timer_current(&current);
+  clock_timespec_add(&current, ts, &priv->alarm);
 
   sim_update_hosttimer();
 
@@ -374,9 +358,6 @@ static int sim_cancel(struct oneshot_lowerhalf_s *lower,
   sim_reset_alarm(&priv->alarm);
   sim_update_hosttimer();
 
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
   leave_critical_section(flags);
 
   return OK;
@@ -474,6 +455,8 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan,
 
   /* Initialize the lower-half driver structure */
 
+  priv->running = 0;
+
   sq_addlast(&priv->link, &g_oneshot_list);
   priv->lh.ops = &g_oneshot_ops;
 
diff --git a/arch/sparc/src/bm3803/bm3803_oneshot_lowerhalf.c 
b/arch/sparc/src/bm3803/bm3803_oneshot_lowerhalf.c
index 5f1bd1f3118..16bbbffe043 100644
--- a/arch/sparc/src/bm3803/bm3803_oneshot_lowerhalf.c
+++ b/arch/sparc/src/bm3803/bm3803_oneshot_lowerhalf.c
@@ -60,8 +60,6 @@ struct bm3803_oneshot_lowerhalf_s
   /* STM32-specific oneshot state */
 
   struct bm3803_oneshot_s oneshot;
-  oneshot_callback_t callback;   /* internal handler that receives callback */
-  void *arg;                     /* Argument that is passed to the handler */
 };
 
 /****************************************************************************
@@ -114,8 +112,6 @@ static void bm3803_oneshot_handler(void *arg)
 {
   struct bm3803_oneshot_lowerhalf_s *priv =
     (struct bm3803_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -123,21 +119,7 @@ static void bm3803_oneshot_handler(void *arg)
    * bm3803_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -213,11 +195,9 @@ static int bm3803_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = bm3803_oneshot_start(&priv->oneshot,
-                                       bm3803_oneshot_handler, priv, ts);
+  flags = enter_critical_section();
+  ret   = bm3803_oneshot_start(&priv->oneshot,
+                               bm3803_oneshot_handler, priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -264,10 +244,8 @@ static int bm3803_cancel(struct oneshot_lowerhalf_s *lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = bm3803_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = bm3803_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
diff --git a/arch/tricore/src/common/tricore_systimer.c 
b/arch/tricore/src/common/tricore_systimer.c
index 70ad40629cf..6405cd8478b 100644
--- a/arch/tricore/src/common/tricore_systimer.c
+++ b/arch/tricore/src/common/tricore_systimer.c
@@ -49,8 +49,6 @@ struct tricore_systimer_lowerhalf_s
   volatile void              *tbase;
   uint64_t                   freq;
   uint64_t                   alarm;
-  oneshot_callback_t         callback;
-  void                       *arg;
   spinlock_t                 lock;
 };
 
@@ -184,9 +182,6 @@ static int tricore_systimer_start(struct 
oneshot_lowerhalf_s *lower,
       priv->alarm = UINT64_MAX;
     }
 
-  priv->callback = callback;
-  priv->arg      = arg;
-
   tricore_systimer_set_timecmp(priv, priv->alarm);
   return 0;
 }
@@ -239,9 +234,7 @@ static int tricore_systimer_cancel(struct 
oneshot_lowerhalf_s *lower,
       ts->tv_nsec = 0;
     }
 
-  priv->alarm    = 0;
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  priv->alarm = 0;
 
   return 0;
 }
@@ -335,10 +328,7 @@ static int tricore_systimer_interrupt(int irq, void 
*context, void *arg)
   struct tricore_systimer_lowerhalf_s *priv = arg;
 
   tricore_systimer_set_timecmp(priv, UINT64_MAX);
-  if (priv->callback != NULL)
-    {
-      priv->callback(&priv->lower, priv->arg);
-    }
+  oneshot_process_callback(&priv->lower);
 
   return 0;
 }
diff --git a/arch/x86_64/src/intel64/intel64_oneshot_lower.c 
b/arch/x86_64/src/intel64/intel64_oneshot_lower.c
index f82aace3e98..126f7c5b6b8 100644
--- a/arch/x86_64/src/intel64/intel64_oneshot_lower.c
+++ b/arch/x86_64/src/intel64/intel64_oneshot_lower.c
@@ -49,8 +49,6 @@ struct intel64_oneshot_lowerhalf_s
 {
   struct oneshot_lowerhalf_s  lh;
   struct intel64_oneshot_s    oneshot;
-  oneshot_callback_t          callback;
-  void                       *arg;
 };
 
 /****************************************************************************
@@ -120,8 +118,6 @@ static spinlock_t g_oneshotlow_spin;
 static void intel64_oneshot_handler(void *arg)
 {
   struct intel64_oneshot_lowerhalf_s *priv = arg;
-  oneshot_callback_t  callback;
-  void               *cbarg;
 
   DEBUGASSERT(priv != NULL);
 
@@ -129,21 +125,7 @@ static void intel64_oneshot_handler(void *arg)
    * intel64_cancel?
    */
 
-  if (priv->callback)
-    {
-      /* Sample and nullify BEFORE executing callback (in case the callback
-       * restarts the oneshot).
-       */
-
-      callback       = priv->callback;
-      cbarg          = priv->arg;
-      priv->callback = NULL;
-      priv->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&priv->lh, cbarg);
-    }
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -220,12 +202,9 @@ static int intel64_start(struct oneshot_lowerhalf_s *lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = spin_lock_irqsave(&g_oneshotlow_spin);
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = intel64_oneshot_start(&priv->oneshot,
-                                         intel64_oneshot_handler,
-                                         priv, ts);
+  flags = spin_lock_irqsave(&g_oneshotlow_spin);
+  ret   = intel64_oneshot_start(&priv->oneshot, intel64_oneshot_handler,
+                                priv, ts);
   spin_unlock_irqrestore(&g_oneshotlow_spin, flags);
 
   if (ret < 0)
@@ -272,10 +251,8 @@ static int intel64_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = spin_lock_irqsave(&g_oneshotlow_spin);
-  ret            = intel64_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = spin_lock_irqsave(&g_oneshotlow_spin);
+  ret   = intel64_oneshot_cancel(&priv->oneshot, ts);
   spin_unlock_irqrestore(&g_oneshotlow_spin, flags);
 
   if (ret < 0)
diff --git a/arch/xtensa/src/common/xtensa_oneshot.c 
b/arch/xtensa/src/common/xtensa_oneshot.c
index 100500349e6..4317070acf9 100644
--- a/arch/xtensa/src/common/xtensa_oneshot.c
+++ b/arch/xtensa/src/common/xtensa_oneshot.c
@@ -47,8 +47,6 @@ struct xoneshot_lowerhalf_s
 {
   struct oneshot_lowerhalf_s lh;       /* Lower half operations */
   uint32_t                   freq;     /* Timer working clock frequency(Hz) */
-  oneshot_callback_t         callback; /* Current user interrupt callback */
-  void                      *arg;      /* Argument passed to upper half 
callback */
   uint32_t                   irq;
 };
 
@@ -105,9 +103,6 @@ static int xtensa_oneshot_start(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = enter_critical_section();
 
-  lower->callback = callback;
-  lower->arg      = arg;
-
   count = sec_to_count((uint64_t)ts->tv_sec, lower->freq) +
           nsec_to_count((uint64_t)ts->tv_nsec, lower->freq);
 
@@ -130,9 +125,6 @@ static int xtensa_oneshot_cancel(struct oneshot_lowerhalf_s 
*lower_,
 
   flags = enter_critical_section();
 
-  lower->callback  = NULL;
-  lower->arg       = NULL;
-
   up_disable_irq(lower->irq);
 
   leave_critical_section(flags);
@@ -157,22 +149,10 @@ static int xtensa_oneshot_maxdelay(struct 
oneshot_lowerhalf_s *lower_,
 static int xtensa_oneshot_interrupt(int irq, void *context, void *arg)
 {
   struct xoneshot_lowerhalf_s *lower = arg;
-  oneshot_callback_t callback;
-  void *cbarg;
 
   DEBUGASSERT(lower != NULL);
 
-  if (lower->callback != NULL)
-    {
-      callback        = lower->callback;
-      cbarg           = lower->arg;
-      lower->callback = NULL;
-      lower->arg      = NULL;
-
-      /* Then perform the callback */
-
-      callback(&lower->lh, cbarg);
-    }
+  oneshot_process_callback(&lower->lh);
 
   return 0;
 }
diff --git a/arch/xtensa/src/esp32/esp32_oneshot_lowerhalf.c 
b/arch/xtensa/src/esp32/esp32_oneshot_lowerhalf.c
index b98f0758323..e9945d0d2e0 100644
--- a/arch/xtensa/src/esp32/esp32_oneshot_lowerhalf.c
+++ b/arch/xtensa/src/esp32/esp32_oneshot_lowerhalf.c
@@ -58,8 +58,6 @@ struct esp32_oneshot_lowerhalf_s
 
   struct oneshot_lowerhalf_s  lh;         /* Lower half instance */
   struct esp32_oneshot_s      oneshot;    /* ESP32-specific oneshot state */
-  oneshot_callback_t          callback;   /* Upper half Interrupt callback */
-  void                        *arg;       /* Argument passed to handler */
   uint16_t                    resolution; /* Timer's resulation in uS */
   spinlock_t                  lock;       /* Device specific lock */
 };
@@ -117,26 +115,12 @@ static void esp32_oneshot_lh_handler(void *arg)
 {
   struct esp32_oneshot_lowerhalf_s *priv =
     (struct esp32_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cb_arg;
 
   DEBUGASSERT(priv != NULL);
-  DEBUGASSERT(priv->callback != NULL);
 
   tmrinfo("Oneshot LH handler triggered\n");
 
-  /* Sample and nullify BEFORE executing callback (in case the callback
-   * restarts the oneshot).
-   */
-
-  callback       = priv->callback;
-  cb_arg         = priv->arg;
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
-  /* Then perform the callback */
-
-  callback(&priv->lh, cb_arg);
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -215,11 +199,9 @@ static int esp32_lh_start(struct oneshot_lowerhalf_s 
*lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = spin_lock_irqsave(&priv->lock);
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = esp32_oneshot_start(&priv->oneshot,
-                                       esp32_oneshot_lh_handler, priv, ts);
+  flags = spin_lock_irqsave(&priv->lock);
+  ret   = esp32_oneshot_start(&priv->oneshot,
+                              esp32_oneshot_lh_handler, priv, ts);
   spin_unlock_irqrestore(&priv->lock, flags);
 
   if (ret < 0)
@@ -266,10 +248,8 @@ static int esp32_lh_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = spin_lock_irqsave(&priv->lock);
-  ret            = esp32_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = spin_lock_irqsave(&priv->lock);
+  ret   = esp32_oneshot_cancel(&priv->oneshot, ts);
   spin_unlock_irqrestore(&priv->lock, flags);
 
   if (ret < 0)
@@ -356,8 +336,6 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan,
     }
 
   priv->lh.ops     = &g_esp32_timer_ops; /* Pointer to the LH operations */
-  priv->callback   = NULL;               /* No callback yet */
-  priv->arg        = NULL;               /* No arg yet */
   priv->resolution = resolution;         /* Configured resolution */
 
   /* Initialize esp32_oneshot_s structure */
diff --git a/arch/xtensa/src/esp32s2/esp32s2_oneshot_lowerhalf.c 
b/arch/xtensa/src/esp32s2/esp32s2_oneshot_lowerhalf.c
index 0c1fe3929cf..26083bbc62e 100644
--- a/arch/xtensa/src/esp32s2/esp32s2_oneshot_lowerhalf.c
+++ b/arch/xtensa/src/esp32s2/esp32s2_oneshot_lowerhalf.c
@@ -56,8 +56,6 @@ struct esp32s2_oneshot_lowerhalf_s
 
   struct oneshot_lowerhalf_s        lh;   /* Lower half instance */
   struct esp32s2_oneshot_s     oneshot;   /* ESP32-S2-specific oneshot state */
-  oneshot_callback_t          callback;   /* Upper half Interrupt callback */
-  void                            *arg;   /* Argument passed to handler */
   uint16_t                  resolution;
 };
 
@@ -114,11 +112,8 @@ static void esp32s2_oneshot_lh_handler(void *arg)
 {
   struct esp32s2_oneshot_lowerhalf_s *priv =
     (struct esp32s2_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cb_arg;
 
   DEBUGASSERT(priv != NULL);
-  DEBUGASSERT(priv->callback != NULL);
 
   tmrinfo("Oneshot LH handler triggered\n");
 
@@ -126,14 +121,7 @@ static void esp32s2_oneshot_lh_handler(void *arg)
    * restarts the oneshot).
    */
 
-  callback       = priv->callback;
-  cb_arg         = priv->arg;
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
-  /* Then perform the callback */
-
-  callback(&priv->lh, cb_arg);
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -213,13 +201,9 @@ static int oneshot_lh_start(struct oneshot_lowerhalf_s 
*lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = enter_critical_section();
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = esp32s2_oneshot_start(&priv->oneshot,
-                                         esp32s2_oneshot_lh_handler,
-                                         priv,
-                                         ts);
+  flags = enter_critical_section();
+  ret   = esp32s2_oneshot_start(&priv->oneshot, esp32s2_oneshot_lh_handler,
+                                priv, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -266,10 +250,8 @@ static int oneshot_lh_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = enter_critical_section();
-  ret            = esp32s2_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = enter_critical_section();
+  ret   = esp32s2_oneshot_cancel(&priv->oneshot, ts);
   leave_critical_section(flags);
 
   if (ret < 0)
@@ -356,8 +338,6 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan,
     }
 
   priv->lh.ops     = &g_esp32s2_timer_ops; /* Pointer to the LH operations */
-  priv->callback   = NULL;                 /* No callback yet */
-  priv->arg        = NULL;                 /* No arg yet */
   priv->resolution = resolution;           /* Configured resolution */
 
   /* Initialize esp32s2_oneshot_s structure */
diff --git a/arch/xtensa/src/esp32s3/esp32s3_oneshot_lowerhalf.c 
b/arch/xtensa/src/esp32s3/esp32s3_oneshot_lowerhalf.c
index af621f26f37..65e9992c6b8 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_oneshot_lowerhalf.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_oneshot_lowerhalf.c
@@ -57,8 +57,6 @@ struct esp32s3_oneshot_lowerhalf_s
 
   struct oneshot_lowerhalf_s lh;    /* Lower-half instance */
   struct esp32s3_oneshot_s oneshot; /* ESP32-S3-specific oneshot state */
-  oneshot_callback_t callback;      /* Upper-half Interrupt callback */
-  void *arg;                        /* Argument passed to handler */
   uint16_t resolution;              /* Timer's resolution in microseconds */
   spinlock_t lock;                  /* Device-specific lock */
 };
@@ -116,11 +114,8 @@ static void oneshot_lh_handler(void *arg)
 {
   struct esp32s3_oneshot_lowerhalf_s *priv =
     (struct esp32s3_oneshot_lowerhalf_s *)arg;
-  oneshot_callback_t callback;
-  void *cb_arg;
 
   DEBUGASSERT(priv != NULL);
-  DEBUGASSERT(priv->callback != NULL);
 
   tmrinfo("Oneshot LH handler triggered\n");
 
@@ -128,14 +123,7 @@ static void oneshot_lh_handler(void *arg)
    * restarts the oneshot).
    */
 
-  callback       = priv->callback;
-  cb_arg         = priv->arg;
-  priv->callback = NULL;
-  priv->arg      = NULL;
-
-  /* Then perform the callback */
-
-  callback(&priv->lh, cb_arg);
+  oneshot_process_callback(&priv->lh);
 }
 
 /****************************************************************************
@@ -212,11 +200,9 @@ static int oneshot_lh_start(struct oneshot_lowerhalf_s 
*lower,
 
   /* Save the callback information and start the timer */
 
-  flags          = spin_lock_irqsave(&priv->lock);
-  priv->callback = callback;
-  priv->arg      = arg;
-  ret            = esp32s3_oneshot_start(&priv->oneshot, oneshot_lh_handler,
-                                         priv, ts);
+  flags = spin_lock_irqsave(&priv->lock);
+  ret   = esp32s3_oneshot_start(&priv->oneshot, oneshot_lh_handler,
+                                priv, ts);
   spin_unlock_irqrestore(&priv->lock, flags);
 
   if (ret < 0)
@@ -263,10 +249,8 @@ static int oneshot_lh_cancel(struct oneshot_lowerhalf_s 
*lower,
 
   /* Cancel the timer */
 
-  flags          = spin_lock_irqsave(&priv->lock);
-  ret            = esp32s3_oneshot_cancel(&priv->oneshot, ts);
-  priv->callback = NULL;
-  priv->arg      = NULL;
+  flags = spin_lock_irqsave(&priv->lock);
+  ret   = esp32s3_oneshot_cancel(&priv->oneshot, ts);
   spin_unlock_irqrestore(&priv->lock, flags);
 
   if (ret < 0)
@@ -352,8 +336,6 @@ struct oneshot_lowerhalf_s *oneshot_initialize(int chan, 
uint16_t resolution)
     }
 
   priv->lh.ops     = &g_esp32s3_timer_ops; /* Pointer to the LH operations */
-  priv->callback   = NULL;                 /* No callback yet */
-  priv->arg        = NULL;                 /* No arg yet */
   priv->resolution = resolution;           /* Configured resolution */
 
   /* Initialize esp32s3_oneshot_s structure */
diff --git a/drivers/audio/tone.c b/drivers/audio/tone.c
index 5465258d75f..dd4730d688d 100644
--- a/drivers/audio/tone.c
+++ b/drivers/audio/tone.c
@@ -958,6 +958,9 @@ int tone_register(FAR const char *path, FAR struct 
pwm_lowerhalf_s *tone,
   upper->channel = (uint8_t)channel;
 #endif
 
+  upper->oneshot->callback = oneshot_callback;
+  upper->oneshot->arg = upper;
+
   /* Register the PWM device */
 
   audinfo("Registering %s\n", path);
diff --git a/drivers/timers/arch_alarm.c b/drivers/timers/arch_alarm.c
index fe37816c4f4..6a345ed2fd5 100644
--- a/drivers/timers/arch_alarm.c
+++ b/drivers/timers/arch_alarm.c
@@ -90,6 +90,9 @@ void up_alarm_set_lowerhalf(FAR struct oneshot_lowerhalf_s 
*lower)
 
   g_oneshot_lower = lower;
 
+  lower->callback = oneshot_callback;
+  lower->arg      = lower;
+
 #ifdef CONFIG_SCHED_TICKLESS
   ONESHOT_TICK_MAX_DELAY(g_oneshot_lower, &ticks);
   g_oneshot_maxticks = ticks < UINT32_MAX ? ticks : UINT32_MAX;
diff --git a/drivers/timers/goldfish_timer.c b/drivers/timers/goldfish_timer.c
index 05b2a8575e7..afd680c8fc5 100644
--- a/drivers/timers/goldfish_timer.c
+++ b/drivers/timers/goldfish_timer.c
@@ -64,8 +64,6 @@
 struct goldfish_timer_lowerhalf_s
 {
   struct oneshot_lowerhalf_s lh;        /* Lower half operations */
-  oneshot_callback_t         callback;  /* Current user interrupt callback */
-  FAR void                   *arg;      /* Argument passed to upper half 
callback */
   uintptr_t                  base;      /* Base address of registers */
   spinlock_t                 lock;      /* Lock for interrupt handling */
 };
@@ -126,9 +124,6 @@ static int goldfish_timer_start(FAR struct 
oneshot_lowerhalf_s *lower_,
 
   flags = spin_lock_irqsave(&lower->lock);
 
-  lower->callback = callback;
-  lower->arg      = arg;
-
   nsec  = ts->tv_sec * 1000000000 + ts->tv_nsec;
   l32   = getreg32(lower->base + GOLDFISH_TIMER_TIME_LOW);
   h32   = getreg32(lower->base + GOLDFISH_TIMER_TIME_HIGH);
@@ -154,9 +149,6 @@ static int goldfish_timer_cancel(FAR struct 
oneshot_lowerhalf_s *lower_,
 
   flags = spin_lock_irqsave(&lower->lock);
 
-  lower->callback  = NULL;
-  lower->arg       = NULL;
-
   putreg32(0, lower->base + GOLDFISH_TIMER_IRQ_ENABLED);
   putreg32(1, lower->base + GOLDFISH_TIMER_CLEAR_ALARM);
 
@@ -196,9 +188,7 @@ static int goldfish_timer_interrupt(int irq,
                                     FAR void *arg)
 {
   FAR struct goldfish_timer_lowerhalf_s *lower = arg;
-  oneshot_callback_t callback = NULL;
   irqstate_t flags;
-  void *cbarg;
 
   DEBUGASSERT(lower != NULL);
 
@@ -207,22 +197,11 @@ static int goldfish_timer_interrupt(int irq,
   putreg32(1, lower->base + GOLDFISH_TIMER_CLEAR_ALARM);
   putreg32(1, lower->base + GOLDFISH_TIMER_CLEAR_INTERRUPT);
 
-  if (lower->callback != NULL)
-    {
-      callback        = lower->callback;
-      cbarg           = lower->arg;
-      lower->callback = NULL;
-      lower->arg      = NULL;
-    }
-
   spin_unlock_irqrestore(&lower->lock, flags);
 
   /* Then perform the callback */
 
-  if (callback)
-    {
-      callback(&lower->lh, cbarg);
-    }
+  oneshot_process_callback(&lower->lh);
 
   return 0;
 }
diff --git a/drivers/timers/oneshot.c b/drivers/timers/oneshot.c
index 605baccf9f6..9b78a8573bd 100644
--- a/drivers/timers/oneshot.c
+++ b/drivers/timers/oneshot.c
@@ -311,6 +311,10 @@ int oneshot_register(FAR const char *devname,
   /* Initialize the new oneshot timer driver instance */
 
   priv->od_lower = lower;
+
+  lower->callback = oneshot_callback;
+  lower->arg      = lower;
+
   nxmutex_init(&priv->od_lock);
 
   /* And register the oneshot timer driver */
diff --git a/drivers/timers/watchdog.c b/drivers/timers/watchdog.c
index 0f964805e68..9e87eaba366 100644
--- a/drivers/timers/watchdog.c
+++ b/drivers/timers/watchdog.c
@@ -848,6 +848,8 @@ FAR void *watchdog_register(FAR const char *path,
     }
 
 #if defined(CONFIG_WATCHDOG_AUTOMONITOR_BY_ONESHOT)
+  upper->oneshot->callback = watchdog_automonitor_oneshot;
+  upper->oneshot->arg      = upper;
   watchdog_automonitor_start(upper, oneshot);
 #elif defined(CONFIG_WATCHDOG_AUTOMONITOR_BY_TIMER)
   watchdog_automonitor_start(upper, timer);
diff --git a/include/nuttx/timers/oneshot.h b/include/nuttx/timers/oneshot.h
index a9d09d8ed16..e713a13f0e2 100644
--- a/include/nuttx/timers/oneshot.h
+++ b/include/nuttx/timers/oneshot.h
@@ -231,6 +231,9 @@ struct oneshot_lowerhalf_s
 
   FAR const struct oneshot_operations_s *ops;
 
+  FAR oneshot_callback_t callback;
+  FAR void *arg;
+
   /* Private lower half data may follow */
 };
 
@@ -400,6 +403,15 @@ int oneshot_tick_current(FAR struct oneshot_lowerhalf_s 
*lower,
   return ret;
 }
 
+static inline_function
+void oneshot_process_callback(FAR struct oneshot_lowerhalf_s *lower)
+{
+  if (lower->callback)
+    {
+      lower->callback(lower, lower->arg);
+    }
+}
+
 /****************************************************************************
  * Name: oneshot_initialize
  *
diff --git a/sched/sched/sched_cpuload_oneshot.c 
b/sched/sched/sched_cpuload_oneshot.c
index cb87fa97a8e..78bafd8ea3c 100644
--- a/sched/sched/sched_cpuload_oneshot.c
+++ b/sched/sched/sched_cpuload_oneshot.c
@@ -328,6 +328,8 @@ void nxsched_oneshot_extclk(FAR struct oneshot_lowerhalf_s 
*lower)
   /* Then start the oneshot */
 
   g_sched_oneshot.oneshot = lower;
+  lower->callback = nxsched_oneshot_callback;
+  lower->arg      = NULL;
   nxsched_oneshot_start();
 }
 #endif

Reply via email to