Changes since v3: Fixed two references to bcma_core_mips_irq in 
driver_pci_host.c

Signed-off-by: Nathan Hintz <nlhi...@hotmail.com>

--- /dev/null   2012-04-07 22:03:23.120698218 -0700
+++ target/linux/brcm47xx/patches-3.2/235-bcma-dont-expose-mips-irq.patch       
2012-04-09 20:18:16.988877496 -0700
@@ -0,0 +1,95 @@
+--- a/include/linux/bcma/bcma.h
++++ b/include/linux/bcma/bcma.h
+@@ -295,6 +295,7 @@ extern struct bcma_device *bcma_find_cor
+ extern bool bcma_core_is_enabled(struct bcma_device *core);
+ extern void bcma_core_disable(struct bcma_device *core, u32 flags);
+ extern int bcma_core_enable(struct bcma_device *core, u32 flags);
++extern unsigned int bcma_core_irq(struct bcma_device *core);
+ extern void bcma_core_set_clockmode(struct bcma_device *core,
+                                   enum bcma_clkmode clkmode);
+ extern void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status,
+--- a/include/linux/bcma/bcma_driver_mips.h
++++ b/include/linux/bcma/bcma_driver_mips.h
+@@ -46,6 +46,4 @@ static inline void bcma_core_mips_init(s
+ 
+ extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore);
+ 
+-extern unsigned int bcma_core_mips_irq(struct bcma_device *dev);
+-
+ #endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
+--- a/arch/mips/bcm47xx/gpio.c
++++ b/arch/mips/bcm47xx/gpio.c
+@@ -94,7 +94,7 @@ int gpio_to_irq(unsigned gpio)
+ #endif
+ #ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+-              return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2;
++              return bcma_core_irq(bcm47xx_bus.bcma.bus.drv_cc.core);
+ #endif
+       }
+       return -EINVAL;
+--- a/arch/mips/bcm47xx/serial.c
++++ b/arch/mips/bcm47xx/serial.c
+@@ -62,7 +62,7 @@ static int __init uart8250_init_bcma(voi
+ 
+               p->mapbase = (unsigned int) bcma_port->regs;
+               p->membase = (void *) bcma_port->regs;
+-              p->irq = bcma_port->irq + 2;
++              p->irq = bcma_port->irq;
+               p->uartclk = bcma_port->baud_base;
+               p->regshift = bcma_port->reg_shift;
+               p->iotype = UPIO_MEM;
+--- a/drivers/bcma/driver_chipcommon.c
++++ b/drivers/bcma/driver_chipcommon.c
+@@ -147,7 +147,7 @@ void bcma_chipco_serial_init(struct bcma
+               return;
+       }
+ 
+-      irq = bcma_core_mips_irq(cc->core);
++      irq = bcma_core_irq(cc->core);
+ 
+       /* Determine the registers of the UARTs */
+       cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART);
+--- a/drivers/bcma/driver_mips.c
++++ b/drivers/bcma/driver_mips.c
+@@ -81,7 +81,7 @@ static u32 bcma_core_mips_irqflag(struct
+ /* Get the MIPS IRQ assignment for a specified device.
+  * If unassigned, 0 is returned.
+  */
+-unsigned int bcma_core_mips_irq(struct bcma_device *dev)
++static unsigned int bcma_core_mips_irq(struct bcma_device *dev)
+ {
+       struct bcma_device *mdev = dev->bus->drv_mips.core;
+       u32 irqflag;
+@@ -96,7 +96,11 @@ unsigned int bcma_core_mips_irq(struct b
+ 
+       return 0;
+ }
+-EXPORT_SYMBOL(bcma_core_mips_irq);
++
++unsigned int bcma_core_irq(struct bcma_device *dev) {
++      return bcma_core_mips_irq(dev) + 2;
++}
++EXPORT_SYMBOL(bcma_core_irq);
+ 
+ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
+ {
+--- a/drivers/bcma/driver_pci_host.c
++++ b/drivers/bcma/driver_pci_host.c
+@@ -565,7 +565,7 @@
+       pr_info("PCI: Fixing up device %s\n", pci_name(dev));
+ 
+       /* Fix up interrupt lines */
+-      dev->irq = bcma_core_mips_irq(pc_host->pdev->core) + 2;
++      dev->irq = bcma_core_irq(pc_host->pdev->core);
+       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+ 
+       return 0;
+@@ -584,6 +584,6 @@
+ 
+       pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
+                              pci_ops);
+-      return bcma_core_mips_irq(pc_host->pdev->core) + 2;
++      return bcma_core_irq(pc_host->pdev->core);
+ }
+ EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);
--- /dev/null   2012-03-21 21:16:41.055325718 -0700
+++ target/linux/brcm47xx/patches-3.2/237-bcma-fix-irq-assignment.patch 
2012-03-29 21:05:49.189660716 -0700
@@ -0,0 +1,173 @@
+--- a/include/linux/bcma/bcma_driver_mips.h
++++ b/include/linux/bcma/bcma_driver_mips.h
+@@ -28,6 +28,7 @@
+ #define BCMA_MIPS_MIPS74K_GPIOEN      0x0048
+ #define BCMA_MIPS_MIPS74K_CLKCTLST    0x01E0
+ 
++#define BCMA_MIPS_OOBSELINA74         0x004
+ #define BCMA_MIPS_OOBSELOUTA30                0x100
+ 
+ struct bcma_device;
+--- a/drivers/bcma/driver_mips.c
++++ b/drivers/bcma/driver_mips.c
+@@ -65,6 +65,10 @@ static const u32 ipsflag_irq_shift[] = {
+       BCMA_MIPS_IPSFLAG_IRQ4_SHIFT,
+ };
+ 
++#define IRQ_FLAG_MASK         0x1F
++#define INVALID_IRQ_FLAG      0x3F
++#define IRQ_NOT_ASSIGNED      5
++#define IRQ_NOT_REQUIRED      6
+ static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
+ {
+       u32 flag;
+@@ -75,11 +79,11 @@ static u32 bcma_core_mips_irqflag(struct
+               return dev->core_index;
+       flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30);
+ 
+-      return flag & 0x1F;
++      return ((flag && ((flag & IRQ_FLAG_MASK) <= 7)) ? (flag & 
IRQ_FLAG_MASK) : INVALID_IRQ_FLAG);
+ }
+ 
+ /* Get the MIPS IRQ assignment for a specified device.
+- * If unassigned, 0 is returned.
++ * If unassigned, 5 is returned; if no IRQ is required, 6 is returned
+  */
+ static unsigned int bcma_core_mips_irq(struct bcma_device *dev)
+ {
+@@ -88,21 +92,24 @@ static unsigned int bcma_core_mips_irq(s
+       unsigned int irq;
+ 
+       irqflag = bcma_core_mips_irqflag(dev);
++      if (irqflag == INVALID_IRQ_FLAG)
++              return IRQ_NOT_REQUIRED;
+ 
+-      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 IRQ_NOT_ASSIGNED;
+ }
+ 
+ unsigned int bcma_core_irq(struct bcma_device *dev) {
+-      return bcma_core_mips_irq(dev) + 2;
++      unsigned int irq = bcma_core_mips_irq(dev);
++      return ((irq > 4) ? 0 : (irq + 2));
+ }
+ EXPORT_SYMBOL(bcma_core_irq);
+ 
+-static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
++static bool bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
+ {
+       unsigned int oldirq = bcma_core_mips_irq(dev);
+       struct bcma_bus *bus = dev->bus;
+@@ -110,7 +117,8 @@ static void bcma_core_mips_set_irq(struc
+       u32 irqflag;
+ 
+       irqflag = bcma_core_mips_irqflag(dev);
+-      BUG_ON(oldirq == 6);
++      if (irqflag == INVALID_IRQ_FLAG)
++              return false;
+ 
+       dev->irq = irq + 2;
+ 
+@@ -119,8 +127,8 @@ static void bcma_core_mips_set_irq(struc
+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
+                           bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) &
+                           ~(1 << irqflag));
+-      else
+-              bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0);
++      else if (oldirq <= 4)
++              bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0);
+ 
+       /* assign the new one */
+       if (irq == 0) {
+@@ -149,7 +157,9 @@ static void bcma_core_mips_set_irq(struc
+       }
+ 
+       pr_info("set_irq: core 0x%04x, irq %d => %d\n",
+-              dev->id.id, oldirq + 2, irq + 2);
++              dev->id.id, (oldirq > 4) ? 0 : (oldirq + 2), irq + 2);
++
++      return true;
+ }
+ 
+ static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int 
irq)
+@@ -226,6 +236,27 @@ static void bcma_core_mips_flash_detect(
+       }
+ }
+ 
++static void bcma_fix_i2s_irqflag(struct bcma_bus *bus) {
++      struct bcma_device *cpu, *pcie, *i2s;
++
++      /* IRQ flags >= 8 are not honored in the IRQ masks (2010 Broadcom SDK) 
*/
++      if (bus->chipinfo.id != 0x4716 &&
++              bus->chipinfo.id != 0x4748)
++              return;
++
++      if ((cpu = bcma_find_core(bus, BCMA_CORE_MIPS_74K)) &&
++              (pcie = bcma_find_core(bus, BCMA_CORE_PCIE)) &&
++              (i2s = bcma_find_core(bus, BCMA_CORE_I2S))) {
++              if (bcma_aread32(cpu, BCMA_MIPS_OOBSELINA74) == 0x08060504 &&
++                    bcma_aread32(pcie, BCMA_MIPS_OOBSELINA74) == 0x08060504 &&
++                    bcma_aread32(i2s, BCMA_MIPS_OOBSELOUTA30) == 0x88) {
++                      bcma_awrite32(cpu, BCMA_MIPS_OOBSELINA74, 0x07060504);
++                      bcma_awrite32(pcie, BCMA_MIPS_OOBSELINA74, 0x07060504);
++                      bcma_awrite32(i2s, BCMA_MIPS_OOBSELOUTA30, 0x87);
++              }
++      }
++}
++
+ void bcma_core_mips_init(struct bcma_drv_mips *mcore)
+ {
+       struct bcma_bus *bus;
+@@ -234,12 +265,14 @@ void bcma_core_mips_init(struct bcma_drv
+ 
+       pr_info("Initializing MIPS core...\n");
+ 
++      bcma_fix_i2s_irqflag(bus);
++
+       if (!mcore->setup_done)
+               mcore->assigned_irqs = 1;
+ 
+       /* Assign IRQs to all cores on the bus */
+       list_for_each_entry_reverse(core, &bus->cores, list) {
+-              int mips_irq;
++              unsigned int mips_irq;
+               if (core->irq)
+                       continue;
+ 
+@@ -248,8 +281,7 @@ void bcma_core_mips_init(struct bcma_drv
+                       core->irq = 0;
+               else
+                       core->irq = mips_irq + 2;
+-              if (core->irq > 5)
+-                      continue;
++
+               switch (core->id.id) {
+               case BCMA_CORE_PCI:
+               case BCMA_CORE_PCIE:
+@@ -261,9 +293,17 @@ void bcma_core_mips_init(struct bcma_drv
+                       /* These devices get their own IRQ line if available,
+                        * the rest goes on IRQ0
+                        */
+-                      if (mcore->assigned_irqs <= 4)
+-                              bcma_core_mips_set_irq(core,
+-                                                     mcore->assigned_irqs++);
++                      if (mcore->assigned_irqs <= 4) {
++                              if (bcma_core_mips_set_irq(core,
++                                                         
mcore->assigned_irqs))
++                                      mcore->assigned_irqs++;
++                      }
++                      else
++                              bcma_core_mips_set_irq(core, 0);
++                      break;
++              case BCMA_CORE_CHIPCOMMON:
++              case BCMA_CORE_I2S:
++                      bcma_core_mips_set_irq(core, 0);
+                       break;
+               }
+       }

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to