]> git.sur5r.net Git - u-boot/blobdiff - env/env.c
env: Save environment at the end of an MMC partition
[u-boot] / env / env.c
index d327f9cdfffdbb20b20889a5e6f9867f29ff0edf..76a5608628fc3c1b9c1be12bcffb5b6843a5f3dd 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -28,9 +28,7 @@ static struct env_driver *env_driver_lookup(enum env_location loc)
 
 static enum env_location env_get_default_location(void)
 {
-       if IS_ENABLED(CONFIG_ENV_IS_IN_DATAFLASH)
-               return ENVL_DATAFLASH;
-       else if IS_ENABLED(CONFIG_ENV_IS_IN_EEPROM)
+       if IS_ENABLED(CONFIG_ENV_IS_IN_EEPROM)
                return ENVL_EEPROM;
        else if IS_ENABLED(CONFIG_ENV_IS_IN_FAT)
                return ENVL_FAT;
@@ -54,7 +52,7 @@ static enum env_location env_get_default_location(void)
                return ENVL_UNKNOWN;
 }
 
-static struct env_driver *env_driver_lookup_default(void)
+struct env_driver *env_driver_lookup_default(void)
 {
        enum env_location loc = env_get_default_location();
        struct env_driver *drv;
@@ -69,11 +67,13 @@ static struct env_driver *env_driver_lookup_default(void)
        return drv;
 }
 
-int env_get_char_new(int index)
+int env_get_char(int index)
 {
        struct env_driver *drv = env_driver_lookup_default();
        int ret;
 
+       if (gd->env_valid == ENV_INVALID)
+               return default_environment[index];
        if (!drv)
                return -ENODEV;
        if (!drv->get_char)
@@ -96,7 +96,7 @@ int env_load(void)
                return -ENODEV;
        if (!drv->load)
                return 0;
-       drv->load();  /* TODO(sjg@chromium.org): Make this return an error */
+       ret = drv->load();
        if (ret) {
                debug("%s: Environment failed to load (err=%d)\n", __func__,
                      ret);
@@ -125,17 +125,21 @@ int env_save(void)
        return 0;
 }
 
-int env_init_new(void)
+int env_init(void)
 {
        struct env_driver *drv = env_driver_lookup_default();
-       int ret;
+       int ret = -ENOENT;
 
        if (!drv)
                return -ENODEV;
-       if (!drv->init)
-               return -ENOSYS;
-       ret = drv->init();
-       if (ret) {
+       if (drv->init)
+               ret = drv->init();
+       if (ret == -ENOENT) {
+               gd->env_addr = (ulong)&default_environment[0];
+               gd->env_valid = ENV_VALID;
+
+               return 0;
+       } else if (ret) {
                debug("%s: Environment failed to init (err=%d)\n", __func__,
                      ret);
                return ret;
@@ -143,23 +147,3 @@ int env_init_new(void)
 
        return 0;
 }
-
-unsigned char env_get_char_spec(int index)
-{
-       return *(uchar *)(gd->env_addr + index);
-}
-
-void env_relocate_spec(void)
-{
-       env_load();
-}
-
-int saveenv(void)
-{
-       return env_save();
-}
-
-int env_init(void)
-{
-       return env_init_new();
-}