161e115a5SMichael Buesch /* 261e115a5SMichael Buesch * Sonics Silicon Backplane 361e115a5SMichael Buesch * Bus scanning 461e115a5SMichael Buesch * 561e115a5SMichael Buesch * Copyright (C) 2005-2007 Michael Buesch <mb@bu3sch.de> 661e115a5SMichael Buesch * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 761e115a5SMichael Buesch * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 861e115a5SMichael Buesch * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 961e115a5SMichael Buesch * Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch> 1061e115a5SMichael Buesch * Copyright (C) 2006 Broadcom Corporation. 1161e115a5SMichael Buesch * 1261e115a5SMichael Buesch * Licensed under the GNU/GPL. See COPYING for details. 1361e115a5SMichael Buesch */ 1461e115a5SMichael Buesch 1561e115a5SMichael Buesch #include <linux/ssb/ssb.h> 1661e115a5SMichael Buesch #include <linux/ssb/ssb_regs.h> 1761e115a5SMichael Buesch #include <linux/pci.h> 1861e115a5SMichael Buesch #include <linux/io.h> 1961e115a5SMichael Buesch 2061e115a5SMichael Buesch #include <pcmcia/cs_types.h> 2161e115a5SMichael Buesch #include <pcmcia/cs.h> 2261e115a5SMichael Buesch #include <pcmcia/cistpl.h> 2361e115a5SMichael Buesch #include <pcmcia/ds.h> 2461e115a5SMichael Buesch 2561e115a5SMichael Buesch #include "ssb_private.h" 2661e115a5SMichael Buesch 2761e115a5SMichael Buesch 2861e115a5SMichael Buesch const char *ssb_core_name(u16 coreid) 2961e115a5SMichael Buesch { 3061e115a5SMichael Buesch switch (coreid) { 3161e115a5SMichael Buesch case SSB_DEV_CHIPCOMMON: 3261e115a5SMichael Buesch return "ChipCommon"; 3361e115a5SMichael Buesch case SSB_DEV_ILINE20: 3461e115a5SMichael Buesch return "ILine 20"; 3561e115a5SMichael Buesch case SSB_DEV_SDRAM: 3661e115a5SMichael Buesch return "SDRAM"; 3761e115a5SMichael Buesch case SSB_DEV_PCI: 3861e115a5SMichael Buesch return "PCI"; 3961e115a5SMichael Buesch case SSB_DEV_MIPS: 4061e115a5SMichael Buesch return "MIPS"; 4161e115a5SMichael Buesch case SSB_DEV_ETHERNET: 4261e115a5SMichael Buesch return "Fast Ethernet"; 4361e115a5SMichael Buesch case SSB_DEV_V90: 4461e115a5SMichael Buesch return "V90"; 4561e115a5SMichael Buesch case SSB_DEV_USB11_HOSTDEV: 4661e115a5SMichael Buesch return "USB 1.1 Hostdev"; 4761e115a5SMichael Buesch case SSB_DEV_ADSL: 4861e115a5SMichael Buesch return "ADSL"; 4961e115a5SMichael Buesch case SSB_DEV_ILINE100: 5061e115a5SMichael Buesch return "ILine 100"; 5161e115a5SMichael Buesch case SSB_DEV_IPSEC: 5261e115a5SMichael Buesch return "IPSEC"; 5361e115a5SMichael Buesch case SSB_DEV_PCMCIA: 5461e115a5SMichael Buesch return "PCMCIA"; 5561e115a5SMichael Buesch case SSB_DEV_INTERNAL_MEM: 5661e115a5SMichael Buesch return "Internal Memory"; 5761e115a5SMichael Buesch case SSB_DEV_MEMC_SDRAM: 5861e115a5SMichael Buesch return "MEMC SDRAM"; 5961e115a5SMichael Buesch case SSB_DEV_EXTIF: 6061e115a5SMichael Buesch return "EXTIF"; 6161e115a5SMichael Buesch case SSB_DEV_80211: 6261e115a5SMichael Buesch return "IEEE 802.11"; 6361e115a5SMichael Buesch case SSB_DEV_MIPS_3302: 6461e115a5SMichael Buesch return "MIPS 3302"; 6561e115a5SMichael Buesch case SSB_DEV_USB11_HOST: 6661e115a5SMichael Buesch return "USB 1.1 Host"; 6761e115a5SMichael Buesch case SSB_DEV_USB11_DEV: 6861e115a5SMichael Buesch return "USB 1.1 Device"; 6961e115a5SMichael Buesch case SSB_DEV_USB20_HOST: 7061e115a5SMichael Buesch return "USB 2.0 Host"; 7161e115a5SMichael Buesch case SSB_DEV_USB20_DEV: 7261e115a5SMichael Buesch return "USB 2.0 Device"; 7361e115a5SMichael Buesch case SSB_DEV_SDIO_HOST: 7461e115a5SMichael Buesch return "SDIO Host"; 7561e115a5SMichael Buesch case SSB_DEV_ROBOSWITCH: 7661e115a5SMichael Buesch return "Roboswitch"; 7761e115a5SMichael Buesch case SSB_DEV_PARA_ATA: 7861e115a5SMichael Buesch return "PATA"; 7961e115a5SMichael Buesch case SSB_DEV_SATA_XORDMA: 8061e115a5SMichael Buesch return "SATA XOR-DMA"; 8161e115a5SMichael Buesch case SSB_DEV_ETHERNET_GBIT: 8261e115a5SMichael Buesch return "GBit Ethernet"; 8361e115a5SMichael Buesch case SSB_DEV_PCIE: 8461e115a5SMichael Buesch return "PCI-E"; 8561e115a5SMichael Buesch case SSB_DEV_MIMO_PHY: 8661e115a5SMichael Buesch return "MIMO PHY"; 8761e115a5SMichael Buesch case SSB_DEV_SRAM_CTRLR: 8861e115a5SMichael Buesch return "SRAM Controller"; 8961e115a5SMichael Buesch case SSB_DEV_MINI_MACPHY: 9061e115a5SMichael Buesch return "Mini MACPHY"; 9161e115a5SMichael Buesch case SSB_DEV_ARM_1176: 9261e115a5SMichael Buesch return "ARM 1176"; 9361e115a5SMichael Buesch case SSB_DEV_ARM_7TDMI: 9461e115a5SMichael Buesch return "ARM 7TDMI"; 9561e115a5SMichael Buesch } 9661e115a5SMichael Buesch return "UNKNOWN"; 9761e115a5SMichael Buesch } 9861e115a5SMichael Buesch 9961e115a5SMichael Buesch static u16 pcidev_to_chipid(struct pci_dev *pci_dev) 10061e115a5SMichael Buesch { 10161e115a5SMichael Buesch u16 chipid_fallback = 0; 10261e115a5SMichael Buesch 10361e115a5SMichael Buesch switch (pci_dev->device) { 10461e115a5SMichael Buesch case 0x4301: 10561e115a5SMichael Buesch chipid_fallback = 0x4301; 10661e115a5SMichael Buesch break; 10761e115a5SMichael Buesch case 0x4305 ... 0x4307: 10861e115a5SMichael Buesch chipid_fallback = 0x4307; 10961e115a5SMichael Buesch break; 11061e115a5SMichael Buesch case 0x4403: 11161e115a5SMichael Buesch chipid_fallback = 0x4402; 11261e115a5SMichael Buesch break; 11361e115a5SMichael Buesch case 0x4610 ... 0x4615: 11461e115a5SMichael Buesch chipid_fallback = 0x4610; 11561e115a5SMichael Buesch break; 11661e115a5SMichael Buesch case 0x4710 ... 0x4715: 11761e115a5SMichael Buesch chipid_fallback = 0x4710; 11861e115a5SMichael Buesch break; 11961e115a5SMichael Buesch case 0x4320 ... 0x4325: 12061e115a5SMichael Buesch chipid_fallback = 0x4309; 12161e115a5SMichael Buesch break; 12261e115a5SMichael Buesch case PCI_DEVICE_ID_BCM4401: 12361e115a5SMichael Buesch case PCI_DEVICE_ID_BCM4401B0: 12461e115a5SMichael Buesch case PCI_DEVICE_ID_BCM4401B1: 12561e115a5SMichael Buesch chipid_fallback = 0x4401; 12661e115a5SMichael Buesch break; 12761e115a5SMichael Buesch default: 12861e115a5SMichael Buesch ssb_printk(KERN_ERR PFX 12961e115a5SMichael Buesch "PCI-ID not in fallback list\n"); 13061e115a5SMichael Buesch } 13161e115a5SMichael Buesch 13261e115a5SMichael Buesch return chipid_fallback; 13361e115a5SMichael Buesch } 13461e115a5SMichael Buesch 13561e115a5SMichael Buesch static u8 chipid_to_nrcores(u16 chipid) 13661e115a5SMichael Buesch { 13761e115a5SMichael Buesch switch (chipid) { 13861e115a5SMichael Buesch case 0x5365: 13961e115a5SMichael Buesch return 7; 14061e115a5SMichael Buesch case 0x4306: 14161e115a5SMichael Buesch return 6; 14261e115a5SMichael Buesch case 0x4310: 14361e115a5SMichael Buesch return 8; 14461e115a5SMichael Buesch case 0x4307: 14561e115a5SMichael Buesch case 0x4301: 14661e115a5SMichael Buesch return 5; 14761e115a5SMichael Buesch case 0x4401: 14861e115a5SMichael Buesch case 0x4402: 14961e115a5SMichael Buesch return 3; 15061e115a5SMichael Buesch case 0x4710: 15161e115a5SMichael Buesch case 0x4610: 15261e115a5SMichael Buesch case 0x4704: 15361e115a5SMichael Buesch return 9; 15461e115a5SMichael Buesch default: 15561e115a5SMichael Buesch ssb_printk(KERN_ERR PFX 15661e115a5SMichael Buesch "CHIPID not in nrcores fallback list\n"); 15761e115a5SMichael Buesch } 15861e115a5SMichael Buesch 15961e115a5SMichael Buesch return 1; 16061e115a5SMichael Buesch } 16161e115a5SMichael Buesch 16261e115a5SMichael Buesch static u32 scan_read32(struct ssb_bus *bus, u8 current_coreidx, 16361e115a5SMichael Buesch u16 offset) 16461e115a5SMichael Buesch { 16561e115a5SMichael Buesch switch (bus->bustype) { 16661e115a5SMichael Buesch case SSB_BUSTYPE_SSB: 16761e115a5SMichael Buesch offset += current_coreidx * SSB_CORE_SIZE; 16861e115a5SMichael Buesch break; 16961e115a5SMichael Buesch case SSB_BUSTYPE_PCI: 17061e115a5SMichael Buesch break; 17161e115a5SMichael Buesch case SSB_BUSTYPE_PCMCIA: 17261e115a5SMichael Buesch if (offset >= 0x800) { 17361e115a5SMichael Buesch ssb_pcmcia_switch_segment(bus, 1); 17461e115a5SMichael Buesch offset -= 0x800; 17561e115a5SMichael Buesch } else 17661e115a5SMichael Buesch ssb_pcmcia_switch_segment(bus, 0); 17761e115a5SMichael Buesch break; 17861e115a5SMichael Buesch } 17961e115a5SMichael Buesch return readl(bus->mmio + offset); 18061e115a5SMichael Buesch } 18161e115a5SMichael Buesch 18261e115a5SMichael Buesch static int scan_switchcore(struct ssb_bus *bus, u8 coreidx) 18361e115a5SMichael Buesch { 18461e115a5SMichael Buesch switch (bus->bustype) { 18561e115a5SMichael Buesch case SSB_BUSTYPE_SSB: 18661e115a5SMichael Buesch break; 18761e115a5SMichael Buesch case SSB_BUSTYPE_PCI: 18861e115a5SMichael Buesch return ssb_pci_switch_coreidx(bus, coreidx); 18961e115a5SMichael Buesch case SSB_BUSTYPE_PCMCIA: 19061e115a5SMichael Buesch return ssb_pcmcia_switch_coreidx(bus, coreidx); 19161e115a5SMichael Buesch } 19261e115a5SMichael Buesch return 0; 19361e115a5SMichael Buesch } 19461e115a5SMichael Buesch 19561e115a5SMichael Buesch void ssb_iounmap(struct ssb_bus *bus) 19661e115a5SMichael Buesch { 19761e115a5SMichael Buesch switch (bus->bustype) { 19861e115a5SMichael Buesch case SSB_BUSTYPE_SSB: 19961e115a5SMichael Buesch case SSB_BUSTYPE_PCMCIA: 20061e115a5SMichael Buesch iounmap(bus->mmio); 20161e115a5SMichael Buesch break; 20261e115a5SMichael Buesch case SSB_BUSTYPE_PCI: 20361e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 20461e115a5SMichael Buesch pci_iounmap(bus->host_pci, bus->mmio); 20561e115a5SMichael Buesch #else 20661e115a5SMichael Buesch SSB_BUG_ON(1); /* Can't reach this code. */ 20761e115a5SMichael Buesch #endif 20861e115a5SMichael Buesch break; 20961e115a5SMichael Buesch } 21061e115a5SMichael Buesch bus->mmio = NULL; 21161e115a5SMichael Buesch bus->mapped_device = NULL; 21261e115a5SMichael Buesch } 21361e115a5SMichael Buesch 21461e115a5SMichael Buesch static void __iomem *ssb_ioremap(struct ssb_bus *bus, 21561e115a5SMichael Buesch unsigned long baseaddr) 21661e115a5SMichael Buesch { 21761e115a5SMichael Buesch void __iomem *mmio = NULL; 21861e115a5SMichael Buesch 21961e115a5SMichael Buesch switch (bus->bustype) { 22061e115a5SMichael Buesch case SSB_BUSTYPE_SSB: 22161e115a5SMichael Buesch /* Only map the first core for now. */ 22261e115a5SMichael Buesch /* fallthrough... */ 22361e115a5SMichael Buesch case SSB_BUSTYPE_PCMCIA: 22461e115a5SMichael Buesch mmio = ioremap(baseaddr, SSB_CORE_SIZE); 22561e115a5SMichael Buesch break; 22661e115a5SMichael Buesch case SSB_BUSTYPE_PCI: 22761e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 22861e115a5SMichael Buesch mmio = pci_iomap(bus->host_pci, 0, ~0UL); 22961e115a5SMichael Buesch #else 23061e115a5SMichael Buesch SSB_BUG_ON(1); /* Can't reach this code. */ 23161e115a5SMichael Buesch #endif 23261e115a5SMichael Buesch break; 23361e115a5SMichael Buesch } 23461e115a5SMichael Buesch 23561e115a5SMichael Buesch return mmio; 23661e115a5SMichael Buesch } 23761e115a5SMichael Buesch 23861e115a5SMichael Buesch static int we_support_multiple_80211_cores(struct ssb_bus *bus) 23961e115a5SMichael Buesch { 24061e115a5SMichael Buesch /* More than one 802.11 core is only supported by special chips. 24161e115a5SMichael Buesch * There are chips with two 802.11 cores, but with dangling 24261e115a5SMichael Buesch * pins on the second core. Be careful and reject them here. 24361e115a5SMichael Buesch */ 24461e115a5SMichael Buesch 24561e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 24661e115a5SMichael Buesch if (bus->bustype == SSB_BUSTYPE_PCI) { 24761e115a5SMichael Buesch if (bus->host_pci->vendor == PCI_VENDOR_ID_BROADCOM && 24861e115a5SMichael Buesch bus->host_pci->device == 0x4324) 24961e115a5SMichael Buesch return 1; 25061e115a5SMichael Buesch } 25161e115a5SMichael Buesch #endif /* CONFIG_SSB_PCIHOST */ 25261e115a5SMichael Buesch return 0; 25361e115a5SMichael Buesch } 25461e115a5SMichael Buesch 25561e115a5SMichael Buesch int ssb_bus_scan(struct ssb_bus *bus, 25661e115a5SMichael Buesch unsigned long baseaddr) 25761e115a5SMichael Buesch { 25861e115a5SMichael Buesch int err = -ENOMEM; 25961e115a5SMichael Buesch void __iomem *mmio; 26061e115a5SMichael Buesch u32 idhi, cc, rev, tmp; 26161e115a5SMichael Buesch int dev_i, i; 26261e115a5SMichael Buesch struct ssb_device *dev; 26361e115a5SMichael Buesch int nr_80211_cores = 0; 26461e115a5SMichael Buesch 26561e115a5SMichael Buesch mmio = ssb_ioremap(bus, baseaddr); 26661e115a5SMichael Buesch if (!mmio) 26761e115a5SMichael Buesch goto out; 26861e115a5SMichael Buesch bus->mmio = mmio; 26961e115a5SMichael Buesch 27061e115a5SMichael Buesch err = scan_switchcore(bus, 0); /* Switch to first core */ 27161e115a5SMichael Buesch if (err) 27261e115a5SMichael Buesch goto err_unmap; 27361e115a5SMichael Buesch 27461e115a5SMichael Buesch idhi = scan_read32(bus, 0, SSB_IDHIGH); 27561e115a5SMichael Buesch cc = (idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT; 27661e115a5SMichael Buesch rev = (idhi & SSB_IDHIGH_RCLO); 27761e115a5SMichael Buesch rev |= (idhi & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT; 27861e115a5SMichael Buesch 27961e115a5SMichael Buesch bus->nr_devices = 0; 28061e115a5SMichael Buesch if (cc == SSB_DEV_CHIPCOMMON) { 28161e115a5SMichael Buesch tmp = scan_read32(bus, 0, SSB_CHIPCO_CHIPID); 28261e115a5SMichael Buesch 28361e115a5SMichael Buesch bus->chip_id = (tmp & SSB_CHIPCO_IDMASK); 28461e115a5SMichael Buesch bus->chip_rev = (tmp & SSB_CHIPCO_REVMASK) >> 28561e115a5SMichael Buesch SSB_CHIPCO_REVSHIFT; 28661e115a5SMichael Buesch bus->chip_package = (tmp & SSB_CHIPCO_PACKMASK) >> 28761e115a5SMichael Buesch SSB_CHIPCO_PACKSHIFT; 28861e115a5SMichael Buesch if (rev >= 4) { 28961e115a5SMichael Buesch bus->nr_devices = (tmp & SSB_CHIPCO_NRCORESMASK) >> 29061e115a5SMichael Buesch SSB_CHIPCO_NRCORESSHIFT; 29161e115a5SMichael Buesch } 29261e115a5SMichael Buesch tmp = scan_read32(bus, 0, SSB_CHIPCO_CAP); 29361e115a5SMichael Buesch bus->chipco.capabilities = tmp; 29461e115a5SMichael Buesch } else { 29561e115a5SMichael Buesch if (bus->bustype == SSB_BUSTYPE_PCI) { 29661e115a5SMichael Buesch bus->chip_id = pcidev_to_chipid(bus->host_pci); 29761e115a5SMichael Buesch pci_read_config_word(bus->host_pci, PCI_REVISION_ID, 29861e115a5SMichael Buesch &bus->chip_rev); 29961e115a5SMichael Buesch bus->chip_package = 0; 30061e115a5SMichael Buesch } else { 30161e115a5SMichael Buesch bus->chip_id = 0x4710; 30261e115a5SMichael Buesch bus->chip_rev = 0; 30361e115a5SMichael Buesch bus->chip_package = 0; 30461e115a5SMichael Buesch } 30561e115a5SMichael Buesch } 30661e115a5SMichael Buesch if (!bus->nr_devices) 30761e115a5SMichael Buesch bus->nr_devices = chipid_to_nrcores(bus->chip_id); 30861e115a5SMichael Buesch if (bus->nr_devices > ARRAY_SIZE(bus->devices)) { 30961e115a5SMichael Buesch ssb_printk(KERN_ERR PFX 31061e115a5SMichael Buesch "More than %d ssb cores found (%d)\n", 31161e115a5SMichael Buesch SSB_MAX_NR_CORES, bus->nr_devices); 31261e115a5SMichael Buesch goto err_unmap; 31361e115a5SMichael Buesch } 31461e115a5SMichael Buesch if (bus->bustype == SSB_BUSTYPE_SSB) { 31561e115a5SMichael Buesch /* Now that we know the number of cores, 31661e115a5SMichael Buesch * remap the whole IO space for all cores. 31761e115a5SMichael Buesch */ 31861e115a5SMichael Buesch err = -ENOMEM; 31961e115a5SMichael Buesch iounmap(mmio); 32061e115a5SMichael Buesch mmio = ioremap(baseaddr, SSB_CORE_SIZE * bus->nr_devices); 32161e115a5SMichael Buesch if (!mmio) 32261e115a5SMichael Buesch goto out; 32361e115a5SMichael Buesch bus->mmio = mmio; 32461e115a5SMichael Buesch } 32561e115a5SMichael Buesch 32661e115a5SMichael Buesch /* Fetch basic information about each core/device */ 32761e115a5SMichael Buesch for (i = 0, dev_i = 0; i < bus->nr_devices; i++) { 32861e115a5SMichael Buesch err = scan_switchcore(bus, i); 32961e115a5SMichael Buesch if (err) 33061e115a5SMichael Buesch goto err_unmap; 33161e115a5SMichael Buesch dev = &(bus->devices[dev_i]); 33261e115a5SMichael Buesch 33361e115a5SMichael Buesch idhi = scan_read32(bus, i, SSB_IDHIGH); 33461e115a5SMichael Buesch dev->id.coreid = (idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT; 33561e115a5SMichael Buesch dev->id.revision = (idhi & SSB_IDHIGH_RCLO); 33661e115a5SMichael Buesch dev->id.revision |= (idhi & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT; 33761e115a5SMichael Buesch dev->id.vendor = (idhi & SSB_IDHIGH_VC) >> SSB_IDHIGH_VC_SHIFT; 33861e115a5SMichael Buesch dev->core_index = i; 33961e115a5SMichael Buesch dev->bus = bus; 34061e115a5SMichael Buesch dev->ops = bus->ops; 34161e115a5SMichael Buesch 34261e115a5SMichael Buesch ssb_dprintk(KERN_INFO PFX 34361e115a5SMichael Buesch "Core %d found: %s " 34461e115a5SMichael Buesch "(cc 0x%03X, rev 0x%02X, vendor 0x%04X)\n", 34561e115a5SMichael Buesch i, ssb_core_name(dev->id.coreid), 34661e115a5SMichael Buesch dev->id.coreid, dev->id.revision, dev->id.vendor); 34761e115a5SMichael Buesch 34861e115a5SMichael Buesch switch (dev->id.coreid) { 34961e115a5SMichael Buesch case SSB_DEV_80211: 35061e115a5SMichael Buesch nr_80211_cores++; 35161e115a5SMichael Buesch if (nr_80211_cores > 1) { 35261e115a5SMichael Buesch if (!we_support_multiple_80211_cores(bus)) { 35361e115a5SMichael Buesch ssb_dprintk(KERN_INFO PFX "Ignoring additional " 35461e115a5SMichael Buesch "802.11 core\n"); 35561e115a5SMichael Buesch continue; 35661e115a5SMichael Buesch } 35761e115a5SMichael Buesch } 35861e115a5SMichael Buesch break; 35961e115a5SMichael Buesch case SSB_DEV_EXTIF: 36061e115a5SMichael Buesch #ifdef CONFIG_SSB_DRIVER_EXTIF 36161e115a5SMichael Buesch if (bus->extif.dev) { 36261e115a5SMichael Buesch ssb_printk(KERN_WARNING PFX 36361e115a5SMichael Buesch "WARNING: Multiple EXTIFs found\n"); 36461e115a5SMichael Buesch break; 36561e115a5SMichael Buesch } 36661e115a5SMichael Buesch bus->extif.dev = dev; 36761e115a5SMichael Buesch #endif /* CONFIG_SSB_DRIVER_EXTIF */ 36861e115a5SMichael Buesch break; 36961e115a5SMichael Buesch case SSB_DEV_CHIPCOMMON: 37061e115a5SMichael Buesch if (bus->chipco.dev) { 37161e115a5SMichael Buesch ssb_printk(KERN_WARNING PFX 37261e115a5SMichael Buesch "WARNING: Multiple ChipCommon found\n"); 37361e115a5SMichael Buesch break; 37461e115a5SMichael Buesch } 37561e115a5SMichael Buesch bus->chipco.dev = dev; 37661e115a5SMichael Buesch break; 37761e115a5SMichael Buesch case SSB_DEV_MIPS: 37861e115a5SMichael Buesch case SSB_DEV_MIPS_3302: 37961e115a5SMichael Buesch #ifdef CONFIG_SSB_DRIVER_MIPS 38061e115a5SMichael Buesch if (bus->mipscore.dev) { 38161e115a5SMichael Buesch ssb_printk(KERN_WARNING PFX 38261e115a5SMichael Buesch "WARNING: Multiple MIPS cores found\n"); 38361e115a5SMichael Buesch break; 38461e115a5SMichael Buesch } 38561e115a5SMichael Buesch bus->mipscore.dev = dev; 38661e115a5SMichael Buesch #endif /* CONFIG_SSB_DRIVER_MIPS */ 38761e115a5SMichael Buesch break; 38861e115a5SMichael Buesch case SSB_DEV_PCI: 38961e115a5SMichael Buesch case SSB_DEV_PCIE: 39061e115a5SMichael Buesch #ifdef CONFIG_SSB_DRIVER_PCICORE 39161e115a5SMichael Buesch if (bus->pcicore.dev) { 39261e115a5SMichael Buesch ssb_printk(KERN_WARNING PFX 39361e115a5SMichael Buesch "WARNING: Multiple PCI(E) cores found\n"); 39461e115a5SMichael Buesch break; 39561e115a5SMichael Buesch } 39661e115a5SMichael Buesch bus->pcicore.dev = dev; 39761e115a5SMichael Buesch #endif /* CONFIG_SSB_DRIVER_PCICORE */ 39861e115a5SMichael Buesch break; 39961e115a5SMichael Buesch default: 40061e115a5SMichael Buesch break; 40161e115a5SMichael Buesch } 40261e115a5SMichael Buesch 40361e115a5SMichael Buesch dev_i++; 40461e115a5SMichael Buesch } 40561e115a5SMichael Buesch bus->nr_devices = dev_i; 40661e115a5SMichael Buesch 40761e115a5SMichael Buesch err = 0; 40861e115a5SMichael Buesch out: 40961e115a5SMichael Buesch return err; 41061e115a5SMichael Buesch err_unmap: 41161e115a5SMichael Buesch ssb_iounmap(bus); 41261e115a5SMichael Buesch goto out; 41361e115a5SMichael Buesch } 414