diff options
Diffstat (limited to 'drivers/bcma/driver_pci.c')
| -rw-r--r-- | drivers/bcma/driver_pci.c | 66 | 
1 files changed, 64 insertions, 2 deletions
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c index e757e4e3c7e2..25f3ddf33823 100644 --- a/drivers/bcma/driver_pci.c +++ b/drivers/bcma/driver_pci.c @@ -3,7 +3,7 @@   * PCI Core   *   * Copyright 2005, Broadcom Corporation - * Copyright 2006, 2007, Michael Buesch <[email protected]> + * Copyright 2006, 2007, Michael Buesch <[email protected]>   *   * Licensed under the GNU/GPL. See COPYING for details.   */ @@ -157,7 +157,69 @@ static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc)   * Init.   **************************************************/ -void bcma_core_pci_init(struct bcma_drv_pci *pc) +static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)  {  	bcma_pcicore_serdes_workaround(pc);  } + +static bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc) +{ +	struct bcma_bus *bus = pc->core->bus; +	u16 chipid_top; + +	chipid_top = (bus->chipinfo.id & 0xFF00); +	if (chipid_top != 0x4700 && +	    chipid_top != 0x5300) +		return false; + +#ifdef CONFIG_SSB_DRIVER_PCICORE +	if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI) +		return false; +#endif /* CONFIG_SSB_DRIVER_PCICORE */ + +#if 0 +	/* TODO: on BCMA we use address from EROM instead of magic formula */ +	u32 tmp; +	return !mips_busprobe32(tmp, (bus->mmio + +		(pc->core->core_index * BCMA_CORE_SIZE))); +#endif + +	return true; +} + +void bcma_core_pci_init(struct bcma_drv_pci *pc) +{ +	if (bcma_core_pci_is_in_hostmode(pc)) { +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE +		bcma_core_pci_hostmode_init(pc); +#else +		pr_err("Driver compiled without support for hostmode PCI\n"); +#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */ +	} else { +		bcma_core_pci_clientmode_init(pc); +	} +} + +int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core, +			  bool enable) +{ +	struct pci_dev *pdev = pc->core->bus->host_pci; +	u32 coremask, tmp; +	int err; + +	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp); +	if (err) +		goto out; + +	coremask = BIT(core->core_index) << 8; +	if (enable) +		tmp |= coremask; +	else +		tmp &= ~coremask; + +	err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp); + +out: +	return err; +} +EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl);  |