
Initialise devices marked 'pre-reloc' and make them available prior to relocation. Note that this requires pre-reloc malloc() to be available.
Signed-off-by: Simon Glass sjg@chromium.org ---
common/board_f.c | 30 ++++++++++++++++++++++++++++++ common/board_r.c | 3 +++ include/asm-generic/global_data.h | 1 + 3 files changed, 34 insertions(+)
diff --git a/common/board_f.c b/common/board_f.c index cc040c7..0dc745a 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -14,6 +14,7 @@ #include <linux/compiler.h> #include <version.h> #include <environment.h> +#include <dm.h> #include <fdtdec.h> #include <fs.h> #if defined(CONFIG_CMD_IDE) @@ -52,6 +53,7 @@ #ifdef CONFIG_SANDBOX #include <asm/state.h> #endif +#include <dm/root.h> #include <linux/compiler.h>
/* @@ -787,6 +789,33 @@ static int initf_malloc(void) return 0; }
+static int initf_dm(void) +{ +#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_BASE) + int ret; + + ret = dm_init(); + if (ret) { + debug("dm_init() failed: %d\n", ret); + return ret; + } + ret = dm_scan_platdata(true); + if (ret) { + debug("dm_scan_platdata() failed: %d\n", ret); + return ret; + } +#ifdef CONFIG_OF_CONTROL + ret = dm_scan_fdt(gd->fdt_blob, true); + if (ret) { + debug("dm_scan_fdt() failed: %d\n", ret); + return ret; + } +#endif +#endif + + return 0; +} + static init_fnc_t init_sequence_f[] = { #ifdef CONFIG_SANDBOX setup_ram_buf, @@ -845,6 +874,7 @@ static init_fnc_t init_sequence_f[] = { init_timebase, #endif initf_malloc, + initf_dm, init_baud_rate, /* initialze baudrate settings */ serial_init, /* serial communications setup */ console_init_f, /* stage 1 init of console */ diff --git a/common/board_r.c b/common/board_r.c index e16f3ad..13c1bc1 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -275,6 +275,9 @@ static int initr_dm(void) { int ret;
+ /* Save the pre-reloc driver model and start a new one */ + gd->dm_root_f = gd->dm_root; + gd->dm_root = NULL; ret = dm_init(); if (ret) { debug("dm_init() failed: %d\n", ret); diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index 1070a75..b3b91d3 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -66,6 +66,7 @@ typedef struct global_data {
#ifdef CONFIG_DM struct device *dm_root; /* Root instance for Driver Model */ + struct device *dm_root_f; /* Pre-relocation root instance */ struct list_head uclass_root; /* Head of core tree */ #endif