[U-Boot] [PATCH 0/3] i.MX6 SabreSD and SabreAUTO bmode support

This adds the bmode support for i.MX6 SabreSD and SabreAUTO boards. This allows user to choose the boot mode at runtime making it easy to boot from USB or other media.
Otavio Salvador (3): mx6qsabresd: Fix card detection for invalid card id case mx6qsabresd: Document the mapping of USDHC[2-4] mx6qsabre{sd,auto}: Add boot mode select
board/freescale/mx6qsabreauto/mx6qsabreauto.c | 17 ++++++++++++++++ board/freescale/mx6qsabresd/mx6qsabresd.c | 28 ++++++++++++++++++++++++++- include/configs/mx6qsabre_common.h | 4 +++- 3 files changed, 47 insertions(+), 2 deletions(-)

Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- board/freescale/mx6qsabresd/mx6qsabresd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 65c4a1a..3c00023 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -151,9 +151,11 @@ int board_mmc_getcd(struct mmc *mmc) return !gpio_get_value(USDHC2_CD_GPIO); case USDHC3_BASE_ADDR: return !gpio_get_value(USDHC3_CD_GPIO); - default: + case USDHC4_BASE_ADDR: return 1; /* eMMC/uSDHC4 is always present */ } + + return 0; }
int board_mmc_init(bd_t *bis)

On Sat, Mar 2, 2013 at 6:49 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Please provide a commit log.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br
board/freescale/mx6qsabresd/mx6qsabresd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 65c4a1a..3c00023 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -151,9 +151,11 @@ int board_mmc_getcd(struct mmc *mmc) return !gpio_get_value(USDHC2_CD_GPIO); case USDHC3_BASE_ADDR: return !gpio_get_value(USDHC3_CD_GPIO);
default:
case USDHC4_BASE_ADDR: return 1; /* eMMC/uSDHC4 is always present */
This looks good.
}
return 0;
,but why do we need this?

On Sat, Mar 2, 2013 at 7:11 PM, Fabio Estevam festevam@gmail.com wrote:
On Sat, Mar 2, 2013 at 6:49 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Please provide a commit log.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br
board/freescale/mx6qsabresd/mx6qsabresd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 65c4a1a..3c00023 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -151,9 +151,11 @@ int board_mmc_getcd(struct mmc *mmc) return !gpio_get_value(USDHC2_CD_GPIO); case USDHC3_BASE_ADDR: return !gpio_get_value(USDHC3_CD_GPIO);
default:
case USDHC4_BASE_ADDR: return 1; /* eMMC/uSDHC4 is always present */
This looks good.
}
return 0;
,but why do we need this?
Fail by default?

On Sat, Mar 2, 2013 at 8:08 PM, Otavio Salvador otavio@ossystems.com.br wrote:
}
return 0;
,but why do we need this?
Fail by default?
No, just do like mx53loco and mx6qsabrelite, where we always 'return ret'

On Sat, Mar 2, 2013 at 8:15 PM, Fabio Estevam festevam@gmail.com wrote:
On Sat, Mar 2, 2013 at 8:08 PM, Otavio Salvador otavio@ossystems.com.br wrote:
}
return 0;
,but why do we need this?
Fail by default?
No, just do like mx53loco and mx6qsabrelite, where we always 'return ret'
Ok; will fix it

On Sat, Mar 2, 2013 at 8:19 PM, Otavio Salvador otavio@ossystems.com.br wrote:
On Sat, Mar 2, 2013 at 8:15 PM, Fabio Estevam festevam@gmail.com wrote:
On Sat, Mar 2, 2013 at 8:08 PM, Otavio Salvador otavio@ossystems.com.br wrote:
}
return 0;
,but why do we need this?
Fail by default?
No, just do like mx53loco and mx6qsabrelite, where we always 'return ret'
Ok; will fix it
Well, we don't have ret here.
int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
switch (cfg->esdhc_base) { case USDHC2_BASE_ADDR: return !gpio_get_value(USDHC2_CD_GPIO); case USDHC3_BASE_ADDR: return !gpio_get_value(USDHC3_CD_GPIO); case USDHC4_BASE_ADDR: return 1; /* eMMC/uSDHC4 is always present */ }
return 0; }
So I think the default ought to be 0;
-- Otavio Salvador O.S. Systems E-mail: otavio@ossystems.com.br http://www.ossystems.com.br Mobile: +55 53 9981-7854 http://projetos.ossystems.com.br

On Sat, Mar 2, 2013 at 8:22 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Well, we don't have ret here.
Yes, exactly. My suggestion is to add a return value, just like mx53loco and sabresd.

On Sat, Mar 2, 2013 at 8:24 PM, Fabio Estevam festevam@gmail.com wrote:
On Sat, Mar 2, 2013 at 8:22 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Well, we don't have ret here.
Yes, exactly. My suggestion is to add a return value, just like mx53loco and sabresd.
Great; did it for v2.

Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- board/freescale/mx6qsabresd/mx6qsabresd.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 3c00023..c334403 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -26,6 +26,7 @@ #include <asm/errno.h> #include <asm/gpio.h> #include <asm/imx-common/iomux-v3.h> +#include <asm/imx-common/boot_mode.h> #include <mmc.h> #include <fsl_esdhc.h> #include <miiphy.h> @@ -164,18 +165,21 @@ int board_mmc_init(bd_t *bis)
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { switch (i) { + /* SD2 - mmc0 */ case 0: imx_iomux_v3_setup_multiple_pads( usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); gpio_direction_input(USDHC2_CD_GPIO); usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); break; + /* SD3 - mmc1 */ case 1: imx_iomux_v3_setup_multiple_pads( usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); gpio_direction_input(USDHC3_CD_GPIO); usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); break; + /* eMMC - mmc2 */ case 2: imx_iomux_v3_setup_multiple_pads( usdhc4_pads, ARRAY_SIZE(usdhc4_pads));

