81 lines
3.2 KiB
Diff
81 lines
3.2 KiB
Diff
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(-)
|
|
|
|
--- a/arch/mips/bcm47xx/sprom.c
|
|
+++ b/arch/mips/bcm47xx/sprom.c
|
|
@@ -180,6 +180,33 @@ static void nvram_read_alpha2(const char
|
|
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(
|
|
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
|
|
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
|