aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@openwrt.org>2014-05-29 19:25:40 +0000
committerHauke Mehrtens <hauke@openwrt.org>2014-05-29 19:25:40 +0000
commitae61421afa39e5f0eff857207070aee11c057832 (patch)
tree468db86b88000647696928919786a23a397c48cf /target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch
parent139153ff6c4d3fc3d7335bc7d5836a8cf26a62c9 (diff)
downloadupstream-ae61421afa39e5f0eff857207070aee11c057832.tar.gz
upstream-ae61421afa39e5f0eff857207070aee11c057832.tar.bz2
upstream-ae61421afa39e5f0eff857207070aee11c057832.zip
bcm53xx: add support for the PCIe controller
This patch adds support for the PCIe controller In addition to the PCIe controller a sprom is now provided by a device tree driver to bcma from some nvram. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@40880 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch')
-rw-r--r--target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch180
1 files changed, 180 insertions, 0 deletions
diff --git a/target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch b/target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch
new file mode 100644
index 0000000000..9fdf66af08
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch
@@ -0,0 +1,180 @@
+From 6c0df4a483e41ef129caa8948b3bcde7f91de197 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 12 May 2014 20:33:15 +0200
+Subject: [PATCH 11/15] bcma: add support for chipcommon B core
+
+This core is used on BCM4708 to configure the PCIe and USB3 PHYs and it
+contains the addresses to the Device Management unit. This will be used
+by the PCIe driver first.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ drivers/bcma/Makefile | 1 +
+ drivers/bcma/bcma_private.h | 4 ++
+ drivers/bcma/driver_chipcommon_b.c | 59 +++++++++++++++++++++++++++++
+ drivers/bcma/main.c | 10 +++++
+ drivers/bcma/scan.c | 1 +
+ include/linux/bcma/bcma.h | 1 +
+ include/linux/bcma/bcma_driver_chipcommon.h | 8 ++++
+ 7 files changed, 84 insertions(+)
+ create mode 100644 drivers/bcma/driver_chipcommon_b.c
+
+--- a/drivers/bcma/Makefile
++++ b/drivers/bcma/Makefile
+@@ -1,5 +1,6 @@
+ bcma-y += main.o scan.o core.o sprom.o
+ bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o
++bcma-y += driver_chipcommon_b.o
+ bcma-$(CONFIG_BCMA_SFLASH) += driver_chipcommon_sflash.o
+ bcma-$(CONFIG_BCMA_NFLASH) += driver_chipcommon_nflash.o
+ bcma-y += driver_pci.o
+--- a/drivers/bcma/bcma_private.h
++++ b/drivers/bcma/bcma_private.h
+@@ -50,6 +50,10 @@ void bcma_chipco_serial_init(struct bcma
+ extern struct platform_device bcma_pflash_dev;
+ #endif /* CONFIG_BCMA_DRIVER_MIPS */
+
++/* driver_chipcommon_b.c */
++int bcma_core_chipcommon_b_init(struct bcma_drv_cc_b *ccb);
++void bcma_core_chipcommon_b_free(struct bcma_drv_cc_b *ccb);
++
+ /* driver_chipcommon_pmu.c */
+ u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc);
+ u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc);
+--- /dev/null
++++ b/drivers/bcma/driver_chipcommon_b.c
+@@ -0,0 +1,59 @@
++/*
++ * Broadcom specific AMBA
++ * ChipCommon B Unit driver
++ *
++ * Copyright 2011, 2014, Hauke Mehrtens <hauke@hauke-m.de>
++ *
++ * Licensed under the GNU/GPL. See COPYING for details.
++ */
++
++#include "bcma_private.h"
++#include <linux/export.h>
++#include <linux/bcma/bcma.h>
++
++static bool bcma_wait_reg(void __iomem *addr, u32 mask, u32 value,
++ int timeout)
++{
++ unsigned long deadline = jiffies + timeout;
++ u32 val;
++
++ do {
++ val = readl(addr);
++ if ((val & mask) == value)
++ return true;
++ cpu_relax();
++ udelay(10);
++ } while (!time_after_eq(jiffies, deadline));
++
++ pr_warn("Timeout waiting for register %p!\n", addr);
++
++ return false;
++}
++
++void bcma_chipco_b_mii_write(struct bcma_drv_cc_b *ccb, u32 offset, u32 value)
++{
++ writel(offset, ccb->mii + 0x00);
++ bcma_wait_reg(ccb->mii + 0x00, 0x0100, 0x0000, 100);
++ writel(value, ccb->mii + 0x04);
++ bcma_wait_reg(ccb->mii + 0x00, 0x0100, 0x0000, 100);
++}
++EXPORT_SYMBOL_GPL(bcma_chipco_b_mii_write);
++
++int bcma_core_chipcommon_b_init(struct bcma_drv_cc_b *ccb)
++{
++ if (ccb->setup_done)
++ return 0;
++
++ ccb->setup_done = 1;
++ ccb->mii = ioremap_nocache(ccb->core->addr_s[1], BCMA_CORE_SIZE);
++ if (!ccb->mii)
++ return -ENOMEM;
++
++ return 0;
++}
++
++void bcma_core_chipcommon_b_free(struct bcma_drv_cc_b *ccb)
++{
++ if (ccb->mii)
++ iounmap(ccb->mii);
++}
+--- a/drivers/bcma/main.c
++++ b/drivers/bcma/main.c
+@@ -164,6 +164,7 @@ static int bcma_register_cores(struct bc
+ switch (core->id.id) {
+ case BCMA_CORE_4706_CHIPCOMMON:
+ case BCMA_CORE_CHIPCOMMON:
++ case BCMA_CORE_CHIPCOMMON_B:
+ case BCMA_CORE_PCI:
+ case BCMA_CORE_PCIE:
+ case BCMA_CORE_MIPS_74K:
+@@ -300,6 +301,13 @@ int bcma_bus_register(struct bcma_bus *b
+ bcma_core_chipcommon_init(&bus->drv_cc);
+ }
+
++ /* Init CC core */
++ core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON_B);
++ if (core) {
++ bus->drv_cc_b.core = core;
++ bcma_core_chipcommon_b_init(&bus->drv_cc_b);
++ }
++
+ /* Init MIPS core */
+ core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
+ if (core) {
+@@ -347,6 +355,8 @@ void bcma_bus_unregister(struct bcma_bus
+ else if (err)
+ bcma_err(bus, "Can not unregister GPIO driver: %i\n", err);
+
++ bcma_core_chipcommon_b_free(&bus->drv_cc_b);
++
+ cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
+ cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE);
+ cores[2] = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
+--- a/drivers/bcma/scan.c
++++ b/drivers/bcma/scan.c
+@@ -314,6 +314,7 @@ static int bcma_get_next_core(struct bcm
+ /* Some specific cores don't need wrappers */
+ switch (core->id.id) {
+ case BCMA_CORE_4706_MAC_GBIT_COMMON:
++ case BCMA_CORE_CHIPCOMMON_B:
+ /* Not used yet: case BCMA_CORE_OOB_ROUTER: */
+ break;
+ default:
+--- a/include/linux/bcma/bcma.h
++++ b/include/linux/bcma/bcma.h
+@@ -334,6 +334,7 @@ struct bcma_bus {
+ u8 num;
+
+ struct bcma_drv_cc drv_cc;
++ struct bcma_drv_cc_b drv_cc_b;
+ struct bcma_drv_pci drv_pci[2];
+ struct bcma_drv_mips drv_mips;
+ struct bcma_drv_gmac_cmn drv_gmac_cmn;
+--- a/include/linux/bcma/bcma_driver_chipcommon.h
++++ b/include/linux/bcma/bcma_driver_chipcommon.h
+@@ -644,6 +644,12 @@ struct bcma_drv_cc {
+ #endif
+ };
+
++struct bcma_drv_cc_b {
++ struct bcma_device *core;
++ u8 setup_done:1;
++ void __iomem *mii;
++};
++
+ /* Register access */
+ #define bcma_cc_read32(cc, offset) \
+ bcma_read32((cc)->core, offset)
+@@ -699,4 +705,6 @@ extern void bcma_pmu_spuravoid_pllupdate
+
+ extern u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc);
+
++void bcma_chipco_b_mii_write(struct bcma_drv_cc_b *ccb, u32 offset, u32 value);
++
+ #endif /* LINUX_BCMA_DRIVER_CC_H_ */