diff options
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.patch | 133 |
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; |