summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/timer
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2012-11-19 15:24:21 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2015-04-17 01:10:18 +0200
commit7ebc28cd1ae6648cb02c7db6c62e53d9a0110f14 (patch)
treeb3406d398e54e6aea347d6e857eb9341fcd4268e /c/src/lib/libbsp/sparc/shared/timer
parentleon,gpiolib: add mask/unmask interrupt support (diff)
downloadrtems-7ebc28cd1ae6648cb02c7db6c62e53d9a0110f14.tar.bz2
GPTIMER: Only probe pending bit on timer0
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/timer')
-rw-r--r--c/src/lib/libbsp/sparc/shared/timer/gptimer.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
index d093ca1bb2..2314a3b236 100644
--- a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
+++ b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
@@ -177,6 +177,7 @@ int gptimer_init1(struct drvmgr_dev *dev)
int i, size;
struct gptimer_timer *timer;
union drvmgr_key_value *value;
+ unsigned char irq_ack_mask;
#if defined(LEON3) && defined(RTEMS_DRVMGR_STARTUP)
char timer_index[7];
#endif
@@ -267,6 +268,16 @@ int gptimer_init1(struct drvmgr_dev *dev)
/* Get Frequency that the timers are operating in (after prescaler) */
priv->base_freq = priv->base_clk / (priv->regs->scaler_reload + 1);
+ /* Stop Timer and probe Pending bit. In newer hardware the
+ * timer has pending bit is cleared by writing a one to it,
+ * whereas older versions it is cleared with a zero.
+ */
+ priv->regs->timer[0].ctrl = GPTIMER_CTRL_IP;
+ if ((priv->regs->timer[0].ctrl & GPTIMER_CTRL_IP) != 0)
+ irq_ack_mask = ~GPTIMER_CTRL_IP;
+ else
+ irq_ack_mask = ~0;
+
priv->timer_cnt = timer_cnt;
for (i=0; i<timer_cnt; i++) {
timer = &priv->timers[i];
@@ -274,16 +285,7 @@ int gptimer_init1(struct drvmgr_dev *dev)
timer->tindex = i + timer_start;
timer->tregs = &regs->timer[(int)timer->tindex];
timer->tdev.drv = &gptimer_tlib_drv;
-
- /* Stop Timer and probe Pending bit. In newer hardware the
- * timer has pending bit is cleared by writing a one to it,
- * whereas older versions it is cleared with a zero.
- */
- timer->tregs->ctrl = GPTIMER_CTRL_IP;
- if ((timer->tregs->ctrl & GPTIMER_CTRL_IP) != 0)
- timer->irq_ack_mask = ~GPTIMER_CTRL_IP;
- else
- timer->irq_ack_mask = ~0;
+ timer->irq_ack_mask = irq_ack_mask;
/* Register Timer at Timer Library */
#if defined(LEON3) && defined(RTEMS_DRVMGR_STARTUP)