diff options
author | Arvid Bjorkengren <arvid@gaisler.com> | 2012-09-25 15:31:31 +0200 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2012-10-08 10:46:05 +0200 |
commit | 066d9b95b3636802e3ed034576028da089d3d3eb (patch) | |
tree | 3fe607aafc53cb8675b86e268485be8b6f27f507 | |
parent | 3bf4890e72f846c93dd3b3073edfcd0e0b268b0e (diff) |
AMBAPP_BUS_RMAP: Check mask when handling interrupts.
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_rmap.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_rmap.c b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_rmap.c index 0e5919cb61..a5c6afb834 100644 --- a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_rmap.c +++ b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_rmap.c @@ -76,6 +76,7 @@ struct ambapp_rmap_priv { int irq_support; genirq_t genirq; struct irqmp_regs *irq; + unsigned int mask; /* Access routines */ struct drvmgr_func funcs[INHERIT_LENGTH+3]; @@ -366,8 +367,7 @@ void ambapp_rmap_isr (void *arg) struct ambapp_rmap_priv *priv = arg; unsigned int status, tmp; int irq; - tmp = status = READ_REG(priv, &priv->irq->ipend); - + tmp = status = READ_REG(priv, &priv->irq->ipend) & priv->mask; /* DBG("AMBAPP-RMAP-ISR: IRQ 0x%x\n",status); */ /* Clear handled IRQs at remote IRQ controller, These IRQs are not @@ -452,8 +452,9 @@ int ambapp_rmap_int_register( /* Enable IRQ for first enabled handler only */ /* unmask interrupt source */ - tmp = READ_REG(priv, &priv->irq->mask[0]); - WRITE_REG(priv, &priv->irq->mask[0], tmp | (1<<irq)); + priv->mask = READ_REG(priv, &priv->irq->mask[0]); + priv->mask |= (1<<irq); + WRITE_REG(priv, &priv->irq->mask[0], priv->mask); } else if ( status == 1 ) status = DRVMGR_OK; @@ -480,8 +481,9 @@ int ambapp_rmap_int_unregister( /* Disable IRQ only when no enabled handler exists */ /* mask interrupt source */ - tmp = READ_REG(priv, &priv->irq->mask[0]); - WRITE_REG(priv, &priv->irq->mask[0], tmp & ~(1<<irq)); + priv->mask = READ_REG(priv, &priv->irq->mask[0]); + priv->mask &= ~(1<<irq); + WRITE_REG(priv, &priv->irq->mask[0], priv->mask); } status = genirq_unregister(priv->genirq, irq, isr, arg); @@ -494,7 +496,6 @@ int ambapp_rmap_int_unregister( int ambapp_rmap_int_unmask(struct drvmgr_dev *dev, int irq) { struct ambapp_rmap_priv *priv = dev->parent->dev->priv; - unsigned int tmp; DBG("AMBAPP-RMAP-INT_UNMASK: %d\n", irq); @@ -505,8 +506,9 @@ int ambapp_rmap_int_unmask(struct drvmgr_dev *dev, int irq) return DRVMGR_FAIL; /* unmask interrupt source */ - tmp = READ_REG(priv, &priv->irq->mask[0]); - WRITE_REG(priv, &priv->irq->mask[0], tmp | (1<<irq)); + priv->mask = READ_REG(priv, &priv->irq->mask[0]); + priv->mask |= (1<<irq); + WRITE_REG(priv, &priv->irq->mask[0], priv->mask); return DRVMGR_OK; } @@ -514,7 +516,6 @@ int ambapp_rmap_int_unmask(struct drvmgr_dev *dev, int irq) int ambapp_rmap_int_mask(struct drvmgr_dev *dev, int irq) { struct ambapp_rmap_priv *priv = dev->parent->dev->priv; - unsigned int tmp; DBG("AMBAPP-RMAP-INT_MASK: %d\n", irq); @@ -525,8 +526,9 @@ int ambapp_rmap_int_mask(struct drvmgr_dev *dev, int irq) return DRVMGR_FAIL; /* mask interrupt source */ - tmp = READ_REG(priv, &priv->irq->mask[0]); - WRITE_REG(priv, &priv->irq->mask[0], tmp & ~(1<<irq)); + priv->mask = READ_REG(priv, &priv->irq->mask[0]); + priv->mask &= (1<<irq); + WRITE_REG(priv, &priv->irq->mask[0], priv->mask); return DRVMGR_OK; } |