| 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 |
| @@ -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 <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 |