diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2012-11-19 15:24:21 +0100 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-04-17 01:10:18 +0200 |
commit | 7ebc28cd1ae6648cb02c7db6c62e53d9a0110f14 (patch) | |
tree | b3406d398e54e6aea347d6e857eb9341fcd4268e /c/src/lib/libbsp/sparc/shared | |
parent | leon,gpiolib: add mask/unmask interrupt support (diff) | |
download | rtems-7ebc28cd1ae6648cb02c7db6c62e53d9a0110f14.tar.bz2 |
GPTIMER: Only probe pending bit on timer0
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared')
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/timer/gptimer.c | 22 |
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 = ®s->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) |