From f93062e72447b4a4a51afbe33ea086ce8c922587 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 19 Jun 2011 17:52:09 +0200 Subject: [PATCH 08/14] bcma: add pci(e) host mode This adds some stub for a pci(e) host controller. This controller is found on some embedded devices to attach other chips. Signed-off-by: Hauke Mehrtens --- drivers/bcma/Kconfig | 6 ++++ drivers/bcma/Makefile | 1 + drivers/bcma/bcma_private.h | 6 ++++ drivers/bcma/driver_pci.c | 14 ++++++++++- drivers/bcma/driver_pci_host.c | 43 ++++++++++++++++++++++++++++++++++ include/linux/bcma/bcma_driver_pci.h | 1 + 6 files changed, 70 insertions(+), 1 deletions(-) create mode 100644 drivers/bcma/driver_pci_host.c --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig @@ -32,6 +32,12 @@ config BCMA_HOST_SOC depends on BCMA_DRIVER_MIPS default n +config BCMA_DRIVER_PCI_HOSTMODE + bool "Hostmode support for BCMA PCI core" + depends on BCMA_DRIVER_MIPS + help + PCIcore hostmode operation (external PCI bus). + config BCMA_DRIVER_MIPS bool "BCMA Broadcom MIPS core driver" depends on BCMA && MIPS --- a/drivers/bcma/Makefile +++ b/drivers/bcma/Makefile @@ -1,6 +1,7 @@ bcma-y += main.o scan.o core.o sprom.o bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o bcma-y += driver_pci.o +bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o --- a/drivers/bcma/bcma_private.h +++ b/drivers/bcma/bcma_private.h @@ -38,6 +38,12 @@ extern int bcma_chipco_serial_init(struc struct bcma_drv_mips_serial_port *ports); #endif /* CONFIG_BCMA_DRIVER_MIPS */ +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE +/* driver_pci_host.c */ +int bcma_core_pci_in_hostmode(struct bcma_drv_pci *pc); +void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc); +#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */ + #ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */ extern int __init bcma_host_pci_init(void); --- a/drivers/bcma/driver_pci.c +++ b/drivers/bcma/driver_pci.c @@ -159,9 +159,21 @@ static void bcma_pcicore_serdes_workarou void bcma_core_pci_init(struct bcma_drv_pci *pc) { + struct bcma_device *core = pc->core; + if (pc->setup_done) return; - bcma_pcicore_serdes_workaround(pc); + + if (!bcma_core_is_enabled(core)) + bcma_core_enable(core, 0); +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE + pc->hostmode = bcma_core_pci_in_hostmode(pc); + if (pc->hostmode) + bcma_core_pci_hostmode_init(pc); +#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */ + if (!pc->hostmode) + bcma_pcicore_serdes_workaround(pc); + pc->setup_done = true; } --- /dev/null +++ b/drivers/bcma/driver_pci_host.c @@ -0,0 +1,43 @@ +/* + * Broadcom specific AMBA + * PCI Host mode + * + * Copyright 2005, Broadcom Corporation + * + * Licensed under the GNU/GPL. See COPYING for details. + */ + +#include "bcma_private.h" +#include + +#include +/* Probe a 32bit value on the bus and catch bus exceptions. + * Returns nonzero on a bus exception. + * This is MIPS specific */ +#define mips_busprobe32(val, addr) get_dbe((val), ((u32 *)(addr))) + + +void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc) +{ + /* TODO: implement PCI host mode */ +} + +int bcma_core_pci_in_hostmode(struct bcma_drv_pci *pc) +{ + struct bcma_bus *bus = pc->core->bus; + u16 chipid_top; + u32 tmp; + + chipid_top = (bus->chipinfo.id & 0xFF00); + if (chipid_top != 0x4700 && + chipid_top != 0x5300) + return 0; + +/* TODO: add when sprom is available + * if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI) + * return 0; + */ + + return !mips_busprobe32(tmp, (bus->mmio + (pc->core->core_index * + BCMA_CORE_SIZE))); +} --- a/include/linux/bcma/bcma_driver_pci.h +++ b/include/linux/bcma/bcma_driver_pci.h @@ -78,6 +78,7 @@ struct pci_dev; struct bcma_drv_pci { struct bcma_device *core; u8 setup_done:1; + u8 hostmode:1; }; /* Register access */