To avoid install ISRs during init level 1 the ISR install is moved
to the opening/initialization of the timer.
---
 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 b8c08e5..f8dec2b 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);
+               }
        }
 }
 
-- 
1.7.0.4

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to