/branches/18.06.1/target/linux/brcm63xx/patches-4.9/368-MIPS-BCM63XX-add-support-for-matching-the-board_info.patch |
@@ -0,0 +1,95 @@ |
From 25bf2b5836c892f091651d8a3384c9c57ce1b400 Mon Sep 17 00:00:00 2001 |
From: Jonas Gorski <jogo@openwrt.org> |
Date: Thu, 26 Jun 2014 12:51:00 +0200 |
Subject: [PATCH 46/48] MIPS: BCM63XX: add support for matching the board_info |
by dtb |
|
Allow using the passed dtb's compatible property to match board_info |
structs instead of nvram's boardname field, which is not unique anyway. |
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org> |
--- |
arch/mips/bcm63xx/boards/board_bcm963xx.c | 15 +++++++++++++++ |
arch/mips/bcm63xx/boards/board_common.c | 18 ++++++++++++++++++ |
arch/mips/bcm63xx/boards/board_common.h | 3 +++ |
3 files changed, 36 insertions(+) |
|
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c |
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c |
@@ -695,6 +695,10 @@ static const struct board_info __initcon |
#endif |
}; |
|
+static struct of_device_id const bcm963xx_boards_dt[] = { |
+ { }, |
+}; |
+ |
/* |
* early init callback, read nvram data from flash and checksum it |
*/ |
@@ -706,6 +710,7 @@ void __init board_bcm963xx_init(void) |
char *board_name = NULL; |
u32 val; |
struct bcm_hcs *hcs; |
+ const struct of_device_id *board_match; |
|
/* read base address of boot chip select (0) |
* 6328/6362 do not have MPI but boot from a fixed address |
@@ -745,6 +750,16 @@ void __init board_bcm963xx_init(void) |
} else { |
board_name = bcm63xx_nvram_get_name(); |
} |
+ |
+ /* find board by compat */ |
+ board_match = bcm63xx_match_board(bcm963xx_boards_dt); |
+ if (board_match) { |
+ board_early_setup(board_match->data, |
+ bcm63xx_nvram_get_mac_address); |
+ |
+ return; |
+ } |
+ |
/* find board by name */ |
for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { |
if (strncmp(board_name, bcm963xx_boards[i]->name, 16)) |
--- a/arch/mips/bcm63xx/boards/board_common.c |
+++ b/arch/mips/bcm63xx/boards/board_common.c |
@@ -239,3 +239,21 @@ int __init board_register_devices(void) |
|
return 0; |
} |
+ |
+const struct of_device_id * __init bcm63xx_match_board(const struct of_device_id *m) |
+{ |
+ const struct of_device_id *match; |
+ unsigned long dt_root; |
+ |
+ if (!IS_ENABLED(CONFIG_OF) || !initial_boot_params) |
+ return NULL; |
+ |
+ dt_root = of_get_flat_dt_root(); |
+ |
+ for (match = m; match->compatible[0]; match++) { |
+ if (of_flat_dt_is_compatible(dt_root, match->compatible)) |
+ return match; |
+ } |
+ |
+ return NULL; |
+} |
--- a/arch/mips/bcm63xx/boards/board_common.h |
+++ b/arch/mips/bcm63xx/boards/board_common.h |
@@ -1,11 +1,14 @@ |
#ifndef __BOARD_COMMON_H |
#define __BOARD_COMMON_H |
|
+#include <linux/of.h> |
#include <board_bcm963xx.h> |
|
void board_early_setup(const struct board_info *board, |
int (*get_mac_address)(u8 mac[ETH_ALEN])); |
|
+const struct of_device_id *bcm63xx_match_board(const struct of_device_id *); |
+ |
#if defined(CONFIG_BOARD_BCM963XX) |
void board_bcm963xx_init(void); |
#else |