Commit a6b0652bb5040351eeb1a2580270bd3988cb0a59

Authored by Nikita Kiryanov
Committed by Stefano Babic
1 parent e32028a70b

arm: mx6: cm_fx6: add nand support

Add NAND support for Compulab CM-FX6 CoM.

Cc: Igor Grinberg <grinberg@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Tom Rini <trini@ti.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>

Showing 3 changed files with 78 additions and 1 deletions Side-by-side Diff

board/compulab/cm_fx6/cm_fx6.c
... ... @@ -10,11 +10,46 @@
10 10  
11 11 #include <common.h>
12 12 #include <fsl_esdhc.h>
  13 +#include <asm/arch/crm_regs.h>
13 14 #include <asm/arch/sys_proto.h>
  15 +#include <asm/io.h>
14 16 #include "common.h"
15 17  
16 18 DECLARE_GLOBAL_DATA_PTR;
17 19  
  20 +#ifdef CONFIG_NAND_MXS
  21 +static iomux_v3_cfg_t const nand_pads[] = {
  22 + IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(NO_PAD_CTRL)),
  23 + IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(NO_PAD_CTRL)),
  24 + IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  25 + IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  26 + IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  27 + IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  28 + IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  29 + IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  30 + IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  31 + IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  32 + IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  33 + IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  34 + IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  35 + IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
  36 +};
  37 +
  38 +static void cm_fx6_setup_gpmi_nand(void)
  39 +{
  40 + SETUP_IOMUX_PADS(nand_pads);
  41 + /* Enable clock roots */
  42 + enable_usdhc_clk(1, 3);
  43 + enable_usdhc_clk(1, 4);
  44 +
  45 + setup_gpmi_io_clk(MXC_CCM_CS2CDR_ENFC_CLK_PODF(0xf) |
  46 + MXC_CCM_CS2CDR_ENFC_CLK_PRED(1) |
  47 + MXC_CCM_CS2CDR_ENFC_CLK_SEL(0));
  48 +}
  49 +#else
  50 +static void cm_fx6_setup_gpmi_nand(void) {}
  51 +#endif
  52 +
18 53 #ifdef CONFIG_FSL_ESDHC
19 54 static struct fsl_esdhc_cfg usdhc_cfg[3] = {
20 55 {USDHC1_BASE_ADDR},
... ... @@ -47,6 +82,8 @@
47 82 int board_init(void)
48 83 {
49 84 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
  85 + cm_fx6_setup_gpmi_nand();
  86 +
50 87 return 0;
51 88 }
52 89  
board/compulab/cm_fx6/spl.c
... ... @@ -15,6 +15,7 @@
15 15 #include <asm/arch/mx6-ddr.h>
16 16 #include <asm/arch/clock.h>
17 17 #include <asm/arch/sys_proto.h>
  18 +#include <asm/arch/crm_regs.h>
18 19 #include <asm/imx-common/iomux-v3.h>
19 20 #include <fsl_esdhc.h>
20 21 #include "common.h"
21 22  
... ... @@ -309,7 +310,17 @@
309 310  
310 311 void board_init_f(ulong dummy)
311 312 {
  313 + struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  314 +
312 315 gd = &gdata;
  316 + /*
  317 + * We don't use DMA in SPL, but we do need it in U-Boot. U-Boot
  318 + * initializes DMA very early (before all board code), so the only
  319 + * opportunity we have to initialize APBHDMA clocks is in SPL.
  320 + */
  321 + setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
  322 + enable_usdhc_clk(1, 2);
  323 +
313 324 arch_cpu_init();
314 325 timer_init();
315 326 cm_fx6_setup_ecspi();
include/configs/cm_fx6.h
... ... @@ -130,6 +130,20 @@
130 130 "mmcboot=echo Booting from mmc ...; " \
131 131 "run mmcargs; " \
132 132 "run doboot\0" \
  133 + "nandroot=/dev/mtdblock4 rw\0" \
  134 + "nandrootfstype=ubifs\0" \
  135 + "nandargs=setenv bootargs console=${console} " \
  136 + "root=${nandroot} " \
  137 + "rootfstype=${nandrootfstype} " \
  138 + "${video}\0" \
  139 + "nandloadfdt=nand read ${fdtaddr} 780000 80000;\0" \
  140 + "nandboot=echo Booting from nand ...; " \
  141 + "run nandargs; " \
  142 + "nand read ${loadaddr} 0 780000; " \
  143 + "if ${loadfdt}; then " \
  144 + "run nandloadfdt;" \
  145 + "fi; " \
  146 + "run doboot\0" \
133 147 "boot=mmc dev ${mmcdev}; " \
134 148 "if mmc rescan; then " \
135 149 "if run loadmmcbootscript; then " \
... ... @@ -142,7 +156,8 @@
142 156 "run mmcboot;" \
143 157 "fi;" \
144 158 "fi;" \
145   - "fi;\0"
  159 + "fi;" \
  160 + "run nandboot\0"
146 161  
147 162 #define CONFIG_BOOTCOMMAND \
148 163 "run setboottypem; run boot"
... ... @@ -159,6 +174,20 @@
159 174 #define CONFIG_SPI_FLASH_STMICRO
160 175 #define CONFIG_SPI_FLASH_SST
161 176 #define CONFIG_SPI_FLASH_WINBOND
  177 +
  178 +/* NAND */
  179 +#ifndef CONFIG_SPL_BUILD
  180 +#define CONFIG_CMD_NAND
  181 +#define CONFIG_SYS_NAND_BASE 0x40000000
  182 +#define CONFIG_SYS_NAND_MAX_CHIPS 1
  183 +#define CONFIG_SYS_MAX_NAND_DEVICE 1
  184 +#define CONFIG_NAND_MXS
  185 +#define CONFIG_SYS_NAND_ONFI_DETECTION
  186 +/* APBH DMA is required for NAND support */
  187 +#define CONFIG_APBH_DMA
  188 +#define CONFIG_APBH_DMA_BURST
  189 +#define CONFIG_APBH_DMA_BURST8
  190 +#endif
162 191  
163 192 /* GPIO */
164 193 #define CONFIG_MXC_GPIO