ar71xx: create even more network configs from the uci-defaults script
[openwrt.git] / target / linux / brcm47xx / patches-3.0 / 0004-bcma-add-SOC-bus.patch
index 10099d1..6ad9dce 100644 (file)
@@ -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 <hauke@hauke-m.de>
 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 <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/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 <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,76 +261,132 @@ 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,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;
  
This page took 0.037301 seconds and 4 git commands to generate.