bcma: add arm support Signed-off-by: Hauke Mehrtens --- drivers/bcma/Kconfig | 9 +++++ drivers/bcma/Makefile | 1 + drivers/bcma/driver_arm.c | 61 ++++++++++++++++++++++++++++++++++ drivers/bcma/main.c | 7 ++++ include/linux/bcma/bcma.h | 2 ++ include/linux/bcma/bcma_driver_arm.h | 20 +++++++++++ 6 files changed, 100 insertions(+) create mode 100644 drivers/bcma/driver_arm.c create mode 100644 include/linux/bcma/bcma_driver_arm.h --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig @@ -54,6 +54,15 @@ config BCMA_DRIVER_MIPS If unsure, say N +config BCMA_DRIVER_ARM + bool "BCMA Broadcom ARM core driver" + depends on BCMA && ARM + help + Driver for the Broadcom MIPS core attached to Broadcom specific + Advanced Microcontroller Bus. + + If unsure, say N + config BCMA_SFLASH bool depends on BCMA_DRIVER_MIPS --- a/drivers/bcma/Makefile +++ b/drivers/bcma/Makefile @@ -5,6 +5,7 @@ bcma-$(CONFIG_BCMA_NFLASH) += driver_ch 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_DRIVER_ARM) += driver_arm.o bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o bcma-$(CONFIG_BCMA_DRIVER_GPIO) += driver_gpio.o bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o --- /dev/null +++ b/drivers/bcma/driver_arm.c @@ -0,0 +1,53 @@ +/* + * Broadcom specific AMBA + * Broadcom MIPS32 74K core driver + * + * Copyright 2009, Broadcom Corporation + * Copyright 2006, 2007, Michael Buesch + * Copyright 2010, Bernhard Loos + * Copyright 2011, Hauke Mehrtens + * + * Licensed under the GNU/GPL. See COPYING for details. + */ + +#include "bcma_private.h" + +#include + +static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq, + u16 coreid, u8 unit) +{ + struct bcma_device *core; + + core = bcma_find_core_unit(bus, coreid, unit); + if (!core) { + bcma_warn(bus, + "Can not find core (id: 0x%x, unit %i) for IRQ configuration.\n", + coreid, unit); + return; + } + core->irq = irq; +} + +void bcma_core_arm_init(struct bcma_drv_arm *acore) +{ + struct bcma_bus *bus; + struct bcma_device *core; + bus = acore->core->bus; + + if (acore->setup_done) + return; + + bcma_core_mips_set_irq_name(bus, 111, BCMA_CORE_USB20, 0); + + bcma_core_mips_set_irq_name(bus, 179, BCMA_CORE_MAC_GBIT, 0); + bcma_core_mips_set_irq_name(bus, 180, BCMA_CORE_MAC_GBIT, 1); + bcma_core_mips_set_irq_name(bus, 181, BCMA_CORE_MAC_GBIT, 2); + bcma_core_mips_set_irq_name(bus, 182, BCMA_CORE_MAC_GBIT, 3); + + bcma_core_mips_set_irq_name(bus, 112, BCMA_CORE_USB30, 0); + bcma_debug(bus, "IRQ reconfiguration done\n"); + + + acore->setup_done = true; +} --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c @@ -258,6 +258,13 @@ int bcma_bus_register(struct bcma_bus *b bcma_core_mips_init(&bus->drv_mips); } + /* Init ARM core */ + core = bcma_find_core(bus, BCMA_CORE_ARMCA9); + if (core) { + bus->drv_arm.core = core; + bcma_core_arm_init(&bus->drv_arm); + } + /* Init PCIE core */ core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 0); if (core) { --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include /* SPROM sharing */ @@ -334,6 +335,7 @@ struct bcma_bus { struct bcma_drv_cc drv_cc; struct bcma_drv_pci drv_pci[2]; struct bcma_drv_mips drv_mips; + struct bcma_drv_arm drv_arm; struct bcma_drv_gmac_cmn drv_gmac_cmn; /* We decided to share SPROM struct with SSB as long as we do not need --- /dev/null +++ b/include/linux/bcma/bcma_driver_arm.h @@ -0,0 +1,20 @@ +#ifndef LINUX_BCMA_DRIVER_ARM_H_ +#define LINUX_BCMA_DRIVER_ARM_H_ + +struct bcma_device; + +struct bcma_drv_arm { + struct bcma_device *core; + u8 setup_done:1; + u8 early_setup_done:1; +}; + +#ifdef CONFIG_BCMA_DRIVER_ARM +extern void bcma_core_arm_init(struct bcma_drv_arm *acore); + +#else +static inline void bcma_core_arm_init(struct bcma_drv_arm *acore) { } + +#endif + +#endif /* LINUX_BCMA_DRIVER_ARM_H_ */