bcma: add support for embedded devices like bcm4716
Subsystems (4)
Hauke Mehrtens
maintainerv3 cover bcma: add support for embedded devices like bcm4716
This patch series adds support for embedded devices like bcm47xx to bcma. Bcma is used on bcm4716 and bcm4718 SoCs as the system bus and replaced ssb used on older devices. With these patches my bcm4716 device boots up till it tries to access the flash, because the serial flash chip is unsupported for now, this will be my next task. This adds support for MIPS cores, interrupt configuration and the serial console.
These patches are not containing all functions needed to get the SoC to fully work and support every feature, but it is a good start. These patches are now integrated in OpenWrt for everyone how wants to test them.
This was tested with a BCM4704 device (SoC with ssb bus), a BCM4716 device and a pcie wireless card supported by bcma.
@John could you please merge this into wireless-testing. I hope Ralf is fine with it when some MIPS bits will go through wireless. This will make it much easier for Linus to merge wireless-testing and the mips tree together as there are many other changes for bcma in wireless- testing.
PATCH v3:
* rebase on wireless-testing master-2011-07-22-2
* remove BCMA_HOSTTYPE_NONE
* add Acked-by Rafa?
* rename bcm47xx_active_bus_type to bcm47xx_bus_type
* set core->dev.dma_mask and core->dma_dev for SoC
* fix comment
PATCH v2:
* define inline function bcma_core_mips_init() if mips driver is not build
* iounmap core->io_wrap and core->io_addr after it was used.
* update bcma based on new braodcom driver code
* add workaround for 5357b0
* move flash informations into own struct and store it in chipcommon.
When adding serial flash support it will be in chipcommon and then all flash structs should be there.
* some changes to bcma_chipco_serial_init()
* some changes are done after looking into a more recent version of broadcom driver.
* changes suggested by Jonas
* serial struct is in chipcommon as it is accessed through chipcommon.
* use bcma_pmu_alp_clock() to get the clock.
* cpu clock: add detection support for some newer SoCs.
PATCH v1:
* rebased on mips tree (mips/queue)
* drop pcie hostmode patch as Rafa? sent a better patch to wireless mailing list
* drop sprom patch because sprom is not supported in bcma version from mips tree, I will send a separate patch to wireless mailing list.
* fix compilation of arch/mips/bcm47xx/wgt634u.c
* fix texts in arch/mips/bcm47xx/Kconfig
RFC v3:
* make bcm47xx built either with bcma, ssb or both and use mips MIPS 74K optimizations if possible
* add block io support
* some minor fixes for code and doku
RFC v2:
* use list and no arry to store cores
* rename bcma_host_bcma_ to bcma_host_soc_
* use core->io_addr and core->io_wrap to access cores
* checkpatch fixes
* some minor fixes
Hauke Mehrtens (11):
bcma: move parsing of EEPROM into own function.
bcma: move initializing of struct bcma_bus to own function.
bcma: add functions to scan cores needed on SoCs
bcma: add SOC bus
bcma: add mips driver
bcma: add serial console support
bcma: get CPU clock
bcm47xx: prepare to support different buses
bcm47xx: make it possible to build bcm47xx without ssb.
bcm47xx: add support for bcma bus
bcm47xx: fix irq assignment for new SoCs.
arch/mips/Kconfig | 8 +- arch/mips/bcm47xx/Kconfig | 31 +++ arch/mips/bcm47xx/Makefile | 3 +- arch/mips/bcm47xx/gpio.c | 82 +++++-- arch/mips/bcm47xx/irq.c | 12 + arch/mips/bcm47xx/nvram.c | 29 ++- arch/mips/bcm47xx/serial.c | 46 ++++- arch/mips/bcm47xx/setup.c | 90 ++++++- arch/mips/bcm47xx/time.c | 16 +- arch/mips/bcm47xx/wgt634u.c | 14 +- arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 26 ++- arch/mips/include/asm/mach-bcm47xx/gpio.h | 108 +++++++-- arch/mips/pci/pci-bcm47xx.c | 6 + drivers/bcma/Kconfig | 13 + drivers/bcma/Makefile | 2 + drivers/bcma/bcma_private.h | 16 ++ drivers/bcma/core.c | 2 + drivers/bcma/driver_chipcommon.c | 53 ++++ drivers/bcma/driver_chipcommon_pmu.c | 133 ++++++++++ drivers/bcma/driver_mips.c | 256 +++++++++++++++++++ drivers/bcma/driver_pci.c | 14 +- drivers/bcma/host_soc.c | 183 ++++++++++++++ drivers/bcma/main.c | 70 +++++- drivers/bcma/scan.c | 348 ++++++++++++++++++-------- drivers/watchdog/bcm47xx_wdt.c | 27 ++- include/linux/bcma/bcma.h | 9 +- include/linux/bcma/bcma_driver_chipcommon.h | 67 +++++ include/linux/bcma/bcma_driver_mips.h | 51 ++++ include/linux/bcma/bcma_soc.h | 16 ++ 29 files changed, 1549 insertions(+), 182 deletions(-) create mode 100644 arch/mips/bcm47xx/Kconfig create mode 100644 drivers/bcma/driver_mips.c create mode 100644 drivers/bcma/host_soc.c create mode 100644 include/linux/bcma/bcma_driver_mips.h create mode 100644 include/linux/bcma/bcma_soc.h
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 1/11 bcma: move parsing of EEPROM into own function.
Move the parsing of the EEPROM data in scan function for one core into an own function. Now we are able to use it in some other scan function as well.
--- drivers/bcma/scan.c | 230 ++++++++++++++++++++++++++------------------------- 1 files changed, 118 insertions(+), 112 deletions(-)
drivers/bcma/scan.c +118 -112
@@ -200,16 +200,124 @@ static s32 bcma_erom_get_addr_desc(struct bcma_bus *bus, u32 **eromptr,return addrl; } +static int bcma_get_next_core (struct bcma_bus *bus,u32 __iomem **eromptr, +struct bcma_device *core) +{ +s32 tmp; +u8 i, j; +s32 cia, cib; +u8 ports[2 ], wrappers[2 ]; + +/* get CIs */ + cia =bcma_erom_get_ci (bus, eromptr); +if (cia <0 ) { +bcma_erom_push_ent (eromptr); +if (bcma_erom_is_end (bus, eromptr)) +return -ESPIPE ; +return -EILSEQ ; + } + cib =bcma_erom_get_ci (bus, eromptr); +if (cib <0 ) +return -EILSEQ ; + +/* parse CIs */ + core->id.class = (cia &SCAN_CIA_CLASS ) >>SCAN_CIA_CLASS_SHIFT ; + core->id.id = (cia &SCAN_CIA_ID ) >>SCAN_CIA_ID_SHIFT ; + core->id.manuf = (cia &SCAN_CIA_MANUF ) >>SCAN_CIA_MANUF_SHIFT ; + ports[0 ] = (cib &SCAN_CIB_NMP ) >>SCAN_CIB_NMP_SHIFT ; + ports[1 ] = (cib &SCAN_CIB_NSP ) >>SCAN_CIB_NSP_SHIFT ; + wrappers[0 ] = (cib &SCAN_CIB_NMW ) >>SCAN_CIB_NMW_SHIFT ; + wrappers[1 ] = (cib &SCAN_CIB_NSW ) >>SCAN_CIB_NSW_SHIFT ; + core->id.rev = (cib &SCAN_CIB_REV ) >>SCAN_CIB_REV_SHIFT ; + +if (((core->id.manuf ==BCMA_MANUF_ARM ) && + (core->id.id ==0xFFF )) || + (ports[1 ] ==0 )) { +bcma_erom_skip_component (bus, eromptr); +return -ENXIO ; + } + +/* check if component is a core at all */ +if (wrappers[0 ] + wrappers[1 ] ==0 ) { +/* we could save addrl of the router +if (cid == BCMA_CORE_OOB_ROUTER) +*/ +bcma_erom_skip_component (bus, eromptr); +return -ENXIO ; + } + +if (bcma_erom_is_bridge (bus, eromptr)) { +bcma_erom_skip_component (bus, eromptr); +return -ENXIO ; + } + +/* get & parse master ports */ +for (i =0 ; i < ports[0 ]; i++) { +u32 mst_port_d =bcma_erom_get_mst_port (bus, eromptr); +if (mst_port_d <0 ) +return -EILSEQ ; + } + +/* get & parse slave ports */ +for (i =0 ; i < ports[1 ]; i++) { +for (j =0 ; ; j++) { + tmp =bcma_erom_get_addr_desc (bus, eromptr, +SCAN_ADDR_TYPE_SLAVE , i); +if (tmp <0 ) { +/* no more entries for port _i_ */ +/* pr_debug("erom: slave port %d " +* "has %d descriptors\n", i, j); */ +break ; + }else { +if (i ==0 && j ==0 ) + core->addr = tmp; + } + } + } + +/* get & parse master wrappers */ +for (i =0 ; i < wrappers[0 ]; i++) { +for (j =0 ; ; j++) { + tmp =bcma_erom_get_addr_desc (bus, eromptr, +SCAN_ADDR_TYPE_MWRAP , i); +if (tmp <0 ) { +/* no more entries for port _i_ */ +/* pr_debug("erom: master wrapper %d " +* "has %d descriptors\n", i, j); */ +break ; + }else { +if (i ==0 && j ==0 ) + core->wrap = tmp; + } + } + } + +/* get & parse slave wrappers */ +for (i =0 ; i < wrappers[1 ]; i++) { +u8 hack = (ports[1 ] ==1 ) ?0 :1 ; +for (j =0 ; ; j++) { + tmp =bcma_erom_get_addr_desc (bus, eromptr, +SCAN_ADDR_TYPE_SWRAP , i + hack); +if (tmp <0 ) { +/* no more entries for port _i_ */ +/* pr_debug("erom: master wrapper %d " +* has %d descriptors\n", i, j); */ +break ; + }else { +if (wrappers[0 ] ==0 && !i && !j) + core->wrap = tmp; + } + } + } +return 0 ; +} +int bcma_bus_scan (struct bcma_bus *bus) {u32 erombase;u32 __iomem *eromptr, *eromend; -s32 cia, cib; -u8 ports[2 ], wrappers[2 ]; -s32 tmp; -u8 i, j;int err;
@@ -236,112 +344,13 @@ int bcma_bus_scan(struct bcma_bus *bus)INIT_LIST_HEAD (&core->list); core->bus = bus; -/* get CIs */ - cia =bcma_erom_get_ci (bus, &eromptr); -if (cia <0 ) { -bcma_erom_push_ent (&eromptr); -if (bcma_erom_is_end (bus, &eromptr)) -break ; - err= -EILSEQ ; - goto out; - } - cib =bcma_erom_get_ci (bus, &eromptr); -if (cib <0 ) { - err= -EILSEQ ; - goto out; - } - -/* parse CIs */ - core->id.class = (cia &SCAN_CIA_CLASS ) >>SCAN_CIA_CLASS_SHIFT ; - core->id.id = (cia &SCAN_CIA_ID ) >>SCAN_CIA_ID_SHIFT ; - core->id.manuf = (cia &SCAN_CIA_MANUF ) >>SCAN_CIA_MANUF_SHIFT ; - ports[0 ] = (cib &SCAN_CIB_NMP ) >>SCAN_CIB_NMP_SHIFT ; - ports[1 ] = (cib &SCAN_CIB_NSP ) >>SCAN_CIB_NSP_SHIFT ; - wrappers[0 ] = (cib &SCAN_CIB_NMW ) >>SCAN_CIB_NMW_SHIFT ; - wrappers[1 ] = (cib &SCAN_CIB_NSW ) >>SCAN_CIB_NSW_SHIFT ; - core->id.rev = (cib &SCAN_CIB_REV ) >>SCAN_CIB_REV_SHIFT ; - -if (((core->id.manuf ==BCMA_MANUF_ARM ) && - (core->id.id ==0xFFF )) || - (ports[1 ] ==0 )) { -bcma_erom_skip_component (bus, &eromptr); -continue ; - } - -/* check if component is a core at all */ -if (wrappers[0 ] + wrappers[1 ] ==0 ) { -/* we could save addrl of the router -if (cid == BCMA_CORE_OOB_ROUTER) -*/ -bcma_erom_skip_component (bus, &eromptr); -continue ; - } - -if (bcma_erom_is_bridge (bus, &eromptr)) { -bcma_erom_skip_component (bus, &eromptr); + err =bcma_get_next_core (bus, &eromptr, core); +if (err == -ENXIO )continue ; - } - -/* get & parse master ports */ -for (i =0 ; i < ports[0 ]; i++) { -u32 mst_port_d =bcma_erom_get_mst_port (bus, &eromptr); -if (mst_port_d <0 ) { - err= -EILSEQ ; - goto out; - } - } - -/* get & parse slave ports */ -for (i =0 ; i < ports[1 ]; i++) { -for (j =0 ; ; j++) { - tmp =bcma_erom_get_addr_desc (bus, &eromptr, -SCAN_ADDR_TYPE_SLAVE , i); -if (tmp <0 ) { -/* no more entries for port _i_ */ -/* pr_debug("erom: slave port %d " -* "has %d descriptors\n", i, j); */ -break ; - }else { -if (i ==0 && j ==0 ) - core->addr = tmp; - } - } - } - -/* get & parse master wrappers */ -for (i =0 ; i < wrappers[0 ]; i++) { -for (j =0 ; ; j++) { - tmp =bcma_erom_get_addr_desc (bus, &eromptr, -SCAN_ADDR_TYPE_MWRAP , i); -if (tmp <0 ) { -/* no more entries for port _i_ */ -/* pr_debug("erom: master wrapper %d " -* "has %d descriptors\n", i, j); */ -break ; - }else { -if (i ==0 && j ==0 ) - core->wrap = tmp; - } - } - } - -/* get & parse slave wrappers */ -for (i =0 ; i < wrappers[1 ]; i++) { -u8 hack = (ports[1 ] ==1 ) ?0 :1 ; -for (j =0 ; ; j++) { - tmp =bcma_erom_get_addr_desc (bus, &eromptr, -SCAN_ADDR_TYPE_SWRAP , i + hack); -if (tmp <0 ) { -/* no more entries for port _i_ */ -/* pr_debug("erom: master wrapper %d " -* has %d descriptors\n", i, j); */ -break ; - }else { -if (wrappers[0 ] ==0 && !i && !j) - core->wrap = tmp; - } - } - } +else if (err == -ESPIPE ) +break ; +else if (err <0 ) +return err; pr_info("Core %d found: %s " "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
@@ -351,9 +360,6 @@ int bcma_bus_scan(struct bcma_bus *bus) core->core_index = bus->nr_cores++;list_add (&core->list, &bus->cores); -continue ; -out: -return err; }return 0 ;
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 2/11 bcma: move initializing of struct bcma_bus to own function.
In reply to Hauke MehrtensThis makes it possible to use this code in some other method.
--- drivers/bcma/scan.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-)
drivers/bcma/scan.c +11 -6
@@ -312,15 +312,10 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,return 0 ; } -int bcma_bus_scan (struct bcma_bus *bus) +static void bcma_init_bus (struct bcma_bus *bus) { -u32 erombase; -u32 __iomem *eromptr, *eromend; -s32 tmp; -int err; -INIT_LIST_HEAD (&bus->cores); bus->nr_cores =0 ;
@@ -330,6 +325,16 @@ int bcma_bus_scan(struct bcma_bus *bus) bus->chipinfo.id = (tmp &BCMA_CC_ID_ID ) >>BCMA_CC_ID_ID_SHIFT ; bus->chipinfo.rev = (tmp &BCMA_CC_ID_REV ) >>BCMA_CC_ID_REV_SHIFT ; bus->chipinfo.pkg = (tmp &BCMA_CC_ID_PKG ) >>BCMA_CC_ID_PKG_SHIFT ; +} + +int bcma_bus_scan (struct bcma_bus *bus) +{ +u32 erombase; +u32 __iomem *eromptr, *eromend; + +int err; + +bcma_init_bus (bus); erombase =bcma_scan_read32 (bus,0 ,BCMA_CC_EROM ); eromptr = bus->mmio;
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 3/11 bcma: add functions to scan cores needed on SoCs
In reply to Hauke MehrtensThe chip common and mips core have to be setup early in the boot process to get the cpu clock.bcma_bus_early_register() gets pointers to some space to store the core data and searches for the chip common and mips core and initializes chip common. After that was done and the kernel is out of early boot we just have to run bcma_bus_register() and it will search for the other cores, initialize and register them.
The cores are getting the same numbers as before.
--- drivers/bcma/bcma_private.h | 7 ++ drivers/bcma/driver_chipcommon.c | 5 ++ drivers/bcma/driver_pci.c | 5 ++ drivers/bcma/main.c | 46 +++++++++++++ drivers/bcma/scan.c | 95 +++++++++++++++++++++++++-- include/linux/bcma/bcma.h | 1 + include/linux/bcma/bcma_driver_chipcommon.h | 1 + 7 files changed, 154 insertions(+), 6 deletions(-)
drivers/bcma/bcma_private.h +7 -0
@@ -15,9 +15,16 @@ struct bcma_bus;/* main.c */ int bcma_bus_register (struct bcma_bus *bus);void bcma_bus_unregister (struct bcma_bus *bus); +int __init bcma_bus_early_register (struct bcma_bus *bus, +struct bcma_device *core_cc, +struct bcma_device *core_mips);/* scan.c */ int bcma_bus_scan (struct bcma_bus *bus); +int __init bcma_bus_scan_early (struct bcma_bus *bus, +struct bcma_device_id *match, +struct bcma_device *core); +void bcma_init_bus (struct bcma_bus *bus);/* sprom.c */ int bcma_sprom_get (struct bcma_bus *bus);
drivers/bcma/driver_chipcommon.c +5 -0
@@ -26,6 +26,9 @@ void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)u32 leddc_on =10 ;u32 leddc_off =90 ; +if (cc->setup_done) +return ; +if (cc->core->id.rev >=11 ) cc->status =bcma_cc_read32 (cc,BCMA_CC_CHIPSTAT ); cc->capabilities =bcma_cc_read32 (cc,BCMA_CC_CAP );
@@ -52,6 +55,8 @@ void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) ((leddc_on <<BCMA_CC_GPIOTIMER_ONTIME_SHIFT ) | (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); } + + cc->setup_done = true; }/* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
drivers/bcma/driver_pci.c +5 -0
@@ -187,6 +187,9 @@ static bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)void bcma_core_pci_init (struct bcma_drv_pci *pc) { +if (pc->setup_done) +return ; +if (bcma_core_pci_is_in_hostmode (pc)) {#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE bcma_core_pci_hostmode_init (pc);
@@ -196,6 +199,8 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc) }else {bcma_core_pci_clientmode_init (pc); } + + pc->setup_done = true; } int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
drivers/bcma/main.c +46 -0
52 lines not on this page · raw message
drivers/bcma/scan.c +89 -6
148 lines not on this page · raw message
include/linux/bcma/bcma.h +1 -0
@@ -190,6 +190,7 @@ struct bcma_bus {struct bcma_device *mapped_core;struct list_head cores;u8 nr_cores; + u8 init_done:1;struct bcma_drv_cc drv_cc;struct bcma_drv_pci drv_pci;
include/linux/bcma/bcma_driver_chipcommon.h +1 -0
@@ -252,6 +252,7 @@ struct bcma_drv_cc {u32 status;u32 capabilities;u32 capabilities_ext; + u8 setup_done:1;/* Fast Powerup Delay constant */ u16 fast_pwrup_delay;struct bcma_chipcommon_pmu pmu;
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 4/11 bcma: add SOC bus
In reply to Hauke MehrtensThis patch adds support for using bcma on a Broadcom SoC as the system bus. An SoC like the bcm4716 could register this bus and use it to searches for the bcma cores and register the devices on this bus.
BCMA_HOSTTYPE_NONE was intended for SoCs at first but BCMA_HOSTTYPE_SOC is a better name.
--- drivers/bcma/Kconfig | 4 + drivers/bcma/Makefile | 1 + drivers/bcma/core.c | 2 + drivers/bcma/driver_pci.c | 9 ++- drivers/bcma/host_soc.c | 183 +++++++++++++++++++++++++++++++++++++++++ drivers/bcma/main.c | 9 ++- drivers/bcma/scan.c | 42 ++++++++- include/linux/bcma/bcma.h | 5 +- include/linux/bcma/bcma_soc.h | 16 ++++ 9 files changed, 263 insertions(+), 8 deletions(-) create mode 100644 drivers/bcma/host_soc.c create mode 100644 include/linux/bcma/bcma_soc.h
drivers/bcma/Kconfig +4 -0
@@ -33,6 +33,10 @@ config BCMA_DRIVER_PCI_HOSTMODE help PCI core hostmode operation (external PCI bus). +config BCMA_HOST_SOC + bool + depends on BCMA && MIPS + config BCMA_DEBUG bool "BCMA debugging" depends on BCMA
drivers/bcma/Makefile +1 -0
@@ -3,6 +3,7 @@ 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_HOST_PCI) += host_pci.o +bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o obj-$(CONFIG_BCMA) += bcma.o ccflags-$(CONFIG_BCMA_DEBUG) := -DDEBUG
drivers/bcma/core.c +2 -0
@@ -110,6 +110,8 @@ EXPORT_SYMBOL_GPL(bcma_core_pll_ctl);u32 bcma_core_dma_translation (struct bcma_device *core) {switch (core->bus->hosttype) { +case BCMA_HOSTTYPE_SOC : +return 0 ;case BCMA_HOSTTYPE_PCI :if (bcma_aread32 (core,BCMA_IOST ) &BCMA_IOST_DMA64 )return BCMA_DMA_TRANSLATION_DMA64_CMT ;
drivers/bcma/driver_pci.c +8 -1
@@ -208,7 +208,14 @@ int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core, {struct pci_dev *pdev = pc->core->bus->host_pci;u32 coremask, tmp; -int err; +int err =0 ; + +if (core->bus->hosttype !=BCMA_HOSTTYPE_PCI ) { +/* This bcma device is not on a PCI host-bus. So the IRQs are +* not routed through the PCI core. +* So we must not enable routing through the PCI core. */ + goto out; + } err =pci_read_config_dword (pdev,BCMA_PCI_IRQMASK , &tmp);if (err)
drivers/bcma/host_soc.c new file +183 -0
183 lines not on this page · raw message
drivers/bcma/main.c +8 -1
@@ -66,6 +66,10 @@ static struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)static void bcma_release_core_dev (struct device *dev) { struct bcma_device *core = container_of(dev, struct bcma_device, dev); +if (core->io_addr) +iounmap (core->io_addr); +if (core->io_wrap) +iounmap (core->io_wrap);kfree (core); }
@@ -93,7 +97,10 @@ static int bcma_register_cores(struct bcma_bus *bus) core->dma_dev = &bus->host_pci->dev; core->irq = bus->host_pci->irq;break ; -case BCMA_HOSTTYPE_NONE : +case BCMA_HOSTTYPE_SOC : + core->dev.dma_mask = &core->dev.coherent_dma_mask; + core->dma_dev = &core->dev; +break ;case BCMA_HOSTTYPE_SDIO :break ; }
drivers/bcma/scan.c +37 -5
74 lines not on this page · raw message
include/linux/bcma/bcma.h +4 -1
@@ -14,9 +14,9 @@ struct bcma_device;struct bcma_bus ;enum bcma_hosttype { -BCMA_HOSTTYPE_NONE ,BCMA_HOSTTYPE_PCI ,BCMA_HOSTTYPE_SDIO , +BCMA_HOSTTYPE_SOC , };struct bcma_chipinfo {
@@ -138,6 +138,9 @@ struct bcma_device {u32 addr;u32 wrap; +void __iomem *io_addr; +void __iomem *io_wrap; +void *drvdata;struct list_head list; };
include/linux/bcma/bcma_soc.h new file +16 -0
@@ -0,0 +1,16 @@ +#ifndef LINUX_BCMA_SOC_H_ +#define LINUX_BCMA_SOC_H_ + +#include <linux/bcma/bcma.h> + +struct bcma_soc { +struct bcma_bus bus; +struct bcma_device core_cc; +struct bcma_device core_mips; +}; + +int __init bcma_host_soc_register (struct bcma_soc *soc); + +int bcma_bus_register (struct bcma_bus *bus); + +#endif /* LINUX_BCMA_SOC_H_ */
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 5/11 bcma: add mips driver
In reply to Hauke MehrtensThis adds a mips driver to bcma. This is only found on embedded devices. For now the driver just initializes the irqs used on this system.
--- drivers/bcma/Kconfig | 9 + drivers/bcma/Makefile | 1 + drivers/bcma/driver_mips.c | 243 +++++++++++++++++++++++++++ drivers/bcma/main.c | 15 ++ include/linux/bcma/bcma.h | 3 + include/linux/bcma/bcma_driver_chipcommon.h | 13 ++ include/linux/bcma/bcma_driver_mips.h | 49 ++++++ 7 files changed, 333 insertions(+), 0 deletions(-) create mode 100644 drivers/bcma/driver_mips.c create mode 100644 include/linux/bcma/bcma_driver_mips.h
drivers/bcma/Kconfig +9 -0
@@ -35,7 +35,16 @@ config BCMA_DRIVER_PCI_HOSTMODE config BCMA_HOST_SOC bool + depends on BCMA_DRIVER_MIPS + +config BCMA_DRIVER_MIPS + bool "BCMA Broadcom MIPS core driver" depends on BCMA && MIPS + help + Driver for the Broadcom MIPS core attached to Broadcom specific + Advanced Microcontroller Bus. + + If unsure, say N config BCMA_DEBUG bool "BCMA debugging"
drivers/bcma/Makefile +1 -0
@@ -2,6 +2,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 obj-$(CONFIG_BCMA) += bcma.o
drivers/bcma/driver_mips.c new file +243 -0
243 lines not on this page · raw message
drivers/bcma/main.c +15 -0
@@ -84,6 +84,7 @@ static int bcma_register_cores(struct bcma_bus *bus)case BCMA_CORE_CHIPCOMMON :case BCMA_CORE_PCI :case BCMA_CORE_PCIE : +case BCMA_CORE_MIPS_74K :continue ; }
@@ -147,6 +148,13 @@ int bcma_bus_register(struct bcma_bus *bus)bcma_core_chipcommon_init (&bus->drv_cc); } +/* Init MIPS core */ + core =bcma_find_core (bus,BCMA_CORE_MIPS_74K ); +if (core) { + bus->drv_mips.core = core; +bcma_core_mips_init (&bus->drv_mips); + } +/* Init PCIE core */ core =bcma_find_core (bus,BCMA_CORE_PCIE );if (core) {
@@ -217,6 +225,13 @@ int __init bcma_bus_early_register(struct bcma_bus *bus,bcma_core_chipcommon_init (&bus->drv_cc); } +/* Init MIPS core */ + core =bcma_find_core (bus,BCMA_CORE_MIPS_74K ); +if (core) { + bus->drv_mips.core = core; +bcma_core_mips_init (&bus->drv_mips); + } +pr_info ("Early bus registered\n" );return 0 ;
include/linux/bcma/bcma.h +3 -0
@@ -6,6 +6,7 @@#include <linux/bcma/bcma_driver_chipcommon.h> #include <linux/bcma/bcma_driver_pci.h> +#include <linux/bcma/bcma_driver_mips.h> #include <linux/ssb/ssb.h> /* SPROM sharing */ #include "bcma_regs.h"
@@ -130,6 +131,7 @@ struct bcma_device {struct device dev;struct device *dma_dev; +unsigned int irq;bool dev_registered;
@@ -197,6 +199,7 @@ struct bcma_bus {struct bcma_drv_cc drv_cc;struct bcma_drv_pci drv_pci; +struct bcma_drv_mips drv_mips;/* We decided to share SPROM struct with SSB as long as we do not need * any hacks for BCMA. This simplifies drivers code. */
include/linux/bcma/bcma_driver_chipcommon.h +13 -0
@@ -24,6 +24,7 @@#define BCMA_CC_FLASHT_NONE 0x00000000/* No flash */ #define BCMA_CC_FLASHT_STSER 0x00000100/* ST serial flash */ #define BCMA_CC_FLASHT_ATSER 0x00000200/* Atmel serial flash */ +#define BCMA_CC_FLASHT_NFLASH 0x00000200#define BCMA_CC_FLASHT_PARA 0x00000700/* Parallel flash */ #define BCMA_CC_CAP_PLLT 0x00038000/* PLL Type */ #define BCMA_PLLTYPE_NONE 0x00000000
@@ -178,6 +179,7 @@#define BCMA_CC_PROG_CFG 0x0120#define BCMA_CC_PROG_WAITCNT 0x0124#define BCMA_CC_FLASH_CFG 0x0128 +#define BCMA_CC_FLASH_CFG_DS 0x0010/* Data size, 0=8bit, 1=16bit */ #define BCMA_CC_FLASH_WAITCNT 0x012C/* 0x1E0 is defined as shared BCMA_CLKCTLST */ #define BCMA_CC_HW_WORKAROUND 0x01E4/* Hardware workaround (rev >= 20) */
@@ -247,6 +249,14 @@ struct bcma_chipcommon_pmu {u32 crystalfreq;/* The active crystal frequency (in kHz) */ }; +#ifdef CONFIG_BCMA_DRIVER_MIPS +struct bcma_pflash { +u8 buswidth; +u32 window; +u32 window_size; +}; +#endif /* CONFIG_BCMA_DRIVER_MIPS */ +struct bcma_drv_cc {struct bcma_device *core;u32 status;
@@ -256,6 +266,9 @@ struct bcma_drv_cc {/* Fast Powerup Delay constant */ u16 fast_pwrup_delay;struct bcma_chipcommon_pmu pmu; +#ifdef CONFIG_BCMA_DRIVER_MIPS +struct bcma_pflash pflash; +#endif /* CONFIG_BCMA_DRIVER_MIPS */ };/* Register access */
include/linux/bcma/bcma_driver_mips.h new file +49 -0
49 lines not on this page · raw message
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 6/11 bcma: add serial console support
In reply to Hauke MehrtensThis adds support for serial console to bcma, when operating on an SoC.
--- drivers/bcma/bcma_private.h | 8 ++++ drivers/bcma/driver_chipcommon.c | 48 +++++++++++++++++++++++++++ drivers/bcma/driver_chipcommon_pmu.c | 26 ++++++++++++++ drivers/bcma/driver_mips.c | 1 + include/linux/bcma/bcma_driver_chipcommon.h | 14 ++++++++ 5 files changed, 97 insertions(+), 0 deletions(-)
drivers/bcma/bcma_private.h +8 -0
@@ -29,6 +29,14 @@ void bcma_init_bus(struct bcma_bus *bus);/* sprom.c */ int bcma_sprom_get (struct bcma_bus *bus); +/* driver_chipcommon.c */ +#ifdef CONFIG_BCMA_DRIVER_MIPS +void bcma_chipco_serial_init (struct bcma_drv_cc *cc); +#endif /* CONFIG_BCMA_DRIVER_MIPS */ + +/* driver_chipcommon_pmu.c */ +u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc); +#ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */ extern int __init bcma_host_pci_init (void );
drivers/bcma/driver_chipcommon.c +48 -0
51 lines not on this page · raw message
drivers/bcma/driver_chipcommon_pmu.c +26 -0
@@ -136,3 +136,29 @@ void bcma_pmu_init(struct bcma_drv_cc *cc)bcma_pmu_swreg_init (cc);bcma_pmu_workarounds (cc); } + +u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc) +{ +struct bcma_bus *bus = cc->core->bus; + +switch (bus->chipinfo.id) { +case 0x4716 : +case 0x4748 : +case 47162 : +case 0x4313 : +case 0x5357 : +case 0x4749 : +case 53572 : +/* always 20Mhz */ +return 20000 *1000 ; +case 0x5356 : +case 0x5300 : +/* always 25Mhz */ +return 25000 *1000 ; +default : +pr_warn ("No ALP clock specified for %04X device, " +"pmu rev. %d, using default %d Hz\n" , + bus->chipinfo.id, cc->pmu.rev,BCMA_CC_PMU_ALP_CLOCK ); + } +return BCMA_CC_PMU_ALP_CLOCK ; +}
drivers/bcma/driver_mips.c +1 -0
@@ -238,6 +238,7 @@ void bcma_core_mips_init(struct bcma_drv_mips *mcore)if (mcore->setup_done)return ; +bcma_chipco_serial_init (&bus->drv_cc);bcma_core_mips_flash_detect (mcore); mcore->setup_done = true; }
include/linux/bcma/bcma_driver_chipcommon.h +14 -0
@@ -241,6 +241,9 @@#define BCMA_CC_SPROM 0x0800/* SPROM beginning */ #define BCMA_CC_SPROM_PCIE6 0x0830/* SPROM beginning on PCIe rev >= 6 */ +/* ALP clock on pre-PMU chips */ +#define BCMA_CC_PMU_ALP_CLOCK 20000000 +/* Data for the PMU, if available. * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) */
@@ -255,6 +258,14 @@ struct bcma_pflash {u32 window;u32 window_size; }; + +struct bcma_serial_port { +void *regs; +unsigned long clockspeed; +unsigned int irq; +unsigned int baud_base; +unsigned int reg_shift; +};#endif /* CONFIG_BCMA_DRIVER_MIPS */ struct bcma_drv_cc {
@@ -268,6 +279,9 @@ struct bcma_drv_cc {struct bcma_chipcommon_pmu pmu;#ifdef CONFIG_BCMA_DRIVER_MIPS struct bcma_pflash pflash; + +int nr_serial_ports; +struct bcma_serial_port serial_ports[4 ];#endif /* CONFIG_BCMA_DRIVER_MIPS */ };
Signature · 1 line
1.7.4.1
Rafał Miłecki
maintainerPATCH 6/11 bcma: add serial console support
2011/7/23 Hauke Mehrtens <[email protected]>:
Quoted 27 lines
This adds support for serial console to bcma, when operating on an SoC.
Signed-off-by Hauke Mehrtens <[email protected]>---
?drivers/bcma/bcma_private.h ? ? ? ? ? ? ? ? | ? ?8 ++++ ?drivers/bcma/driver_chipcommon.c ? ? ? ? ? ?| ? 48 +++++++++++++++++++++++++++ ?drivers/bcma/driver_chipcommon_pmu.c ? ? ? ?| ? 26 ++++++++++++++ ?drivers/bcma/driver_mips.c ? ? ? ? ? ? ? ? ?| ? ?1 + ?include/linux/bcma/bcma_driver_chipcommon.h | ? 14 ++++++++?5 files changed, 97 insertions(+), 0 deletions(-)
drivers/bcma/bcma_private.h +0
-0@@ -29,6 +29,14 @@ void bcma_init_bus(struct bcma_bus *bus);?/*
sprom.c*/
?intbcma_sprom_get(struct bcma_bus *bus);drivers/bcma/bcma_private.h +8
-0+/* driver_chipcommon.c */ +#ifdef CONFIG_BCMA_DRIVER_MIPS +void bcma_chipco_serial_init (struct bcma_drv_cc *cc); +#endif /* CONFIG_BCMA_DRIVER_MIPS */ + +/* driver_chipcommon_pmu.c */ +u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc); +
Quoted 3 lines
?#ifdef
CONFIG_BCMA_HOST_PCI
?/*host_pci.c*/
?extern int__initbcma_host_pci_init(void);
Not sure, what do you think about this, feel free to comment.
My idea was to use bcma_private.h for bcma-internal functions. For example, support for PCI host or SoC host, is something "internal" (as I call it) for bcma. Drivers in theory could be separated modules and I use include/linux/bcma/driver_*.h for them.
If following this schema, declarations of bcma_pmu_alp_clockbcma_host_pci_init
should be in include/linux/bcma/bcma_driver_chipcommon.h
Signature · 1 line
Rafa?
Rafał Miłecki
maintainerPATCH 6/11 bcma: add serial console support
W dniu 29 lipca 2011 23:04 u?ytkownik Rafa? Mi?ecki <[email protected]> napisa?:
Quoted 39 lines
2011/7/23 Hauke Mehrtens <[email protected]>:
Quoted 27 lines
This adds support for serial console to bcma, when operating on an SoC.
Signed-off-by Hauke Mehrtens <[email protected]>---
?drivers/bcma/bcma_private.h ? ? ? ? ? ? ? ? | ? ?8 ++++ ?drivers/bcma/driver_chipcommon.c ? ? ? ? ? ?| ? 48 +++++++++++++++++++++++++++ ?drivers/bcma/driver_chipcommon_pmu.c ? ? ? ?| ? 26 ++++++++++++++ ?drivers/bcma/driver_mips.c ? ? ? ? ? ? ? ? ?| ? ?1 + ?include/linux/bcma/bcma_driver_chipcommon.h | ? 14 ++++++++?5 files changed, 97 insertions(+), 0 deletions(-)
drivers/bcma/bcma_private.h +0
-0@@ -29,6 +29,14 @@ void bcma_init_bus(struct bcma_bus *bus);?/*
sprom.c*/
?intbcma_sprom_get(struct bcma_bus *bus);drivers/bcma/bcma_private.h +8
-0+/* driver_chipcommon.c */ +#ifdef CONFIG_BCMA_DRIVER_MIPS +void bcma_chipco_serial_init (struct bcma_drv_cc *cc); +#endif /* CONFIG_BCMA_DRIVER_MIPS */ + +/* driver_chipcommon_pmu.c */ +u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc); +Quoted 3 lines
?#ifdef
CONFIG_BCMA_HOST_PCI
?/*host_pci.c*/
?extern int__initbcma_host_pci_init(void);Not sure, what do you think about this, feel free to comment.
My idea was to use
bcma_private.hfor bcma-internal functions. For example, support for PCI host or SoC host, is something "internal" (as I call it) for bcma. Drivers in theory could be separated modules and I useinclude/linux/bcma/driver_*.hfor them.
Quoted 4 lines
If following this schema, declarations of
bcma_pmu_alp_clockbcma_host_pci_init
should be ininclude/linux/bcma/bcma_driver_chipcommon.h
Same goes to thebcma_pmu_get_clockcpu
from patch 07/11.
Sorry for late-noticing this.
I don't have more comments against your patch set :) Hope John will take it soon :)
Signature · 1 line
Rafa?
Hauke Mehrtens
maintainerPATCH v3 6/11 bcma: add serial console support
Quoted 45 lines · Rafa? Mi?ecki
W dniu 29 lipca 2011 23:04 u?ytkownik Rafa? Mi?ecki <[email protected]> napisa?:
Quoted 39 lines
2011/7/23 Hauke Mehrtens <[email protected]>:
Quoted 20 lines
This adds support for serial console to bcma, when operating on an SoC.
Signed-off-by Hauke Mehrtens <[email protected]>--- drivers/bcma/bcma_private.h | 8 ++++ drivers/bcma/driver_chipcommon.c | 48 +++++++++++++++++++++++++++ drivers/bcma/driver_chipcommon_pmu.c | 26 ++++++++++++++ drivers/bcma/driver_mips.c | 1 + include/linux/bcma/bcma_driver_chipcommon.h | 14 ++++++++ 5 files changed, 97 insertions(+), 0 deletions(-)drivers/bcma/bcma_private.h +1
-0@@ -29,6 +29,14 @@ void bcma_init_bus(struct bcma_bus *bus);/* sprom.c */ int bcma_sprom_get (struct bcma_bus *bus); +/* driver_chipcommon.c */ drivers/bcma/bcma_private.h void bcma_init_bus(struct bcma_bus *bus); · line 42
Quoted 10 lines
drivers/bcma/bcma_private.h +7
-0+#ifdef CONFIG_BCMA_DRIVER_MIPS +void bcma_chipco_serial_init (struct bcma_drv_cc *cc); +#endif /* CONFIG_BCMA_DRIVER_MIPS */ + +/* driver_chipcommon_pmu.c */ +u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc); +#ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */ extern int __init bcma_host_pci_init (void );Not sure, what do you think about this, feel free to comment.
My idea was to use
bcma_private.hfor bcma-internal functions. For example, support for PCI host or SoC host, is something "internal" (as I call it) for bcma. Drivers in theory could be separated modules and I useinclude/linux/bcma/driver_*.hfor them.Quoted 4 lines
If following this schema, declarations of
bcma_pmu_alp_clockbcma_host_pci_init
should be ininclude/linux/bcma/bcma_driver_chipcommon.h
Quoted 9 lines
Same goes to the
bcma_pmu_get_clockcpu
from patch 07/11.Sorry for late-noticing this.
I don't have more comments against your patch set :) Hope John will take it soon :)
This sounds good. I will send a new patch moving the method declaration to bcma_driver_chipcommon.h for these 3 functions.
Hauke
Hauke Mehrtens
maintainerPATCH v3 7/11 bcma: get CPU clock
In reply to Hauke MehrtensAdd method to return the clock of the CPU. This is needed by the arch code to calculate the mips_hpt_frequency.
--- drivers/bcma/bcma_private.h | 1 + drivers/bcma/driver_chipcommon_pmu.c | 107 +++++++++++++++++++++++++++ drivers/bcma/driver_mips.c | 12 +++ include/linux/bcma/bcma_driver_chipcommon.h | 39 ++++++++++ include/linux/bcma/bcma_driver_mips.h | 2 + 5 files changed, 161 insertions(+), 0 deletions(-)
drivers/bcma/bcma_private.h +1 -0
@@ -36,6 +36,7 @@ void bcma_chipco_serial_init(struct bcma_drv_cc *cc);/* driver_chipcommon_pmu.c */ u32 bcma_pmu_alp_clock (struct bcma_drv_cc *cc); +u32 bcma_pmu_get_clockcpu (struct bcma_drv_cc *cc);#ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */
drivers/bcma/driver_chipcommon_pmu.c +107 -0
116 lines not on this page · raw message
drivers/bcma/driver_mips.c +12 -0
@@ -166,6 +166,18 @@ static void bcma_core_mips_dump_irq(struct bcma_bus *bus) } } +u32 bcma_cpu_clock (struct bcma_drv_mips *mcore) +{ +struct bcma_bus *bus = mcore->core->bus; + +if (bus->drv_cc.capabilities &BCMA_CC_CAP_PMU ) +return bcma_pmu_get_clockcpu (&bus->drv_cc); + +pr_err ("No PMU available, need this to get the cpu clock\n" ); +return 0 ; +} +EXPORT_SYMBOL (bcma_cpu_clock); +static void bcma_core_mips_flash_detect (struct bcma_drv_mips *mcore) {struct bcma_bus *bus = mcore->core->bus;
include/linux/bcma/bcma_driver_chipcommon.h +39 -0
@@ -241,8 +241,47 @@#define BCMA_CC_SPROM 0x0800/* SPROM beginning */ #define BCMA_CC_SPROM_PCIE6 0x0830/* SPROM beginning on PCIe rev >= 6 */ +/* Divider allocation in 4716/47162/5356 */ +#define BCMA_CC_PMU5_MAINPLL_CPU 1 +#define BCMA_CC_PMU5_MAINPLL_MEM 2 +#define BCMA_CC_PMU5_MAINPLL_SSB 3 + +/* PLL usage in 4716/47162 */ +#define BCMA_CC_PMU4716_MAINPLL_PLL0 12 + +/* PLL usage in 5356/5357 */ +#define BCMA_CC_PMU5356_MAINPLL_PLL0 0 +#define BCMA_CC_PMU5357_MAINPLL_PLL0 0 + +/* 4706 PMU */ +#define BCMA_CC_PMU4706_MAINPLL_PLL0 0 +/* ALP clock on pre-PMU chips */ #define BCMA_CC_PMU_ALP_CLOCK 20000000 +/* HT clock for systems with PMU-enabled chipcommon */ +#define BCMA_CC_PMU_HT_CLOCK 80000000 + +/* PMU rev 5 (& 6) */ +#define BCMA_CC_PPL_P1P2_OFF 0 +#define BCMA_CC_PPL_P1_MASK 0x0f000000 +#define BCMA_CC_PPL_P1_SHIFT 24 +#define BCMA_CC_PPL_P2_MASK 0x00f00000 +#define BCMA_CC_PPL_P2_SHIFT 20 +#define BCMA_CC_PPL_M14_OFF 1 +#define BCMA_CC_PPL_MDIV_MASK 0x000000ff +#define BCMA_CC_PPL_MDIV_WIDTH 8 +#define BCMA_CC_PPL_NM5_OFF 2 +#define BCMA_CC_PPL_NDIV_MASK 0xfff00000 +#define BCMA_CC_PPL_NDIV_SHIFT 20 +#define BCMA_CC_PPL_FMAB_OFF 3 +#define BCMA_CC_PPL_MRAT_MASK 0xf0000000 +#define BCMA_CC_PPL_MRAT_SHIFT 28 +#define BCMA_CC_PPL_ABRAT_MASK 0x08000000 +#define BCMA_CC_PPL_ABRAT_SHIFT 27 +#define BCMA_CC_PPL_FDIV_MASK 0x07ffffff +#define BCMA_CC_PPL_PLLCTL_OFF 4 +#define BCMA_CC_PPL_PCHI_OFF 5 +#define BCMA_CC_PPL_PCHI_MASK 0x0000003f/* Data for the PMU, if available. * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
include/linux/bcma/bcma_driver_mips.h +2 -0
@@ -44,6 +44,8 @@ extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);static inline void bcma_core_mips_init (struct bcma_drv_mips *mcore) { }#endif +extern u32 bcma_cpu_clock (struct bcma_drv_mips *mcore); +extern unsigned int bcma_core_mips_irq (struct bcma_device *dev);#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 8/11 bcm47xx: prepare to support different buses
In reply to Hauke MehrtensPrepare bcm47xx to support different System buses. Before adding support for bcma it should be possible to build bcm47xx without the need of ssb. With this patch bcm47xx does not directly contain a ssb_bus, but a union contain all the supported system buses. As a SoC just uses one system bus a union is a good choice.
--- arch/mips/bcm47xx/gpio.c | 56 ++++++++++++++++---------- arch/mips/bcm47xx/nvram.c | 15 +++++-- arch/mips/bcm47xx/serial.c | 13 +++++- arch/mips/bcm47xx/setup.c | 33 ++++++++++++--- arch/mips/bcm47xx/time.c | 9 +++- arch/mips/bcm47xx/wgt634u.c | 14 ++++-- arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 14 ++++++- arch/mips/include/asm/mach-bcm47xx/gpio.h | 55 ++++++++++++++++++------- drivers/watchdog/bcm47xx_wdt.c | 12 +++++- 9 files changed, 160 insertions(+), 61 deletions(-)
arch/mips/bcm47xx/gpio.c +34 -22
@@ -20,42 +20,54 @@ static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);int gpio_request (unsigned gpio,const char *tag) { -if (ssb_chipco_available (&ssb_bcm47xx.chipco) && - ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES )) -return -EINVAL ; +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco) && + ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES )) +return -EINVAL ; -if (ssb_extif_available (&ssb_bcm47xx.extif) && - ((unsigned )gpio >=BCM47XX_EXTIF_GPIO_LINES )) -return -EINVAL ; +if (ssb_extif_available (&bcm47xx_bus.ssb.extif) && + ((unsigned )gpio >=BCM47XX_EXTIF_GPIO_LINES )) +return -EINVAL ; -if (test_and_set_bit (gpio, gpio_in_use)) -return -EBUSY ; +if (test_and_set_bit (gpio, gpio_in_use)) +return -EBUSY ; -return 0 ; +return 0 ; + } +return -EINVAL ; }EXPORT_SYMBOL (gpio_request);void gpio_free (unsigned gpio) { -if (ssb_chipco_available (&ssb_bcm47xx.chipco) && - ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES )) -return ; +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco) && + ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES )) +return ; -if (ssb_extif_available (&ssb_bcm47xx.extif) && - ((unsigned )gpio >=BCM47XX_EXTIF_GPIO_LINES )) -return ; +if (ssb_extif_available (&bcm47xx_bus.ssb.extif) && + ((unsigned )gpio >=BCM47XX_EXTIF_GPIO_LINES )) +return ; -clear_bit (gpio, gpio_in_use); +clear_bit (gpio, gpio_in_use); +return ; + } }EXPORT_SYMBOL (gpio_free);int gpio_to_irq (unsigned gpio) { -if (ssb_chipco_available (&ssb_bcm47xx.chipco)) -return ssb_mips_irq (ssb_bcm47xx.chipco.dev) +2 ; -else if (ssb_extif_available (&ssb_bcm47xx.extif)) -return ssb_mips_irq (ssb_bcm47xx.extif.dev) +2 ; -else -return -EINVAL ; +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco)) +return ssb_mips_irq (bcm47xx_bus.ssb.chipco.dev) +2 ; +else if (ssb_extif_available (&bcm47xx_bus.ssb.extif)) +return ssb_mips_irq (bcm47xx_bus.ssb.extif.dev) +2 ; +else +return -EINVAL ; + } +return -EINVAL ; }EXPORT_SYMBOL_GPL (gpio_to_irq);
arch/mips/bcm47xx/nvram.c +11 -4
@@ -26,14 +26,21 @@ static char nvram_buf[NVRAM_SPACE];/* Probe for NVRAM header */ static void early_nvram_init (void ) { -struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore; +struct ssb_mipscore *mcore_ssb;struct nvram_header *header;int i; -u32 base, lim, off; +u32 base =0 ; +u32 lim =0 ; +u32 off;u32 *src, *dst; - base = mcore->flash_window; - lim = mcore->flash_window_size; +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : + mcore_ssb = &bcm47xx_bus.ssb.mipscore; + base = mcore_ssb->flash_window; + lim = mcore_ssb->flash_window_size; +break ; + } off =FLASH_MIN ;while (off <= lim) {
arch/mips/bcm47xx/serial.c +11 -2
@@ -23,10 +23,10 @@ static struct platform_device uart8250_device = { }, }; -static int __init uart8250_init (void ) +static int __init uart8250_init_ssb (void ) {int i; -struct ssb_mipscore *mcore = &(ssb_bcm47xx.mipscore); +struct ssb_mipscore *mcore = &(bcm47xx_bus.ssb.mipscore);memset (&uart8250_data,0 ,sizeof (uart8250_data));
@@ -45,6 +45,15 @@ static int __init uart8250_init(void)return platform_device_register (&uart8250_device); } +static int __init uart8250_init (void ) +{ +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +return uart8250_init_ssb (); + } +return -EINVAL ; +} +module_init (uart8250_init);MODULE_AUTHOR ("Aurelien Jarno <[email protected]>" );
arch/mips/bcm47xx/setup.c +26 -7
@@ -35,15 +35,22 @@#include <bcm47xx.h> #include <asm/mach-bcm47xx/nvram.h> -struct ssb_bus ssb_bcm47xx; -EXPORT_SYMBOL (ssb_bcm47xx); +union bcm47xx_bus bcm47xx_bus; +EXPORT_SYMBOL (bcm47xx_bus); + +enum bcm47xx_bus_type bcm47xx_bus_type; +EXPORT_SYMBOL (bcm47xx_bus_type);static void bcm47xx_machine_restart (char *command) {printk (KERN_ALERT "Please stand by while rebooting the system...\n" );local_irq_disable ();/* Set the watchdog timer to reset immediately */ -ssb_watchdog_timer_set (&ssb_bcm47xx,1 ); +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +ssb_watchdog_timer_set (&bcm47xx_bus.ssb,1 ); +break ; + }while (1 )cpu_relax (); }
@@ -52,7 +59,11 @@ static void bcm47xx_machine_halt(void) {/* Disable interrupts and watchdog and spin forever */ local_irq_disable (); -ssb_watchdog_timer_set (&ssb_bcm47xx,0 ); +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0 ); +break ; + }while (1 )cpu_relax (); }
@@ -247,7 +258,7 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,return 0 ; } -void __init plat_mem_setup (void ) +static void __init bcm47xx_register_ssb (void ) {int err;char buf[100 ];
@@ -258,12 +269,12 @@ void __init plat_mem_setup(void)printk (KERN_WARNING "bcm47xx: someone else already registered" " a ssb SPROM callback handler (err %d)\n" , err); - err =ssb_bus_ssbbus_register (&ssb_bcm47xx,SSB_ENUM_BASE , + err =ssb_bus_ssbbus_register (&(bcm47xx_bus.ssb),SSB_ENUM_BASE , bcm47xx_get_invariants);if (err)panic ("Failed to initialize SSB bus (err %d)\n" , err); - mcore = &ssb_bcm47xx.mipscore; + mcore = &bcm47xx_bus.ssb.mipscore;if (nvram_getenv ("kernel_args" , buf,sizeof (buf)) >=0 ) {if (strstr (buf,"console=ttyS1" )) {struct ssb_serial_port port;
@@ -276,6 +287,14 @@ void __init plat_mem_setup(void)memcpy (&mcore->serial_ports[1 ], &port,sizeof (port)); } } +} + +void __init plat_mem_setup (void ) +{ +struct cpuinfo_mips *c = ¤t_cpu_data; + + bcm47xx_bus_type =BCM47XX_BUS_TYPE_SSB ; +bcm47xx_register_ssb (); _machine_restart = bcm47xx_machine_restart; _machine_halt = bcm47xx_machine_halt;
arch/mips/bcm47xx/time.c +7 -2
@@ -30,7 +30,7 @@void __init plat_time_init (void ) { -unsigned long hz; +unsigned long hz =0 ;/* * Use deterministic values for initial counter interrupt
@@ -39,7 +39,12 @@ void __init plat_time_init(void)write_c0_count (0 );write_c0_compare (0xffff ); - hz =ssb_cpu_clock (&ssb_bcm47xx.mipscore) /2 ; +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : + hz =ssb_cpu_clock (&bcm47xx_bus.ssb.mipscore) /2 ; +break ; + } +if (!hz) hz =100000000 ;
arch/mips/bcm47xx/wgt634u.c +9 -5
@@ -108,7 +108,7 @@ static irqreturn_t gpio_interrupt(int irq, void *ignored)/* Interrupts are shared, check if the current one is a GPIO interrupt. */ -if (!ssb_chipco_irq_status (&ssb_bcm47xx.chipco, +if (!ssb_chipco_irq_status (&bcm47xx_bus.ssb.chipco,SSB_CHIPCO_IRQ_GPIO ))return IRQ_NONE ;
@@ -132,22 +132,26 @@ static int __init wgt634u_init(void)* machine. Use the MAC address as an heuristic. Netgear Inc. has * been allocated ranges 00:09:5b:xx:xx:xx and 00:0f:b5:xx:xx:xx. */ +u8 *et0mac; -u8 *et0mac = ssb_bcm47xx.sprom.et0mac; +if (bcm47xx_bus_type !=BCM47XX_BUS_TYPE_SSB ) +return -ENODEV ; + + et0mac = bcm47xx_bus.ssb.sprom.et0mac;if (et0mac[0 ] ==0x00 && ((et0mac[1 ] ==0x09 && et0mac[2 ] ==0x5b ) || (et0mac[1 ] ==0x0f && et0mac[2 ] ==0xb5 ))) { -struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore; +struct ssb_mipscore *mcore = &bcm47xx_bus.ssb.mipscore;printk (KERN_INFO "WGT634U machine detected.\n" );if (!request_irq (gpio_to_irq (WGT634U_GPIO_RESET ), gpio_interrupt,IRQF_SHARED , -"WGT634U GPIO" , &ssb_bcm47xx.chipco)) { +"WGT634U GPIO" , &bcm47xx_bus.ssb.chipco)) {gpio_direction_input (WGT634U_GPIO_RESET );gpio_intmask (WGT634U_GPIO_RESET ,1 ); -ssb_chipco_irq_mask (&ssb_bcm47xx.chipco, +ssb_chipco_irq_mask (&bcm47xx_bus.ssb.chipco,SSB_CHIPCO_IRQ_GPIO ,SSB_CHIPCO_IRQ_GPIO ); }
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h +12 -2
@@ -19,7 +19,17 @@#ifndef __ASM_BCM47XX_H#define __ASM_BCM47XX_H -/* SSB bus */ -extern struct ssb_bus ssb_bcm47xx; +#include <linux/ssb/ssb.h> + +enum bcm47xx_bus_type { +BCM47XX_BUS_TYPE_SSB , +}; + +union bcm47xx_bus { +struct ssb_bus ssb; +}; + +extern union bcm47xx_bus bcm47xx_bus; +extern enum bcm47xx_bus_type bcm47xx_bus_type;#endif /* __ASM_BCM47XX_H */
arch/mips/include/asm/mach-bcm47xx/gpio.h +40 -15
81 lines not on this page · raw message
drivers/watchdog/bcm47xx_wdt.c +10 -2
@@ -54,12 +54,20 @@ static atomic_t ticks;static inline void bcm47xx_wdt_hw_start (void ) {/* this is 2,5s on 100Mhz clock and 2s on 133 Mhz */ -ssb_watchdog_timer_set (&ssb_bcm47xx,0xfffffff ); +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0xfffffff ); +break ; + } }static inline int bcm47xx_wdt_hw_stop (void ) { -return ssb_watchdog_timer_set (&ssb_bcm47xx,0 ); +switch (bcm47xx_bus_type) { +case BCM47XX_BUS_TYPE_SSB : +return ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0 ); + } +return -EINVAL ; }static void bcm47xx_timer_tick (unsigned long unused)
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 9/11 bcm47xx: make it possible to build bcm47xx without ssb.
In reply to Hauke Mehrtens--- arch/mips/Kconfig | 8 +------- arch/mips/bcm47xx/Kconfig | 18 ++++++++++++++++++ arch/mips/bcm47xx/Makefile | 3 ++- arch/mips/bcm47xx/gpio.c | 6 ++++++ arch/mips/bcm47xx/nvram.c | 4 ++++ arch/mips/bcm47xx/serial.c | 4 ++++ arch/mips/bcm47xx/setup.c | 8 ++++++++ arch/mips/bcm47xx/time.c | 2 ++ arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 4 ++++ arch/mips/include/asm/mach-bcm47xx/gpio.h | 12 ++++++++++++ arch/mips/pci/pci-bcm47xx.c | 6 ++++++ drivers/watchdog/bcm47xx_wdt.c | 4 ++++ 12 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 arch/mips/bcm47xx/Kconfig
arch/mips/Kconfig +1 -7
@@ -91,15 +91,8 @@ config BCM47XX select DMA_NONCOHERENT select HW_HAS_PCI select IRQ_CPU - select SYS_HAS_CPU_MIPS32_R1 select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_LITTLE_ENDIAN - select SSB - select SSB_DRIVER_MIPS - select SSB_DRIVER_EXTIF - select SSB_EMBEDDED - select SSB_B43_PCI_BRIDGE if PCI - select SSB_PCICORE_HOSTMODE if PCI select GENERIC_GPIO select SYS_HAS_EARLY_PRINTK select CFE
@@ -785,6 +778,7 @@ endchoice source "arch/mips/alchemy/Kconfig" source "arch/mips/ath79/Kconfig" +source "arch/mips/bcm47xx/Kconfig" source "arch/mips/bcm63xx/Kconfig" source "arch/mips/jazz/Kconfig" source "arch/mips/jz4740/Kconfig"
arch/mips/bcm47xx/Kconfig new file +18 -0
@@ -0,0 +1,18 @@ +if BCM47XX + +config BCM47XX_SSB + bool "SSB Support for Broadcom BCM47XX" + select SYS_HAS_CPU_MIPS32_R1 + select SSB + select SSB_DRIVER_MIPS + select SSB_DRIVER_EXTIF + select SSB_EMBEDDED + select SSB_B43_PCI_BRIDGE if PCI + select SSB_PCICORE_HOSTMODE if PCI + default y + help + Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support. + + This will generate an image with support for SSB and MIPS32 R1 instruction set. + +endif
arch/mips/bcm47xx/Makefile +2 -1
@@ -3,4 +3,5 @@ # under Linux. # -obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o +obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o +obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
arch/mips/bcm47xx/gpio.c +6 -0
@@ -21,6 +21,7 @@ static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);int gpio_request (unsigned gpio,const char *tag) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco) && ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES ))
@@ -34,6 +35,7 @@ int gpio_request(unsigned gpio, const char *tag)return -EBUSY ;return 0 ; +#endif }return -EINVAL ; }
@@ -42,6 +44,7 @@ EXPORT_SYMBOL(gpio_request);void gpio_free (unsigned gpio) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco) && ((unsigned )gpio >=BCM47XX_CHIPCO_GPIO_LINES ))
@@ -53,6 +56,7 @@ void gpio_free(unsigned gpio)clear_bit (gpio, gpio_in_use);return ; +#endif } }EXPORT_SYMBOL (gpio_free);
@@ -60,6 +64,7 @@ EXPORT_SYMBOL(gpio_free);int gpio_to_irq (unsigned gpio) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :if (ssb_chipco_available (&bcm47xx_bus.ssb.chipco))return ssb_mips_irq (bcm47xx_bus.ssb.chipco.dev) +2 ;
@@ -67,6 +72,7 @@ int gpio_to_irq(unsigned gpio)return ssb_mips_irq (bcm47xx_bus.ssb.extif.dev) +2 ; else return -EINVAL; +#endif }return -EINVAL ; }
arch/mips/bcm47xx/nvram.c +4 -0
@@ -26,7 +26,9 @@ static char nvram_buf[NVRAM_SPACE];/* Probe for NVRAM header */ static void early_nvram_init (void ) { +#ifdef CONFIG_BCM47XX_SSB struct ssb_mipscore *mcore_ssb; +#endif struct nvram_header *header;int i;u32 base =0 ;
@@ -35,11 +37,13 @@ static void early_nvram_init(void)u32 *src, *dst;switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB : mcore_ssb = &bcm47xx_bus.ssb.mipscore; base = mcore_ssb->flash_window; lim = mcore_ssb->flash_window_size;break ; +#endif } off =FLASH_MIN ;
arch/mips/bcm47xx/serial.c +4 -0
@@ -23,6 +23,7 @@ static struct platform_device uart8250_device = { }, }; +#ifdef CONFIG_BCM47XX_SSB static int __init uart8250_init_ssb (void ) {int i;
@@ -44,12 +45,15 @@ static int __init uart8250_init_ssb(void) }return platform_device_register (&uart8250_device); } +#endif static int __init uart8250_init (void ) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :return uart8250_init_ssb (); +#endif }return -EINVAL ; }
arch/mips/bcm47xx/setup.c +8 -0
@@ -47,9 +47,11 @@ static void bcm47xx_machine_restart(char *command)local_irq_disable ();/* Set the watchdog timer to reset immediately */ switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_watchdog_timer_set (&bcm47xx_bus.ssb,1 );break ; +#endif }while (1 )cpu_relax ();
@@ -60,14 +62,17 @@ static void bcm47xx_machine_halt(void)/* Disable interrupts and watchdog and spin forever */ local_irq_disable ();switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0 );break ; +#endif }while (1 )cpu_relax (); } +#ifdef CONFIG_BCM47XX_SSB #define READ_FROM_NVRAM (_outvar, name, buf) \ if (nvram_getprefix(prefix, name, buf, sizeof(buf)) >= 0)\ sprom->_outvar = simple_strtoul(buf, NULL, 0);
@@ -288,13 +293,16 @@ static void __init bcm47xx_register_ssb(void) } } } +#endif void __init plat_mem_setup (void ) {struct cpuinfo_mips *c = ¤t_cpu_data; +#ifdef CONFIG_BCM47XX_SSB bcm47xx_bus_type =BCM47XX_BUS_TYPE_SSB ;bcm47xx_register_ssb (); +#endif _machine_restart = bcm47xx_machine_restart; _machine_halt = bcm47xx_machine_halt;
arch/mips/bcm47xx/time.c +2 -0
@@ -40,9 +40,11 @@ void __init plat_time_init(void)write_c0_compare (0xffff );switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB : hz =ssb_cpu_clock (&bcm47xx_bus.ssb.mipscore) /2 ;break ; +#endif }if (!hz)
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h +4 -0
@@ -22,11 +22,15 @@#include <linux/ssb/ssb.h> enum bcm47xx_bus_type { +#ifdef CONFIG_BCM47XX_SSB BCM47XX_BUS_TYPE_SSB , +#endif };union bcm47xx_bus { +#ifdef CONFIG_BCM47XX_SSB struct ssb_bus ssb; +#endif };extern union bcm47xx_bus bcm47xx_bus;
arch/mips/include/asm/mach-bcm47xx/gpio.h +12 -0
@@ -22,8 +22,10 @@ extern int gpio_to_irq(unsigned gpio);static inline int gpio_get_value (unsigned gpio) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :return ssb_gpio_in (&bcm47xx_bus.ssb,1 << gpio); +#endif }return -EINVAL ; }
@@ -31,18 +33,22 @@ static inline int gpio_get_value(unsigned gpio)static inline void gpio_set_value (unsigned gpio,int value) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_gpio_out (&bcm47xx_bus.ssb,1 << gpio, value ?1 << gpio :0 ); +#endif } }static inline int gpio_direction_input (unsigned gpio) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_gpio_outen (&bcm47xx_bus.ssb,1 << gpio,0 );return 0 ; +#endif }return -EINVAL ; }
@@ -50,6 +56,7 @@ static inline int gpio_direction_input(unsigned gpio)static inline int gpio_direction_output (unsigned gpio,int value) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :/* first set the gpio out value */ ssb_gpio_out(&bcm47xx_bus.ssb, 1 << gpio,
@@ -57,6 +64,7 @@ static inline int gpio_direction_output(unsigned gpio, int value)/* then set the gpio mode */ ssb_gpio_outen (&bcm47xx_bus.ssb,1 << gpio,1 << gpio);return 0 ; +#endif }return -EINVAL ; }
@@ -64,10 +72,12 @@ static inline int gpio_direction_output(unsigned gpio, int value)static inline int gpio_intmask (unsigned gpio,int value) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_gpio_intmask (&bcm47xx_bus.ssb,1 << gpio, value ?1 << gpio :0 );return 0 ; +#endif }return -EINVAL ; }
@@ -75,10 +85,12 @@ static inline int gpio_intmask(unsigned gpio, int value)static inline int gpio_polarity (unsigned gpio,int value) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_gpio_polarity (&bcm47xx_bus.ssb,1 << gpio, value ?1 << gpio :0 );return 0 ; +#endif }return -EINVAL ; }
arch/mips/pci/pci-bcm47xx.c +6 -0
@@ -25,6 +25,7 @@#include <linux/types.h> #include <linux/pci.h> #include <linux/ssb/ssb.h> +#include <bcm47xx.h> int __init pcibios_map_irq (const struct pci_dev *dev,u8 slot,u8 pin) {
@@ -33,9 +34,13 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)int pcibios_plat_dev_init (struct pci_dev *dev) { +#ifdef CONFIG_BCM47XX_SSB int res;u8 slot, pin; +if (bcm47xx_bus_type !=BCM47XX_BUS_TYPE_SSB ) +return 0 ; + res =ssb_pcibios_plat_dev_init (dev);if (res <0 ) { printk(KERN_ALERT "PCI: Failed to init device %s\n",
@@ -55,5 +60,6 @@ int pcibios_plat_dev_init(struct pci_dev *dev) } dev->irq = res; +#endif return 0 ; }
drivers/watchdog/bcm47xx_wdt.c +4 -0
@@ -55,17 +55,21 @@ static inline void bcm47xx_wdt_hw_start(void) {/* this is 2,5s on 100Mhz clock and 2s on 133 Mhz */ switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0xfffffff );break ; +#endif } }static inline int bcm47xx_wdt_hw_stop (void ) {switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB :return ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0 ); +#endif }return -EINVAL ; }
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 10/11 bcm47xx: add support for bcma bus
In reply to Hauke MehrtensThis patch add support for the bcma bus. Broadcom uses only Mips 74K CPUs on the new SoC and on the old ons using ssb bus there are no Mips 74K CPUs.
--- arch/mips/bcm47xx/Kconfig | 13 ++++++ arch/mips/bcm47xx/gpio.c | 22 +++++++++++ arch/mips/bcm47xx/nvram.c | 10 +++++ arch/mips/bcm47xx/serial.c | 29 ++++++++++++++ arch/mips/bcm47xx/setup.c | 53 +++++++++++++++++++++++++- arch/mips/bcm47xx/time.c | 5 ++ arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 8 ++++ arch/mips/include/asm/mach-bcm47xx/gpio.h | 41 ++++++++++++++++++++ drivers/watchdog/bcm47xx_wdt.c | 11 +++++ 9 files changed, 190 insertions(+), 2 deletions(-)
arch/mips/bcm47xx/Kconfig +13 -0
@@ -15,4 +15,17 @@ config BCM47XX_SSB This will generate an image with support for SSB and MIPS32 R1 instruction set. +config BCM47XX_BCMA + bool "BCMA Support for Broadcom BCM47XX" + select SYS_HAS_CPU_MIPS32_R2 + select BCMA + select BCMA_HOST_SOC + select BCMA_DRIVER_MIPS + select BCMA_DRIVER_PCI_HOSTMODE if PCI + default y + help + Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus. + + This will generate an image with support for BCMA and MIPS32 R2 instruction set. + endif
arch/mips/bcm47xx/gpio.c +22 -0
@@ -36,6 +36,16 @@ int gpio_request(unsigned gpio, const char *tag)return 0 ;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +if (gpio >=BCM47XX_CHIPCO_GPIO_LINES ) +return -EINVAL ; + +if (test_and_set_bit (gpio, gpio_in_use)) +return -EBUSY ; + +return 0 ; +#endif }return -EINVAL ; }
@@ -57,6 +67,14 @@ void gpio_free(unsigned gpio)clear_bit (gpio, gpio_in_use);return ;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +if (gpio >=BCM47XX_CHIPCO_GPIO_LINES ) +return ; + +clear_bit (gpio, gpio_in_use); +return ; +#endif } }EXPORT_SYMBOL (gpio_free);
@@ -73,6 +91,10 @@ int gpio_to_irq(unsigned gpio) else return -EINVAL;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +return bcma_core_mips_irq (bcm47xx_bus.bcma.bus.drv_cc.core) +2 ; +#endif }return -EINVAL ; }
arch/mips/bcm47xx/nvram.c +10 -0
@@ -29,6 +29,9 @@ static void early_nvram_init(void)#ifdef CONFIG_BCM47XX_SSB struct ssb_mipscore *mcore_ssb;#endif +#ifdef CONFIG_BCM47XX_BCMA +struct bcma_drv_cc *bcma_cc; +#endif struct nvram_header *header;int i;u32 base =0 ;
@@ -44,6 +47,13 @@ static void early_nvram_init(void) lim = mcore_ssb->flash_window_size;break ;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : + bcma_cc = &bcm47xx_bus.bcma.bus.drv_cc; + base = bcma_cc->pflash.window; + lim = bcma_cc->pflash.window_size; +break ; +#endif } off =FLASH_MIN ;
arch/mips/bcm47xx/serial.c +29 -0
@@ -47,6 +47,31 @@ static int __init uart8250_init_ssb(void) }#endif +#ifdef CONFIG_BCM47XX_BCMA +static int __init uart8250_init_bcma (void ) +{ +int i; +struct bcma_drv_cc *cc = &(bcm47xx_bus.bcma.bus.drv_cc); + +memset (&uart8250_data,0 ,sizeof (uart8250_data)); + +for (i =0 ; i < cc->nr_serial_ports; i++) { +struct plat_serial8250_port *p = &(uart8250_data[i]); +struct bcma_serial_port *bcma_port; + bcma_port = &(cc->serial_ports[i]); + + p->mapbase = (unsigned int ) bcma_port->regs; + p->membase = (void *) bcma_port->regs; + p->irq = bcma_port->irq +2 ; + p->uartclk = bcma_port->baud_base; + p->regshift = bcma_port->reg_shift; + p->iotype =UPIO_MEM ; + p->flags =UPF_BOOT_AUTOCONF |UPF_SHARE_IRQ ; + } +return platform_device_register (&uart8250_device); +} +#endif +static int __init uart8250_init (void ) {switch (bcm47xx_bus_type) {
@@ -54,6 +79,10 @@ static int __init uart8250_init(void)case BCM47XX_BUS_TYPE_SSB :return uart8250_init_ssb ();#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +return uart8250_init_bcma (); +#endif }return -EINVAL ; }
arch/mips/bcm47xx/setup.c +51 -2
85 lines not on this page · raw message
arch/mips/bcm47xx/time.c +5 -0
@@ -45,6 +45,11 @@ void __init plat_time_init(void) hz =ssb_cpu_clock (&bcm47xx_bus.ssb.mipscore) /2 ;break ;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : + hz =bcma_cpu_clock (&bcm47xx_bus.bcma.bus.drv_mips) /2 ; +break ; +#endif }if (!hz)
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h +8 -0
@@ -20,17 +20,25 @@#define __ASM_BCM47XX_H#include <linux/ssb/ssb.h> +#include <linux/bcma/bcma.h> +#include <linux/bcma/bcma_soc.h> enum bcm47xx_bus_type {#ifdef CONFIG_BCM47XX_SSB BCM47XX_BUS_TYPE_SSB ,#endif +#ifdef CONFIG_BCM47XX_BCMA +BCM47XX_BUS_TYPE_BCMA , +#endif };union bcm47xx_bus {#ifdef CONFIG_BCM47XX_SSB struct ssb_bus ssb;#endif +#ifdef CONFIG_BCM47XX_BCMA +struct bcma_soc bcma; +#endif };extern union bcm47xx_bus bcm47xx_bus;
arch/mips/include/asm/mach-bcm47xx/gpio.h +41 -0
83 lines not on this page · raw message
drivers/watchdog/bcm47xx_wdt.c +11 -0
@@ -60,6 +60,12 @@ static inline void bcm47xx_wdt_hw_start(void)ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0xfffffff );break ;#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +bcma_chipco_watchdog_timer_set (&bcm47xx_bus.bcma.bus.drv_cc, +0xfffffff ); +break ; +#endif } }
@@ -70,6 +76,11 @@ static inline int bcm47xx_wdt_hw_stop(void)case BCM47XX_BUS_TYPE_SSB :return ssb_watchdog_timer_set (&bcm47xx_bus.ssb,0 );#endif +#ifdef CONFIG_BCM47XX_BCMA +case BCM47XX_BUS_TYPE_BCMA : +bcma_chipco_watchdog_timer_set (&bcm47xx_bus.bcma.bus.drv_cc,0 ); +return 0 ; +#endif }return -EINVAL ; }
Signature · 1 line
1.7.4.1
Hauke Mehrtens
maintainerPATCH v3 11/11 bcm47xx: fix irq assignment for new SoCs.
In reply to Hauke Mehrtens--- arch/mips/bcm47xx/irq.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-)
arch/mips/bcm47xx/irq.c +12 -0
@@ -26,6 +26,7 @@#include <linux/interrupt.h> #include <linux/irq.h> #include <asm/irq_cpu.h> +#include <bcm47xx.h> void plat_irq_dispatch (void ) {
@@ -51,5 +52,16 @@ void plat_irq_dispatch(void)void __init arch_init_irq (void ) { +#ifdef CONFIG_BCM47XX_BCMA +if (bcm47xx_bus_type ==BCM47XX_BUS_TYPE_BCMA ) { +bcma_write32 (bcm47xx_bus.bcma.bus.drv_mips.core, +BCMA_MIPS_MIPS74K_INTMASK (5 ),1 <<31 ); +/* +* the kernel reads the timer irq from some register and thinks +* it's #5, but we offset it by 2 and route to #7 +*/ + cp0_compare_irq =7 ; + } +#endif mips_cpu_irq_init (); }
Signature · 1 line
1.7.4.1
v3 cover bcma: add support for embedded devices like bcm4716
In reply to Hauke MehrtensQuoted 12 lines · Hauke Mehrtens
This patch series adds support for embedded devices like bcm47xx to bcma. Bcma is used on bcm4716 and bcm4718 SoCs as the system bus and replaced ssb used on older devices. With these patches my bcm4716 device boots up till it tries to access the flash, because the serial flash chip is unsupported for now, this will be my next task. This adds support for MIPS cores, interrupt configuration and the serial console.
These patches are not containing all functions needed to get the SoC to fully work and support every feature, but it is a good start. These patches are now integrated in OpenWrt for everyone how wants to test them.
Quoted 8 lines
This was tested with a BCM4704 device (SoC with ssb bus), a BCM4716 device and a pcie wireless card supported by bcma.
@John could you please merge this into wireless-testing. I hope Ralf is fine with it when some MIPS bits will go through wireless. This will make it much easier for Linus to merge wireless-testing and the mips tree together as there are many other changes for bcma in wireless- testing.
Any chance we could see an ACK from Ralf?
John
Signature · 2 lines
John W. Linville Someday the world will need a hero, and you linville at tuxdriver.com might be all we have. Be ready.
Quoted 12 lines · Hauke Mehrtens
This patch series adds support for embedded devices like bcm47xx to bcma. Bcma is used on bcm4716 and bcm4718 SoCs as the system bus and replaced ssb used on older devices. With these patches my bcm4716 device boots up till it tries to access the flash, because the serial flash chip is unsupported for now, this will be my next task. This adds support for MIPS cores, interrupt configuration and the serial console.
These patches are not containing all functions needed to get the SoC to fully work and support every feature, but it is a good start. These patches are now integrated in OpenWrt for everyone how wants to test them.
Quoted 8 lines
This was tested with a BCM4704 device (SoC with ssb bus), a BCM4716 device and a pcie wireless card supported by bcma.
@John could you please merge this into wireless-testing. I hope Ralf is fine with it when some MIPS bits will go through wireless. This will make it much easier for Linus to merge wireless-testing and the mips tree together as there are many other changes for bcma in wireless- testing.
John, if you want to merge the MIPS bits through the wireless tree, feel free to:
Ralf