From 0daf361ea799fba0af5a232036d0f06cea85ad24 Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
Date: Sat, 21 Jun 2014 12:47:49 +0200
Subject: [PATCH 42/44] MIPS: BCM63XX: allow building support for more than one
 board type

Use the arguments passed to the kernel to detect being booted with
CFE as the indicator for bcm963xx board support, allowing the
non presence of CFE_EPTSEAL to assume a different board type.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 arch/mips/bcm63xx/boards/Kconfig          |  7 +++----
 arch/mips/bcm63xx/boards/board_bcm963xx.c |  2 +-
 arch/mips/bcm63xx/boards/board_common.c   | 13 +++++++++++++
 arch/mips/bcm63xx/boards/board_common.h   |  6 ++++++
 4 files changed, 23 insertions(+), 5 deletions(-)

--- a/arch/mips/bcm63xx/boards/Kconfig
+++ b/arch/mips/bcm63xx/boards/Kconfig
@@ -1,11 +1,10 @@
-choice
-	prompt "Board support"
+menu "Board support"
 	depends on BCM63XX
-	default BOARD_BCM963XX
 
 config BOARD_BCM963XX
        bool "Generic Broadcom 963xx boards"
 	select SSB
+	default y
        help
 
-endchoice
+endmenu
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
@@ -702,7 +702,7 @@ static const struct board_info __initcon
 /*
  * early init callback, read nvram data from flash and checksum it
  */
-void __init board_prom_init(void)
+void __init board_bcm963xx_init(void)
 {
 	unsigned int i;
 	u8 *boot_addr, *cfe;
--- a/arch/mips/bcm63xx/boards/board_common.c
+++ b/arch/mips/bcm63xx/boards/board_common.c
@@ -13,6 +13,8 @@
 #include <linux/platform_device.h>
 #include <linux/ssb/ssb.h>
 #include <asm/addrspace.h>
+#include <asm/bootinfo.h>
+#include <asm/fw/cfe/cfe_api.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_dev_uart.h>
@@ -31,6 +33,8 @@
 #include <bcm63xx_dev_usb_usbd.h>
 #include <board_bcm963xx.h>
 
+#include "board_common.h"
+
 #define PFX	"board: "
 
 static struct board_info board;
@@ -81,6 +85,15 @@ const char *board_get_name(void)
 	return board.name;
 }
 
+void __init board_prom_init(void)
+{
+	/* detect bootloader */
+	if (fw_arg3 == CFE_EPTSEAL)
+		board_bcm963xx_init();
+	else
+		panic("unsupported bootloader detected");
+}
+
 static int (*board_get_mac_address)(u8 mac[ETH_ALEN]);
 
 /*
--- a/arch/mips/bcm63xx/boards/board_common.h
+++ b/arch/mips/bcm63xx/boards/board_common.h
@@ -6,4 +6,10 @@
 void board_early_setup(const struct board_info *board,
 		       int (*get_mac_address)(u8 mac[ETH_ALEN]));
 
+#if defined(CONFIG_BOARD_BCM963XX)
+void board_bcm963xx_init(void);
+#else
+static inline void board_bcm963xx_init(void) { }
+#endif
+
 #endif /* __BOARD_COMMON_H */
