Commit dfae7143 authored by Hauke Mehrtens's avatar Hauke Mehrtens Committed by John W. Linville

bcma: add an extra pcie core struct

The BCM4706 has two PCIe host controller on the bcma bus. For PCIe
client mode it is assumed that there is only one PCIe controller so the
PCIe driver, like b43 and brcmsmac are accessing the first PCIe
controller when they want to issue a operation on the host controller.
Signed-off-by: default avatarHauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 017c4c3b
...@@ -452,6 +452,8 @@ void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc) ...@@ -452,6 +452,8 @@ void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
pc_host->mem_resource.start = BCMA_SOC_PCI_MEM; pc_host->mem_resource.start = BCMA_SOC_PCI_MEM;
pc_host->mem_resource.end = BCMA_SOC_PCI_MEM + pc_host->mem_resource.end = BCMA_SOC_PCI_MEM +
BCMA_SOC_PCI_MEM_SZ - 1; BCMA_SOC_PCI_MEM_SZ - 1;
pc_host->io_resource.start = 0x100;
pc_host->io_resource.end = 0x47F;
pci_membase_1G = BCMA_SOC_PCIE_DMA_H32; pci_membase_1G = BCMA_SOC_PCIE_DMA_H32;
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0, pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
tmp | BCMA_SOC_PCI_MEM); tmp | BCMA_SOC_PCI_MEM);
...@@ -459,6 +461,8 @@ void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc) ...@@ -459,6 +461,8 @@ void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
pc_host->mem_resource.start = BCMA_SOC_PCI1_MEM; pc_host->mem_resource.start = BCMA_SOC_PCI1_MEM;
pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM + pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM +
BCMA_SOC_PCI_MEM_SZ - 1; BCMA_SOC_PCI_MEM_SZ - 1;
pc_host->io_resource.start = 0x480;
pc_host->io_resource.end = 0x7FF;
pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32; pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32;
pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG; pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG;
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0, pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
......
...@@ -81,6 +81,18 @@ struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid) ...@@ -81,6 +81,18 @@ struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
} }
EXPORT_SYMBOL_GPL(bcma_find_core); EXPORT_SYMBOL_GPL(bcma_find_core);
static struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
u8 unit)
{
struct bcma_device *core;
list_for_each_entry(core, &bus->cores, list) {
if (core->id.id == coreid && core->core_unit == unit)
return core;
}
return NULL;
}
static void bcma_release_core_dev(struct device *dev) static void bcma_release_core_dev(struct device *dev)
{ {
struct bcma_device *core = container_of(dev, struct bcma_device, dev); struct bcma_device *core = container_of(dev, struct bcma_device, dev);
...@@ -211,10 +223,17 @@ int __devinit bcma_bus_register(struct bcma_bus *bus) ...@@ -211,10 +223,17 @@ int __devinit bcma_bus_register(struct bcma_bus *bus)
} }
/* Init PCIE core */ /* Init PCIE core */
core = bcma_find_core(bus, BCMA_CORE_PCIE); core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 0);
if (core) {
bus->drv_pci[0].core = core;
bcma_core_pci_init(&bus->drv_pci[0]);
}
/* Init PCIE core */
core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 1);
if (core) { if (core) {
bus->drv_pci.core = core; bus->drv_pci[1].core = core;
bcma_core_pci_init(&bus->drv_pci); bcma_core_pci_init(&bus->drv_pci[1]);
} }
/* Init GBIT MAC COMMON core */ /* Init GBIT MAC COMMON core */
......
...@@ -4652,7 +4652,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev) ...@@ -4652,7 +4652,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
switch (dev->dev->bus_type) { switch (dev->dev->bus_type) {
#ifdef CONFIG_B43_BCMA #ifdef CONFIG_B43_BCMA
case B43_BUS_BCMA: case B43_BUS_BCMA:
bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci, bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
dev->dev->bdev, true); dev->dev->bdev, true);
break; break;
#endif #endif
......
...@@ -692,7 +692,7 @@ void ai_pci_up(struct si_pub *sih) ...@@ -692,7 +692,7 @@ void ai_pci_up(struct si_pub *sih)
sii = container_of(sih, struct si_info, pub); sii = container_of(sih, struct si_info, pub);
if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true); bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], true);
} }
/* Unconfigure and/or apply various WARs when going down */ /* Unconfigure and/or apply various WARs when going down */
...@@ -703,7 +703,7 @@ void ai_pci_down(struct si_pub *sih) ...@@ -703,7 +703,7 @@ void ai_pci_down(struct si_pub *sih)
sii = container_of(sih, struct si_info, pub); sii = container_of(sih, struct si_info, pub);
if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false); bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], false);
} }
/* Enable BT-COEX & Ex-PA for 4313 */ /* Enable BT-COEX & Ex-PA for 4313 */
......
...@@ -5077,7 +5077,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw) ...@@ -5077,7 +5077,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
* Configure pci/pcmcia here instead of in brcms_c_attach() * Configure pci/pcmcia here instead of in brcms_c_attach()
* to allow mfg hotswap: down, hotswap (chip power cycle), up. * to allow mfg hotswap: down, hotswap (chip power cycle), up.
*/ */
bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci, wlc_hw->d11core, bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
true); true);
/* /*
......
...@@ -251,7 +251,7 @@ struct bcma_bus { ...@@ -251,7 +251,7 @@ struct bcma_bus {
u8 num; u8 num;
struct bcma_drv_cc drv_cc; struct bcma_drv_cc drv_cc;
struct bcma_drv_pci drv_pci; struct bcma_drv_pci drv_pci[2];
struct bcma_drv_mips drv_mips; struct bcma_drv_mips drv_mips;
struct bcma_drv_gmac_cmn drv_gmac_cmn; struct bcma_drv_gmac_cmn drv_gmac_cmn;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment