summaryrefslogtreecommitdiff
path: root/env
diff options
context:
space:
mode:
Diffstat (limited to 'env')
-rw-r--r--env/env.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/env/env.c b/env/env.c
index 264917e0f1..d4f5e35b1e 100644
--- a/env/env.c
+++ b/env/env.c
@@ -64,6 +64,23 @@ static enum env_location env_locations[] = {
static enum env_location env_load_location = ENVL_UNKNOWN;
+static bool env_has_inited(enum env_location location)
+{
+ return gd->env_has_init & BIT(location);
+}
+
+static void env_set_inited(enum env_location location)
+{
+ /*
+ * We're using a 32-bits bitmask stored in gd (env_has_init)
+ * using the above enum value as the bit index. We need to
+ * make sure that we're not overflowing it.
+ */
+ BUILD_BUG_ON(ARRAY_SIZE(env_locations) > BITS_PER_LONG);
+
+ gd->env_has_init |= BIT(location);
+}
+
/**
* env_get_location() - Returns the best env location for a board
* @op: operations performed on the environment
@@ -145,6 +162,9 @@ int env_get_char(int index)
if (!drv->get_char)
continue;
+ if (!env_has_inited(drv->location))
+ continue;
+
ret = drv->get_char(index);
if (!ret)
return 0;
@@ -167,6 +187,9 @@ int env_load(void)
if (!drv->load)
continue;
+ if (!env_has_inited(drv->location))
+ continue;
+
printf("Loading Environment from %s... ", drv->name);
ret = drv->load();
if (ret)
@@ -192,6 +215,9 @@ int env_save(void)
if (!drv->save)
continue;
+ if (!env_has_inited(drv->location))
+ continue;
+
printf("Saving Environment to %s... ", drv->name);
ret = drv->save();
if (ret)
@@ -213,14 +239,10 @@ int env_init(void)
int prio;
for (prio = 0; (drv = env_driver_lookup(ENVOP_INIT, prio)); prio++) {
- if (!drv->init)
- continue;
-
- ret = drv->init();
- if (!ret)
- return 0;
+ if (!drv->init || !(ret = drv->init()))
+ env_set_inited(drv->location);
- debug("%s: Environment %s failed to init (err=%d)\n", __func__,
+ debug("%s: Environment %s init done (ret=%d)\n", __func__,
drv->name, ret);
}