summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/core/root.c14
-rw-r--r--dts/Kconfig20
-rw-r--r--include/asm-generic/global_data.h16
-rw-r--r--include/dm/device.h15
-rw-r--r--test/dm/of_platdata.c2
5 files changed, 63 insertions, 4 deletions
diff --git a/drivers/core/root.c b/drivers/core/root.c
index 3e52452cd8..446ac2ff77 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -133,6 +133,18 @@ static int dm_setup_inst(void)
{
DM_ROOT_NON_CONST = DM_DEVICE_GET(root);
+ if (CONFIG_IS_ENABLED(OF_PLATDATA_RT)) {
+ struct udevice_rt *urt;
+ int n_ents;
+
+ /* Allocate the udevice_rt table */
+ n_ents = ll_entry_count(struct udevice, udevice);
+ urt = calloc(n_ents, sizeof(struct udevice_rt));
+ if (!urt)
+ return log_msg_ret("urt", -ENOMEM);
+ gd_set_dm_udevice_rt(urt);
+ }
+
return 0;
}
@@ -205,7 +217,7 @@ int dm_scan_plat(bool pre_reloc_only)
{
int ret;
- if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
+ if (CONFIG_IS_ENABLED(OF_PLATDATA_DRIVER_RT)) {
struct driver_rt *dyn;
int n_ents;
diff --git a/dts/Kconfig b/dts/Kconfig
index e6bbdc596b..99ce75e1a2 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -338,6 +338,7 @@ config SPL_OF_PLATDATA
bool "Generate platform data for use in SPL"
depends on SPL_OF_CONTROL
select DTOC
+ select SPL_OF_PLATDATA_DRIVER_RT if !SPL_OF_PLATDATA_INST
help
For very constrained SPL environments the overhead of decoding
device tree nodes and converting their contents into platform data
@@ -391,12 +392,22 @@ config SPL_OF_PLATDATA_RT
struct udevice (at present just the flags) into a separate struct,
which is allocated at runtime.
+config SPL_OF_PLATDATA_DRIVER_RT
+ bool
+ help
+ Use a separate struct for driver runtime data.
+
+ This enables the driver_rt information, used with of-platdata when
+ of-platdata-inst is not used. It allows finding devices by their
+ driver data.
+
endif
config TPL_OF_PLATDATA
bool "Generate platform data for use in TPL"
depends on TPL_OF_CONTROL
select DTOC
+ select TPL_OF_PLATDATA_DRIVER_RT if !TPL_OF_PLATDATA_INST
help
For very constrained SPL environments the overhead of decoding
device tree nodes and converting their contents into platform data
@@ -451,6 +462,15 @@ config TPL_OF_PLATDATA_RT
struct udevice (at present just the flags) into a separate struct,
which is allocated at runtime.
+config TPL_OF_PLATDATA_DRIVER_RT
+ bool
+ help
+ Use a separate struct for driver runtime data.
+
+ This enables the driver_rt information, used with of-platdata when
+ of-platdata-inst is not used. It allows finding devices by their
+ driver data.
+
endif
endmenu
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index c24f5e0e97..f6189eff4e 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -215,10 +215,14 @@ struct global_data {
* @uclass_root_s.
*/
struct list_head *uclass_root;
-# if CONFIG_IS_ENABLED(OF_PLATDATA)
+# if CONFIG_IS_ENABLED(OF_PLATDATA_DRIVER_RT)
/** @dm_driver_rt: Dynamic info about the driver */
struct driver_rt *dm_driver_rt;
# endif
+#if CONFIG_IS_ENABLED(OF_PLATDATA_RT)
+ /** @dm_udevice_rt: Dynamic info about the udevice */
+ struct udevice_rt *dm_udevice_rt;
+# endif
#endif
#ifdef CONFIG_TIMER
/**
@@ -483,7 +487,7 @@ struct global_data {
#define gd_set_of_root(_root)
#endif
-#if CONFIG_IS_ENABLED(OF_PLATDATA)
+#if CONFIG_IS_ENABLED(OF_PLATDATA_DRIVER_RT)
#define gd_set_dm_driver_rt(dyn) gd->dm_driver_rt = dyn
#define gd_dm_driver_rt() gd->dm_driver_rt
#else
@@ -491,6 +495,14 @@ struct global_data {
#define gd_dm_driver_rt() NULL
#endif
+#if CONFIG_IS_ENABLED(OF_PLATDATA_RT)
+#define gd_set_dm_udevice_rt(dyn) gd->dm_udevice_rt = dyn
+#define gd_dm_udevice_rt() gd->dm_udevice_rt
+#else
+#define gd_set_dm_udevice_rt(dyn)
+#define gd_dm_udevice_rt() NULL
+#endif
+
#ifdef CONFIG_GENERATE_ACPI_TABLE
#define gd_acpi_ctx() gd->acpi_ctx
#else
diff --git a/include/dm/device.h b/include/dm/device.h
index 9183356468..8e16f2ea49 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -190,6 +190,21 @@ struct udevice {
#endif
};
+/**
+ * udevice_rt - runtime information set up by U-Boot
+ *
+ * This is only used with OF_PLATDATA_RT
+ *
+ * There is one of these for every udevice in the linker list, indexed by
+ * the udevice_info idx value.
+ *
+ * @flags_: Flags for this device DM_FLAG_... (do not access outside driver
+ * model)
+ */
+struct udevice_rt {
+ u32 flags_;
+};
+
/* Maximum sequence number supported */
#define DM_MAX_SEQ 999
diff --git a/test/dm/of_platdata.c b/test/dm/of_platdata.c
index f2b45b9a86..0f89c7a7da 100644
--- a/test/dm/of_platdata.c
+++ b/test/dm/of_platdata.c
@@ -147,7 +147,7 @@ static int dm_test_of_plat_dev(struct unit_test_state *uts)
uint i;
/* Skip this test if there is no platform data */
- if (CONFIG_IS_ENABLED(OF_PLATDATA_INST))
+ if (!CONFIG_IS_ENABLED(OF_PLATDATA_DRIVER_RT))
return 0;
/* Record the indexes that are found */