|
|
@ -9,6 +9,32 @@
|
|
|
|
help
|
|
|
|
help
|
|
|
|
PCI core hostmode operation (external PCI bus).
|
|
|
|
PCI core hostmode operation (external PCI bus).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -46,6 +46,15 @@ config BCMA_DRIVER_MIPS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If unsure, say N
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+config BCMA_DRIVER_GMAC_CMN
|
|
|
|
|
|
|
|
+ bool "BCMA Broadcom GBIT MAC COMMON core driver"
|
|
|
|
|
|
|
|
+ depends on BCMA
|
|
|
|
|
|
|
|
+ help
|
|
|
|
|
|
|
|
+ Driver for the Broadcom GBIT MAC COMMON core attached to Broadcom
|
|
|
|
|
|
|
|
+ specific Advanced Microcontroller Bus.
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+ If unsure, say N
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
config BCMA_DEBUG
|
|
|
|
|
|
|
|
bool "BCMA debugging"
|
|
|
|
|
|
|
|
depends on BCMA
|
|
|
|
|
|
|
|
--- a/drivers/bcma/Makefile
|
|
|
|
|
|
|
|
+++ b/drivers/bcma/Makefile
|
|
|
|
|
|
|
|
@@ -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_DRIVER_MIPS) += driver_mips.o
|
|
|
|
|
|
|
|
+bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o
|
|
|
|
|
|
|
|
bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o
|
|
|
|
|
|
|
|
bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o
|
|
|
|
|
|
|
|
obj-$(CONFIG_BCMA) += bcma.o
|
|
|
|
--- a/drivers/bcma/bcma_private.h
|
|
|
|
--- a/drivers/bcma/bcma_private.h
|
|
|
|
+++ b/drivers/bcma/bcma_private.h
|
|
|
|
+++ b/drivers/bcma/bcma_private.h
|
|
|
|
@@ -10,10 +10,19 @@
|
|
|
|
@@ -10,10 +10,19 @@
|
|
|
@ -618,6 +644,23 @@
|
|
|
|
+ bcma_cc_write32(cc, BCMA_CC_PMU_CTL, tmp);
|
|
|
|
+ bcma_cc_write32(cc, BCMA_CC_PMU_CTL, tmp);
|
|
|
|
+}
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate);
|
|
|
|
+EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate);
|
|
|
|
|
|
|
|
--- /dev/null
|
|
|
|
|
|
|
|
+++ b/drivers/bcma/driver_gmac_cmn.c
|
|
|
|
|
|
|
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
+/*
|
|
|
|
|
|
|
|
+ * Broadcom specific AMBA
|
|
|
|
|
|
|
|
+ * GBIT MAC COMMON Core
|
|
|
|
|
|
|
|
+ *
|
|
|
|
|
|
|
|
+ * Licensed under the GNU/GPL. See COPYING for details.
|
|
|
|
|
|
|
|
+ */
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+#include "bcma_private.h"
|
|
|
|
|
|
|
|
+#include <linux/bcma/bcma.h>
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+void __devinit bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc)
|
|
|
|
|
|
|
|
+{
|
|
|
|
|
|
|
|
+ mutex_init(&gc->phy_mutex);
|
|
|
|
|
|
|
|
+}
|
|
|
|
--- a/drivers/bcma/driver_mips.c
|
|
|
|
--- a/drivers/bcma/driver_mips.c
|
|
|
|
+++ b/drivers/bcma/driver_mips.c
|
|
|
|
+++ b/drivers/bcma/driver_mips.c
|
|
|
|
@@ -22,15 +22,15 @@
|
|
|
|
@@ -22,15 +22,15 @@
|
|
|
@ -1737,16 +1780,23 @@
|
|
|
|
static int bcma_bus_match(struct device *dev, struct device_driver *drv);
|
|
|
|
static int bcma_bus_match(struct device *dev, struct device_driver *drv);
|
|
|
|
static int bcma_device_probe(struct device *dev);
|
|
|
|
static int bcma_device_probe(struct device *dev);
|
|
|
|
static int bcma_device_remove(struct device *dev);
|
|
|
|
static int bcma_device_remove(struct device *dev);
|
|
|
|
@@ -55,7 +61,7 @@ static struct bus_type bcma_bus_type = {
|
|
|
|
@@ -55,7 +61,14 @@ static struct bus_type bcma_bus_type = {
|
|
|
|
.dev_attrs = bcma_device_attrs,
|
|
|
|
.dev_attrs = bcma_device_attrs,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
-static struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
|
|
|
-static struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
|
|
|
|
|
|
|
+static u16 bcma_cc_core_id(struct bcma_bus *bus)
|
|
|
|
|
|
|
|
+{
|
|
|
|
|
|
|
|
+ if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4706)
|
|
|
|
|
|
|
|
+ return BCMA_CORE_4706_CHIPCOMMON;
|
|
|
|
|
|
|
|
+ return BCMA_CORE_CHIPCOMMON;
|
|
|
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
+
|
|
|
|
+struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
|
|
|
+struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct bcma_device *core;
|
|
|
|
struct bcma_device *core;
|
|
|
|
|
|
|
|
|
|
|
|
@@ -65,6 +71,7 @@ static struct bcma_device *bcma_find_cor
|
|
|
|
@@ -65,6 +78,7 @@ static struct bcma_device *bcma_find_cor
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1754,7 +1804,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
static void bcma_release_core_dev(struct device *dev)
|
|
|
|
static void bcma_release_core_dev(struct device *dev)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@@ -93,7 +100,7 @@ static int bcma_register_cores(struct bc
|
|
|
|
@@ -84,16 +98,18 @@ static int bcma_register_cores(struct bc
|
|
|
|
|
|
|
|
list_for_each_entry(core, &bus->cores, list) {
|
|
|
|
|
|
|
|
/* We support that cores ourself */
|
|
|
|
|
|
|
|
switch (core->id.id) {
|
|
|
|
|
|
|
|
+ case BCMA_CORE_4706_CHIPCOMMON:
|
|
|
|
|
|
|
|
case BCMA_CORE_CHIPCOMMON:
|
|
|
|
|
|
|
|
case BCMA_CORE_PCI:
|
|
|
|
|
|
|
|
case BCMA_CORE_PCIE:
|
|
|
|
|
|
|
|
case BCMA_CORE_MIPS_74K:
|
|
|
|
|
|
|
|
+ case BCMA_CORE_4706_MAC_GBIT_COMMON:
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
core->dev.release = bcma_release_core_dev;
|
|
|
|
core->dev.release = bcma_release_core_dev;
|
|
|
|
core->dev.bus = &bcma_bus_type;
|
|
|
|
core->dev.bus = &bcma_bus_type;
|
|
|
@ -1763,7 +1824,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
switch (bus->hosttype) {
|
|
|
|
switch (bus->hosttype) {
|
|
|
|
case BCMA_HOSTTYPE_PCI:
|
|
|
|
case BCMA_HOSTTYPE_PCI:
|
|
|
|
@@ -111,8 +118,9 @@ static int bcma_register_cores(struct bc
|
|
|
|
@@ -111,8 +127,9 @@ static int bcma_register_cores(struct bc
|
|
|
|
|
|
|
|
|
|
|
|
err = device_register(&core->dev);
|
|
|
|
err = device_register(&core->dev);
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
@ -1775,7 +1836,7 @@
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
core->dev_registered = true;
|
|
|
|
core->dev_registered = true;
|
|
|
|
@@ -132,15 +140,19 @@ static void bcma_unregister_cores(struct
|
|
|
|
@@ -132,20 +149,24 @@ static void bcma_unregister_cores(struct
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1797,7 +1858,23 @@
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -168,14 +180,14 @@ int bcma_bus_register(struct bcma_bus *b
|
|
|
|
/* Init CC core */
|
|
|
|
|
|
|
|
- core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON);
|
|
|
|
|
|
|
|
+ core = bcma_find_core(bus, bcma_cc_core_id(bus));
|
|
|
|
|
|
|
|
if (core) {
|
|
|
|
|
|
|
|
bus->drv_cc.core = core;
|
|
|
|
|
|
|
|
bcma_core_chipcommon_init(&bus->drv_cc);
|
|
|
|
|
|
|
|
@@ -165,17 +186,24 @@ int bcma_bus_register(struct bcma_bus *b
|
|
|
|
|
|
|
|
bcma_core_pci_init(&bus->drv_pci);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ /* Init GBIT MAC COMMON core */
|
|
|
|
|
|
|
|
+ core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
|
|
|
|
|
|
|
|
+ if (core) {
|
|
|
|
|
|
|
|
+ bus->drv_gmac_cmn.core = core;
|
|
|
|
|
|
|
|
+ bcma_core_gmac_cmn_init(&bus->drv_gmac_cmn);
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+
|
|
|
|
/* Try to get SPROM */
|
|
|
|
/* Try to get SPROM */
|
|
|
|
err = bcma_sprom_get(bus);
|
|
|
|
err = bcma_sprom_get(bus);
|
|
|
|
if (err == -ENOENT) {
|
|
|
|
if (err == -ENOENT) {
|
|
|
@ -1815,7 +1892,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -203,7 +215,7 @@ int __init bcma_bus_early_register(struc
|
|
|
|
@@ -196,14 +224,14 @@ int __init bcma_bus_early_register(struc
|
|
|
|
|
|
|
|
bcma_init_bus(bus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
match.manuf = BCMA_MANUF_BCM;
|
|
|
|
|
|
|
|
- match.id = BCMA_CORE_CHIPCOMMON;
|
|
|
|
|
|
|
|
+ match.id = bcma_cc_core_id(bus);
|
|
|
|
|
|
|
|
match.class = BCMA_CL_SIM;
|
|
|
|
|
|
|
|
match.rev = BCMA_ANY_REV;
|
|
|
|
|
|
|
|
|
|
|
|
/* Scan for chip common core */
|
|
|
|
/* Scan for chip common core */
|
|
|
|
err = bcma_bus_scan_early(bus, &match, core_cc);
|
|
|
|
err = bcma_bus_scan_early(bus, &match, core_cc);
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
@ -1824,7 +1909,7 @@
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -215,7 +227,7 @@ int __init bcma_bus_early_register(struc
|
|
|
|
@@ -215,12 +243,12 @@ int __init bcma_bus_early_register(struc
|
|
|
|
/* Scan for mips core */
|
|
|
|
/* Scan for mips core */
|
|
|
|
err = bcma_bus_scan_early(bus, &match, core_mips);
|
|
|
|
err = bcma_bus_scan_early(bus, &match, core_mips);
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
@ -1833,7 +1918,13 @@
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -233,7 +245,7 @@ int __init bcma_bus_early_register(struc
|
|
|
|
/* Init CC core */
|
|
|
|
|
|
|
|
- core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON);
|
|
|
|
|
|
|
|
+ core = bcma_find_core(bus, bcma_cc_core_id(bus));
|
|
|
|
|
|
|
|
if (core) {
|
|
|
|
|
|
|
|
bus->drv_cc.core = core;
|
|
|
|
|
|
|
|
bcma_core_chipcommon_init(&bus->drv_cc);
|
|
|
|
|
|
|
|
@@ -233,7 +261,7 @@ int __init bcma_bus_early_register(struc
|
|
|
|
bcma_core_mips_init(&bus->drv_mips);
|
|
|
|
bcma_core_mips_init(&bus->drv_mips);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1842,6 +1933,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -259,8 +287,7 @@ int bcma_bus_resume(struct bcma_bus *bus
|
|
|
|
|
|
|
|
struct bcma_device *core;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Init CC core */
|
|
|
|
|
|
|
|
- core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON);
|
|
|
|
|
|
|
|
- if (core) {
|
|
|
|
|
|
|
|
+ if (bus->drv_cc.core) {
|
|
|
|
|
|
|
|
bus->drv_cc.setup_done = false;
|
|
|
|
|
|
|
|
bcma_core_chipcommon_init(&bus->drv_cc);
|
|
|
|
|
|
|
|
}
|
|
|
|
--- a/drivers/bcma/scan.c
|
|
|
|
--- a/drivers/bcma/scan.c
|
|
|
|
+++ b/drivers/bcma/scan.c
|
|
|
|
+++ b/drivers/bcma/scan.c
|
|
|
|
@@ -19,15 +19,27 @@ struct bcma_device_id_name {
|
|
|
|
@@ -19,15 +19,27 @@ struct bcma_device_id_name {
|
|
|
@ -1851,6 +1952,7 @@
|
|
|
|
-struct bcma_device_id_name bcma_device_names[] = {
|
|
|
|
-struct bcma_device_id_name bcma_device_names[] = {
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static const struct bcma_device_id_name bcma_arm_device_names[] = {
|
|
|
|
+static const struct bcma_device_id_name bcma_arm_device_names[] = {
|
|
|
|
|
|
|
|
+ { BCMA_CORE_4706_MAC_GBIT_COMMON, "BCM4706 GBit MAC Common" },
|
|
|
|
+ { BCMA_CORE_ARM_1176, "ARM 1176" },
|
|
|
|
+ { BCMA_CORE_ARM_1176, "ARM 1176" },
|
|
|
|
+ { BCMA_CORE_ARM_7TDMI, "ARM 7TDMI" },
|
|
|
|
+ { BCMA_CORE_ARM_7TDMI, "ARM 7TDMI" },
|
|
|
|
+ { BCMA_CORE_ARM_CM3, "ARM CM3" },
|
|
|
|
+ { BCMA_CORE_ARM_CM3, "ARM CM3" },
|
|
|
@ -1863,7 +1965,6 @@
|
|
|
|
+ { BCMA_CORE_4706_MAC_GBIT, "BCM4706 GBit MAC" },
|
|
|
|
+ { BCMA_CORE_4706_MAC_GBIT, "BCM4706 GBit MAC" },
|
|
|
|
+ { BCMA_CORE_AMEMC, "AMEMC (DDR)" },
|
|
|
|
+ { BCMA_CORE_AMEMC, "AMEMC (DDR)" },
|
|
|
|
+ { BCMA_CORE_ALTA, "ALTA (I2S)" },
|
|
|
|
+ { BCMA_CORE_ALTA, "ALTA (I2S)" },
|
|
|
|
+ { BCMA_CORE_4706_MAC_GBIT_COMMON, "BCM4706 GBit MAC Common" },
|
|
|
|
|
|
|
|
{ BCMA_CORE_INVALID, "Invalid" },
|
|
|
|
{ BCMA_CORE_INVALID, "Invalid" },
|
|
|
|
{ BCMA_CORE_CHIPCOMMON, "ChipCommon" },
|
|
|
|
{ BCMA_CORE_CHIPCOMMON, "ChipCommon" },
|
|
|
|
{ BCMA_CORE_ILINE20, "ILine 20" },
|
|
|
|
{ BCMA_CORE_ILINE20, "ILine 20" },
|
|
|
@ -1965,7 +2066,28 @@
|
|
|
|
static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
|
|
|
|
static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
|
|
|
|
struct bcma_device_id *match, int core_num,
|
|
|
|
struct bcma_device_id *match, int core_num,
|
|
|
|
struct bcma_device *core)
|
|
|
|
struct bcma_device *core)
|
|
|
|
@@ -286,6 +329,23 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
@@ -252,11 +295,15 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* check if component is a core at all */
|
|
|
|
|
|
|
|
if (wrappers[0] + wrappers[1] == 0) {
|
|
|
|
|
|
|
|
- /* we could save addrl of the router
|
|
|
|
|
|
|
|
- if (cid == BCMA_CORE_OOB_ROUTER)
|
|
|
|
|
|
|
|
- */
|
|
|
|
|
|
|
|
- bcma_erom_skip_component(bus, eromptr);
|
|
|
|
|
|
|
|
- return -ENXIO;
|
|
|
|
|
|
|
|
+ /* Some specific cores don't need wrappers */
|
|
|
|
|
|
|
|
+ switch (core->id.id) {
|
|
|
|
|
|
|
|
+ case BCMA_CORE_4706_MAC_GBIT_COMMON:
|
|
|
|
|
|
|
|
+ /* Not used yet: case BCMA_CORE_OOB_ROUTER: */
|
|
|
|
|
|
|
|
+ break;
|
|
|
|
|
|
|
|
+ default:
|
|
|
|
|
|
|
|
+ bcma_erom_skip_component(bus, eromptr);
|
|
|
|
|
|
|
|
+ return -ENXIO;
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (bcma_erom_is_bridge(bus, eromptr)) {
|
|
|
|
|
|
|
|
@@ -286,6 +333,23 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
return -EILSEQ;
|
|
|
|
return -EILSEQ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1989,7 +2111,7 @@
|
|
|
|
/* get & parse slave ports */
|
|
|
|
/* get & parse slave ports */
|
|
|
|
for (i = 0; i < ports[1]; i++) {
|
|
|
|
for (i = 0; i < ports[1]; i++) {
|
|
|
|
for (j = 0; ; j++) {
|
|
|
|
for (j = 0; ; j++) {
|
|
|
|
@@ -298,7 +358,7 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
@@ -298,7 +362,7 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if (i == 0 && j == 0)
|
|
|
|
if (i == 0 && j == 0)
|
|
|
@ -1998,7 +2120,7 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -353,6 +413,7 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
@@ -353,6 +417,7 @@ static int bcma_get_next_core(struct bcm
|
|
|
|
void bcma_init_bus(struct bcma_bus *bus)
|
|
|
|
void bcma_init_bus(struct bcma_bus *bus)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s32 tmp;
|
|
|
|
s32 tmp;
|
|
|
@ -2006,7 +2128,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
if (bus->init_done)
|
|
|
|
if (bus->init_done)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
@@ -363,9 +424,12 @@ void bcma_init_bus(struct bcma_bus *bus)
|
|
|
|
@@ -363,9 +428,12 @@ void bcma_init_bus(struct bcma_bus *bus)
|
|
|
|
bcma_scan_switch_core(bus, BCMA_ADDR_BASE);
|
|
|
|
bcma_scan_switch_core(bus, BCMA_ADDR_BASE);
|
|
|
|
|
|
|
|
|
|
|
|
tmp = bcma_scan_read32(bus, 0, BCMA_CC_ID);
|
|
|
|
tmp = bcma_scan_read32(bus, 0, BCMA_CC_ID);
|
|
|
@ -2022,7 +2144,7 @@
|
|
|
|
bus->init_done = true;
|
|
|
|
bus->init_done = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -392,6 +456,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|
|
|
@@ -392,6 +460,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|
|
|
bcma_scan_switch_core(bus, erombase);
|
|
|
|
bcma_scan_switch_core(bus, erombase);
|
|
|
|
|
|
|
|
|
|
|
|
while (eromptr < eromend) {
|
|
|
|
while (eromptr < eromend) {
|
|
|
@ -2030,7 +2152,7 @@
|
|
|
|
struct bcma_device *core = kzalloc(sizeof(*core), GFP_KERNEL);
|
|
|
|
struct bcma_device *core = kzalloc(sizeof(*core), GFP_KERNEL);
|
|
|
|
if (!core)
|
|
|
|
if (!core)
|
|
|
|
return -ENOMEM;
|
|
|
|
return -ENOMEM;
|
|
|
|
@@ -414,12 +479,13 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|
|
|
@@ -414,14 +483,15 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|
|
|
|
|
|
|
|
|
|
|
core->core_index = core_num++;
|
|
|
|
core->core_index = core_num++;
|
|
|
|
bus->nr_cores++;
|
|
|
|
bus->nr_cores++;
|
|
|
@ -2047,9 +2169,12 @@
|
|
|
|
+ core->id.manuf, core->id.id, core->id.rev,
|
|
|
|
+ core->id.manuf, core->id.id, core->id.rev,
|
|
|
|
+ core->id.class);
|
|
|
|
+ core->id.class);
|
|
|
|
|
|
|
|
|
|
|
|
list_add(&core->list, &bus->cores);
|
|
|
|
- list_add(&core->list, &bus->cores);
|
|
|
|
|
|
|
|
+ list_add_tail(&core->list, &bus->cores);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -471,11 +537,10 @@ int __init bcma_bus_scan_early(struct bc
|
|
|
|
|
|
|
|
|
|
|
|
if (bus->hosttype == BCMA_HOSTTYPE_SOC)
|
|
|
|
|
|
|
|
@@ -471,13 +541,12 @@ int __init bcma_bus_scan_early(struct bc
|
|
|
|
|
|
|
|
|
|
|
|
core->core_index = core_num++;
|
|
|
|
core->core_index = core_num++;
|
|
|
|
bus->nr_cores++;
|
|
|
|
bus->nr_cores++;
|
|
|
@ -2063,8 +2188,22 @@
|
|
|
|
+ core->id.manuf, core->id.id, core->id.rev,
|
|
|
|
+ core->id.manuf, core->id.id, core->id.rev,
|
|
|
|
+ core->id.class);
|
|
|
|
+ core->id.class);
|
|
|
|
|
|
|
|
|
|
|
|
list_add(&core->list, &bus->cores);
|
|
|
|
- list_add(&core->list, &bus->cores);
|
|
|
|
|
|
|
|
+ list_add_tail(&core->list, &bus->cores);
|
|
|
|
err = 0;
|
|
|
|
err = 0;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
--- a/drivers/bcma/scan.h
|
|
|
|
|
|
|
|
+++ b/drivers/bcma/scan.h
|
|
|
|
|
|
|
|
@@ -27,7 +27,7 @@
|
|
|
|
|
|
|
|
#define SCAN_CIB_NMW 0x0007C000
|
|
|
|
|
|
|
|
#define SCAN_CIB_NMW_SHIFT 14
|
|
|
|
|
|
|
|
#define SCAN_CIB_NSW 0x00F80000
|
|
|
|
|
|
|
|
-#define SCAN_CIB_NSW_SHIFT 17
|
|
|
|
|
|
|
|
+#define SCAN_CIB_NSW_SHIFT 19
|
|
|
|
|
|
|
|
#define SCAN_CIB_REV 0xFF000000
|
|
|
|
|
|
|
|
#define SCAN_CIB_REV_SHIFT 24
|
|
|
|
|
|
|
|
|
|
|
|
--- a/drivers/bcma/sprom.c
|
|
|
|
--- a/drivers/bcma/sprom.c
|
|
|
|
+++ b/drivers/bcma/sprom.c
|
|
|
|
+++ b/drivers/bcma/sprom.c
|
|
|
|
@@ -2,6 +2,8 @@
|
|
|
|
@@ -2,6 +2,8 @@
|
|
|
@ -2630,7 +2769,15 @@
|
|
|
|
err = bcma_sprom_valid(sprom);
|
|
|
|
err = bcma_sprom_valid(sprom);
|
|
|
|
--- a/include/linux/bcma/bcma.h
|
|
|
|
--- a/include/linux/bcma/bcma.h
|
|
|
|
+++ b/include/linux/bcma/bcma.h
|
|
|
|
+++ b/include/linux/bcma/bcma.h
|
|
|
|
@@ -26,6 +26,11 @@ struct bcma_chipinfo {
|
|
|
|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
|
|
#include <linux/bcma/bcma_driver_chipcommon.h>
|
|
|
|
|
|
|
|
#include <linux/bcma/bcma_driver_pci.h>
|
|
|
|
|
|
|
|
#include <linux/bcma/bcma_driver_mips.h>
|
|
|
|
|
|
|
|
+#include <linux/bcma/bcma_driver_gmac_cmn.h>
|
|
|
|
|
|
|
|
#include <linux/ssb/ssb.h> /* SPROM sharing */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "bcma_regs.h"
|
|
|
|
|
|
|
|
@@ -26,6 +27,11 @@ struct bcma_chipinfo {
|
|
|
|
u8 pkg;
|
|
|
|
u8 pkg;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -2642,7 +2789,7 @@
|
|
|
|
enum bcma_clkmode {
|
|
|
|
enum bcma_clkmode {
|
|
|
|
BCMA_CLKMODE_FAST,
|
|
|
|
BCMA_CLKMODE_FAST,
|
|
|
|
BCMA_CLKMODE_DYNAMIC,
|
|
|
|
BCMA_CLKMODE_DYNAMIC,
|
|
|
|
@@ -65,6 +70,13 @@ struct bcma_host_ops {
|
|
|
|
@@ -65,6 +71,13 @@ struct bcma_host_ops {
|
|
|
|
|
|
|
|
|
|
|
|
/* Core-ID values. */
|
|
|
|
/* Core-ID values. */
|
|
|
|
#define BCMA_CORE_OOB_ROUTER 0x367 /* Out of band */
|
|
|
|
#define BCMA_CORE_OOB_ROUTER 0x367 /* Out of band */
|
|
|
@ -2656,7 +2803,7 @@
|
|
|
|
#define BCMA_CORE_INVALID 0x700
|
|
|
|
#define BCMA_CORE_INVALID 0x700
|
|
|
|
#define BCMA_CORE_CHIPCOMMON 0x800
|
|
|
|
#define BCMA_CORE_CHIPCOMMON 0x800
|
|
|
|
#define BCMA_CORE_ILINE20 0x801
|
|
|
|
#define BCMA_CORE_ILINE20 0x801
|
|
|
|
@@ -125,6 +137,36 @@ struct bcma_host_ops {
|
|
|
|
@@ -125,6 +138,36 @@ struct bcma_host_ops {
|
|
|
|
|
|
|
|
|
|
|
|
#define BCMA_MAX_NR_CORES 16
|
|
|
|
#define BCMA_MAX_NR_CORES 16
|
|
|
|
|
|
|
|
|
|
|
@ -2693,7 +2840,7 @@
|
|
|
|
struct bcma_device {
|
|
|
|
struct bcma_device {
|
|
|
|
struct bcma_bus *bus;
|
|
|
|
struct bcma_bus *bus;
|
|
|
|
struct bcma_device_id id;
|
|
|
|
struct bcma_device_id id;
|
|
|
|
@@ -136,8 +178,10 @@ struct bcma_device {
|
|
|
|
@@ -136,8 +179,10 @@ struct bcma_device {
|
|
|
|
bool dev_registered;
|
|
|
|
bool dev_registered;
|
|
|
|
|
|
|
|
|
|
|
|
u8 core_index;
|
|
|
|
u8 core_index;
|
|
|
@ -2704,7 +2851,7 @@
|
|
|
|
u32 wrap;
|
|
|
|
u32 wrap;
|
|
|
|
|
|
|
|
|
|
|
|
void __iomem *io_addr;
|
|
|
|
void __iomem *io_addr;
|
|
|
|
@@ -175,6 +219,12 @@ int __bcma_driver_register(struct bcma_d
|
|
|
|
@@ -175,6 +220,12 @@ int __bcma_driver_register(struct bcma_d
|
|
|
|
|
|
|
|
|
|
|
|
extern void bcma_driver_unregister(struct bcma_driver *drv);
|
|
|
|
extern void bcma_driver_unregister(struct bcma_driver *drv);
|
|
|
|
|
|
|
|
|
|
|
@ -2717,7 +2864,7 @@
|
|
|
|
struct bcma_bus {
|
|
|
|
struct bcma_bus {
|
|
|
|
/* The MMIO area. */
|
|
|
|
/* The MMIO area. */
|
|
|
|
void __iomem *mmio;
|
|
|
|
void __iomem *mmio;
|
|
|
|
@@ -191,10 +241,13 @@ struct bcma_bus {
|
|
|
|
@@ -191,14 +242,18 @@ struct bcma_bus {
|
|
|
|
|
|
|
|
|
|
|
|
struct bcma_chipinfo chipinfo;
|
|
|
|
struct bcma_chipinfo chipinfo;
|
|
|
|
|
|
|
|
|
|
|
@ -2731,7 +2878,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
struct bcma_drv_cc drv_cc;
|
|
|
|
struct bcma_drv_cc drv_cc;
|
|
|
|
struct bcma_drv_pci drv_pci;
|
|
|
|
struct bcma_drv_pci drv_pci;
|
|
|
|
@@ -282,6 +335,7 @@ static inline void bcma_maskset16(struct
|
|
|
|
struct bcma_drv_mips drv_mips;
|
|
|
|
|
|
|
|
+ struct bcma_drv_gmac_cmn drv_gmac_cmn;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* We decided to share SPROM struct with SSB as long as we do not need
|
|
|
|
|
|
|
|
* any hacks for BCMA. This simplifies drivers code. */
|
|
|
|
|
|
|
|
@@ -282,6 +337,7 @@ static inline void bcma_maskset16(struct
|
|
|
|
bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
|
|
|
|
bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2869,6 +3021,109 @@
|
|
|
|
+extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid);
|
|
|
|
+extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid);
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* LINUX_BCMA_DRIVER_CC_H_ */
|
|
|
|
#endif /* LINUX_BCMA_DRIVER_CC_H_ */
|
|
|
|
|
|
|
|
--- /dev/null
|
|
|
|
|
|
|
|
+++ b/include/linux/bcma/bcma_driver_gmac_cmn.h
|
|
|
|
|
|
|
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
+#ifndef LINUX_BCMA_DRIVER_GMAC_CMN_H_
|
|
|
|
|
|
|
|
+#define LINUX_BCMA_DRIVER_GMAC_CMN_H_
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+#include <linux/types.h>
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_STAG0 0x000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_STAG1 0x004
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_STAG2 0x008
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_STAG3 0x00C
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PARSER_CTL 0x020
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_MIB_MAX_LEN 0x024
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PHY_ACCESS 0x100
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_DATA_MASK 0x0000ffff
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_ADDR_MASK 0x001f0000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_ADDR_SHIFT 16
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_REG_MASK 0x1f000000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_REG_SHIFT 24
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_WRITE 0x20000000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PA_START 0x40000000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PHY_CTL 0x104
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PC_EPA_MASK 0x0000001f
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PC_MCT_MASK 0x007f0000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PC_MCT_SHIFT 16
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_PC_MTE 0x00800000
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_GMAC0_RGMII_CTL 0x110
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_ACCESS 0x200
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA0 0x210
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA1 0x214
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA2 0x218
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA3 0x21C
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA4 0x220
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA5 0x224
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA6 0x228
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_DATA7 0x22C
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK0 0x230
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK1 0x234
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK2 0x238
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK3 0x23C
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK4 0x240
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK5 0x244
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK6 0x248
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_TCAM_MASK7 0x24C
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_CFP_ACTION_DATA 0x250
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_TCAM_BIST_CTL 0x2A0
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_TCAM_BIST_STATUS 0x2A4
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_TCAM_CMP_STATUS 0x2A8
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_TCAM_DISABLE 0x2AC
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_TCAM_TEST_CTL 0x2F0
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_A3_A0 0x300
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_A7_A4 0x304
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_A8 0x308
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_A3_A0 0x310
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_A7_A4 0x314
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_A8 0x318
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_A3_A0 0x320
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_A7_A4 0x324
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_A8 0x328
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_B3_B0 0x330
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_B7_B4 0x334
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_B8 0x338
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_B3_B0 0x340
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_B7_B4 0x344
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_B8 0x348
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_B3_B0 0x350
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_B7_B4 0x354
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_B8 0x358
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_C3_C0 0x360
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_C7_C4 0x364
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_C8 0x368
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_C3_C0 0x370
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_C7_C4 0x374
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_1_C8 0x378
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_C3_C0 0x380
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_C7_C4 0x384
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_2_C8 0x388
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_D3_D0 0x390
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_D7_D4 0x394
|
|
|
|
|
|
|
|
+#define BCMA_GMAC_CMN_UDF_0_D11_D8 0x394
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+struct bcma_drv_gmac_cmn {
|
|
|
|
|
|
|
|
+ struct bcma_device *core;
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+ /* Drivers accessing BCMA_GMAC_CMN_PHY_ACCESS and
|
|
|
|
|
|
|
|
+ * BCMA_GMAC_CMN_PHY_CTL need to take that mutex first. */
|
|
|
|
|
|
|
|
+ struct mutex phy_mutex;
|
|
|
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+/* Register access */
|
|
|
|
|
|
|
|
+#define gmac_cmn_read16(gc, offset) bcma_read16((gc)->core, offset)
|
|
|
|
|
|
|
|
+#define gmac_cmn_read32(gc, offset) bcma_read32((gc)->core, offset)
|
|
|
|
|
|
|
|
+#define gmac_cmn_write16(gc, offset, val) bcma_write16((gc)->core, offset, val)
|
|
|
|
|
|
|
|
+#define gmac_cmn_write32(gc, offset, val) bcma_write32((gc)->core, offset, val)
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+#ifdef CONFIG_BCMA_DRIVER_GMAC_CMN
|
|
|
|
|
|
|
|
+extern void __devinit bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc);
|
|
|
|
|
|
|
|
+#else
|
|
|
|
|
|
|
|
+static inline void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc) { }
|
|
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+#endif /* LINUX_BCMA_DRIVER_GMAC_CMN_H_ */
|
|
|
|
--- a/include/linux/bcma/bcma_driver_pci.h
|
|
|
|
--- a/include/linux/bcma/bcma_driver_pci.h
|
|
|
|
+++ b/include/linux/bcma/bcma_driver_pci.h
|
|
|
|
+++ b/include/linux/bcma/bcma_driver_pci.h
|
|
|
|
@@ -53,11 +53,47 @@ struct pci_dev;
|
|
|
|
@@ -53,11 +53,47 @@ struct pci_dev;
|
|
|
|