dm: Support driver model prior to relocation
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>
This commit is contained in:
parent
00606d7e39
commit
ab7cd62790
@ -14,6 +14,7 @@
|
|||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
#include <environment.h>
|
#include <environment.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <fdtdec.h>
|
#include <fdtdec.h>
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#if defined(CONFIG_CMD_IDE)
|
#if defined(CONFIG_CMD_IDE)
|
||||||
@ -53,6 +54,7 @@
|
|||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
#include <asm/state.h>
|
#include <asm/state.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <dm/root.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -778,6 +780,19 @@ static int initf_malloc(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int initf_dm(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = dm_init_and_scan(true);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static init_fnc_t init_sequence_f[] = {
|
static init_fnc_t init_sequence_f[] = {
|
||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
setup_ram_buf,
|
setup_ram_buf,
|
||||||
@ -836,6 +851,7 @@ static init_fnc_t init_sequence_f[] = {
|
|||||||
init_timebase,
|
init_timebase,
|
||||||
#endif
|
#endif
|
||||||
initf_malloc,
|
initf_malloc,
|
||||||
|
initf_dm,
|
||||||
init_baud_rate, /* initialze baudrate settings */
|
init_baud_rate, /* initialze baudrate settings */
|
||||||
serial_init, /* serial communications setup */
|
serial_init, /* serial communications setup */
|
||||||
console_init_f, /* stage 1 init of console */
|
console_init_f, /* stage 1 init of console */
|
||||||
|
@ -273,27 +273,10 @@ static int initr_malloc(void)
|
|||||||
#ifdef CONFIG_DM
|
#ifdef CONFIG_DM
|
||||||
static int initr_dm(void)
|
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;
|
||||||
ret = dm_init();
|
gd->dm_root = NULL;
|
||||||
if (ret) {
|
return dm_init_and_scan(false);
|
||||||
debug("dm_init() failed: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
ret = dm_scan_platdata(false);
|
|
||||||
if (ret) {
|
|
||||||
debug("dm_scan_platdata() failed: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_OF_CONTROL
|
|
||||||
ret = dm_scan_fdt(gd->fdt_blob, false);
|
|
||||||
if (ret) {
|
|
||||||
debug("dm_scan_fdt() failed: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -105,6 +105,31 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int dm_init_and_scan(bool pre_reloc_only)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = dm_init();
|
||||||
|
if (ret) {
|
||||||
|
debug("dm_init() failed: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ret = dm_scan_platdata(pre_reloc_only);
|
||||||
|
if (ret) {
|
||||||
|
debug("dm_scan_platdata() failed: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#ifdef CONFIG_OF_CONTROL
|
||||||
|
ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
|
||||||
|
if (ret) {
|
||||||
|
debug("dm_scan_fdt() failed: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* This is the root driver - all drivers are children of this */
|
/* This is the root driver - all drivers are children of this */
|
||||||
U_BOOT_DRIVER(root_driver) = {
|
U_BOOT_DRIVER(root_driver) = {
|
||||||
.name = "root_driver",
|
.name = "root_driver",
|
||||||
|
@ -65,7 +65,8 @@ typedef struct global_data {
|
|||||||
struct global_data *new_gd; /* relocated global data */
|
struct global_data *new_gd; /* relocated global data */
|
||||||
|
|
||||||
#ifdef CONFIG_DM
|
#ifdef CONFIG_DM
|
||||||
struct udevice *dm_root;/* Root instance for Driver Model */
|
struct udevice *dm_root; /* Root instance for Driver Model */
|
||||||
|
struct udevice *dm_root_f; /* Pre-relocation root instance */
|
||||||
struct list_head uclass_root; /* Head of core tree */
|
struct list_head uclass_root; /* Head of core tree */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -44,6 +44,19 @@ int dm_scan_platdata(bool pre_reloc_only);
|
|||||||
*/
|
*/
|
||||||
int dm_scan_fdt(const void *blob, bool pre_reloc_only);
|
int dm_scan_fdt(const void *blob, bool pre_reloc_only);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dm_init_and_scan() - Initialise Driver Model structures and scan for devices
|
||||||
|
*
|
||||||
|
* This function initialises the roots of the driver tree and uclass trees,
|
||||||
|
* then scans and binds available devices from platform data and the FDT.
|
||||||
|
* This calls dm_init() to set up Driver Model structures.
|
||||||
|
*
|
||||||
|
* @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
|
||||||
|
* flag. If false bind all drivers.
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int dm_init_and_scan(bool pre_reloc_only);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dm_init() - Initialise Driver Model structures
|
* dm_init() - Initialise Driver Model structures
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user