[U-Boot] [PATCH v3 0/9] feature additions and fixes for da850/omap-l138

From: Lad, Prabhakar prabhakar.lad@ti.com
This series adds MMC/SD, NAND and NOR SPL support for Logic PD's DA850/OMAP-L138 EVM. This series also fixes some issues found on the EVM during testing. The patches are sent in a series as these patches need to be applied in the order they are sent.
Changes for v2: 1: Fixed comments from Tom to remove unused macro and add comment. 2: Fixed comments from Christian to move GPIO pins to board file and add a check to perform initializations only when CONFIG_SPL_LIBCOMMON_SUPPORT is defined.
Changes for v3: 1: Fixed comments from Christian, to define CONFIG_SPL_MMC_LOAD config while booting from MMC. 2: Splitted patch 5(of v2), one for CONFIG_SPL_LIBCOMMON_SUPPORT check, one to define SPI specific configs of SP only when SPI flash is used and lastly to add NAND SPL support. 3: Rearranged the patch sequnece.
Lad, Prabhakar (7): da850/omap-l138: Add MMC support for DA850/OMAP-L138 arm, davinci: perform check for initalizing global data and serial init da850/omap-l138: Define SPI specific configs for SPL only when SPI is used da850/omap-l138: Add support to read u-boot image from MMC/SD da850/omap-l138: Fix NAND flash timings da850/omap-l138: Add support for NAND SPL da850/omap-l138: add support for direct NOR boot mode
Rajashekhara, Sudhakar (2): da850/omap-l138: modifications for Logic PD Rev.3 AM18xx EVM da850/omap-l138: Make MMC and NOR support mutually exclusive
arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c | 11 +++ arch/arm/cpu/arm926ejs/davinci/spl.c | 24 +++++-- arch/arm/include/asm/arch-davinci/hardware.h | 1 + arch/arm/include/asm/arch-davinci/pinmux_defs.h | 3 + board/davinci/da8xxevm/da850evm.c | 54 ++++++++++++-- boards.cfg | 1 + drivers/mmc/Makefile | 4 + drivers/mmc/spl_mmc_load.c | 62 +++++++++++++++ include/configs/da850evm.h | 92 +++++++++++++++++++++-- include/mmc.h | 2 + 10 files changed, 234 insertions(+), 20 deletions(-) create mode 100644 drivers/mmc/spl_mmc_load.c

