aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch133
1 files changed, 97 insertions, 36 deletions
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 10099d1036..035da9d76a 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,44 +1,50 @@
-From a807b2fb233af60028ed38ba237953bcffdf33e9 Mon Sep 17 00:00:00 2001
+From 22573303ad477fa07c948a9944e9c18fea9af724 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sat, 18 Jun 2011 14:31:53 +0200
-Subject: [PATCH 04/14] bcma: add SOC bus
+Subject: [PATCH 04/22] 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 <zajec5@gmail.com>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- 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/host_soc.c | 183 +++++++++++++++++++++++++++++++++++++++++
+ drivers/bcma/main.c | 6 +-
+ 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(-)
+ 7 files changed, 250 insertions(+), 7 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
@@ -46,7 +52,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
ccflags-$(CONFIG_BCMA_DEBUG) := -DDEBUG
--- /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 +216,12 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+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,13 +230,30 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ 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,8 +97,8 @@ 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_NONE:
case BCMA_HOSTTYPE_SDIO:
+ case BCMA_HOSTTYPE_SOC:
break;
@@ -237,62 +261,99 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
--- 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;