On 12/11/2012 05:48 AM, Nathan Hintz wrote:
> 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 <nlhi...@hotmail.com>
> 
> --- /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)

Handling something > 6 as invalid makes scene, but I think just adding a
pr_err() in that case is enough.

> +             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)

There are constants for 0x4716 and 0x4748 in include/linux/bcma/bcma.h

> ++            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)))

Do not do assignments in the if condition.

> ++            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
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
> 

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

Reply via email to