diff options
Diffstat (limited to 'env/mmc.c')
| -rw-r--r-- | env/mmc.c | 26 | 
1 files changed, 16 insertions, 10 deletions
| diff --git a/env/mmc.c b/env/mmc.c index a8b661db80a..aca61b75e99 100644 --- a/env/mmc.c +++ b/env/mmc.c @@ -24,14 +24,25 @@  DECLARE_GLOBAL_DATA_PTR; +#if !defined(CONFIG_SYS_MMC_ENV_DEV) +#define CONFIG_SYS_MMC_ENV_DEV 0 +#endif + +__weak int mmc_get_env_dev(void) +{ +	return CONFIG_SYS_MMC_ENV_DEV; +} +  #if CONFIG_IS_ENABLED(OF_CONTROL) -static inline int mmc_offset_try_partition(const char *str, s64 *val) +static inline int mmc_offset_try_partition(const char *str, int copy, s64 *val)  {  	struct disk_partition info;  	struct blk_desc *desc;  	int len, i, ret; +	char dev_str[4]; -	ret = blk_get_device_by_str("mmc", STR(CONFIG_SYS_MMC_ENV_DEV), &desc); +	snprintf(dev_str, sizeof(dev_str), "%d", mmc_get_env_dev()); +	ret = blk_get_device_by_str("mmc", dev_str, &desc);  	if (ret < 0)  		return (ret); @@ -45,10 +56,10 @@ static inline int mmc_offset_try_partition(const char *str, s64 *val)  	}  	/* round up to info.blksz */ -	len = (CONFIG_ENV_SIZE + info.blksz - 1) & ~(info.blksz - 1); +	len = DIV_ROUND_UP(CONFIG_ENV_SIZE, info.blksz);  	/* use the top of the partion for the environment */ -	*val = (info.start + info.size - 1) - len / info.blksz; +	*val = (info.start + info.size - (1 + copy) * len) * info.blksz;  	return 0;  } @@ -73,7 +84,7 @@ static inline s64 mmc_offset(int copy)  	str = fdtdec_get_config_string(gd->fdt_blob, dt_prop.partition);  	if (str) {  		/* try to place the environment at end of the partition */ -		err = mmc_offset_try_partition(str, &val); +		err = mmc_offset_try_partition(str, copy, &val);  		if (!err)  			return val;  	} @@ -114,11 +125,6 @@ __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)  	return 0;  } -__weak int mmc_get_env_dev(void) -{ -	return CONFIG_SYS_MMC_ENV_DEV; -} -  #ifdef CONFIG_SYS_MMC_ENV_PART  __weak uint mmc_get_env_part(struct mmc *mmc)  { | 
