From: Jagan Teki <ja...@amarulasolutions.com>

Add initial devicetree support for i.MX6 Quad Sabresd board.

(1) Added config options
    CONFIG_OF_CONTROL=y
    CONFIG_DM_GPIO=y
    CONFIG_DM_MMC=y
    CONFIG_BLK is not set
    CONFIG_DM_MMC_OPS is not set
    CONFIG_PINCTRL=y
    CONFIG_PINCTRL_IMX6=y
(2) Moved spl code to board/freescale/mx6sabresd/spl.c
(3) Removed U-Boot proper board_mmc_init code, since mmc
    support through dtb
(4) DM_GPIO and GM_MMC are undef for SPL, till SPL_OF_CONTROL
    support.

Signed-off-by: Jagan Teki <ja...@amarulasolutions.com>
---
 arch/arm/cpu/armv7/mx6/Kconfig          |   9 +-
 board/freescale/mx6sabresd/Makefile     |   1 +
 board/freescale/mx6sabresd/mx6sabresd.c | 523 --------------------------------
 board/freescale/mx6sabresd/spl.c        | 501 ++++++++++++++++++++++++++++++
 configs/mx6sabresd_spl_defconfig        |   3 +
 include/configs/mx6sabresd.h            |   5 +-
 6 files changed, 516 insertions(+), 526 deletions(-)
 create mode 100644 board/freescale/mx6sabresd/spl.c

diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
index 0ff9045..0497fe0 100644
--- a/arch/arm/cpu/armv7/mx6/Kconfig
+++ b/arch/arm/cpu/armv7/mx6/Kconfig
@@ -210,11 +210,16 @@ config TARGET_MX6QSABREAUTO
 
 config TARGET_MX6SABRESD
        bool "mx6sabresd"
+       select BOARD_EARLY_INIT_F
        select BOARD_LATE_INIT
-       select SUPPORT_SPL
+       select OF_CONTROL
        select DM
+       select DM_GPIO
+       select DM_MMC
        select DM_THERMAL
-       select BOARD_EARLY_INIT_F
+       select PINCTRL
+       select PINCTRL_IMX6
+       select SUPPORT_SPL
 
 config TARGET_MX6SLEVK
        bool "mx6slevk"
diff --git a/board/freescale/mx6sabresd/Makefile 
b/board/freescale/mx6sabresd/Makefile
index cfca2ef..3ae32ab 100644
--- a/board/freescale/mx6sabresd/Makefile
+++ b/board/freescale/mx6sabresd/Makefile
@@ -7,3 +7,4 @@
 #
 
 obj-y  := mx6sabresd.o
+obj-$(CONFIG_SPL_BUILD) += spl.o
diff --git a/board/freescale/mx6sabresd/mx6sabresd.c 
b/board/freescale/mx6sabresd/mx6sabresd.c
index f4a5d9c..7af263d 100644
--- a/board/freescale/mx6sabresd/mx6sabresd.c
+++ b/board/freescale/mx6sabresd/mx6sabresd.c
@@ -16,8 +16,6 @@
 #include <asm/imx-common/iomux-v3.h>
 #include <asm/imx-common/boot_mode.h>
 #include <asm/imx-common/video.h>
-#include <mmc.h>
-#include <fsl_esdhc.h>
 #include <miiphy.h>
 #include <netdev.h>
 #include <asm/arch/mxc_hdmi.h>
@@ -36,10 +34,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
-       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
-       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
-
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
 
@@ -56,8 +50,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define DISP0_PWR_EN   IMX_GPIO_NR(1, 21)
 
-#define KEY_VOL_UP     IMX_GPIO_NR(1, 4)
-
 int dram_init(void)
 {
        gd->ram_size = imx_ddr_size();
@@ -100,47 +92,6 @@ static void setup_iomux_enet(void)
        udelay(100);
 }
 
