diff options
Diffstat (limited to 'target/linux/brcm47xx/patches-3.18/031-12-MIPS-BCM47xx-Add-generic-function-filling-SPROM-entr.patch')
-rw-r--r-- | target/linux/brcm47xx/patches-3.18/031-12-MIPS-BCM47xx-Add-generic-function-filling-SPROM-entr.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.18/031-12-MIPS-BCM47xx-Add-generic-function-filling-SPROM-entr.patch b/target/linux/brcm47xx/patches-3.18/031-12-MIPS-BCM47xx-Add-generic-function-filling-SPROM-entr.patch new file mode 100644 index 0000000000..eb994facff --- /dev/null +++ b/target/linux/brcm47xx/patches-3.18/031-12-MIPS-BCM47xx-Add-generic-function-filling-SPROM-entr.patch @@ -0,0 +1,85 @@ +From d55a52ccf8f80cdf51af2c5c6e56c825f98c4f85 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com> +Date: Thu, 2 Apr 2015 09:13:49 +0200 +Subject: [PATCH] MIPS: BCM47xx: Add generic function filling SPROM entries +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Handling many SPROM revisions became messy, we have tons of functions +specific to various revision groups which are quite hard to track. +For years there is yet another revision 11 asking for support, but +adding it in current the form would make things even worse. +To resolve this problem let's add new function with table-like entries +that will contain revision bitmask for every SPROM variable. + +Signed-off-by: Rafał Miłecki <zajec5@gmail.com> +Cc: linux-mips@linux-mips.org +Cc: Hauke Mehrtens <hauke@hauke-m.de> +Cc: Jonas Gorski <jonas.gorski@gmail.com> +Patchwork: https://patchwork.linux-mips.org/patch/9659/ +Signed-off-by: Ralf Baechle <ralf@linux-mips.org> +--- + arch/mips/bcm47xx/sprom.c | 32 +++++++++++++++++++++++++++++--- + 1 file changed, 29 insertions(+), 3 deletions(-) + +diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c +index 5d32afc..77790c9 100644 +--- a/arch/mips/bcm47xx/sprom.c ++++ b/arch/mips/bcm47xx/sprom.c +@@ -180,6 +180,33 @@ static void nvram_read_alpha2(const char *prefix, const char *name, + memcpy(val, buf, 2); + } + ++/* This is one-function-only macro, it uses local "sprom" variable! */ ++#define ENTRY(_revmask, _type, _prefix, _name, _val, _allset, _fallback) \ ++ if (_revmask & BIT(sprom->revision)) \ ++ nvram_read_ ## _type(_prefix, NULL, _name, &sprom->_val, \ ++ _allset, _fallback) ++/* ++ * Special version of filling function that can be safely called for any SPROM ++ * revision. For every NVRAM to SPROM mapping it contains bitmask of revisions ++ * for which the mapping is valid. ++ * It obviously requires some hexadecimal/bitmasks knowledge, but allows ++ * writing cleaner code (easy revisions handling). ++ * Note that while SPROM revision 0 was never used, we still keep BIT(0) ++ * reserved for it, just to keep numbering sane. ++ */ ++static void bcm47xx_sprom_fill_auto(struct ssb_sprom *sprom, ++ const char *prefix, bool fallback) ++{ ++ const char *pre = prefix; ++ bool fb = fallback; ++ ++ ENTRY(0xfffffffe, u16, pre, "boardrev", board_rev, 0, true); ++ ENTRY(0xfffffffe, u16, pre, "boardnum", board_num, 0, fb); ++ ++ /* TODO: Move more mappings here */ ++} ++#undef ENTRY /* It's specififc, uses local variable, don't use it (again). */ ++ + static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom, + const char *prefix, bool fallback) + { +@@ -714,9 +741,6 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom, + static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix, + bool fallback) + { +- nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0, true); +- nvram_read_u16(prefix, NULL, "boardnum", &sprom->board_num, 0, +- fallback); + nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0, true); + nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo, + &sprom->boardflags_hi, fallback); +@@ -787,6 +811,8 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix, + bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); + bcm47xx_fill_sprom_r1(sprom, prefix, fallback); + } ++ ++ bcm47xx_sprom_fill_auto(sprom, prefix, fallback); + } + + #ifdef CONFIG_BCM47XX_SSB +-- +1.8.4.5 + |