From 25bf2b5836c892f091651d8a3384c9c57ce1b400 Mon Sep 17 00:00:00 2001 From: Jonas Gorski 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 --- 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 @@ -692,6 +692,10 @@ static const struct board_info __initcon #endif /* CONFIG_BCM63XX_CPU_6358 */ }; +static struct of_device_id const bcm963xx_boards_dt[] = { + { }, +}; + /* * early init callback, read nvram data from flash and checksum it */ @@ -703,6 +707,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 @@ -746,6 +751,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 #include 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