[U-Boot] [PATCH V3 1/2] mmc: exynos dwmmc: check boot mode before init dwmmc

Pantelis Antoniou panto at antoniou-consulting.com
Mon Feb 23 18:49:07 CET 2015


Hi Przemyslaw,

> On Feb 20, 2015, at 13:29 , Przemyslaw Marczak <p.marczak at samsung.com> wrote:
> 
> Before this commit, the mmc devices were always registered
> in the same order. So dwmmc channel 0 was registered as mmc 0,
> channel 1 as mmc 1, etc.
> In case of possibility to boot from more then one device,
> the CONFIG_SYS_MMC_ENV_DEV should always point to right mmc device.
> 
> This can be achieved by init boot device as first, so it will be
> always registered as mmc 0. Thanks to this, the 'saveenv' command
> will work fine for all mmc boot devices.
> 
> Exynos based boards usually uses mmc host channels configuration:
> - 0, or 0+1 for 8 bit  - as a default boot device (usually eMMC)
> - 2 for 4bit - as an optional boot device (usually SD card slot)
> 
> And usually the boot order is defined by OM pin configuration,
> which can be changed in a few ways, eg.
> - Odroid U3     - eMMC card insertion -> first boot from eMMC
> - Odroid X2/XU3 - boot priority jumper
> 
> By this commit, Exynos dwmmc driver will check the OM pin configuration,
> and then try to init the boot device and register it as mmc 0.
> 
> Signed-off-by: Przemyslaw Marczak <p.marczak at samsung.com>
> Cc: Minkyu Kang <mk7.kang at samsung.com>
> Cc: Jaehoon Chung <jh80.chung at samsung.com>
> Cc: Pantelis Antoniou <panto at antoniou-consulting.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Akshay Saraswat <akshay.s at samsung.com>
> 
> ---
> Changes v2:
> - none
> 
> Changes v3:
> - Fix email to Pantelis
> ---
> drivers/mmc/exynos_dw_mmc.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c
> index dfa209b..91f0163 100644
> --- a/drivers/mmc/exynos_dw_mmc.c
> +++ b/drivers/mmc/exynos_dw_mmc.c
> @@ -13,6 +13,7 @@
> #include <asm/arch/dwmmc.h>
> #include <asm/arch/clk.h>
> #include <asm/arch/pinmux.h>
> +#include <asm/arch/power.h>
> #include <asm/gpio.h>
> #include <asm-generic/errno.h>
> 
> @@ -166,7 +167,6 @@ static int exynos_dwmci_get_config(const void *blob, int node,
> 	if (host->dev_index == host->dev_id)
> 		host->dev_index = host->dev_id - PERIPH_ID_SDMMC0;
> 
> -
> 	/* Get the bus width from the device node */
> 	host->buswidth = fdtdec_get_int(blob, node, "samsung,bus-width", 0);
> 	if (host->buswidth <= 0) {
> @@ -229,12 +229,21 @@ int exynos_dwmmc_init(const void *blob)
> {
> 	int compat_id;
> 	int node_list[DWMMC_MAX_CH_NUM];
> +	int boot_dev_node;
> 	int err = 0, count;
> 
> 	compat_id = COMPAT_SAMSUNG_EXYNOS_DWMMC;
> 
> 	count = fdtdec_find_aliases_for_id(blob, "mmc",
> 				compat_id, node_list, DWMMC_MAX_CH_NUM);
> +
> +	/* For DWMMC always set boot device as mmc 0 */
> +	if (count >= 3 && get_boot_mode() == BOOT_MODE_SD) {
> +		boot_dev_node = node_list[2];
> +		node_list[2] = node_list[0];
> +		node_list[0] = boot_dev_node;
> +	}
> +
> 	err = exynos_dwmci_process_node(blob, node_list, count);
> 
> 	return err;
> -- 
> 1.9.1
> 

Applied, but ick… Driver model should make this go away.

— Pantelis



More information about the U-Boot mailing list