From: Lad, Prabhakar prabhakar.lad@ti.com
This patch adds support for MMC/SD on DA850/OMAP-L138.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v2: 1:Removed CONFIG_MMC_MBLOCK config which was never used. 2:Added comment while enabling MMC commands. 3:Moved GP0[11] to the board file da850evm.c
Changes for v3: None
arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c | 11 ++++++++ arch/arm/include/asm/arch-davinci/hardware.h | 1 + arch/arm/include/asm/arch-davinci/pinmux_defs.h | 3 ++ board/davinci/da8xxevm/da850evm.c | 32 +++++++++++++++++++++++ include/configs/da850evm.h | 17 ++++++++++++ 5 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c b/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c index fa07fb5..ad600b2 100644 --- a/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c +++ b/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c @@ -169,3 +169,14 @@ const struct pinmux_config emifa_pins_nor[] = { { pinmux(12), 1, 6 }, /* EMA_A[1] */ { pinmux(12), 1, 7 }, /* EMA_A[0] */ }; + +/* MMC0 pin muxer settings */ +const struct pinmux_config mmc0_pins[] = { + { pinmux(10), 2, 0 }, /* MMCSD0_CLK */ + { pinmux(10), 2, 1 }, /* MMCSD0_CMD */ + { pinmux(10), 2, 2 }, /* MMCSD0_DAT_0 */ + { pinmux(10), 2, 3 }, /* MMCSD0_DAT_1 */ + { pinmux(10), 2, 4 }, /* MMCSD0_DAT_2 */ + { pinmux(10), 2, 5 }, /* MMCSD0_DAT_3 */ + /* DA850 supports only 4-bit mode, remaining pins are not configured */ +}; diff --git a/arch/arm/include/asm/arch-davinci/hardware.h b/arch/arm/include/asm/arch-davinci/hardware.h index b145c6e..f6b7a2c 100644 --- a/arch/arm/include/asm/arch-davinci/hardware.h +++ b/arch/arm/include/asm/arch-davinci/hardware.h @@ -446,6 +446,7 @@ struct davinci_pllc_regs { #define DAVINCI_SPI1_CLKID (cpu_is_da830() ? 2 : ASYNC3) /* Clock IDs */ enum davinci_clk_ids { + DAVINCI_MMCSD_CLKID = 2, DAVINCI_SPI0_CLKID = 2, DAVINCI_UART2_CLKID = 2, DAVINCI_MMC_CLKID = 2, diff --git a/arch/arm/include/asm/arch-davinci/pinmux_defs.h b/arch/arm/include/asm/arch-davinci/pinmux_defs.h index 07aceaa..0db1e40 100644 --- a/arch/arm/include/asm/arch-davinci/pinmux_defs.h +++ b/arch/arm/include/asm/arch-davinci/pinmux_defs.h @@ -48,4 +48,7 @@ extern const struct pinmux_config emifa_pins_cs4[1]; extern const struct pinmux_config emifa_pins_nand[12]; extern const struct pinmux_config emifa_pins_nor[43];
+/* MMC pin muxer settings */ +extern const struct pinmux_config mmc0_pins[6]; + #endif diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 004d5ad..88337ff 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -36,6 +36,11 @@ #include <asm/errno.h> #include <hwconfig.h>
+#ifdef CONFIG_DAVINCI_MMC +#include <mmc.h> +#include <asm/arch/sdmmc_defs.h> +#endif + DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DRIVER_TI_EMAC @@ -204,11 +209,32 @@ int misc_init_r(void) return 0; }
+#ifdef CONFIG_DAVINCI_MMC +static struct davinci_mmc mmc_sd0 = { + .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE, + .host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */ + .voltages = MMC_VDD_32_33 | MMC_VDD_33_34, + .version = MMC_CTLR_VERSION_2, +}; + +int board_mmc_init(bd_t *bis) +{ + mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID); + + /* Add slot-0 to mmc subsystem */ + return davinci_mmc_init(bis, &mmc_sd0); +} +#endif + static const struct pinmux_config gpio_pins[] = { #ifdef CONFIG_USE_NOR /* GP0[11] is required for NOR to work on Rev 3 EVMs */ { pinmux(0), 8, 4 }, /* GP0[11] */ #endif +#ifdef CONFIG_DAVINCI_MMC + /* GP0[11] is required for SD to work on Rev 3 EVMs */ + { pinmux(0), 8, 4 }, /* GP0[11] */ +#endif };
const struct pinmux_resource pinmuxes[] = { @@ -236,6 +262,9 @@ const struct pinmux_resource pinmuxes[] = { PINMUX_ITEM(emifa_pins_nor), #endif PINMUX_ITEM(gpio_pins), +#ifdef CONFIG_DAVINCI_MMC + PINMUX_ITEM(mmc0_pins), +#endif };
const int pinmuxes_size = ARRAY_SIZE(pinmuxes); @@ -246,6 +275,9 @@ const struct lpsc_resource lpsc[] = { { DAVINCI_LPSC_EMAC }, /* image download */ { DAVINCI_LPSC_UART2 }, /* console */ { DAVINCI_LPSC_GPIO }, +#ifdef CONFIG_DAVINCI_MMC + { DAVINCI_LPSC_MMC_SD }, +#endif };
const int lpsc_size = ARRAY_SIZE(lpsc); diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index 989472b..8b4fea1 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -313,6 +313,23 @@ #undef CONFIG_CMD_ENV #endif
+/* SD/MMC configuration */ +#define CONFIG_MMC +#define CONFIG_DAVINCI_MMC_SD1 +#define CONFIG_GENERIC_MMC +#define CONFIG_DAVINCI_MMC + +/* + * Enable MMC commands only when + * MMC support is present + */ +#ifdef CONFIG_MMC +#define CONFIG_DOS_PARTITION +#define CONFIG_CMD_EXT2 +#define CONFIG_CMD_FAT +#define CONFIG_CMD_MMC +#endif + /* defines for SPL */ #define CONFIG_SPL #define CONFIG_SPL_SPI_SUPPORT

From: Rajashekhara, Sudhakar sudhakar.raj@ti.com
AHCLKR/UART1_RTS/GP0[11] pin needs to be configured for MMC and NOR to work on DA850/OMAP-L138 Rev.3 EVM. When GP0[11] is low, the SD0 interface will not work, but NOR flash will. When GP0[11] is high, SD0 will work but NOR flash will not.
Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- board/davinci/da8xxevm/da850evm.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 88337ff..0d75b84 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -335,7 +335,7 @@ int board_early_init_f(void)
int board_init(void) { -#ifdef CONFIG_USE_NOR +#if defined(CONFIG_USE_NOR) || defined(CONFIG_DAVINCI_MMC) u32 val; #endif
@@ -386,6 +386,16 @@ int board_init(void) writel(val, GPIO_BANK0_REG_CLR_ADDR); #endif
+#ifdef CONFIG_DAVINCI_MMC + /* Set the GPIO direction as output */ + clrbits_be32((u32 *)GPIO_BANK0_REG_DIR_ADDR, (0x01 << 11)); + + /* Set the output as high */ + val = readl(GPIO_BANK0_REG_SET_ADDR); + val |= (0x01 << 11); + writel(val, GPIO_BANK0_REG_SET_ADDR); +#endif + #ifdef CONFIG_DRIVER_TI_EMAC davinci_emac_mii_mode_sel(HAS_RMII); #endif /* CONFIG_DRIVER_TI_EMAC */

Hi Prabhakar,
On Thu, Jun 21, 2012 at 9:51 AM, Prabhakar Lad prabhakar.lad@ti.com wrote:
From: Rajashekhara, Sudhakar sudhakar.raj@ti.com
AHCLKR/UART1_RTS/GP0[11] pin needs to be configured for MMC and NOR to work on DA850/OMAP-L138 Rev.3 EVM. When GP0[11] is low, the SD0 interface will not work, but NOR flash will. When GP0[11] is high, SD0 will work but NOR flash will not.
Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com
board/davinci/da8xxevm/da850evm.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 88337ff..0d75b84 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -335,7 +335,7 @@ int board_early_init_f(void)
int board_init(void) { -#ifdef CONFIG_USE_NOR +#if defined(CONFIG_USE_NOR) || defined(CONFIG_DAVINCI_MMC) u32 val; #endif
@@ -386,6 +386,16 @@ int board_init(void) writel(val, GPIO_BANK0_REG_CLR_ADDR); #endif
+#ifdef CONFIG_DAVINCI_MMC
- /* Set the GPIO direction as output */
- clrbits_be32((u32 *)GPIO_BANK0_REG_DIR_ADDR, (0x01 << 11));
big endian? I think you want clrbits_le32.
Regards, Christian
- /* Set the output as high */
- val = readl(GPIO_BANK0_REG_SET_ADDR);
- val |= (0x01 << 11);
- writel(val, GPIO_BANK0_REG_SET_ADDR);
+#endif
#ifdef CONFIG_DRIVER_TI_EMAC davinci_emac_mii_mode_sel(HAS_RMII); #endif /* CONFIG_DRIVER_TI_EMAC */ -- 1.7.4.1
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

From: Rajashekhara, Sudhakar sudhakar.raj@ti.com
On Logic PD Rev.3 DA850/OMAP-L138 EVM, NOR and MMC/SD cannot work together. This patch enables the MMC/SD support only when NOR support is disabled. NOR Flash identification works even without this patch, but erase and write will have issues.
Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v2: None Changes for v3: 1: Moved patch up the sequence
include/configs/da850evm.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index 8b4fea1..4546e0f 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -314,10 +314,12 @@ #endif
/* SD/MMC configuration */ +#ifndef CONFIG_USE_NOR #define CONFIG_MMC #define CONFIG_DAVINCI_MMC_SD1 #define CONFIG_GENERIC_MMC #define CONFIG_DAVINCI_MMC +#endif
/* * Enable MMC commands only when

From: Lad, Prabhakar prabhakar.lad@ti.com
initialize baudrate, flags, data and serial intialization, only when CONFIG_SPL_LIBCOMMON_SUPPORT is defined.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Chnages for v3: 1: Creted new patch by splitting patch 6 of v2, to make it more readable.
arch/arm/cpu/arm926ejs/davinci/spl.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c b/arch/arm/cpu/arm926ejs/davinci/spl.c index 74632e5..7d9b289 100644 --- a/arch/arm/cpu/arm926ejs/davinci/spl.c +++ b/arch/arm/cpu/arm926ejs/davinci/spl.c @@ -74,12 +74,7 @@ void board_init_f(ulong dummy)
void board_init_r(gd_t *id, ulong dummy) { -#ifdef CONFIG_SPL_NAND_LOAD - nand_init(); - puts("Nand boot...\n"); - nand_boot(); -#endif -#ifdef CONFIG_SPL_SPI_LOAD +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT mem_malloc_init(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN);
@@ -90,6 +85,14 @@ void board_init_r(gd_t *id, ulong dummy) serial_init(); /* serial communications setup */ gd->have_console = 1;
+#endif + +#ifdef CONFIG_SPL_NAND_LOAD + nand_init(); + puts("Nand boot...\n"); + nand_boot(); +#endif +#ifdef CONFIG_SPL_SPI_LOAD puts("SPI boot...\n"); spi_boot(); #endif

On Thu, Jun 21, 2012 at 9:51 AM, Prabhakar Lad prabhakar.lad@ti.com wrote:
From: Lad, Prabhakar prabhakar.lad@ti.com
initialize baudrate, flags, data and serial intialization,
initialization
only when CONFIG_SPL_LIBCOMMON_SUPPORT is defined.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com
Acked-by: Christian Riesch christian.riesch@omicron.at
Regards, Christian
Chnages for v3: 1: Creted new patch by splitting patch 6 of v2, to make it more readable.
arch/arm/cpu/arm926ejs/davinci/spl.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c b/arch/arm/cpu/arm926ejs/davinci/spl.c index 74632e5..7d9b289 100644 --- a/arch/arm/cpu/arm926ejs/davinci/spl.c +++ b/arch/arm/cpu/arm926ejs/davinci/spl.c @@ -74,12 +74,7 @@ void board_init_f(ulong dummy)
void board_init_r(gd_t *id, ulong dummy) { -#ifdef CONFIG_SPL_NAND_LOAD
- nand_init();
- puts("Nand boot...\n");
- nand_boot();
-#endif -#ifdef CONFIG_SPL_SPI_LOAD +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT mem_malloc_init(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN);
@@ -90,6 +85,14 @@ void board_init_r(gd_t *id, ulong dummy) serial_init(); /* serial communications setup */ gd->have_console = 1;
+#endif
+#ifdef CONFIG_SPL_NAND_LOAD
- nand_init();
- puts("Nand boot...\n");
- nand_boot();
+#endif +#ifdef CONFIG_SPL_SPI_LOAD puts("SPI boot...\n"); spi_boot(); #endif -- 1.7.4.1
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

From: Lad, Prabhakar prabhakar.lad@ti.com
define SPI specific configs for SPL only when CONFIG_USE_SPIFLASH config is defined
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v3: 1: Created a new patch by splitting patch 6 of v2 for better readability.
include/configs/da850evm.h | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index 4546e0f..4e5f160 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -155,6 +155,16 @@ #define CONFIG_SF_DEFAULT_SPEED 30000000 #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
+#ifdef CONFIG_USE_SPIFLASH +#define CONFIG_SPL_SPI_SUPPORT +#define CONFIG_SPL_SPI_FLASH_SUPPORT +#define CONFIG_SPL_SPI_LOAD +#define CONFIG_SPL_SPI_BUS 0 +#define CONFIG_SPL_SPI_CS 0 +#define CONFIG_SYS_SPI_U_BOOT_OFFS 0x8000 +#define CONFIG_SYS_SPI_U_BOOT_SIZE 0x30000 +#endif + /* * I2C Configuration */ @@ -334,11 +344,6 @@
/* defines for SPL */ #define CONFIG_SPL -#define CONFIG_SPL_SPI_SUPPORT -#define CONFIG_SPL_SPI_FLASH_SUPPORT -#define CONFIG_SPL_SPI_LOAD -#define CONFIG_SPL_SPI_BUS 0 -#define CONFIG_SPL_SPI_CS 0 #define CONFIG_SPL_SERIAL_SUPPORT #define CONFIG_SPL_LIBCOMMON_SUPPORT #define CONFIG_SPL_LIBGENERIC_SUPPORT @@ -346,8 +351,6 @@ #define CONFIG_SPL_STACK 0x8001ff00 #define CONFIG_SPL_TEXT_BASE 0x80000000 #define CONFIG_SPL_MAX_SIZE 32768 -#define CONFIG_SYS_SPI_U_BOOT_OFFS 0x8000 -#define CONFIG_SYS_SPI_U_BOOT_SIZE 0x30000
/* additions for new relocation code, must added to all boards */ #define CONFIG_SYS_SDRAM_BASE 0xc0000000

From: Lad, Prabhakar prabhakar.lad@ti.com
DA850/OMAP-L138 does not support strict MMC/SD boot mode. SPL will be in SPI flash and U-Boot image will be in MMC/SD card. SPL will do the low level initialization and then loads the u-boot image from MMC/SD card.
Define CONFIG_SPL_MMC_LOAD macro in the DA850/OMAP-L138 configuration file to enable this feature.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v2: None Changes for v3: 1: Moved the patch down the series to make it readable. 2: Fixed comment from Christian to have CONFIG_SPL_MMC_LOAD config only while loading from MMC. 3: Changed print statement while loading from MMC.
arch/arm/cpu/arm926ejs/davinci/spl.c | 9 +++++ drivers/mmc/Makefile | 4 ++ drivers/mmc/spl_mmc_load.c | 62 ++++++++++++++++++++++++++++++++++ include/configs/da850evm.h | 10 +++++ include/mmc.h | 2 + 5 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 drivers/mmc/spl_mmc_load.c
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c b/arch/arm/cpu/arm926ejs/davinci/spl.c index 7d9b289..66bc566 100644 --- a/arch/arm/cpu/arm926ejs/davinci/spl.c +++ b/arch/arm/cpu/arm926ejs/davinci/spl.c @@ -28,6 +28,11 @@ #include <ns16550.h> #include <malloc.h> #include <spi_flash.h> +#include <mmc.h> +#include <fat.h> +#include <version.h> +#include <asm/arch/davinci_misc.h> +#include <asm/arch/pinmux_defs.h>
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
@@ -96,4 +101,8 @@ void board_init_r(gd_t *id, ulong dummy) puts("SPI boot...\n"); spi_boot(); #endif +#ifdef CONFIG_SPL_MMC_LOAD + puts("MMC boot...\n"); + spl_mmc_load(); +#endif } diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index c245352..2cf4431 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -25,6 +25,10 @@ include $(TOPDIR)/config.mk
LIB := $(obj)libmmc.o
+ifdef CONFIG_SPL_MMC_LOAD +COBJS-$(CONFIG_SPL_MMC_LOAD) += spl_mmc_load.o +endif + COBJS-$(CONFIG_BFIN_SDH) += bfin_sdh.o COBJS-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o COBJS-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o diff --git a/drivers/mmc/spl_mmc_load.c b/drivers/mmc/spl_mmc_load.c new file mode 100644 index 0000000..347dcfe --- /dev/null +++ b/drivers/mmc/spl_mmc_load.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <common.h> +#include <mmc.h> + +DECLARE_GLOBAL_DATA_PTR; + +static void mmc_load_image(struct mmc *mmc) +{ + s32 err; + void (*uboot)(void) __noreturn; + + err = mmc->block_dev.block_read(0, CONFIG_SYS_MMC_U_BOOT_OFFS, + CONFIG_SYS_SPI_U_BOOT_SIZE/512, + (u32 *)CONFIG_SYS_TEXT_BASE); + + if (err <= 0) { + printf("spl: error reading image %s, err - %d\n", + "u-boot.img", err); + hang(); + } + uboot = (void *) CONFIG_SYS_TEXT_BASE; + (*uboot)(); +} + +void spl_mmc_load(void) +{ + struct mmc *mmc; + int err; + void (mmc_load_image)(struct mmc *mmc) __noreturn; + + mmc_initialize(gd->bd); + mmc = find_mmc_device(0); + if (!mmc) { + puts("spl: mmc device not found!!\n"); + hang(); + } else { + puts("spl: mmc device found\n"); + } + err = mmc_init(mmc); + if (err) { + printf("spl: mmc init failed: err - %d\n", err); + hang(); + } + mmc_load_image(mmc); +} diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index 4e5f160..57fc0c0 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -352,6 +352,16 @@ #define CONFIG_SPL_TEXT_BASE 0x80000000 #define CONFIG_SPL_MAX_SIZE 32768
+ +/* Load U-Boot Image From MMC */ +#ifdef CONFIG_SPL_MMC_LOAD +#define CONFIG_SPL_MMC_SUPPORT +#define CONFIG_SPL_FAT_SUPPORT +#define CONFIG_SPL_LIBDISK_SUPPORT +#define CONFIG_SYS_MMC_U_BOOT_OFFS 0x75 +#undef CONFIG_SPL_SPI_LOAD +#endif + /* additions for new relocation code, must added to all boards */ #define CONFIG_SYS_SDRAM_BASE 0xc0000000 #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - /* Fix this */ \ diff --git a/include/mmc.h b/include/mmc.h index f52df70..282b54d 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -27,6 +27,7 @@ #define _MMC_H_
#include <linux/list.h> +#include <linux/compiler.h>
#define SD_VERSION_SD 0x20000 #define SD_VERSION_2 (SD_VERSION_SD | 0x20) @@ -320,6 +321,7 @@ int get_mmc_num(void); int board_mmc_getcd(struct mmc *mmc); int mmc_switch_part(int dev_num, unsigned int part_num); int mmc_getcd(struct mmc *mmc); +void spl_mmc_load(void) __noreturn;
#ifdef CONFIG_GENERIC_MMC #define mmc_host_is_spi(mmc) ((mmc)->host_caps & MMC_MODE_SPI)

From: Lad, Prabhakar prabhakar.lad@ti.com
Though Commit id a3f88293ddd13facd734769c1664d35ab4ed681f (da850evm: setup the NAND flash timings) has configured the AEMIF timings, they are not exactly in sync with the timings used in Linux. Linux is configuring the timing register as 0x08222204, where as currently it configured to 0x00100084 in U-Boot. This issue was found out when support for NAND SPL is added in U-Boot. Without this patch U-Boot does not come up with SPL.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v3: 1: Patch number chnaged due to patch 6 split up of previous version.
board/davinci/da8xxevm/da850evm.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 0d75b84..1c0f75d 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -348,11 +348,11 @@ int board_init(void) * NAND CS setup - cycle counts based on da850evm NAND timings in the * Linux kernel @ 25MHz EMIFA */ - writel((DAVINCI_ABCR_WSETUP(0) | - DAVINCI_ABCR_WSTROBE(1) | - DAVINCI_ABCR_WHOLD(0) | - DAVINCI_ABCR_RSETUP(0) | - DAVINCI_ABCR_RSTROBE(1) | + writel((DAVINCI_ABCR_WSETUP(2) | + DAVINCI_ABCR_WSTROBE(2) | + DAVINCI_ABCR_WHOLD(1) | + DAVINCI_ABCR_RSETUP(1) | + DAVINCI_ABCR_RSTROBE(4) | DAVINCI_ABCR_RHOLD(0) | DAVINCI_ABCR_TA(1) | DAVINCI_ABCR_ASIZE_8BIT),

From: Lad, Prabhakar prabhakar.lad@ti.com
This patch adds configuration required for NAND SP on DA850/OMAP-L138.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v3: 1: Broke down the patch from v2 to make it better for readability. 2: Patch number changed from previous version due to patch 6 split up.
include/configs/da850evm.h | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index 57fc0c0..a85d6e4 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -193,6 +193,32 @@ #define CONFIG_SYS_ALE_MASK 0x8 #undef CONFIG_SYS_NAND_HW_ECC #define CONFIG_SYS_MAX_NAND_DEVICE 1 /* Max number of NAND devices */ +#define CONFIG_SYS_NAND_HW_ECC_OOBFIRST +#define CONFIG_SYS_NAND_5_ADDR_CYCLE +#define CONFIG_SYS_NAND_PAGE_SIZE (2 << 10) +#define CONFIG_SYS_NAND_BLOCK_SIZE (128 << 10) +#define CONFIG_SYS_NAND_U_BOOT_OFFS 0x28000 +#define CONFIG_SYS_NAND_U_BOOT_SIZE 0x60000 +#define CONFIG_SYS_NAND_U_BOOT_DST 0xc1080000 +#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_NAND_U_BOOT_DST +#define CONFIG_SYS_NAND_U_BOOT_RELOC_SP (CONFIG_SYS_NAND_U_BOOT_DST - \ + CONFIG_SYS_NAND_U_BOOT_SIZE - \ + CONFIG_SYS_MALLOC_LEN - \ + GENERATED_GBL_DATA_SIZE) +#define CONFIG_SYS_NAND_ECCPOS { \ + 24, 25, 26, 27, 28, \ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, \ + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, \ + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, \ + 59, 60, 61, 62, 63 } +#define CONFIG_SYS_NAND_PAGE_COUNT 64 +#define CONFIG_SYS_NAND_BAD_BLOCK_POS 0 +#define CONFIG_SYS_NAND_ECCSIZE 512 +#define CONFIG_SYS_NAND_ECCBYTES 10 +#define CONFIG_SYS_NAND_OOBSIZE 64 +#define CONFIG_SPL_NAND_SUPPORT +#define CONFIG_SPL_NAND_SIMPLE +#define CONFIG_SPL_NAND_LOAD #endif
/*

From: Lad, Prabhakar prabhakar.lad@ti.com
This patch adds support for direct NOR boot mode on da850/omap-l138. Added da850evm_direct_nor entry in boards.cfg to allow to build targets.
Signed-off-by: Lad, Prabhakar prabhakar.lad@ti.com Signed-off-by: Rajashekhara, Sudhakar sudhakar.raj@ti.com Signed-off-by: Hadli, Manjunath manjunath.hadli@ti.com --- Changes for v2: 1: Added entry in boards.cfg to build target for direct NOR boot mode. Changes for v3: 1: Patch number chnaged due to patch split up of patch 6 of v2.
boards.cfg | 1 + include/configs/da850evm.h | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/boards.cfg b/boards.cfg index 0dee43f..2685b73 100644 --- a/boards.cfg +++ b/boards.cfg @@ -122,6 +122,7 @@ cam_enc_4xx arm arm926ejs cam_enc_4xx ait da830evm arm arm926ejs da8xxevm davinci davinci da850_am18xxevm arm arm926ejs da8xxevm davinci davinci da850evm:DA850_AM18X_EVM,MAC_ADDR_IN_EEPROM,SYS_I2C_EEPROM_ADDR_LEN=2,SYS_I2C_EEPROM_ADDR=0x50 da850evm arm arm926ejs da8xxevm davinci davinci da850evm:MAC_ADDR_IN_SPIFLASH +da850evm_direct_nor arm arm926ejs da8xxevm davinci davinci da850evm:MAC_ADDR_IN_SPIFLASH,USE_NOR,DIRECT_NOR_BOOT davinci_dm355evm arm arm926ejs dm355evm davinci davinci davinci_dm355leopard arm arm926ejs dm355leopard davinci davinci davinci_dm365evm arm arm926ejs dm365evm davinci davinci diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h index a85d6e4..6f3fd1b 100644 --- a/include/configs/da850evm.h +++ b/include/configs/da850evm.h @@ -27,7 +27,10 @@ * Board */ #define CONFIG_DRIVER_TI_EMAC +/* check if direct NOR boot config is used */ +#ifndef CONFIG_DIRECT_NOR_BOOT #define CONFIG_USE_SPIFLASH +#endif
/* @@ -43,10 +46,19 @@ #define CONFIG_SYS_TIMERBASE DAVINCI_TIMER0_BASE #define CONFIG_SYS_HZ_CLOCK clk_get(DAVINCI_AUXCLK_CLKID) #define CONFIG_SYS_HZ 1000 -#define CONFIG_SYS_TEXT_BASE 0xc1080000 #define CONFIG_SYS_DA850_PLL_INIT #define CONFIG_SYS_DA850_DDR_INIT
+#ifdef CONFIG_DIRECT_NOR_BOOT +#define CONFIG_ARCH_CPU_INIT +#define CONFIG_DA8XX_GPIO +#define CONFIG_SYS_TEXT_BASE 0x60000000 +#define CONFIG_SYS_DV_NOR_BOOT_CFG (0x11) +#define CONFIG_DA850_LOWLEVEL +#else +#define CONFIG_SYS_TEXT_BASE 0xc1080000 +#endif + /* * Memory Info */ @@ -368,6 +380,7 @@ #define CONFIG_CMD_MMC #endif
+#ifndef CONFIG_DIRECT_NOR_BOOT /* defines for SPL */ #define CONFIG_SPL #define CONFIG_SPL_SERIAL_SUPPORT @@ -377,7 +390,7 @@ #define CONFIG_SPL_STACK 0x8001ff00 #define CONFIG_SPL_TEXT_BASE 0x80000000 #define CONFIG_SPL_MAX_SIZE 32768 - +#endif
/* Load U-Boot Image From MMC */ #ifdef CONFIG_SPL_MMC_LOAD @@ -390,6 +403,11 @@
/* additions for new relocation code, must added to all boards */ #define CONFIG_SYS_SDRAM_BASE 0xc0000000 + +#ifdef CONFIG_DIRECT_NOR_BOOT +#define CONFIG_SYS_INIT_SP_ADDR 0x8001ff00 +#else #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - /* Fix this */ \ GENERATED_GBL_DATA_SIZE) +#endif /* CONFIG_DIRECT_NOR_BOOT */ #endif /* __CONFIG_H */

Hi Prabhakar,
On Thu, Jun 21, 2012 at 9:51 AM, Prabhakar Lad prabhakar.lad@ti.com wrote:
From: Lad, Prabhakar prabhakar.lad@ti.com
This series adds MMC/SD, NAND and NOR SPL support for Logic PD's DA850/OMAP-L138 EVM. This series also fixes some issues found on the EVM during testing. The patches are sent in a series as these patches need to be applied in the order they are sent.
I tested the entire patchset on the AM1808 experimenter's kit (da850evm configuration booting from SPI flash with SPL) and on the calimain board, there is no regression due to your patchset.
Tested-by: Christian Riesch christian.riesch@omicron.at
Regards, Christian
Changes for v2: 1: Fixed comments from Tom to remove unused macro and add comment. 2: Fixed comments from Christian to move GPIO pins to board file and add a check to perform initializations only when CONFIG_SPL_LIBCOMMON_SUPPORT is defined.
Changes for v3: 1: Fixed comments from Christian, to define CONFIG_SPL_MMC_LOAD config while booting from MMC. 2: Splitted patch 5(of v2), one for CONFIG_SPL_LIBCOMMON_SUPPORT check, one to define SPI specific configs of SP only when SPI flash is used and lastly to add NAND SPL support. 3: Rearranged the patch sequnece.
Lad, Prabhakar (7): da850/omap-l138: Add MMC support for DA850/OMAP-L138 arm, davinci: perform check for initalizing global data and serial init da850/omap-l138: Define SPI specific configs for SPL only when SPI is used da850/omap-l138: Add support to read u-boot image from MMC/SD da850/omap-l138: Fix NAND flash timings da850/omap-l138: Add support for NAND SPL da850/omap-l138: add support for direct NOR boot mode
Rajashekhara, Sudhakar (2): da850/omap-l138: modifications for Logic PD Rev.3 AM18xx EVM da850/omap-l138: Make MMC and NOR support mutually exclusive
arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c | 11 +++ arch/arm/cpu/arm926ejs/davinci/spl.c | 24 +++++-- arch/arm/include/asm/arch-davinci/hardware.h | 1 + arch/arm/include/asm/arch-davinci/pinmux_defs.h | 3 + board/davinci/da8xxevm/da850evm.c | 54 ++++++++++++-- boards.cfg | 1 + drivers/mmc/Makefile | 4 + drivers/mmc/spl_mmc_load.c | 62 +++++++++++++++ include/configs/da850evm.h | 92 +++++++++++++++++++++-- include/mmc.h | 2 + 10 files changed, 234 insertions(+), 20 deletions(-) create mode 100644 drivers/mmc/spl_mmc_load.c
-- 1.7.4.1
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

On Thu, Jun 21, 2012 at 01:21:22PM +0530, Prabhakar Lad wrote:
From: Lad, Prabhakar prabhakar.lad@ti.com
This series adds MMC/SD, NAND and NOR SPL support for Logic PD's DA850/OMAP-L138 EVM. This series also fixes some issues found on the EVM during testing. The patches are sent in a series as these patches need to be applied in the order they are sent.
I have not tried this on your series yet but since Christian pointed out the clr_be32/le32 thing, you'll need to do a v4 anyhow, so as part of v4 please make sure that the whole series is bisectable using 'git rebase -i' and the 'exec' keyword. I do this locally by having a script with, for example:
#!/bin/sh LOG=`git rev-parse --short HEAD`.log rm -f $LOG
# Build for ELDK 5.1 source /opt/eldk-5.1/armv7a/environment-setup-armv7a-vfp-neon-linux-gnueabi export CROSS_COMPILE=arm-linux-gnueabi- export BUILD_DIR=eldk51 export MAKEALL_LOGDIR=eldk51 ./MAKEALL -s davinci > $LOG 2>&1 RC=`echo $?` if [ $RC -ne 0 ]; then exit $RC fi
# Now 4.2 unset CFLAGS unset LDFLAGS unset CPPFLAGS unset CXXFLAGS export CROSS_COMPILE=/opt/eldk-4.2/arm/usr/bin/arm-linux-gnueabi- export BUILD_DIR=eldk42 export MAKEALL_LOGDIR=eldk42 ./MAKEALL -s davinci > $LOG 2>&1 exit $?
And then 'exec /home/trini/bin/uboot-makeall-davinci-gitrebase.sh' after each 'pick' line, and examine the log files once done (since MAKEALL will exit 0 on new warnings introduced). Thanks!
participants (3)
-
Christian Riesch
-
Prabhakar Lad
-
Tom Rini