From 3bdf05441aa8e7df8e41793eff8a9bbd50c5f153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 16 Jan 2015 12:48:27 +0000 Subject: brcm47xx: backport BCM47XX arch patches (clean NVRAM code, later init) SVN-Revision: 43979 --- ...7XX-Move-SPROM-fallback-code-into-sprom.c.patch | 216 +++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 target/linux/brcm47xx/patches-3.18/033-MIPS-BCM47XX-Move-SPROM-fallback-code-into-sprom.c.patch (limited to 'target/linux/brcm47xx/patches-3.18/033-MIPS-BCM47XX-Move-SPROM-fallback-code-into-sprom.c.patch') diff --git a/target/linux/brcm47xx/patches-3.18/033-MIPS-BCM47XX-Move-SPROM-fallback-code-into-sprom.c.patch b/target/linux/brcm47xx/patches-3.18/033-MIPS-BCM47XX-Move-SPROM-fallback-code-into-sprom.c.patch new file mode 100644 index 0000000000..fe4962993b --- /dev/null +++ b/target/linux/brcm47xx/patches-3.18/033-MIPS-BCM47XX-Move-SPROM-fallback-code-into-sprom.c.patch @@ -0,0 +1,216 @@ +From a59da8fb3b2a1f2df5f871464e43cd5b6ca6ceb1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 28 Oct 2014 12:52:02 +0100 +Subject: [PATCH 157/158] MIPS: BCM47XX: Move SPROM fallback code into sprom.c +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is some general cleanup as well as preparing sprom.c to become a +standalone driver. We will need this for bcm53xx ARM arch support. + +Signed-off-by: Rafał Miłecki +Acked-by: Hauke Mehrtens +Cc: linux-mips@linux-mips.org +Patchwork: https://patchwork.linux-mips.org/patch/8232/ +Signed-off-by: Ralf Baechle +--- + arch/mips/bcm47xx/bcm47xx_private.h | 3 ++ + arch/mips/bcm47xx/setup.c | 58 ++----------------------------- + arch/mips/bcm47xx/sprom.c | 68 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 73 insertions(+), 56 deletions(-) + +diff --git a/arch/mips/bcm47xx/bcm47xx_private.h b/arch/mips/bcm47xx/bcm47xx_private.h +index f1cc9d0..12a112d 100644 +--- a/arch/mips/bcm47xx/bcm47xx_private.h ++++ b/arch/mips/bcm47xx/bcm47xx_private.h +@@ -6,6 +6,9 @@ + /* prom.c */ + void __init bcm47xx_prom_highmem_init(void); + ++/* sprom.c */ ++void bcm47xx_sprom_register_fallbacks(void); ++ + /* buttons.c */ + int __init bcm47xx_buttons_register(void); + +diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c +index c00585d..444c65a 100644 +--- a/arch/mips/bcm47xx/setup.c ++++ b/arch/mips/bcm47xx/setup.c +@@ -102,23 +102,6 @@ static void bcm47xx_machine_halt(void) + } + + #ifdef CONFIG_BCM47XX_SSB +-static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out) +-{ +- char prefix[10]; +- +- if (bus->bustype == SSB_BUSTYPE_PCI) { +- memset(out, 0, sizeof(struct ssb_sprom)); +- snprintf(prefix, sizeof(prefix), "pci/%u/%u/", +- bus->host_pci->bus->number + 1, +- PCI_SLOT(bus->host_pci->devfn)); +- bcm47xx_fill_sprom(out, prefix, false); +- return 0; +- } else { +- printk(KERN_WARNING "bcm47xx: unable to fill SPROM for given bustype.\n"); +- return -EINVAL; +- } +-} +- + static int bcm47xx_get_invariants(struct ssb_bus *bus, + struct ssb_init_invariants *iv) + { +@@ -144,11 +127,6 @@ static void __init bcm47xx_register_ssb(void) + char buf[100]; + struct ssb_mipscore *mcore; + +- err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb); +- if (err) +- printk(KERN_WARNING "bcm47xx: someone else already registered" +- " a ssb SPROM callback handler (err %d)\n", err); +- + err = ssb_bus_ssbbus_register(&(bcm47xx_bus.ssb), SSB_ENUM_BASE, + bcm47xx_get_invariants); + if (err) +@@ -171,44 +149,10 @@ static void __init bcm47xx_register_ssb(void) + #endif + + #ifdef CONFIG_BCM47XX_BCMA +-static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out) +-{ +- char prefix[10]; +- struct bcma_device *core; +- +- switch (bus->hosttype) { +- case BCMA_HOSTTYPE_PCI: +- memset(out, 0, sizeof(struct ssb_sprom)); +- snprintf(prefix, sizeof(prefix), "pci/%u/%u/", +- bus->host_pci->bus->number + 1, +- PCI_SLOT(bus->host_pci->devfn)); +- bcm47xx_fill_sprom(out, prefix, false); +- return 0; +- case BCMA_HOSTTYPE_SOC: +- memset(out, 0, sizeof(struct ssb_sprom)); +- core = bcma_find_core(bus, BCMA_CORE_80211); +- if (core) { +- snprintf(prefix, sizeof(prefix), "sb/%u/", +- core->core_index); +- bcm47xx_fill_sprom(out, prefix, true); +- } else { +- bcm47xx_fill_sprom(out, NULL, false); +- } +- return 0; +- default: +- pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n"); +- return -EINVAL; +- } +-} +- + static void __init bcm47xx_register_bcma(void) + { + int err; + +- err = bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma); +- if (err) +- pr_warn("bcm47xx: someone else already registered a bcma SPROM callback handler (err %d)\n", err); +- + err = bcma_host_soc_register(&bcm47xx_bus.bcma); + if (err) + panic("Failed to register BCMA bus (err %d)", err); +@@ -229,6 +173,7 @@ void __init plat_mem_setup(void) + printk(KERN_INFO "bcm47xx: using bcma bus\n"); + #ifdef CONFIG_BCM47XX_BCMA + bcm47xx_bus_type = BCM47XX_BUS_TYPE_BCMA; ++ bcm47xx_sprom_register_fallbacks(); + bcm47xx_register_bcma(); + bcm47xx_set_system_type(bcm47xx_bus.bcma.bus.chipinfo.id); + #ifdef CONFIG_HIGHMEM +@@ -239,6 +184,7 @@ void __init plat_mem_setup(void) + printk(KERN_INFO "bcm47xx: using ssb bus\n"); + #ifdef CONFIG_BCM47XX_SSB + bcm47xx_bus_type = BCM47XX_BUS_TYPE_SSB; ++ bcm47xx_sprom_register_fallbacks(); + bcm47xx_register_ssb(); + bcm47xx_set_system_type(bcm47xx_bus.ssb.chip_id); + #endif +diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c +index 41226b6..e772e77 100644 +--- a/arch/mips/bcm47xx/sprom.c ++++ b/arch/mips/bcm47xx/sprom.c +@@ -801,3 +801,71 @@ void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo, + nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true); + } + #endif ++ ++#if defined(CONFIG_BCM47XX_SSB) ++static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out) ++{ ++ char prefix[10]; ++ ++ if (bus->bustype == SSB_BUSTYPE_PCI) { ++ memset(out, 0, sizeof(struct ssb_sprom)); ++ snprintf(prefix, sizeof(prefix), "pci/%u/%u/", ++ bus->host_pci->bus->number + 1, ++ PCI_SLOT(bus->host_pci->devfn)); ++ bcm47xx_fill_sprom(out, prefix, false); ++ return 0; ++ } else { ++ pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n"); ++ return -EINVAL; ++ } ++} ++#endif ++ ++#if defined(CONFIG_BCM47XX_BCMA) ++static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out) ++{ ++ char prefix[10]; ++ struct bcma_device *core; ++ ++ switch (bus->hosttype) { ++ case BCMA_HOSTTYPE_PCI: ++ memset(out, 0, sizeof(struct ssb_sprom)); ++ snprintf(prefix, sizeof(prefix), "pci/%u/%u/", ++ bus->host_pci->bus->number + 1, ++ PCI_SLOT(bus->host_pci->devfn)); ++ bcm47xx_fill_sprom(out, prefix, false); ++ return 0; ++ case BCMA_HOSTTYPE_SOC: ++ memset(out, 0, sizeof(struct ssb_sprom)); ++ core = bcma_find_core(bus, BCMA_CORE_80211); ++ if (core) { ++ snprintf(prefix, sizeof(prefix), "sb/%u/", ++ core->core_index); ++ bcm47xx_fill_sprom(out, prefix, true); ++ } else { ++ bcm47xx_fill_sprom(out, NULL, false); ++ } ++ return 0; ++ default: ++ pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n"); ++ return -EINVAL; ++ } ++} ++#endif ++ ++/* ++ * On bcm47xx we need to register SPROM fallback handler very early, so we can't ++ * use anything like platform device / driver for this. ++ */ ++void bcm47xx_sprom_register_fallbacks(void) ++{ ++#if defined(CONFIG_BCM47XX_SSB) ++ if (ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb)) ++ pr_warn("Failed to registered ssb SPROM handler\n"); ++#endif ++ ++#if defined(CONFIG_BCM47XX_BCMA) ++ if (bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma)) ++ pr_warn("Failed to registered bcma SPROM handler\n"); ++#endif ++} +-- +1.8.4.5 + -- cgit v1.2.3