diff options
Diffstat (limited to 'target/linux/generic/patches-3.10/026-bcma-sent.patch')
-rw-r--r-- | target/linux/generic/patches-3.10/026-bcma-sent.patch | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.10/026-bcma-sent.patch b/target/linux/generic/patches-3.10/026-bcma-sent.patch new file mode 100644 index 0000000000..9bf597674e --- /dev/null +++ b/target/linux/generic/patches-3.10/026-bcma-sent.patch @@ -0,0 +1,247 @@ +--- a/arch/mips/bcm47xx/setup.c ++++ b/arch/mips/bcm47xx/setup.c +@@ -194,6 +194,10 @@ static void __init bcm47xx_register_bcma + + err = bcma_host_soc_register(&bcm47xx_bus.bcma); + if (err) ++ panic("Failed to register BCMA bus (err %d)", err); ++ ++ err = bcma_host_soc_init(&bcm47xx_bus.bcma); ++ if (err) + panic("Failed to initialize BCMA bus (err %d)", err); + + bcm47xx_fill_bcma_boardinfo(&bcm47xx_bus.bcma.bus.boardinfo, NULL); +--- a/drivers/bcma/host_pci.c ++++ b/drivers/bcma/host_pci.c +@@ -208,6 +208,9 @@ static int bcma_host_pci_probe(struct pc + bus->boardinfo.vendor = bus->host_pci->subsystem_vendor; + bus->boardinfo.type = bus->host_pci->subsystem_device; + ++ /* Initialize struct, detect chip */ ++ bcma_init_bus(bus); ++ + /* Register */ + err = bcma_bus_register(bus); + if (err) +@@ -282,6 +285,7 @@ static const struct pci_device_id bcma_p + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) }, /* 0xA8DB */ + { 0, }, + }; + MODULE_DEVICE_TABLE(pci, bcma_pci_bridge_tbl); +--- a/drivers/bcma/host_soc.c ++++ b/drivers/bcma/host_soc.c +@@ -165,7 +165,6 @@ static const struct bcma_host_ops bcma_h + int __init bcma_host_soc_register(struct bcma_soc *soc) + { + struct bcma_bus *bus = &soc->bus; +- int err; + + /* iomap only first core. We have to read some register on this core + * to scan the bus. +@@ -178,7 +177,18 @@ int __init bcma_host_soc_register(struct + bus->hosttype = BCMA_HOSTTYPE_SOC; + bus->ops = &bcma_host_soc_ops; + +- /* Register */ ++ /* Initialize struct, detect chip */ ++ bcma_init_bus(bus); ++ ++ return 0; ++} ++ ++int __init bcma_host_soc_init(struct bcma_soc *soc) ++{ ++ struct bcma_bus *bus = &soc->bus; ++ int err; ++ ++ /* Scan bus and initialize it */ + err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips); + if (err) + iounmap(bus->mmio); +--- a/drivers/bcma/main.c ++++ b/drivers/bcma/main.c +@@ -111,10 +111,53 @@ static void bcma_release_core_dev(struct + kfree(core); + } + +-static int bcma_register_cores(struct bcma_bus *bus) ++static bool bcma_is_core_needed_early(u16 core_id) ++{ ++ switch (core_id) { ++ case BCMA_CORE_NS_NAND: ++ case BCMA_CORE_NS_QSPI: ++ return true; ++ } ++ ++ return false; ++} ++ ++static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core) ++{ ++ int err; ++ ++ core->dev.release = bcma_release_core_dev; ++ core->dev.bus = &bcma_bus_type; ++ dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index); ++ ++ switch (bus->hosttype) { ++ case BCMA_HOSTTYPE_PCI: ++ core->dev.parent = &bus->host_pci->dev; ++ core->dma_dev = &bus->host_pci->dev; ++ core->irq = bus->host_pci->irq; ++ break; ++ case BCMA_HOSTTYPE_SOC: ++ core->dev.dma_mask = &core->dev.coherent_dma_mask; ++ core->dma_dev = &core->dev; ++ break; ++ case BCMA_HOSTTYPE_SDIO: ++ break; ++ } ++ ++ err = device_register(&core->dev); ++ if (err) { ++ bcma_err(bus, "Could not register dev for core 0x%03X\n", ++ core->id.id); ++ put_device(&core->dev); ++ return; ++ } ++ core->dev_registered = true; ++} ++ ++static int bcma_register_devices(struct bcma_bus *bus) + { + struct bcma_device *core; +- int err, dev_id = 0; ++ int err; + + list_for_each_entry(core, &bus->cores, list) { + /* We support that cores ourself */ +@@ -129,39 +172,16 @@ static int bcma_register_cores(struct bc + continue; + } + ++ /* Early cores were already registered */ ++ if (bcma_is_core_needed_early(core->id.id)) ++ continue; ++ + /* Only first GMAC core on BCM4706 is connected and working */ + if (core->id.id == BCMA_CORE_4706_MAC_GBIT && + core->core_unit > 0) + continue; + +- core->dev.release = bcma_release_core_dev; +- core->dev.bus = &bcma_bus_type; +- dev_set_name(&core->dev, "bcma%d:%d", bus->num, dev_id); +- +- switch (bus->hosttype) { +- case BCMA_HOSTTYPE_PCI: +- core->dev.parent = &bus->host_pci->dev; +- core->dma_dev = &bus->host_pci->dev; +- core->irq = bus->host_pci->irq; +- break; +- case BCMA_HOSTTYPE_SOC: +- core->dev.dma_mask = &core->dev.coherent_dma_mask; +- core->dma_dev = &core->dev; +- break; +- case BCMA_HOSTTYPE_SDIO: +- break; +- } +- +- err = device_register(&core->dev); +- if (err) { +- bcma_err(bus, +- "Could not register dev for core 0x%03X\n", +- core->id.id); +- put_device(&core->dev); +- continue; +- } +- core->dev_registered = true; +- dev_id++; ++ bcma_register_core(bus, core); + } + + #ifdef CONFIG_BCMA_DRIVER_MIPS +@@ -238,6 +258,12 @@ int bcma_bus_register(struct bcma_bus *b + bcma_core_chipcommon_early_init(&bus->drv_cc); + } + ++ /* Cores providing flash access go before SPROM init */ ++ list_for_each_entry(core, &bus->cores, list) { ++ if (bcma_is_core_needed_early(core->id.id)) ++ bcma_register_core(bus, core); ++ } ++ + /* Try to get SPROM */ + err = bcma_sprom_get(bus); + if (err == -ENOENT) { +@@ -288,7 +314,7 @@ int bcma_bus_register(struct bcma_bus *b + } + + /* Register found cores */ +- bcma_register_cores(bus); ++ bcma_register_devices(bus); + + bcma_info(bus, "Bus registered\n"); + +@@ -325,8 +351,6 @@ int __init bcma_bus_early_register(struc + struct bcma_device *core; + struct bcma_device_id match; + +- bcma_init_bus(bus); +- + match.manuf = BCMA_MANUF_BCM; + match.id = bcma_cc_core_id(bus); + match.class = BCMA_CL_SIM; +--- a/drivers/bcma/scan.c ++++ b/drivers/bcma/scan.c +@@ -438,9 +438,6 @@ void bcma_init_bus(struct bcma_bus *bus) + s32 tmp; + struct bcma_chipinfo *chipinfo = &(bus->chipinfo); + +- if (bus->init_done) +- return; +- + INIT_LIST_HEAD(&bus->cores); + bus->nr_cores = 0; + +@@ -452,8 +449,6 @@ void bcma_init_bus(struct bcma_bus *bus) + chipinfo->pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT; + bcma_info(bus, "Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n", + chipinfo->id, chipinfo->rev, chipinfo->pkg); +- +- bus->init_done = true; + } + + int bcma_bus_scan(struct bcma_bus *bus) +@@ -463,8 +458,6 @@ int bcma_bus_scan(struct bcma_bus *bus) + + int err, core_num = 0; + +- bcma_init_bus(bus); +- + erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); + if (bus->hosttype == BCMA_HOSTTYPE_SOC) { + eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); +--- a/include/linux/bcma/bcma.h ++++ b/include/linux/bcma/bcma.h +@@ -332,7 +332,6 @@ struct bcma_bus { + struct bcma_device *mapped_core; + struct list_head cores; + u8 nr_cores; +- u8 init_done:1; + u8 num; + + struct bcma_drv_cc drv_cc; +--- a/include/linux/bcma/bcma_soc.h ++++ b/include/linux/bcma/bcma_soc.h +@@ -10,6 +10,7 @@ struct bcma_soc { + }; + + int __init bcma_host_soc_register(struct bcma_soc *soc); ++int __init bcma_host_soc_init(struct bcma_soc *soc); + + int bcma_bus_register(struct bcma_bus *bus); + |