X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/6c4398bc6add362d5b399ba361720cf1afd7176b..0c1f9db11441bc272e018ccda9813395e06fa68f:/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch diff --git a/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch b/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch index 10099d103..6ad9dce4b 100644 --- a/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch +++ b/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch @@ -1,52 +1,89 @@ -From a807b2fb233af60028ed38ba237953bcffdf33e9 Mon Sep 17 00:00:00 2001 +From d743a740b76a6be9e88fe1ae6991682927a7769c Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sat, 18 Jun 2011 14:31:53 +0200 -Subject: [PATCH 04/14] bcma: add SOC bus +Subject: [PATCH 04/26] bcma: add SOC bus +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit -This patch adds support for using bcma on an embedded bus. An embedded -system like the bcm4716 could register this bus and it searches for the -bcma cores then. +This 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. + +Acked-by: Rafał Miłecki Signed-off-by: Hauke Mehrtens --- - drivers/bcma/Kconfig | 5 + + drivers/bcma/Kconfig | 4 + drivers/bcma/Makefile | 1 + - drivers/bcma/host_soc.c | 178 +++++++++++++++++++++++++++++++++++++++++ - drivers/bcma/main.c | 1 + - drivers/bcma/scan.c | 24 +++++- - include/linux/bcma/bcma.h | 4 + + 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 ++++ - 7 files changed, 227 insertions(+), 2 deletions(-) + 9 files changed, 263 insertions(+), 8 deletions(-) create mode 100644 drivers/bcma/host_soc.c create mode 100644 include/linux/bcma/bcma_soc.h --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig -@@ -27,6 +27,11 @@ config BCMA_HOST_PCI - bool "Support for BCMA on PCI-host bus" - depends on BCMA_HOST_PCI_POSSIBLE +@@ -34,6 +34,10 @@ config BCMA_DRIVER_PCI_HOSTMODE + help + PCI core hostmode operation (external PCI bus). +config BCMA_HOST_SOC + bool + depends on BCMA && MIPS -+ default n + config BCMA_DEBUG bool "BCMA debugging" depends on BCMA --- a/drivers/bcma/Makefile +++ b/drivers/bcma/Makefile -@@ -2,6 +2,7 @@ bcma-y += main.o scan.o core.o sprom - bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o +@@ -3,6 +3,7 @@ bcma-y += driver_chipcommon.o driver 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 +--- a/drivers/bcma/core.c ++++ b/drivers/bcma/core.c +@@ -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; +--- a/drivers/bcma/driver_pci.c ++++ b/drivers/bcma/driver_pci.c +@@ -208,7 +208,14 @@ int bcma_core_pci_irq_ctl(struct bcma_dr + { + 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) --- /dev/null +++ b/drivers/bcma/host_soc.c -@@ -0,0 +1,178 @@ +@@ -0,0 +1,183 @@ +/* + * Broadcom specific AMBA + * System on Chip (SoC) Host @@ -210,11 +247,12 @@ Signed-off-by: Hauke Mehrtens +int __init bcma_host_soc_register(struct bcma_soc *soc) +{ + struct bcma_bus *bus = &soc->bus; ++ int err; + + /* iomap only first core. We have to read some register on this core + * to scan the bus. + */ -+ bus->mmio = ioremap(BCMA_ADDR_BASE, BCMA_CORE_SIZE * 1); ++ bus->mmio = ioremap_nocache(BCMA_ADDR_BASE, BCMA_CORE_SIZE * 1); + if (!bus->mmio) + return -ENOMEM; + @@ -223,76 +261,132 @@ Signed-off-by: Hauke Mehrtens + bus->ops = &bcma_host_soc_ops; + + /* Register */ -+ return bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips); ++ err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips); ++ if (err) ++ iounmap(bus->mmio); ++ ++ return err; +} --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c -@@ -95,6 +95,7 @@ static int bcma_register_cores(struct bc +@@ -66,6 +66,10 @@ static struct bcma_device *bcma_find_cor + 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 bc + core->dma_dev = &bus->host_pci->dev; + core->irq = bus->host_pci->irq; break; - case BCMA_HOSTTYPE_NONE: - case BCMA_HOSTTYPE_SDIO: +- 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; } - --- a/drivers/bcma/scan.c +++ b/drivers/bcma/scan.c -@@ -337,6 +337,14 @@ static int bcma_get_next_core(struct bcm +@@ -337,6 +337,16 @@ static int bcma_get_next_core(struct bcm } } } + if (bus->hosttype == BCMA_HOSTTYPE_SOC) { -+ core->io_addr = ioremap(core->addr, BCMA_CORE_SIZE); ++ core->io_addr = ioremap_nocache(core->addr, BCMA_CORE_SIZE); + if (!core->io_addr) + return -ENOMEM; -+ core->io_wrap = ioremap(core->wrap, BCMA_CORE_SIZE); -+ if (!core->io_wrap) ++ core->io_wrap = ioremap_nocache(core->wrap, BCMA_CORE_SIZE); ++ if (!core->io_wrap) { ++ iounmap(core->io_addr); + return -ENOMEM; ++ } + } return 0; } -@@ -369,7 +377,13 @@ int bcma_bus_scan(struct bcma_bus *bus) +@@ -369,7 +379,14 @@ int bcma_bus_scan(struct bcma_bus *bus) bcma_init_bus(bus); erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); - eromptr = bus->mmio; + if (bus->hosttype == BCMA_HOSTTYPE_SOC) { -+ eromptr = ioremap(erombase, BCMA_CORE_SIZE); ++ eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); + if (!eromptr) + return -ENOMEM; -+ } else ++ } else { + eromptr = bus->mmio; ++ } + eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); bcma_scan_switch_core(bus, erombase); -@@ -417,7 +431,13 @@ int __init bcma_bus_scan_early(struct bc - int err, core_num = 0; +@@ -404,6 +421,9 @@ int bcma_bus_scan(struct bcma_bus *bus) + list_add(&core->list, &bus->cores); + } + ++ if (bus->hosttype == BCMA_HOSTTYPE_SOC) ++ iounmap(eromptr); ++ + return 0; + } + +@@ -414,10 +434,18 @@ int __init bcma_bus_scan_early(struct bc + u32 erombase; + u32 __iomem *eromptr, *eromend; + +- int err, core_num = 0; ++ int err = -ENODEV; ++ int core_num = 0; erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); - eromptr = bus->mmio; + if (bus->hosttype == BCMA_HOSTTYPE_SOC) { -+ eromptr = ioremap(erombase, BCMA_CORE_SIZE); ++ eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); + if (!eromptr) + return -ENOMEM; -+ } else ++ } else { + eromptr = bus->mmio; ++ } + eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); bcma_scan_switch_core(bus, erombase); +@@ -447,8 +475,12 @@ int __init bcma_bus_scan_early(struct bc + core->id.class); + + list_add(&core->list, &bus->cores); +- return 0; ++ err = 0; ++ break; + } + +- return -ENODEV; ++ if (bus->hosttype == BCMA_HOSTTYPE_SOC) ++ iounmap(eromptr); ++ ++ return err; + } --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h -@@ -17,6 +17,7 @@ enum bcma_hosttype { - BCMA_HOSTTYPE_NONE, +@@ -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 { -@@ -133,6 +134,9 @@ struct bcma_device { +@@ -138,6 +138,9 @@ struct bcma_device { u32 addr; u32 wrap;