|
@@ -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);
|
|
|
}
|
|
|
|