aboutsummaryrefslogtreecommitdiff
path: root/env/sf.c
diff options
context:
space:
mode:
Diffstat (limited to 'env/sf.c')
-rw-r--r--env/sf.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/env/sf.c b/env/sf.c
index 20358f5..1c2ab9d 100644
--- a/env/sf.c
+++ b/env/sf.c
@@ -28,9 +28,18 @@
#define INITENV
#endif
+#define OFFSET_INVALID (~(u32)0)
+
#ifdef CONFIG_ENV_OFFSET_REDUND
+#define ENV_OFFSET_REDUND CONFIG_ENV_OFFSET_REDUND
+
static ulong env_offset = CONFIG_ENV_OFFSET;
static ulong env_new_offset = CONFIG_ENV_OFFSET_REDUND;
+
+#else
+
+#define ENV_OFFSET_REDUND OFFSET_INVALID
+
#endif /* CONFIG_ENV_OFFSET_REDUND */
DECLARE_GLOBAL_DATA_PTR;
@@ -288,6 +297,30 @@ out:
}
#endif
+static int env_sf_erase(void)
+{
+ int ret;
+ env_t env;
+
+ ret = setup_flash_device();
+ if (ret)
+ return ret;
+
+ memset(&env, 0, sizeof(env_t));
+ ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, &env);
+ if (ret)
+ goto done;
+
+ if (ENV_OFFSET_REDUND != OFFSET_INVALID)
+ ret = spi_flash_write(env_flash, ENV_OFFSET_REDUND, CONFIG_ENV_SIZE, &env);
+
+done:
+ spi_flash_free(env_flash);
+ env_flash = NULL;
+
+ return ret;
+}
+
#if CONFIG_ENV_ADDR != 0x0
__weak void *env_sf_get_env_addr(void)
{
@@ -415,5 +448,6 @@ U_BOOT_ENV_LOCATION(sf) = {
ENV_NAME("SPIFlash")
.load = env_sf_load,
.save = ENV_SAVE_PTR(env_sf_save),
+ .erase = ENV_ERASE_PTR(env_sf_erase),
.init = env_sf_init,
};