aboutsummaryrefslogtreecommitdiff
path: root/env
diff options
context:
space:
mode:
authorGoldschmidt Simon <sgoldschmidt@de.pepperl-fuchs.com>2018-02-09 20:23:17 +0000
committerTom Rini <trini@konsulko.com>2018-02-16 11:12:42 -0500
commitb2cdef4861befb65e784c01ed71a48bfb811ab38 (patch)
treebd8f5b467d2f09670e7167a2a66ceb95d8407347 /env
parente1caa5841e8a9bc0ee658bdacae0519fa28e1e6a (diff)
downloadu-boot-b2cdef4861befb65e784c01ed71a48bfb811ab38.zip
u-boot-b2cdef4861befb65e784c01ed71a48bfb811ab38.tar.gz
u-boot-b2cdef4861befb65e784c01ed71a48bfb811ab38.tar.bz2
env: restore old env_get_char() behaviour
With multiple environments, the 'get_char' callback for env drivers does not really make sense any more because it is only supported by two drivers (eeprom and nvram). To restore single character loading for these drivers, override 'env_get_char_spec'. Signed-off-by: Simon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com> Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Diffstat (limited to 'env')
-rw-r--r--env/eeprom.c6
-rw-r--r--env/env.c29
-rw-r--r--env/nvram.c8
3 files changed, 15 insertions, 28 deletions
diff --git a/env/eeprom.c b/env/eeprom.c
index 55d19d9..63842d6 100644
--- a/env/eeprom.c
+++ b/env/eeprom.c
@@ -61,7 +61,10 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
return rcode;
}
-static int env_eeprom_get_char(int index)
+/** Call this function from overridden env_get_char_spec() if you need
+ * this functionality.
+ */
+int env_eeprom_get_char(int index)
{
uchar c;
unsigned int off = CONFIG_ENV_OFFSET;
@@ -228,7 +231,6 @@ static int env_eeprom_save(void)
U_BOOT_ENV_LOCATION(eeprom) = {
.location = ENVL_EEPROM,
ENV_NAME("EEPROM")
- .get_char = env_eeprom_get_char,
.load = env_eeprom_load,
.save = env_save_ptr(env_eeprom_save),
};
diff --git a/env/env.c b/env/env.c
index edfb575..3795dbc 100644
--- a/env/env.c
+++ b/env/env.c
@@ -147,32 +147,17 @@ static struct env_driver *env_driver_lookup(enum env_operation op, int prio)
return drv;
}
-int env_get_char(int index)
+__weak int env_get_char_spec(int index)
{
- struct env_driver *drv;
- int prio;
+ return *(uchar *)(gd->env_addr + index);
+}
+int env_get_char(int index)
+{
if (gd->env_valid == ENV_INVALID)
return default_environment[index];
-
- for (prio = 0; (drv = env_driver_lookup(ENVOP_GET_CHAR, prio)); prio++) {
- int ret;
-
- if (!drv->get_char)
- continue;
-
- if (!env_has_inited(drv->location))
- continue;
-
- ret = drv->get_char(index);
- if (!ret)
- return 0;
-
- debug("%s: Environment %s failed to load (err=%d)\n", __func__,
- drv->name, ret);
- }
-
- return -ENODEV;
+ else
+ return env_get_char_spec(index);
}
int env_load(void)
diff --git a/env/nvram.c b/env/nvram.c
index 6f76fe4..7cc62b6 100644
--- a/env/nvram.c
+++ b/env/nvram.c
@@ -41,7 +41,10 @@ env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
#endif
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
-static int env_nvram_get_char(int index)
+/** Call this function from overridden env_get_char_spec() if you need
+ * this functionality.
+ */
+int env_nvram_get_char(int index)
{
uchar c;
@@ -113,9 +116,6 @@ static int env_nvram_init(void)
U_BOOT_ENV_LOCATION(nvram) = {
.location = ENVL_NVRAM,
ENV_NAME("NVRAM")
-#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
- .get_char = env_nvram_get_char,
-#endif
.load = env_nvram_load,
.save = env_save_ptr(env_nvram_save),
.init = env_nvram_init,