Below is a suggested update for gptimer_tlib_reset().

OK otherwise.


On 2023-07-05 13:18, Sebastian Huber wrote:
---
  bsps/shared/grlib/btimer/gptimer.c   | 177 +++++++++++++--------------
  bsps/sparc/leon3/btimer/btimer.c     |  13 +-
  bsps/sparc/leon3/btimer/watchdog.c   |  27 ++--
  bsps/sparc/leon3/clock/ckinit.c      |  33 ++---
  bsps/sparc/leon3/include/bsp/leon3.h |  44 ++++++-
  bsps/sparc/leon3/include/leon.h      |  24 ----
  bsps/sparc/leon3/start/amba.c        |   9 +-
  bsps/sparc/leon3/start/bspdelay.c    |   8 +-
  bsps/sparc/leon3/start/cpucounter.c  |  20 +--
  9 files changed, 188 insertions(+), 167 deletions(-)

diff --git a/bsps/shared/grlib/btimer/gptimer.c 
b/bsps/shared/grlib/btimer/gptimer.c
index f31b7c052f..ca87780d2c 100644
--- a/bsps/shared/grlib/btimer/gptimer.c
+++ b/bsps/shared/grlib/btimer/gptimer.c

  /* GPTIMER timer private */
-struct gptimer_timer {
+struct gptimer_timer_priv {
        struct tlib_dev tdev;   /* Must be first in struct */
-       struct gptimer_timer_regs *tregs;
+       gptimer_timer *tregs;
        char index; /* Timer Index in this driver */
        char tindex; /* Timer Index In Hardware */
-       unsigned char irq_ack_mask;
+       uint32_t irq_ack_mask;
  };

OK, irq_ack_mask is now wider.



@@ -406,12 +379,14 @@ void gptimer_isr(void *data)
static void gptimer_tlib_reset(struct tlib_dev *hand)
  {
-       struct gptimer_timer *timer = (struct gptimer_timer *)hand;
-
-       timer->tregs->ctrl = (timer->tregs->ctrl & timer->irq_ack_mask) &
-                            GPTIMER_CTRL_IP;
-       timer->tregs->reload = 0xffffffff;
-       timer->tregs->ctrl = GPTIMER_CTRL_LD;
+       struct gptimer_timer_priv *timer = (struct gptimer_timer_priv *)hand;
+       uint32_t tctrl;
+
+       tctrl = grlib_load_32(&timer->tregs->tctrl);
+       tctrl &= timer->irq_ack_mask | GPTIMER_TCTRL_IP;
+       grlib_store_32(&timer->tregs->tctrl, tctrl);
+       grlib_store_32(&timer->tregs->trldval, 0xffffffff);
+       grlib_store_32(&timer->tregs->tctrl, GPTIMER_TCTRL_LD);
  }

This transformation of the trctrl calculation does not look quite right. I think the final tctrl assignment should be like this instead:
    tctrl &= timer->irq_ack_mask & GPTIMER_TCTRL_IP;
The desired side effect is to stop the subtimer, disable its interrupt generation and unpend a possibly pending interrupt indication.


--
Best regards,

Martin Åberg
Software Engineer
Frontgrade Gaisler
martin.ab...@gaisler.com

Frontgrade Gaisler AB, Kungsgatan 12, SE-411 19 GÖTEBORG, Sweden.
+46 (0) 31 775 8650, www.gaisler.com
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to