summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2015-02-18 15:34:39 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2015-04-17 01:10:22 +0200
commite3c993741840aaff509485556635430afeacc265 (patch)
tree4be038c568611cce07ca30718469b8038ea72ade /c
parentGPTIMER: fix build warnings (diff)
downloadrtems-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')
-rw-r--r--c/src/lib/libbsp/sparc/shared/timer/gptimer.c29
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);
+ }
}
}