aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-06-01 10:22:47 -0600
committerTom Rini <trini@konsulko.com>2023-07-14 12:54:51 -0400
commit9af341502c1cdf1d40a41e8fe6c3922f1e409f33 (patch)
treec6af5359c76642a09cac54ac92b3abeaa2a1efcd
parentb828ed7d79295cfebcb0f958f26a33664fae045c (diff)
downloadu-boot-9af341502c1cdf1d40a41e8fe6c3922f1e409f33.zip
u-boot-9af341502c1cdf1d40a41e8fe6c3922f1e409f33.tar.gz
u-boot-9af341502c1cdf1d40a41e8fe6c3922f1e409f33.tar.bz2
expo: Allow setting the start of the dynamic-ID range
Provide a way to set this value so that it is easy to separate the statically allocated IDs (generated by the caller) from those generated dynamically by expo itself. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--boot/expo.c15
-rw-r--r--boot/scene.c10
-rw-r--r--doc/develop/expo.rst3
-rw-r--r--include/expo.h19
4 files changed, 37 insertions, 10 deletions
diff --git a/boot/expo.c b/boot/expo.c
index 8b966b6..be11cfd 100644
--- a/boot/expo.c
+++ b/boot/expo.c
@@ -56,6 +56,21 @@ void expo_destroy(struct expo *exp)
free(exp);
}
+uint resolve_id(struct expo *exp, uint id)
+{
+ if (!id)
+ id = exp->next_id++;
+ else if (id >= exp->next_id)
+ exp->next_id = id + 1;
+
+ return id;
+}
+
+void expo_set_dynamic_start(struct expo *exp, uint dyn_start)
+{
+ exp->next_id = dyn_start;
+}
+
int expo_str(struct expo *exp, const char *name, uint id, const char *str)
{
struct expo_string *estr;
diff --git a/boot/scene.c b/boot/scene.c
index 43c978e..2ac9bfc 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -18,16 +18,6 @@
#include <linux/input.h>
#include "scene_internal.h"
-uint resolve_id(struct expo *exp, uint id)
-{
- if (!id)
- id = exp->next_id++;
- else if (id >= exp->next_id)
- exp->next_id = id + 1;
-
- return id;
-}
-
int scene_new(struct expo *exp, const char *name, uint id, struct scene **scnp)
{
struct scene *scn;
diff --git a/doc/develop/expo.rst b/doc/develop/expo.rst
index 32dd7f0..9565974 100644
--- a/doc/develop/expo.rst
+++ b/doc/develop/expo.rst
@@ -85,6 +85,9 @@ or even the IDs of objects. Programmatic creation of many items in a loop can be
handled by allocating space in the enum for a maximum number of items, then
adding the loop count to the enum values to obtain unique IDs.
+Where dynamic IDs are need, use expo_set_dynamic_start() to set the start value,
+so that they are allocated above the starting (enum) IDs.
+
All text strings are stored in a structure attached to the expo, referenced by
a text ID. This makes it easier at some point to implement multiple languages or
to support Unicode strings.
diff --git a/include/expo.h b/include/expo.h
index f77ee70..b8f5327 100644
--- a/include/expo.h
+++ b/include/expo.h
@@ -258,6 +258,25 @@ int expo_new(const char *name, void *priv, struct expo **expp);
void expo_destroy(struct expo *exp);
/**
+ * expo_set_dynamic_start() - Set the start of the 'dynamic' IDs
+ *
+ * It is common for a set of 'static' IDs to be used to refer to objects in the
+ * expo. These typically use an enum so that they are defined in sequential
+ * order.
+ *
+ * Dynamic IDs (for objects not in the enum) are intended to be used for
+ * objects to which the code does not need to refer. These are ideally located
+ * above the static IDs.
+ *
+ * Use this function to set the start of the dynamic range, making sure that the
+ * value is higher than all the statically allocated IDs.
+ *
+ * @exp: Expo to update
+ * @dyn_start: Start ID that expo should use for dynamic allocation
+ */
+void expo_set_dynamic_start(struct expo *exp, uint dyn_start);
+
+/**
* expo_str() - add a new string to an expo
*
* @exp: Expo to update