On Sat, Mar 2, 2013 at 6:49 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Signed-off-by: Otavio Salvador otavio@ossystems.com.br
No commit log. It is really hard for someone to understand why you need this patch if you do not explain it.
board/freescale/mx6qsabresd/mx6qsabresd.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 3c00023..c334403 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -26,6 +26,7 @@ #include <asm/errno.h> #include <asm/gpio.h> #include <asm/imx-common/iomux-v3.h> +#include <asm/imx-common/boot_mode.h> #include <mmc.h> #include <fsl_esdhc.h> #include <miiphy.h> @@ -164,18 +165,21 @@ int board_mmc_init(bd_t *bis)
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { switch (i) {
/* SD2 - mmc0 */
This mapping is dependent on the kernel. Does it make sense to describe this in the bootloader?

On Sat, Mar 2, 2013 at 7:14 PM, Fabio Estevam festevam@gmail.com wrote:
On Sat, Mar 2, 2013 at 6:49 PM, Otavio Salvador otavio@ossystems.com.br wrote:
Signed-off-by: Otavio Salvador otavio@ossystems.com.br
No commit log. It is really hard for someone to understand why you need this patch if you do not explain it.
Right; I can extend it.
board/freescale/mx6qsabresd/mx6qsabresd.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index 3c00023..c334403 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -26,6 +26,7 @@ #include <asm/errno.h> #include <asm/gpio.h> #include <asm/imx-common/iomux-v3.h> +#include <asm/imx-common/boot_mode.h> #include <mmc.h> #include <fsl_esdhc.h> #include <miiphy.h> @@ -164,18 +165,21 @@ int board_mmc_init(bd_t *bis)
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { switch (i) {
/* SD2 - mmc0 */
This mapping is dependent on the kernel. Does it make sense to describe this in the bootloader?
It does not matter if it changes in the kernel later; I'd like to have it here so people can know which one to use if need to choose one.
It is hard to know which one the bootloader will use without it.

Adds support for 'bmode' command which let user to choose where to boot from; this allows U-Boot to load system from another storage without messing with jumpers.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- board/freescale/mx6qsabreauto/mx6qsabreauto.c | 17 +++++++++++++++++ board/freescale/mx6qsabresd/mx6qsabresd.c | 20 ++++++++++++++++++++ include/configs/mx6qsabre_common.h | 4 +++- 3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/board/freescale/mx6qsabreauto/mx6qsabreauto.c b/board/freescale/mx6qsabreauto/mx6qsabreauto.c index 9e3700e..9650563 100644 --- a/board/freescale/mx6qsabreauto/mx6qsabreauto.c +++ b/board/freescale/mx6qsabreauto/mx6qsabreauto.c @@ -216,6 +216,23 @@ int board_init(void) return 0; }
+#ifdef CONFIG_CMD_BMODE +static const struct boot_mode board_boot_modes[] = { + /* 4 bit bus width */ + {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)}, + {NULL, 0}, +}; +#endif + +int board_late_init(void) +{ +#ifdef CONFIG_CMD_BMODE + add_board_boot_modes(board_boot_modes); +#endif + + return 0; +} + int checkboard(void) { int rev = mx6sabre_rev(); diff --git a/board/freescale/mx6qsabresd/mx6qsabresd.c b/board/freescale/mx6qsabresd/mx6qsabresd.c index c334403..9ff6a06 100644 --- a/board/freescale/mx6qsabresd/mx6qsabresd.c +++ b/board/freescale/mx6qsabresd/mx6qsabresd.c @@ -265,6 +265,26 @@ int board_init(void) return 0; }
+#ifdef CONFIG_CMD_BMODE +static const struct boot_mode board_boot_modes[] = { + /* 4 bit bus width */ + {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)}, + {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)}, + /* 8 bit bus width */ + {"emmc", MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)}, + {NULL, 0}, +}; +#endif + +int board_late_init(void) +{ +#ifdef CONFIG_CMD_BMODE + add_board_boot_modes(board_boot_modes); +#endif + + return 0; +} + int checkboard(void) { puts("Board: MX6Q-SabreSD\n"); diff --git a/include/configs/mx6qsabre_common.h b/include/configs/mx6qsabre_common.h index f7e8779..805707c 100644 --- a/include/configs/mx6qsabre_common.h +++ b/include/configs/mx6qsabre_common.h @@ -33,6 +33,7 @@ #define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
#define CONFIG_BOARD_EARLY_INIT_F +#define CONFIG_BOARD_LATE_INIT #define CONFIG_MXC_GPIO
#define CONFIG_MXC_UART @@ -72,10 +73,11 @@ /* Command definition */ #include <config_cmd_default.h>
+#define CONFIG_CMD_BMODE #define CONFIG_CMD_BOOTZ #undef CONFIG_CMD_IMLS
-#define CONFIG_BOOTDELAY 1 +#define CONFIG_BOOTDELAY 10
#define CONFIG_LOADADDR 0x12000000 #define CONFIG_SYS_TEXT_BASE 0x17800000
participants (2)
-
Fabio Estevam
-
Otavio Salvador