-static iomux_v3_cfg_t const usdhc2_pads[] = {
-       IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02     | MUX_PAD_CTRL(NO_PAD_CTRL)), 
/* CD */
-};
-
-static iomux_v3_cfg_t const usdhc3_pads[] = {
-       IOMUX_PADS(PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(NO_PAD_CTRL)), /* 
CD */
-};
-
-static iomux_v3_cfg_t const usdhc4_pads[] = {
-       IOMUX_PADS(PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-       IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
-};
-
 static iomux_v3_cfg_t const ecspi1_pads[] = {
        IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
        IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
@@ -253,121 +204,6 @@ static void setup_iomux_uart(void)
        SETUP_IOMUX_PADS(uart1_pads);
 }
 
-#ifdef CONFIG_FSL_ESDHC
-struct fsl_esdhc_cfg usdhc_cfg[3] = {
-       {USDHC2_BASE_ADDR},
-       {USDHC3_BASE_ADDR},
-       {USDHC4_BASE_ADDR},
-};
-
-#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
-#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
-
-int board_mmc_get_env_dev(int devno)
-{
-       return devno - 1;
-}
-
-int board_mmc_getcd(struct mmc *mmc)
-{
-       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
-       int ret = 0;
-
-       switch (cfg->esdhc_base) {
-       case USDHC2_BASE_ADDR:
-               ret = !gpio_get_value(USDHC2_CD_GPIO);
-               break;
-       case USDHC3_BASE_ADDR:
-               ret = !gpio_get_value(USDHC3_CD_GPIO);
-               break;
-       case USDHC4_BASE_ADDR:
-               ret = 1; /* eMMC/uSDHC4 is always present */
-               break;
-       }
-
-       return ret;
-}
-
-int board_mmc_init(bd_t *bis)
-{
-#ifndef CONFIG_SPL_BUILD
-       int ret;
-       int i;
-
-       /*
-        * According to the board_mmc_init() the following map is done:
-        * (U-Boot device node)    (Physical Port)
-        * mmc0                    SD2
-        * mmc1                    SD3
-        * mmc2                    eMMC
-        */
-       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
-               switch (i) {
-               case 0:
-                       SETUP_IOMUX_PADS(usdhc2_pads);
-                       gpio_direction_input(USDHC2_CD_GPIO);
-                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-                       break;
-               case 1:
-                       SETUP_IOMUX_PADS(usdhc3_pads);
-                       gpio_direction_input(USDHC3_CD_GPIO);
-                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-                       break;
-               case 2:
-                       SETUP_IOMUX_PADS(usdhc4_pads);
-                       usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
-                       break;
-               default:
-                       printf("Warning: you configured more USDHC controllers"
-                              "(%d) then supported by the board (%d)\n",
-                              i + 1, CONFIG_SYS_FSL_USDHC_NUM);
-                       return -EINVAL;
-               }
-
-               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-#else
-       struct src *psrc = (struct src *)SRC_BASE_ADDR;
-       unsigned reg = readl(&psrc->sbmr1) >> 11;
-       /*
-        * Upon reading BOOT_CFG register the following map is done:
-        * Bit 11 and 12 of BOOT_CFG register can determine the current
-        * mmc port
-        * 0x1                  SD1
-        * 0x2                  SD2
-        * 0x3                  SD4
-        */
-
-       switch (reg & 0x3) {
-       case 0x1:
-               SETUP_IOMUX_PADS(usdhc2_pads);
-               usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
-               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
-               break;
-       case 0x2:
-               SETUP_IOMUX_PADS(usdhc3_pads);
-               usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
-               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
-               break;
-       case 0x3:
-               SETUP_IOMUX_PADS(usdhc4_pads);
-               usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
-               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
-               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
-               break;
-       }
-
-       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
-#endif
-}
-#endif
-
 static int ar8031_phy_fixup(struct phy_device *phydev)
 {
        unsigned short val;
@@ -718,362 +554,3 @@ int checkboard(void)
        puts("Board: MX6-SabreSD\n");
        return 0;
 }
-
-#ifdef CONFIG_SPL_BUILD
-#include <asm/arch/mx6-ddr.h>
-#include <spl.h>
-#include <libfdt.h>
-
-#ifdef CONFIG_SPL_OS_BOOT
-int spl_start_uboot(void)
-{
-       gpio_direction_input(KEY_VOL_UP);
-
-       /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
-       return gpio_get_value(KEY_VOL_UP);
-}
-#endif
-
-static void ccgr_init(void)
-{
-       struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
-
-       writel(0x00C03F3F, &ccm->CCGR0);
-       writel(0x0030FC03, &ccm->CCGR1);
-       writel(0x0FFFC000, &ccm->CCGR2);
-       writel(0x3FF00000, &ccm->CCGR3);
-       writel(0x00FFF300, &ccm->CCGR4);
-       writel(0x0F0000C3, &ccm->CCGR5);
-       writel(0x000003FF, &ccm->CCGR6);
-}
-
-static void gpr_init(void)
-{
-       struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
-
-       /* enable AXI cache for VDOA/VPU/IPU */
-       writel(0xF00000CF, &iomux->gpr[4]);
-       if (is_mx6dqp()) {
-               /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */
-               writel(0x007F007F, &iomux->gpr[6]);
-               writel(0x007F007F, &iomux->gpr[7]);
-       } else {
-               /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
-               writel(0x007F007F, &iomux->gpr[6]);
-               writel(0x007F007F, &iomux->gpr[7]);
-       }
-}
-
-static int mx6q_dcd_table[] = {
-       0x020e0798, 0x000C0000,
-       0x020e0758, 0x00000000,
-       0x020e0588, 0x00000030,
-       0x020e0594, 0x00000030,
-       0x020e056c, 0x00000030,
-       0x020e0578, 0x00000030,
-       0x020e074c, 0x00000030,
-       0x020e057c, 0x00000030,
-       0x020e058c, 0x00000000,
-       0x020e059c, 0x00000030,
-       0x020e05a0, 0x00000030,
-       0x020e078c, 0x00000030,
-       0x020e0750, 0x00020000,
-       0x020e05a8, 0x00000030,
-       0x020e05b0, 0x00000030,
-       0x020e0524, 0x00000030,
-       0x020e051c, 0x00000030,
-       0x020e0518, 0x00000030,
-       0x020e050c, 0x00000030,
-       0x020e05b8, 0x00000030,
-       0x020e05c0, 0x00000030,
-       0x020e0774, 0x00020000,
-       0x020e0784, 0x00000030,
-       0x020e0788, 0x00000030,
-       0x020e0794, 0x00000030,
-       0x020e079c, 0x00000030,
-       0x020e07a0, 0x00000030,
-       0x020e07a4, 0x00000030,
-       0x020e07a8, 0x00000030,
-       0x020e0748, 0x00000030,
-       0x020e05ac, 0x00000030,
-       0x020e05b4, 0x00000030,
-       0x020e0528, 0x00000030,
-       0x020e0520, 0x00000030,
-       0x020e0514, 0x00000030,
-       0x020e0510, 0x00000030,
-       0x020e05bc, 0x00000030,
-       0x020e05c4, 0x00000030,
-       0x021b0800, 0xa1390003,
-       0x021b080c, 0x001F001F,
-       0x021b0810, 0x001F001F,
-       0x021b480c, 0x001F001F,
-       0x021b4810, 0x001F001F,
-       0x021b083c, 0x43270338,
-       0x021b0840, 0x03200314,
-       0x021b483c, 0x431A032F,
-       0x021b4840, 0x03200263,
-       0x021b0848, 0x4B434748,
-       0x021b4848, 0x4445404C,
-       0x021b0850, 0x38444542,
-       0x021b4850, 0x4935493A,
-       0x021b081c, 0x33333333,
-       0x021b0820, 0x33333333,
-       0x021b0824, 0x33333333,
-       0x021b0828, 0x33333333,
-       0x021b481c, 0x33333333,
-       0x021b4820, 0x33333333,
-       0x021b4824, 0x33333333,
-       0x021b4828, 0x33333333,
-       0x021b08b8, 0x00000800,
-       0x021b48b8, 0x00000800,
-       0x021b0004, 0x00020036,
-       0x021b0008, 0x09444040,
-       0x021b000c, 0x555A7975,
-       0x021b0010, 0xFF538F64,
-       0x021b0014, 0x01FF00DB,
-       0x021b0018, 0x00001740,
-       0x021b001c, 0x00008000,
-       0x021b002c, 0x000026d2,
-       0x021b0030, 0x005A1023,
-       0x021b0040, 0x00000027,
-       0x021b0000, 0x831A0000,
-       0x021b001c, 0x04088032,
-       0x021b001c, 0x00008033,
-       0x021b001c, 0x00048031,
-       0x021b001c, 0x09408030,
-       0x021b001c, 0x04008040,
-       0x021b0020, 0x00005800,
-       0x021b0818, 0x00011117,
-       0x021b4818, 0x00011117,
-       0x021b0004, 0x00025576,
-       0x021b0404, 0x00011006,
-       0x021b001c, 0x00000000,
-};
-
-static int mx6qp_dcd_table[] = {
-       0x020e0798, 0x000c0000,
-       0x020e0758, 0x00000000,
-       0x020e0588, 0x00000030,
-       0x020e0594, 0x00000030,
-       0x020e056c, 0x00000030,
-       0x020e0578, 0x00000030,
-       0x020e074c, 0x00000030,
-       0x020e057c, 0x00000030,
-       0x020e058c, 0x00000000,
-       0x020e059c, 0x00000030,
-       0x020e05a0, 0x00000030,
-       0x020e078c, 0x00000030,
-       0x020e0750, 0x00020000,
-       0x020e05a8, 0x00000030,
-       0x020e05b0, 0x00000030,
-       0x020e0524, 0x00000030,
-       0x020e051c, 0x00000030,
-       0x020e0518, 0x00000030,
-       0x020e050c, 0x00000030,
-       0x020e05b8, 0x00000030,
-       0x020e05c0, 0x00000030,
-       0x020e0774, 0x00020000,
-       0x020e0784, 0x00000030,
-       0x020e0788, 0x00000030,
-       0x020e0794, 0x00000030,
-       0x020e079c, 0x00000030,
-       0x020e07a0, 0x00000030,
-       0x020e07a4, 0x00000030,
-       0x020e07a8, 0x00000030,
-       0x020e0748, 0x00000030,
-       0x020e05ac, 0x00000030,
-       0x020e05b4, 0x00000030,
-       0x020e0528, 0x00000030,
-       0x020e0520, 0x00000030,
-       0x020e0514, 0x00000030,
-       0x020e0510, 0x00000030,
-       0x020e05bc, 0x00000030,
-       0x020e05c4, 0x00000030,
-       0x021b0800, 0xa1390003,
-       0x021b080c, 0x001b001e,
-       0x021b0810, 0x002e0029,
-       0x021b480c, 0x001b002a,
-       0x021b4810, 0x0019002c,
-       0x021b083c, 0x43240334,
-       0x021b0840, 0x0324031a,
-       0x021b483c, 0x43340344,
-       0x021b4840, 0x03280276,
-       0x021b0848, 0x44383A3E,
-       0x021b4848, 0x3C3C3846,
-       0x021b0850, 0x2e303230,
-       0x021b4850, 0x38283E34,
-       0x021b081c, 0x33333333,
-       0x021b0820, 0x33333333,
-       0x021b0824, 0x33333333,
-       0x021b0828, 0x33333333,
-       0x021b481c, 0x33333333,
-       0x021b4820, 0x33333333,
-       0x021b4824, 0x33333333,
-       0x021b4828, 0x33333333,
-       0x021b08c0, 0x24912249,
-       0x021b48c0, 0x24914289,
-       0x021b08b8, 0x00000800,
-       0x021b48b8, 0x00000800,
-       0x021b0004, 0x00020036,
-       0x021b0008, 0x24444040,
-       0x021b000c, 0x555A7955,
-       0x021b0010, 0xFF320F64,
-       0x021b0014, 0x01ff00db,
-       0x021b0018, 0x00001740,
-       0x021b001c, 0x00008000,
-       0x021b002c, 0x000026d2,
-       0x021b0030, 0x005A1023,
-       0x021b0040, 0x00000027,
-       0x021b0400, 0x14420000,
-       0x021b0000, 0x831A0000,
-       0x021b0890, 0x00400C58,
-       0x00bb0008, 0x00000000,
-       0x00bb000c, 0x2891E41A,
-       0x00bb0038, 0x00000564,
-       0x00bb0014, 0x00000040,
-       0x00bb0028, 0x00000020,
-       0x00bb002c, 0x00000020,
-       0x021b001c, 0x04088032,
-       0x021b001c, 0x00008033,
-       0x021b001c, 0x00048031,
-       0x021b001c, 0x09408030,
-       0x021b001c, 0x04008040,
-       0x021b0020, 0x00005800,
-       0x021b0818, 0x00011117,
-       0x021b4818, 0x00011117,
-       0x021b0004, 0x00025576,
-       0x021b0404, 0x00011006,
-       0x021b001c, 0x00000000,
-};
-
-static int mx6dl_dcd_table[] = {
-       0x020e0774, 0x000C0000,
-       0x020e0754, 0x00000000,
-       0x020e04ac, 0x00000030,
-       0x020e04b0, 0x00000030,
-       0x020e0464, 0x00000030,
-       0x020e0490, 0x00000030,
-       0x020e074c, 0x00000030,
-       0x020e0494, 0x00000030,
-       0x020e04a0, 0x00000000,
-       0x020e04b4, 0x00000030,
-       0x020e04b8, 0x00000030,
-       0x020e076c, 0x00000030,
-       0x020e0750, 0x00020000,
-       0x020e04bc, 0x00000030,
-       0x020e04c0, 0x00000030,
-       0x020e04c4, 0x00000030,
-       0x020e04c8, 0x00000030,
-       0x020e04cc, 0x00000030,
-       0x020e04d0, 0x00000030,
-       0x020e04d4, 0x00000030,
-       0x020e04d8, 0x00000030,
-       0x020e0760, 0x00020000,
-       0x020e0764, 0x00000030,
-       0x020e0770, 0x00000030,
-       0x020e0778, 0x00000030,
-       0x020e077c, 0x00000030,
-       0x020e0780, 0x00000030,
-       0x020e0784, 0x00000030,
-       0x020e078c, 0x00000030,
-       0x020e0748, 0x00000030,
-       0x020e0470, 0x00000030,
-       0x020e0474, 0x00000030,
-       0x020e0478, 0x00000030,
-       0x020e047c, 0x00000030,
-       0x020e0480, 0x00000030,
-       0x020e0484, 0x00000030,
-       0x020e0488, 0x00000030,
-       0x020e048c, 0x00000030,
-       0x021b0800, 0xa1390003,
-       0x021b080c, 0x001F001F,
-       0x021b0810, 0x001F001F,
-       0x021b480c, 0x001F001F,
-       0x021b4810, 0x001F001F,
-       0x021b083c, 0x4220021F,
-       0x021b0840, 0x0207017E,
-       0x021b483c, 0x4201020C,
-       0x021b4840, 0x01660172,
-       0x021b0848, 0x4A4D4E4D,
-       0x021b4848, 0x4A4F5049,
-       0x021b0850, 0x3F3C3D31,
-       0x021b4850, 0x3238372B,
-       0x021b081c, 0x33333333,
-       0x021b0820, 0x33333333,
-       0x021b0824, 0x33333333,
-       0x021b0828, 0x33333333,
-       0x021b481c, 0x33333333,
-       0x021b4820, 0x33333333,
-       0x021b4824, 0x33333333,
-       0x021b4828, 0x33333333,
-       0x021b08b8, 0x00000800,
-       0x021b48b8, 0x00000800,
-       0x021b0004, 0x0002002D,
-       0x021b0008, 0x00333030,
-       0x021b000c, 0x3F435313,
-       0x021b0010, 0xB66E8B63,
-       0x021b0014, 0x01FF00DB,
-       0x021b0018, 0x00001740,
-       0x021b001c, 0x00008000,
-       0x021b002c, 0x000026d2,
-       0x021b0030, 0x00431023,
-       0x021b0040, 0x00000027,
-       0x021b0000, 0x831A0000,
-       0x021b001c, 0x04008032,
-       0x021b001c, 0x00008033,
-       0x021b001c, 0x00048031,
-       0x021b001c, 0x05208030,
-       0x021b001c, 0x04008040,
-       0x021b0020, 0x00005800,
-       0x021b0818, 0x00011117,
-       0x021b4818, 0x00011117,
-       0x021b0004, 0x0002556D,
-       0x021b0404, 0x00011006,
-       0x021b001c, 0x00000000,
-};
-
-static void ddr_init(int *table, int size)
-{
-       int i;
-
-       for (i = 0; i < size / 2 ; i++)
-               writel(table[2 * i + 1], table[2 * i]);
-}
-
-static void spl_dram_init(void)
-{
-       if (is_mx6dq())
-               ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
-       else if (is_mx6dqp())
-               ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
-       else if (is_mx6sdl())
-               ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
-}
-
-void board_init_f(ulong dummy)
-{
-       /* DDR initialization */
-       spl_dram_init();
-
-       /* setup AIPS and disable watchdog */
-       arch_cpu_init();
-
-       ccgr_init();
-       gpr_init();
-
-       /* iomux and setup of i2c */
-       board_early_init_f();
-
-       /* setup GP timer */
-       timer_init();
-
-       /* UART clocks enabled and gd valid - init serial console */
-       preloader_console_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
-}
-#endif
diff --git a/board/freescale/mx6sabresd/spl.c b/board/freescale/mx6sabresd/spl.c
new file mode 100644
index 0000000..01d45ce
--- /dev/null
+++ b/board/freescale/mx6sabresd/spl.c
@@ -0,0 +1,501 @@
+/*
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.este...@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <libfdt.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <spl.h>
+
+#include <linux/errno.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+
+#include <asm/arch/clock.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6-ddr.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/sys_proto.h>
+
+#include <asm/imx-common/iomux-v3.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_FSL_ESDHC
+#define USDHC_PAD_CTRL         (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW | \
+                               PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST  | \
+                               PAD_CTL_HYS)
+#define KEY_VOL_UP             IMX_GPIO_NR(1, 4)
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+       IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02     | MUX_PAD_CTRL(NO_PAD_CTRL)), 
/* CD */
+};
+
+static iomux_v3_cfg_t const usdhc3_pads[] = {
+       IOMUX_PADS(PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(NO_PAD_CTRL)), /* 
CD */
+};
+
+static iomux_v3_cfg_t const usdhc4_pads[] = {
+       IOMUX_PADS(PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+};
+
+struct fsl_esdhc_cfg usdhc_cfg[3] = {
+       {USDHC2_BASE_ADDR},
+       {USDHC3_BASE_ADDR},
+       {USDHC4_BASE_ADDR},
+};
+
+#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
+#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
+
+int board_mmc_get_env_dev(int devno)
+{
+       return devno - 1;
+}
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC2_BASE_ADDR:
+               ret = !gpio_get_value(USDHC2_CD_GPIO);
+               break;
+       case USDHC3_BASE_ADDR:
+               ret = !gpio_get_value(USDHC3_CD_GPIO);
+               break;
+       case USDHC4_BASE_ADDR:
+               ret = 1; /* eMMC/uSDHC4 is always present */
+               break;
+       }
+
+       return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       struct src *psrc = (struct src *)SRC_BASE_ADDR;
+       unsigned reg = readl(&psrc->sbmr1) >> 11;
+       /*
+        * Upon reading BOOT_CFG register the following map is done:
+        * Bit 11 and 12 of BOOT_CFG register can determine the current
+        * mmc port
+        * 0x1                  SD1
+        * 0x2                  SD2
+        * 0x3                  SD4
+        */
+
+       switch (reg & 0x3) {
+       case 0x1:
+               SETUP_IOMUX_PADS(usdhc2_pads);
+               usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
+               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
+               break;
+       case 0x2:
+               SETUP_IOMUX_PADS(usdhc3_pads);
+               usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
+               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
+               break;
+       case 0x3:
+               SETUP_IOMUX_PADS(usdhc4_pads);
+               usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
+               usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
+               gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
+               break;
+       }
+
+       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
+#endif /* CONFIG_FSL_ESDHC */
+
+#ifdef CONFIG_SPL_OS_BOOT
+int spl_start_uboot(void)
+{
+       gpio_direction_input(KEY_VOL_UP);
+
+       /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
+       return gpio_get_value(KEY_VOL_UP);
+}
+#endif
+
+static void ccgr_init(void)
+{
+       struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+
+       writel(0x00C03F3F, &ccm->CCGR0);
+       writel(0x0030FC03, &ccm->CCGR1);
+       writel(0x0FFFC000, &ccm->CCGR2);
+       writel(0x3FF00000, &ccm->CCGR3);
+       writel(0x00FFF300, &ccm->CCGR4);
+       writel(0x0F0000C3, &ccm->CCGR5);
+       writel(0x000003FF, &ccm->CCGR6);
+}
+
+static void gpr_init(void)
+{
+       struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+       /* enable AXI cache for VDOA/VPU/IPU */
+       writel(0xF00000CF, &iomux->gpr[4]);
+       if (is_mx6dqp()) {
+               /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */
+               writel(0x007F007F, &iomux->gpr[6]);
+               writel(0x007F007F, &iomux->gpr[7]);
+       } else {
+               /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+               writel(0x007F007F, &iomux->gpr[6]);
+               writel(0x007F007F, &iomux->gpr[7]);
+       }
+}
+
+static int mx6q_dcd_table[] = {
+       0x020e0798, 0x000C0000,
+       0x020e0758, 0x00000000,
+       0x020e0588, 0x00000030,
+       0x020e0594, 0x00000030,
+       0x020e056c, 0x00000030,
+       0x020e0578, 0x00000030,
+       0x020e074c, 0x00000030,
+       0x020e057c, 0x00000030,
+       0x020e058c, 0x00000000,
+       0x020e059c, 0x00000030,
+       0x020e05a0, 0x00000030,
+       0x020e078c, 0x00000030,
+       0x020e0750, 0x00020000,
+       0x020e05a8, 0x00000030,
+       0x020e05b0, 0x00000030,
+       0x020e0524, 0x00000030,
+       0x020e051c, 0x00000030,
+       0x020e0518, 0x00000030,
+       0x020e050c, 0x00000030,
+       0x020e05b8, 0x00000030,
+       0x020e05c0, 0x00000030,
+       0x020e0774, 0x00020000,
+       0x020e0784, 0x00000030,
+       0x020e0788, 0x00000030,
+       0x020e0794, 0x00000030,
+       0x020e079c, 0x00000030,
+       0x020e07a0, 0x00000030,
+       0x020e07a4, 0x00000030,
+       0x020e07a8, 0x00000030,
+       0x020e0748, 0x00000030,
+       0x020e05ac, 0x00000030,
+       0x020e05b4, 0x00000030,
+       0x020e0528, 0x00000030,
+       0x020e0520, 0x00000030,
+       0x020e0514, 0x00000030,
+       0x020e0510, 0x00000030,
+       0x020e05bc, 0x00000030,
+       0x020e05c4, 0x00000030,
+       0x021b0800, 0xa1390003,
+       0x021b080c, 0x001F001F,
+       0x021b0810, 0x001F001F,
+       0x021b480c, 0x001F001F,
+       0x021b4810, 0x001F001F,
+       0x021b083c, 0x43270338,
+       0x021b0840, 0x03200314,
+       0x021b483c, 0x431A032F,
+       0x021b4840, 0x03200263,
+       0x021b0848, 0x4B434748,
+       0x021b4848, 0x4445404C,
+       0x021b0850, 0x38444542,
+       0x021b4850, 0x4935493A,
+       0x021b081c, 0x33333333,
+       0x021b0820, 0x33333333,
+       0x021b0824, 0x33333333,
+       0x021b0828, 0x33333333,
+       0x021b481c, 0x33333333,
+       0x021b4820, 0x33333333,
+       0x021b4824, 0x33333333,
+       0x021b4828, 0x33333333,
+       0x021b08b8, 0x00000800,
+       0x021b48b8, 0x00000800,
+       0x021b0004, 0x00020036,
+       0x021b0008, 0x09444040,
+       0x021b000c, 0x555A7975,
+       0x021b0010, 0xFF538F64,
+       0x021b0014, 0x01FF00DB,
+       0x021b0018, 0x00001740,
+       0x021b001c, 0x00008000,
+       0x021b002c, 0x000026d2,
+       0x021b0030, 0x005A1023,
+       0x021b0040, 0x00000027,
+       0x021b0000, 0x831A0000,
+       0x021b001c, 0x04088032,
+       0x021b001c, 0x00008033,
+       0x021b001c, 0x00048031,
+       0x021b001c, 0x09408030,
+       0x021b001c, 0x04008040,
+       0x021b0020, 0x00005800,
+       0x021b0818, 0x00011117,
+       0x021b4818, 0x00011117,
+       0x021b0004, 0x00025576,
+       0x021b0404, 0x00011006,
+       0x021b001c, 0x00000000,
+};
+
+static int mx6qp_dcd_table[] = {
+       0x020e0798, 0x000c0000,
+       0x020e0758, 0x00000000,
+       0x020e0588, 0x00000030,
+       0x020e0594, 0x00000030,
+       0x020e056c, 0x00000030,
+       0x020e0578, 0x00000030,
+       0x020e074c, 0x00000030,
+       0x020e057c, 0x00000030,
+       0x020e058c, 0x00000000,
+       0x020e059c, 0x00000030,
+       0x020e05a0, 0x00000030,
+       0x020e078c, 0x00000030,
+       0x020e0750, 0x00020000,
+       0x020e05a8, 0x00000030,
+       0x020e05b0, 0x00000030,
+       0x020e0524, 0x00000030,
+       0x020e051c, 0x00000030,
+       0x020e0518, 0x00000030,
+       0x020e050c, 0x00000030,
+       0x020e05b8, 0x00000030,
+       0x020e05c0, 0x00000030,
+       0x020e0774, 0x00020000,
+       0x020e0784, 0x00000030,
+       0x020e0788, 0x00000030,
+       0x020e0794, 0x00000030,
+       0x020e079c, 0x00000030,
+       0x020e07a0, 0x00000030,
+       0x020e07a4, 0x00000030,
+       0x020e07a8, 0x00000030,
+       0x020e0748, 0x00000030,
+       0x020e05ac, 0x00000030,
+       0x020e05b4, 0x00000030,
+       0x020e0528, 0x00000030,
+       0x020e0520, 0x00000030,
+       0x020e0514, 0x00000030,
+       0x020e0510, 0x00000030,
+       0x020e05bc, 0x00000030,
+       0x020e05c4, 0x00000030,
+       0x021b0800, 0xa1390003,
+       0x021b080c, 0x001b001e,
+       0x021b0810, 0x002e0029,
+       0x021b480c, 0x001b002a,
+       0x021b4810, 0x0019002c,
+       0x021b083c, 0x43240334,
+       0x021b0840, 0x0324031a,
+       0x021b483c, 0x43340344,
+       0x021b4840, 0x03280276,
+       0x021b0848, 0x44383A3E,
+       0x021b4848, 0x3C3C3846,
+       0x021b0850, 0x2e303230,
+       0x021b4850, 0x38283E34,
+       0x021b081c, 0x33333333,
+       0x021b0820, 0x33333333,
+       0x021b0824, 0x33333333,
+       0x021b0828, 0x33333333,
+       0x021b481c, 0x33333333,
+       0x021b4820, 0x33333333,
+       0x021b4824, 0x33333333,
+       0x021b4828, 0x33333333,
+       0x021b08c0, 0x24912249,
+       0x021b48c0, 0x24914289,
+       0x021b08b8, 0x00000800,
+       0x021b48b8, 0x00000800,
+       0x021b0004, 0x00020036,
+       0x021b0008, 0x24444040,
+       0x021b000c, 0x555A7955,
+       0x021b0010, 0xFF320F64,
+       0x021b0014, 0x01ff00db,
+       0x021b0018, 0x00001740,
+       0x021b001c, 0x00008000,
+       0x021b002c, 0x000026d2,
+       0x021b0030, 0x005A1023,
+       0x021b0040, 0x00000027,
+       0x021b0400, 0x14420000,
+       0x021b0000, 0x831A0000,
+       0x021b0890, 0x00400C58,
+       0x00bb0008, 0x00000000,
+       0x00bb000c, 0x2891E41A,
+       0x00bb0038, 0x00000564,
+       0x00bb0014, 0x00000040,
+       0x00bb0028, 0x00000020,
+       0x00bb002c, 0x00000020,
+       0x021b001c, 0x04088032,
+       0x021b001c, 0x00008033,
+       0x021b001c, 0x00048031,
+       0x021b001c, 0x09408030,
+       0x021b001c, 0x04008040,
+       0x021b0020, 0x00005800,
+       0x021b0818, 0x00011117,
+       0x021b4818, 0x00011117,
+       0x021b0004, 0x00025576,
+       0x021b0404, 0x00011006,
+       0x021b001c, 0x00000000,
+};
+
+static int mx6dl_dcd_table[] = {
+       0x020e0774, 0x000C0000,
+       0x020e0754, 0x00000000,
+       0x020e04ac, 0x00000030,
+       0x020e04b0, 0x00000030,
+       0x020e0464, 0x00000030,
+       0x020e0490, 0x00000030,
+       0x020e074c, 0x00000030,
+       0x020e0494, 0x00000030,
+       0x020e04a0, 0x00000000,
+       0x020e04b4, 0x00000030,
+       0x020e04b8, 0x00000030,
+       0x020e076c, 0x00000030,
+       0x020e0750, 0x00020000,
+       0x020e04bc, 0x00000030,
+       0x020e04c0, 0x00000030,
+       0x020e04c4, 0x00000030,
+       0x020e04c8, 0x00000030,
+       0x020e04cc, 0x00000030,
+       0x020e04d0, 0x00000030,
+       0x020e04d4, 0x00000030,
+       0x020e04d8, 0x00000030,
+       0x020e0760, 0x00020000,
+       0x020e0764, 0x00000030,
+       0x020e0770, 0x00000030,
+       0x020e0778, 0x00000030,
+       0x020e077c, 0x00000030,
+       0x020e0780, 0x00000030,
+       0x020e0784, 0x00000030,
+       0x020e078c, 0x00000030,
+       0x020e0748, 0x00000030,
+       0x020e0470, 0x00000030,
+       0x020e0474, 0x00000030,
+       0x020e0478, 0x00000030,
+       0x020e047c, 0x00000030,
+       0x020e0480, 0x00000030,
+       0x020e0484, 0x00000030,
+       0x020e0488, 0x00000030,
+       0x020e048c, 0x00000030,
+       0x021b0800, 0xa1390003,
+       0x021b080c, 0x001F001F,
+       0x021b0810, 0x001F001F,
+       0x021b480c, 0x001F001F,
+       0x021b4810, 0x001F001F,
+       0x021b083c, 0x4220021F,
+       0x021b0840, 0x0207017E,
+       0x021b483c, 0x4201020C,
+       0x021b4840, 0x01660172,
+       0x021b0848, 0x4A4D4E4D,
+       0x021b4848, 0x4A4F5049,
+       0x021b0850, 0x3F3C3D31,
+       0x021b4850, 0x3238372B,
+       0x021b081c, 0x33333333,
+       0x021b0820, 0x33333333,
+       0x021b0824, 0x33333333,
+       0x021b0828, 0x33333333,
+       0x021b481c, 0x33333333,
+       0x021b4820, 0x33333333,
+       0x021b4824, 0x33333333,
+       0x021b4828, 0x33333333,
+       0x021b08b8, 0x00000800,
+       0x021b48b8, 0x00000800,
+       0x021b0004, 0x0002002D,
+       0x021b0008, 0x00333030,
+       0x021b000c, 0x3F435313,
+       0x021b0010, 0xB66E8B63,
+       0x021b0014, 0x01FF00DB,
+       0x021b0018, 0x00001740,
+       0x021b001c, 0x00008000,
+       0x021b002c, 0x000026d2,
+       0x021b0030, 0x00431023,
+       0x021b0040, 0x00000027,
+       0x021b0000, 0x831A0000,
+       0x021b001c, 0x04008032,
+       0x021b001c, 0x00008033,
+       0x021b001c, 0x00048031,
+       0x021b001c, 0x05208030,
+       0x021b001c, 0x04008040,
+       0x021b0020, 0x00005800,
+       0x021b0818, 0x00011117,
+       0x021b4818, 0x00011117,
+       0x021b0004, 0x0002556D,
+       0x021b0404, 0x00011006,
+       0x021b001c, 0x00000000,
+};
+
+static void ddr_init(int *table, int size)
+{
+       int i;
+
+       for (i = 0; i < size / 2 ; i++)
+               writel(table[2 * i + 1], table[2 * i]);
+}
+
+static void spl_dram_init(void)
+{
+       if (is_mx6dq())
+               ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
+       else if (is_mx6dqp())
+               ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
+       else if (is_mx6sdl())
+               ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
+}
+
+void board_init_f(ulong dummy)
+{
+       /* DDR initialization */
+       spl_dram_init();
+
+       /* setup AIPS and disable watchdog */
+       arch_cpu_init();
+
+       ccgr_init();
+       gpr_init();
+
+       /* iomux and setup of i2c */
+       board_early_init_f();
+
+       /* setup GP timer */
+       timer_init();
+
+       /* UART clocks enabled and gd valid - init serial console */
+       preloader_console_init();
+
+       /* Clear the BSS. */
+       memset(__bss_start, 0, __bss_end - __bss_start);
+
+       /* load/boot image from boot device */
+       board_init_r(NULL, 0);
+}
diff --git a/configs/mx6sabresd_spl_defconfig b/configs/mx6sabresd_spl_defconfig
index 2bfacb9..33e84f0 100644
--- a/configs/mx6sabresd_spl_defconfig
+++ b/configs/mx6sabresd_spl_defconfig
@@ -9,6 +9,7 @@ CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
 CONFIG_SPL_WATCHDOG_SUPPORT=y
 CONFIG_VIDEO=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6q-sabresd"
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/imx-common/spl_sd.cfg,SPL,MX6QDL"
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
@@ -48,3 +49,5 @@ CONFIG_G_DNL_VENDOR_NUM=0x0525
 CONFIG_G_DNL_PRODUCT_NUM=0xa4a5
 # CONFIG_VIDEO_SW_CURSOR is not set
 CONFIG_OF_LIBFDT=y
+# CONFIG_BLK is not set
+# CONFIG_DM_MMC_OPS is not set
diff --git a/include/configs/mx6sabresd.h b/include/configs/mx6sabresd.h
index a8c0e03..43a4aac 100644
--- a/include/configs/mx6sabresd.h
+++ b/include/configs/mx6sabresd.h
@@ -11,6 +11,10 @@
 
 #ifdef CONFIG_SPL
 #include "imx6_spl.h"
+# ifdef CONFIG_SPL_BUILD
+#  undef CONFIG_DM_GPIO
+#  undef CONFIG_DM_MMC
+# endif
 #endif
 
 #define CONFIG_MACH_TYPE       3980
@@ -34,7 +38,6 @@
 #define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS (CONFIG_CMD_SPL_WRITE_SIZE / 
512)
 #define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR        0x1000  /* 2MB */
 
-#define CONFIG_SYS_FSL_USDHC_NUM       3
 #if defined(CONFIG_ENV_IS_IN_MMC)
 #define CONFIG_SYS_MMC_ENV_DEV         1       /* SDHC3 */
 #endif
-- 
1.9.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to