kernel: move bcma patches pushed to wireless-next
We used separated patch for patches that were sent but not accepted yet. It has changed now, so let's use the standard patch file for them. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 42535
This commit is contained in:
		@@ -873,7 +873,17 @@
 | 
			
		||||
 
 | 
			
		||||
 	/* Map MMIO */
 | 
			
		||||
 	err = -ENOMEM;
 | 
			
		||||
@@ -235,7 +238,6 @@ static void bcma_host_pci_remove(struct
 | 
			
		||||
@@ -205,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)
 | 
			
		||||
@@ -235,7 +241,6 @@ static void bcma_host_pci_remove(struct
 | 
			
		||||
 	pci_release_regions(dev);
 | 
			
		||||
 	pci_disable_device(dev);
 | 
			
		||||
 	kfree(bus);
 | 
			
		||||
@@ -881,7 +891,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 #ifdef CONFIG_PM_SLEEP
 | 
			
		||||
@@ -267,14 +269,18 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc
 | 
			
		||||
@@ -267,15 +272,20 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc
 | 
			
		||||
 
 | 
			
		||||
 #endif /* CONFIG_PM_SLEEP */
 | 
			
		||||
 
 | 
			
		||||
@@ -899,8 +909,10 @@
 | 
			
		||||
+	{ 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/main.c
 | 
			
		||||
+++ b/drivers/bcma/main.c
 | 
			
		||||
@@ -69,28 +69,36 @@ static u16 bcma_cc_core_id(struct bcma_b
 | 
			
		||||
@@ -951,7 +963,63 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void bcma_release_core_dev(struct device *dev)
 | 
			
		||||
@@ -115,6 +123,7 @@ static int bcma_register_cores(struct bc
 | 
			
		||||
@@ -103,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 */
 | 
			
		||||
@@ -115,43 +166,22 @@ static int bcma_register_cores(struct bc
 | 
			
		||||
 		case BCMA_CORE_CHIPCOMMON:
 | 
			
		||||
 		case BCMA_CORE_PCI:
 | 
			
		||||
 		case BCMA_CORE_PCIE:
 | 
			
		||||
@@ -959,15 +1027,49 @@
 | 
			
		||||
 		case BCMA_CORE_MIPS_74K:
 | 
			
		||||
 		case BCMA_CORE_4706_MAC_GBIT_COMMON:
 | 
			
		||||
 			continue;
 | 
			
		||||
@@ -148,6 +157,7 @@ static int bcma_register_cores(struct bc
 | 
			
		||||
 			bcma_err(bus,
 | 
			
		||||
 				 "Could not register dev for core 0x%03X\n",
 | 
			
		||||
 				 core->id.id);
 | 
			
		||||
+			put_device(&core->dev);
 | 
			
		||||
 			continue;
 | 
			
		||||
 		}
 | 
			
		||||
 		core->dev_registered = true;
 | 
			
		||||
@@ -218,7 +228,7 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
 
 | 
			
		||||
+		/* 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);
 | 
			
		||||
-			continue;
 | 
			
		||||
-		}
 | 
			
		||||
-		core->dev_registered = true;
 | 
			
		||||
-		dev_id++;
 | 
			
		||||
+		bcma_register_core(bus, core);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 #ifdef CONFIG_BCMA_DRIVER_MIPS
 | 
			
		||||
@@ -218,7 +248,7 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
 	err = bcma_bus_scan(bus);
 | 
			
		||||
 	if (err) {
 | 
			
		||||
 		bcma_err(bus, "Failed to scan: %d\n", err);
 | 
			
		||||
@@ -976,7 +1078,20 @@
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	/* Early init CC core */
 | 
			
		||||
@@ -263,6 +273,13 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
@@ -228,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) {
 | 
			
		||||
@@ -263,6 +299,13 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
 		bcma_core_pci_init(&bus->drv_pci[1]);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -990,6 +1105,24 @@
 | 
			
		||||
 	/* Init GBIT MAC COMMON core */
 | 
			
		||||
 	core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
 | 
			
		||||
 	if (core) {
 | 
			
		||||
@@ -271,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");
 | 
			
		||||
 
 | 
			
		||||
@@ -308,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
 | 
			
		||||
@@ -32,6 +32,18 @@ static const struct bcma_device_id_name
 | 
			
		||||
@@ -1103,6 +1236,34 @@
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 	return 0;
 | 
			
		||||
@@ -421,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -435,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)
 | 
			
		||||
@@ -446,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/drivers/bcma/sprom.c
 | 
			
		||||
+++ b/drivers/bcma/sprom.c
 | 
			
		||||
@@ -72,12 +72,12 @@ fail:
 | 
			
		||||
@@ -1384,7 +1545,12 @@
 | 
			
		||||
 
 | 
			
		||||
 /* Board types (on PCI usually equals to the subsystem dev id) */
 | 
			
		||||
 /* BCM4313 */
 | 
			
		||||
@@ -315,6 +337,7 @@ struct bcma_bus {
 | 
			
		||||
@@ -310,11 +332,11 @@ 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;
 | 
			
		||||
 	struct bcma_drv_pci drv_pci[2];
 | 
			
		||||
@@ -1392,7 +1558,7 @@
 | 
			
		||||
 	struct bcma_drv_mips drv_mips;
 | 
			
		||||
 	struct bcma_drv_gmac_cmn drv_gmac_cmn;
 | 
			
		||||
 
 | 
			
		||||
@@ -400,7 +423,14 @@ static inline void bcma_maskset16(struct
 | 
			
		||||
@@ -400,7 +422,14 @@ static inline void bcma_maskset16(struct
 | 
			
		||||
 	bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1893,6 +2059,34 @@
 | 
			
		||||
 	writel(value, core->io_wrap + offset);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -161,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.
 | 
			
		||||
@@ -174,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/include/linux/bcma/bcma_regs.h
 | 
			
		||||
+++ b/include/linux/bcma/bcma_regs.h
 | 
			
		||||
@@ -39,6 +39,11 @@
 | 
			
		||||
 
 | 
			
		||||
@@ -1,247 +0,0 @@
 | 
			
		||||
--- 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -218,18 +218,86 @@
 | 
			
		||||
+}
 | 
			
		||||
--- a/drivers/bcma/host_pci.c
 | 
			
		||||
+++ b/drivers/bcma/host_pci.c
 | 
			
		||||
@@ -279,6 +279,8 @@ static const struct pci_device_id bcma_p
 | 
			
		||||
@@ -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)
 | 
			
		||||
@@ -279,7 +282,10 @@ static const struct pci_device_id bcma_p
 | 
			
		||||
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
 | 
			
		||||
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
 | 
			
		||||
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
 | 
			
		||||
+	{ 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/main.c
 | 
			
		||||
+++ b/drivers/bcma/main.c
 | 
			
		||||
@@ -132,6 +132,7 @@ static int bcma_register_cores(struct bc
 | 
			
		||||
@@ -120,10 +120,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 */
 | 
			
		||||
@@ -132,44 +175,22 @@ static int bcma_register_cores(struct bc
 | 
			
		||||
 		case BCMA_CORE_CHIPCOMMON:
 | 
			
		||||
 		case BCMA_CORE_PCI:
 | 
			
		||||
 		case BCMA_CORE_PCIE:
 | 
			
		||||
@@ -237,7 +305,63 @@
 | 
			
		||||
 		case BCMA_CORE_MIPS_74K:
 | 
			
		||||
 		case BCMA_CORE_4706_MAC_GBIT_COMMON:
 | 
			
		||||
 			continue;
 | 
			
		||||
@@ -281,6 +282,13 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
+		/* 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
 | 
			
		||||
@@ -246,6 +267,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) {
 | 
			
		||||
@@ -281,6 +308,13 @@ int bcma_bus_register(struct bcma_bus *b
 | 
			
		||||
 		bcma_core_pci_init(&bus->drv_pci[1]);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -251,6 +375,24 @@
 | 
			
		||||
 	/* Init GBIT MAC COMMON core */
 | 
			
		||||
 	core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
 | 
			
		||||
 	if (core) {
 | 
			
		||||
@@ -289,7 +323,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");
 | 
			
		||||
 
 | 
			
		||||
@@ -326,8 +360,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/sprom.c
 | 
			
		||||
+++ b/drivers/bcma/sprom.c
 | 
			
		||||
@@ -201,6 +201,23 @@ static int bcma_sprom_valid(struct bcma_
 | 
			
		||||
@@ -366,7 +508,12 @@
 | 
			
		||||
 #define BCMA_CHIP_ID_BCM43224	43224
 | 
			
		||||
 #define  BCMA_PKG_ID_BCM43224_FAB_CSM	0x8
 | 
			
		||||
 #define  BCMA_PKG_ID_BCM43224_FAB_SMIC	0xa
 | 
			
		||||
@@ -333,6 +337,7 @@ struct bcma_bus {
 | 
			
		||||
@@ -328,11 +332,11 @@ 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;
 | 
			
		||||
 	struct bcma_drv_pci drv_pci[2];
 | 
			
		||||
@@ -584,6 +731,34 @@
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 	return 0;
 | 
			
		||||
@@ -435,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -449,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)
 | 
			
		||||
@@ -460,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/drivers/bcma/host_soc.c
 | 
			
		||||
+++ b/drivers/bcma/host_soc.c
 | 
			
		||||
@@ -134,12 +134,16 @@ static void bcma_host_soc_block_write(st
 | 
			
		||||
@@ -603,6 +778,34 @@
 | 
			
		||||
 	writel(value, core->io_wrap + offset);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -161,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.
 | 
			
		||||
@@ -174,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/driver_mips.c
 | 
			
		||||
+++ b/drivers/bcma/driver_mips.c
 | 
			
		||||
@@ -21,6 +21,14 @@
 | 
			
		||||
 
 | 
			
		||||
@@ -1,247 +0,0 @@
 | 
			
		||||
--- a/arch/mips/bcm47xx/setup.c
 | 
			
		||||
+++ b/arch/mips/bcm47xx/setup.c
 | 
			
		||||
@@ -202,6 +202,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
 | 
			
		||||
@@ -120,10 +120,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 */
 | 
			
		||||
@@ -138,39 +181,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
 | 
			
		||||
@@ -247,6 +267,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) {
 | 
			
		||||
@@ -297,7 +323,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");
 | 
			
		||||
 
 | 
			
		||||
@@ -334,8 +360,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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user