diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2015-02-18 15:34:39 +0100 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-04-17 01:10:22 +0200 |
commit | e3c993741840aaff509485556635430afeacc265 (patch) | |
tree | 4be038c568611cce07ca30718469b8038ea72ade /c/src/lib/libbsp/sparc | |
parent | GPTIMER: fix build warnings (diff) | |
download | rtems-e3c993741840aaff509485556635430afeacc265.tar.bz2 |
GPTIMER: move ISR install from init1
To avoid install ISRs during init level 1 the ISR install is moved
to the opening/initialization of the timer.
Diffstat (limited to 'c/src/lib/libbsp/sparc')
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/timer/gptimer.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c index b8c08e59b1..f8dec2be1c 100644 --- a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c +++ b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c @@ -94,7 +94,8 @@ struct gptimer_priv { struct gptimer_regs *regs; unsigned int base_clk; unsigned int base_freq; - int separate_interrupt; + char separate_interrupt; + char isr_installed; /* Structure per Timer unit, the core supports up to 8 timers */ int timer_cnt; @@ -303,16 +304,6 @@ int gptimer_init1(struct drvmgr_dev *dev) */ priv->separate_interrupt = regs->cfg & GPTIMER_CFG_SI; - if ( priv->separate_interrupt == 0 ) { - /* Shared IRQ handler */ - drvmgr_interrupt_register( - priv->dev, - 0, - "gptimer_shared", - gptimer_isr, - priv); - } - /* Older HW */ @@ -461,6 +452,17 @@ static void gptimer_tlib_irq_reg(struct tlib_dev *hand, tlib_isr_t func, void *d if ( priv->separate_interrupt ) { drvmgr_interrupt_register(priv->dev, timer->tindex, "gptimer", func, data); + } else { + if (priv->isr_installed == 0) { + /* Shared IRQ handler */ + drvmgr_interrupt_register( + priv->dev, + 0, + "gptimer_shared", + gptimer_isr, + priv); + } + priv->isr_installed++; } timer->tregs->ctrl |= GPTIMER_CTRL_IE; @@ -479,6 +481,11 @@ static void gptimer_tlib_irq_unreg(struct tlib_dev *hand, tlib_isr_t func, void func, data); } else { timer->tdev.isr_func = NULL; + priv->isr_installed--; + if (priv->isr_installed == 0) { + drvmgr_interrupt_unregister(priv->dev, 0, + gptimer_isr, priv); + } } } |