brcm47xx: sprom for nvram parsing
[openwrt.git] / target / linux / brcm47xx / patches-3.2 / 199-MIPS-BCM47XX-provide-sprom-to-bcma-bus.patch
diff --git a/target/linux/brcm47xx/patches-3.2/199-MIPS-BCM47XX-provide-sprom-to-bcma-bus.patch b/target/linux/brcm47xx/patches-3.2/199-MIPS-BCM47XX-provide-sprom-to-bcma-bus.patch
new file mode 100644 (file)
index 0000000..e3d2527
--- /dev/null
@@ -0,0 +1,94 @@
+From 112b2e12edda60f495b57e8a1d85eb95e2662845 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Thu, 16 Feb 2012 23:44:26 +0100
+Subject: [PATCH 199/202] MIPS: BCM47XX: provide sprom to bcma bus
+
+On SoCs the sprom is often stored in nvram in the flashchip. This patch
+registers a sprom fallback callback handler in bcma and provides the
+sprom needed for this device.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ arch/mips/bcm47xx/setup.c |   39 +++++++++++++++++++++++++++++++++++----
+ 1 files changed, 35 insertions(+), 4 deletions(-)
+
+--- a/arch/mips/bcm47xx/setup.c
++++ b/arch/mips/bcm47xx/setup.c
+@@ -3,7 +3,7 @@
+  *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
+  *  Copyright (C) 2006 Michael Buesch <m@bues.ch>
+  *  Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
+- *  Copyright (C) 2010-2011 Hauke Mehrtens <hauke@hauke-m.de>
++ *  Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
+  *
+  *  This program is free software; you can redistribute  it and/or modify it
+  *  under  the terms of  the GNU General  Public License as published by the
+@@ -91,7 +91,7 @@ static void bcm47xx_machine_halt(void)
+ }
+ #ifdef CONFIG_BCM47XX_SSB
+-static int bcm47xx_get_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
++static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
+ {
+       char prefix[10];
+@@ -108,7 +108,7 @@ static int bcm47xx_get_sprom(struct ssb_
+ }
+ static int bcm47xx_get_invariants(struct ssb_bus *bus,
+-                                 struct ssb_init_invariants *iv)
++                                struct ssb_init_invariants *iv)
+ {
+       char buf[20];
+@@ -163,7 +163,7 @@ static void __init bcm47xx_register_ssb(
+       char buf[100];
+       struct ssb_mipscore *mcore;
+-      err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom);
++      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);
+@@ -197,10 +197,41 @@ static void __init bcm47xx_register_ssb(
+ #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;
++
++      if (bus->hosttype == BCMA_HOSTTYPE_PCI) {
++              snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
++                       bus->host_pci->bus->number + 1,
++                       PCI_SLOT(bus->host_pci->devfn));
++              bcm47xx_fill_sprom(out, prefix);
++              return 0;
++      } else if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
++              bcm47xx_fill_sprom_ethernet(out, NULL);
++              core = bcma_find_core(bus, BCMA_CORE_80211);
++              if (core) {
++                      snprintf(prefix, sizeof(prefix), "sb/%u/",
++                               core->core_index);
++                      bcm47xx_fill_sprom(out, prefix);
++              }
++              return 0;
++      } else {
++              printk(KERN_WARNING "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)
++              printk(KERN_WARNING "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 initialize BCMA bus (err %d)\n", err);
This page took 0.024872 seconds and 4 git commands to generate.