bcma: mips: show also disabled IRQs
authorHauke Mehrtens <hauke@hauke-m.de>
Thu, 3 Jan 2013 23:51:23 +0000 (00:51 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 7 Jan 2013 20:18:28 +0000 (15:18 -0500)
Some cores do not have a IRQ assigned and some do not support when an
IRQ is assigned to them, this is now handled and printed out in the
code.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/driver_mips.c

index 486aa2d..6981507 100644 (file)
@@ -74,11 +74,16 @@ static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
                return dev->core_index;
        flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30);
 
-       return flag & 0x1F;
+       if (flag)
+               return flag & 0x1F;
+       else
+               return 0x3f;
 }
 
 /* Get the MIPS IRQ assignment for a specified device.
  * If unassigned, 0 is returned.
+ * If disabled, 5 is returned.
+ * If not supported, 6 is returned.
  */
 unsigned int bcma_core_mips_irq(struct bcma_device *dev)
 {
@@ -87,13 +92,15 @@ unsigned int bcma_core_mips_irq(struct bcma_device *dev)
        unsigned int irq;
 
        irqflag = bcma_core_mips_irqflag(dev);
+       if (irqflag == 0x3f)
+               return 6;
 
-       for (irq = 1; irq <= 4; irq++)
+       for (irq = 0; irq <= 4; irq++)
                if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) &
                    (1 << irqflag))
                        return irq;
 
-       return 0;
+       return 5;
 }
 EXPORT_SYMBOL(bcma_core_mips_irq);
 
@@ -114,7 +121,7 @@ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
                bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
                            bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) &
                            ~(1 << irqflag));
-       else
+       else if (oldirq != 5)
                bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0);
 
        /* assign the new one */
@@ -144,7 +151,7 @@ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
        }
 
        bcma_debug(bus, "set_irq: core 0x%04x, irq %d => %d\n",
-                  dev->id.id, oldirq + 2, irq + 2);
+                  dev->id.id, oldirq <= 4 ? oldirq + 2 : 0, irq + 2);
 }
 
 static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq,