Adjust the IRQ Flag value from 8 to 7 for I2S Core for BCM4716 and BCM4748 (per the Broadcom SDK). IRQ Flag values greater than 7 are ignored when setting the IRQ Mask.
Signed-off-by: Nathan Hintz <[email protected]> --- /dev/null +++ target/linux/brcm47xx/patches-3.6/237-bcma-bcm4716-bcm4748-i2s-irqflag.patch @@ -0,0 +1,57 @@ +--- 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 +@@ -79,7 +79,7 @@ static u32 bcma_core_mips_irqflag(struct + return dev->core_index; + flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30); + +- if (flag) ++ if (flag && (flag & IRQ_FLAG_MASK) <= 7) + return flag & IRQ_FLAG_MASK; + else + return INVALID_IRQ_FLAG; +@@ -262,6 +262,26 @@ static void bcma_core_mips_flash_detect( + mcore->early_setup_done = true; + } + ++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; +@@ -275,6 +295,8 @@ void bcma_core_mips_init(struct bcma_drv + + bcma_core_mips_early_init(mcore); + ++ bcma_fix_i2s_irqflag(bus); ++ + mcore->assigned_irqs = 1; + + /* Assign IRQs to all cores on the bus */ _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
