uboot/board/freescale/mx6sabresd/mx6sabresd.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 Freescale Semiconductor, Inc.
   3 *
   4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
   5 *
   6 * SPDX-License-Identifier:     GPL-2.0+
   7 */
   8
   9#include <asm/arch/clock.h>
  10#include <asm/arch/imx-regs.h>
  11#include <asm/arch/iomux.h>
  12#include <asm/arch/mx6-pins.h>
  13#include <linux/errno.h>
  14#include <asm/gpio.h>
  15#include <asm/mach-imx/mxc_i2c.h>
  16#include <asm/mach-imx/iomux-v3.h>
  17#include <asm/mach-imx/boot_mode.h>
  18#include <asm/mach-imx/video.h>
  19#include <mmc.h>
  20#include <fsl_esdhc.h>
  21#include <miiphy.h>
  22#include <netdev.h>
  23#include <asm/arch/mxc_hdmi.h>
  24#include <asm/arch/crm_regs.h>
  25#include <asm/io.h>
  26#include <asm/arch/sys_proto.h>
  27#include <i2c.h>
  28#include <power/pmic.h>
  29#include <power/pfuze100_pmic.h>
  30#include "../common/pfuze.h"
  31#include <usb.h>
  32
  33DECLARE_GLOBAL_DATA_PTR;
  34
  35#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
  36        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
  37        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
  38
  39#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                    \
  40        PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
  41        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
  42
  43#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
  44        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
  45
  46#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
  47                      PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
  48
  49#define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                    \
  50        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
  51        PAD_CTL_ODE | PAD_CTL_SRE_FAST)
  52
  53#define I2C_PMIC        1
  54
  55#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
  56
  57#define DISP0_PWR_EN    IMX_GPIO_NR(1, 21)
  58
  59#define KEY_VOL_UP      IMX_GPIO_NR(1, 4)
  60
  61int dram_init(void)
  62{
  63        gd->ram_size = imx_ddr_size();
  64        return 0;
  65}
  66
  67static iomux_v3_cfg_t const uart1_pads[] = {
  68        IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
  69        IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
  70};
  71
  72static iomux_v3_cfg_t const enet_pads[] = {
  73        IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  74        IOMUX_PADS(PAD_ENET_MDC__ENET_MDC       | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  75        IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  76        IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  77        IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  78        IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  79        IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  80        IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL       | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  81        IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK        | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  82        IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  83        IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  84        IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  85        IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  86        IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3     | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  87        IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL       | MUX_PAD_CTRL(ENET_PAD_CTRL)),
  88        /* AR8031 PHY Reset */
  89        IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25  | MUX_PAD_CTRL(NO_PAD_CTRL)),
  90};
  91
  92static void setup_iomux_enet(void)
  93{
  94        SETUP_IOMUX_PADS(enet_pads);
  95
  96        /* Reset AR8031 PHY */
  97        gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
  98        mdelay(10);
  99        gpio_set_value(IMX_GPIO_NR(1, 25), 1);
 100        udelay(100);
 101}
 102
 103static iomux_v3_cfg_t const usdhc2_pads[] = {
 104        IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 105        IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 106        IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 107        IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 108        IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 109        IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 110        IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 111        IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 112        IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 113        IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 114        IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02     | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
 115};
 116
 117static iomux_v3_cfg_t const usdhc3_pads[] = {
 118        IOMUX_PADS(PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 119        IOMUX_PADS(PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 120        IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 121        IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 122        IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 123        IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 124        IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 125        IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 126        IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 127        IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 128        IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
 129};
 130
 131static iomux_v3_cfg_t const usdhc4_pads[] = {
 132        IOMUX_PADS(PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 133        IOMUX_PADS(PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 134        IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 135        IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 136        IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 137        IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 138        IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 139        IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 140        IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 141        IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
 142};
 143
 144static iomux_v3_cfg_t const ecspi1_pads[] = {
 145        IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
 146        IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
 147        IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
 148        IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 149};
 150
 151static iomux_v3_cfg_t const rgb_pads[] = {
 152        IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
 153        IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 154        IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 155        IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 156        IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 157        IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 158        IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 159        IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 160        IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 161        IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 162        IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 163        IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 164        IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 165        IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 166        IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 167        IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 168        IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 169        IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 170        IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 171        IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 172        IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 173        IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 174        IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 175        IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 176        IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 177        IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 178        IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 179        IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 180        IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 181};
 182
 183static iomux_v3_cfg_t const bl_pads[] = {
 184        IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 185};
 186
 187static void enable_backlight(void)
 188{
 189        SETUP_IOMUX_PADS(bl_pads);
 190        gpio_direction_output(DISP0_PWR_EN, 1);
 191}
 192
 193static void enable_rgb(struct display_info_t const *dev)
 194{
 195        SETUP_IOMUX_PADS(rgb_pads);
 196        enable_backlight();
 197}
 198
 199static void enable_lvds(struct display_info_t const *dev)
 200{
 201        enable_backlight();
 202}
 203
 204static struct i2c_pads_info mx6q_i2c_pad_info1 = {
 205        .scl = {
 206                .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
 207                .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
 208                .gp = IMX_GPIO_NR(4, 12)
 209        },
 210        .sda = {
 211                .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
 212                .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
 213                .gp = IMX_GPIO_NR(4, 13)
 214        }
 215};
 216
 217static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
 218        .scl = {
 219                .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
 220                .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
 221                .gp = IMX_GPIO_NR(4, 12)
 222        },
 223        .sda = {
 224                .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
 225                .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
 226                .gp = IMX_GPIO_NR(4, 13)
 227        }
 228};
 229
 230static void setup_spi(void)
 231{
 232        SETUP_IOMUX_PADS(ecspi1_pads);
 233}
 234
 235iomux_v3_cfg_t const pcie_pads[] = {
 236        IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),        /* POWER */
 237        IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)),        /* RESET */
 238};
 239
 240static void setup_pcie(void)
 241{
 242        SETUP_IOMUX_PADS(pcie_pads);
 243}
 244
 245iomux_v3_cfg_t const di0_pads[] = {
 246        IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK),        /* DISP0_CLK */
 247        IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02),               /* DISP0_HSYNC */
 248        IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03),               /* DISP0_VSYNC */
 249};
 250
 251static void setup_iomux_uart(void)
 252{
 253        SETUP_IOMUX_PADS(uart1_pads);
 254}
 255
 256#ifdef CONFIG_FSL_ESDHC
 257struct fsl_esdhc_cfg usdhc_cfg[3] = {
 258        {USDHC2_BASE_ADDR},
 259        {USDHC3_BASE_ADDR},
 260        {USDHC4_BASE_ADDR},
 261};
 262
 263#define USDHC2_CD_GPIO  IMX_GPIO_NR(2, 2)
 264#define USDHC3_CD_GPIO  IMX_GPIO_NR(2, 0)
 265
 266int board_mmc_get_env_dev(int devno)
 267{
 268        return devno - 1;
 269}
 270
 271int board_mmc_getcd(struct mmc *mmc)
 272{
 273        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
 274        int ret = 0;
 275
 276        switch (cfg->esdhc_base) {
 277        case USDHC2_BASE_ADDR:
 278                ret = !gpio_get_value(USDHC2_CD_GPIO);
 279                break;
 280        case USDHC3_BASE_ADDR:
 281                ret = !gpio_get_value(USDHC3_CD_GPIO);
 282                break;
 283        case USDHC4_BASE_ADDR:
 284                ret = 1; /* eMMC/uSDHC4 is always present */
 285                break;
 286        }
 287
 288        return ret;
 289}
 290
 291int board_mmc_init(bd_t *bis)
 292{
 293#ifndef CONFIG_SPL_BUILD
 294        int ret;
 295        int i;
 296
 297        /*
 298         * According to the board_mmc_init() the following map is done:
 299         * (U-Boot device node)    (Physical Port)
 300         * mmc0                    SD2
 301         * mmc1                    SD3
 302         * mmc2                    eMMC
 303         */
 304        for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
 305                switch (i) {
 306                case 0:
 307                        SETUP_IOMUX_PADS(usdhc2_pads);
 308                        gpio_direction_input(USDHC2_CD_GPIO);
 309                        usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
 310                        break;
 311                case 1:
 312                        SETUP_IOMUX_PADS(usdhc3_pads);
 313                        gpio_direction_input(USDHC3_CD_GPIO);
 314                        usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
 315                        break;
 316                case 2:
 317                        SETUP_IOMUX_PADS(usdhc4_pads);
 318                        usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
 319                        break;
 320                default:
 321                        printf("Warning: you configured more USDHC controllers"
 322                               "(%d) then supported by the board (%d)\n",
 323                               i + 1, CONFIG_SYS_FSL_USDHC_NUM);
 324                        return -EINVAL;
 325                }
 326
 327                ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
 328                if (ret)
 329                        return ret;
 330        }
 331
 332        return 0;
 333#else
 334        struct src *psrc = (struct src *)SRC_BASE_ADDR;
 335        unsigned reg = readl(&psrc->sbmr1) >> 11;
 336        /*
 337         * Upon reading BOOT_CFG register the following map is done:
 338         * Bit 11 and 12 of BOOT_CFG register can determine the current
 339         * mmc port
 340         * 0x1                  SD1
 341         * 0x2                  SD2
 342         * 0x3                  SD4
 343         */
 344
 345        switch (reg & 0x3) {
 346        case 0x1:
 347                SETUP_IOMUX_PADS(usdhc2_pads);
 348                usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
 349                usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
 350                gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
 351                break;
 352        case 0x2:
 353                SETUP_IOMUX_PADS(usdhc3_pads);
 354                usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
 355                usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
 356                gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
 357                break;
 358        case 0x3:
 359                SETUP_IOMUX_PADS(usdhc4_pads);
 360                usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
 361                usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
 362                gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
 363                break;
 364        }
 365
 366        return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
 367#endif
 368}
 369#endif
 370
 371static int ar8031_phy_fixup(struct phy_device *phydev)
 372{
 373        unsigned short val;
 374
 375        /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
 376        phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
 377        phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
 378        phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
 379
 380        val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
 381        val &= 0xffe3;
 382        val |= 0x18;
 383        phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
 384
 385        /* introduce tx clock delay */
 386        phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
 387        val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
 388        val |= 0x0100;
 389        phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
 390
 391        return 0;
 392}
 393
 394int board_phy_config(struct phy_device *phydev)
 395{
 396        ar8031_phy_fixup(phydev);
 397
 398        if (phydev->drv->config)
 399                phydev->drv->config(phydev);
 400
 401        return 0;
 402}
 403
 404#if defined(CONFIG_VIDEO_IPUV3)
 405static void disable_lvds(struct display_info_t const *dev)
 406{
 407        struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
 408
 409        int reg = readl(&iomux->gpr[2]);
 410
 411        reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
 412                 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
 413
 414        writel(reg, &iomux->gpr[2]);
 415}
 416
 417static void do_enable_hdmi(struct display_info_t const *dev)
 418{
 419        disable_lvds(dev);
 420        imx_enable_hdmi_phy();
 421}
 422
 423struct display_info_t const displays[] = {{
 424        .bus    = -1,
 425        .addr   = 0,
 426        .pixfmt = IPU_PIX_FMT_RGB666,
 427        .detect = NULL,
 428        .enable = enable_lvds,
 429        .mode   = {
 430                .name           = "Hannstar-XGA",
 431                .refresh        = 60,
 432                .xres           = 1024,
 433                .yres           = 768,
 434                .pixclock       = 15384,
 435                .left_margin    = 160,
 436                .right_margin   = 24,
 437                .upper_margin   = 29,
 438                .lower_margin   = 3,
 439                .hsync_len      = 136,
 440                .vsync_len      = 6,
 441                .sync           = FB_SYNC_EXT,
 442                .vmode          = FB_VMODE_NONINTERLACED
 443} }, {
 444        .bus    = -1,
 445        .addr   = 0,
 446        .pixfmt = IPU_PIX_FMT_RGB24,
 447        .detect = detect_hdmi,
 448        .enable = do_enable_hdmi,
 449        .mode   = {
 450                .name           = "HDMI",
 451                .refresh        = 60,
 452                .xres           = 1024,
 453                .yres           = 768,
 454                .pixclock       = 15384,
 455                .left_margin    = 160,
 456                .right_margin   = 24,
 457                .upper_margin   = 29,
 458                .lower_margin   = 3,
 459                .hsync_len      = 136,
 460                .vsync_len      = 6,
 461                .sync           = FB_SYNC_EXT,
 462                .vmode          = FB_VMODE_NONINTERLACED
 463} }, {
 464        .bus    = 0,
 465        .addr   = 0,
 466        .pixfmt = IPU_PIX_FMT_RGB24,
 467        .detect = NULL,
 468        .enable = enable_rgb,
 469        .mode   = {
 470                .name           = "SEIKO-WVGA",
 471                .refresh        = 60,
 472                .xres           = 800,
 473                .yres           = 480,
 474                .pixclock       = 29850,
 475                .left_margin    = 89,
 476                .right_margin   = 164,
 477                .upper_margin   = 23,
 478                .lower_margin   = 10,
 479                .hsync_len      = 10,
 480                .vsync_len      = 10,
 481                .sync           = 0,
 482                .vmode          = FB_VMODE_NONINTERLACED
 483} } };
 484size_t display_count = ARRAY_SIZE(displays);
 485
 486static void setup_display(void)
 487{
 488        struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
 489        struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
 490        int reg;
 491
 492        /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
 493        SETUP_IOMUX_PADS(di0_pads);
 494
 495        enable_ipu_clock();
 496        imx_setup_hdmi();
 497
 498        /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
 499        reg = readl(&mxc_ccm->CCGR3);
 500        reg |=  MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
 501        writel(reg, &mxc_ccm->CCGR3);
 502
 503        /* set LDB0, LDB1 clk select to 011/011 */
 504        reg = readl(&mxc_ccm->cs2cdr);
 505        reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
 506                 | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
 507        reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
 508              | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
 509        writel(reg, &mxc_ccm->cs2cdr);
 510
 511        reg = readl(&mxc_ccm->cscmr2);
 512        reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
 513        writel(reg, &mxc_ccm->cscmr2);
 514
 515        reg = readl(&mxc_ccm->chsccdr);
 516        reg |= (CHSCCDR_CLK_SEL_LDB_DI0
 517                << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
 518        reg |= (CHSCCDR_CLK_SEL_LDB_DI0
 519                << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
 520        writel(reg, &mxc_ccm->chsccdr);
 521
 522        reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
 523             | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
 524             | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
 525             | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
 526             | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
 527             | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
 528             | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
 529             | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
 530             | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
 531        writel(reg, &iomux->gpr[2]);
 532
 533        reg = readl(&iomux->gpr[3]);
 534        reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
 535                        | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
 536            | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
 537               << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
 538        writel(reg, &iomux->gpr[3]);
 539}
 540#endif /* CONFIG_VIDEO_IPUV3 */
 541
 542/*
 543 * Do not overwrite the console
 544 * Use always serial for U-Boot console
 545 */
 546int overwrite_console(void)
 547{
 548        return 1;
 549}
 550
 551int board_eth_init(bd_t *bis)
 552{
 553        setup_iomux_enet();
 554        setup_pcie();
 555
 556        return cpu_eth_init(bis);
 557}
 558
 559#ifdef CONFIG_USB_EHCI_MX6
 560#define USB_OTHERREGS_OFFSET    0x800
 561#define UCTRL_PWR_POL           (1 << 9)
 562
 563static iomux_v3_cfg_t const usb_otg_pads[] = {
 564        IOMUX_PADS(PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL)),
 565        IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
 566};
 567
 568static iomux_v3_cfg_t const usb_hc1_pads[] = {
 569        IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
 570};
 571
 572static void setup_usb(void)
 573{
 574        SETUP_IOMUX_PADS(usb_otg_pads);
 575
 576        /*
 577         * set daisy chain for otg_pin_id on 6q.
 578         * for 6dl, this bit is reserved
 579         */
 580        imx_iomux_set_gpr_register(1, 13, 1, 0);
 581
 582        SETUP_IOMUX_PADS(usb_hc1_pads);
 583}
 584
 585int board_ehci_hcd_init(int port)
 586{
 587        u32 *usbnc_usb_ctrl;
 588
 589        if (port > 1)
 590                return -EINVAL;
 591
 592        usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
 593                                 port * 4);
 594
 595        setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
 596
 597        return 0;
 598}
 599
 600int board_ehci_power(int port, int on)
 601{
 602        switch (port) {
 603        case 0:
 604                break;
 605        case 1:
 606                if (on)
 607                        gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
 608                else
 609                        gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
 610                break;
 611        default:
 612                printf("MXC USB port %d not yet supported\n", port);
 613                return -EINVAL;
 614        }
 615
 616        return 0;
 617}
 618#endif
 619
 620int board_early_init_f(void)
 621{
 622        setup_iomux_uart();
 623#if defined(CONFIG_VIDEO_IPUV3)
 624        setup_display();
 625#endif
 626
 627        return 0;
 628}
 629
 630int board_init(void)
 631{
 632        /* address of boot parameters */
 633        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 634
 635#ifdef CONFIG_MXC_SPI
 636        setup_spi();
 637#endif
 638        if (is_mx6dq() || is_mx6dqp())
 639                setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
 640        else
 641                setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
 642#ifdef CONFIG_USB_EHCI_MX6
 643        setup_usb();
 644#endif
 645
 646        return 0;
 647}
 648
 649int power_init_board(void)
 650{
 651        struct pmic *p;
 652        unsigned int reg;
 653        int ret;
 654
 655        p = pfuze_common_init(I2C_PMIC);
 656        if (!p)
 657                return -ENODEV;
 658
 659        ret = pfuze_mode_init(p, APS_PFM);
 660        if (ret < 0)
 661                return ret;
 662
 663        /* Increase VGEN3 from 2.5 to 2.8V */
 664        pmic_reg_read(p, PFUZE100_VGEN3VOL, &reg);
 665        reg &= ~LDO_VOL_MASK;
 666        reg |= LDOB_2_80V;
 667        pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
 668
 669        /* Increase VGEN5 from 2.8 to 3V */
 670        pmic_reg_read(p, PFUZE100_VGEN5VOL, &reg);
 671        reg &= ~LDO_VOL_MASK;
 672        reg |= LDOB_3_00V;
 673        pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
 674
 675        return 0;
 676}
 677
 678#ifdef CONFIG_MXC_SPI
 679int board_spi_cs_gpio(unsigned bus, unsigned cs)
 680{
 681        return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
 682}
 683#endif
 684
 685#ifdef CONFIG_CMD_BMODE
 686static const struct boot_mode board_boot_modes[] = {
 687        /* 4 bit bus width */
 688        {"sd2",  MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
 689        {"sd3",  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
 690        /* 8 bit bus width */
 691        {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
 692        {NULL,   0},
 693};
 694#endif
 695
 696int board_late_init(void)
 697{
 698#ifdef CONFIG_CMD_BMODE
 699        add_board_boot_modes(board_boot_modes);
 700#endif
 701
 702#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
 703        env_set("board_name", "SABRESD");
 704
 705        if (is_mx6dqp())
 706                env_set("board_rev", "MX6QP");
 707        else if (is_mx6dq())
 708                env_set("board_rev", "MX6Q");
 709        else if (is_mx6sdl())
 710                env_set("board_rev", "MX6DL");
 711#endif
 712
 713        return 0;
 714}
 715
 716int checkboard(void)
 717{
 718        puts("Board: MX6-SabreSD\n");
 719        return 0;
 720}
 721
 722#ifdef CONFIG_SPL_BUILD
 723#include <asm/arch/mx6-ddr.h>
 724#include <spl.h>
 725#include <libfdt.h>
 726
 727#ifdef CONFIG_SPL_OS_BOOT
 728int spl_start_uboot(void)
 729{
 730        gpio_direction_input(KEY_VOL_UP);
 731
 732        /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
 733        return gpio_get_value(KEY_VOL_UP);
 734}
 735#endif
 736
 737static void ccgr_init(void)
 738{
 739        struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
 740
 741        writel(0x00C03F3F, &ccm->CCGR0);
 742        writel(0x0030FC03, &ccm->CCGR1);
 743        writel(0x0FFFC000, &ccm->CCGR2);
 744        writel(0x3FF00000, &ccm->CCGR3);
 745        writel(0x00FFF300, &ccm->CCGR4);
 746        writel(0x0F0000C3, &ccm->CCGR5);
 747        writel(0x000003FF, &ccm->CCGR6);
 748}
 749
 750static int mx6q_dcd_table[] = {
 751        0x020e0798, 0x000C0000,
 752        0x020e0758, 0x00000000,
 753        0x020e0588, 0x00000030,
 754        0x020e0594, 0x00000030,
 755        0x020e056c, 0x00000030,
 756        0x020e0578, 0x00000030,
 757        0x020e074c, 0x00000030,
 758        0x020e057c, 0x00000030,
 759        0x020e058c, 0x00000000,
 760        0x020e059c, 0x00000030,
 761        0x020e05a0, 0x00000030,
 762        0x020e078c, 0x00000030,
 763        0x020e0750, 0x00020000,
 764        0x020e05a8, 0x00000030,
 765        0x020e05b0, 0x00000030,
 766        0x020e0524, 0x00000030,
 767        0x020e051c, 0x00000030,
 768        0x020e0518, 0x00000030,
 769        0x020e050c, 0x00000030,
 770        0x020e05b8, 0x00000030,
 771        0x020e05c0, 0x00000030,
 772        0x020e0774, 0x00020000,
 773        0x020e0784, 0x00000030,
 774        0x020e0788, 0x00000030,
 775        0x020e0794, 0x00000030,
 776        0x020e079c, 0x00000030,
 777        0x020e07a0, 0x00000030,
 778        0x020e07a4, 0x00000030,
 779        0x020e07a8, 0x00000030,
 780        0x020e0748, 0x00000030,
 781        0x020e05ac, 0x00000030,
 782        0x020e05b4, 0x00000030,
 783        0x020e0528, 0x00000030,
 784        0x020e0520, 0x00000030,
 785        0x020e0514, 0x00000030,
 786        0x020e0510, 0x00000030,
 787        0x020e05bc, 0x00000030,
 788        0x020e05c4, 0x00000030,
 789        0x021b0800, 0xa1390003,
 790        0x021b080c, 0x001F001F,
 791        0x021b0810, 0x001F001F,
 792        0x021b480c, 0x001F001F,
 793        0x021b4810, 0x001F001F,
 794        0x021b083c, 0x43270338,
 795        0x021b0840, 0x03200314,
 796        0x021b483c, 0x431A032F,
 797        0x021b4840, 0x03200263,
 798        0x021b0848, 0x4B434748,
 799        0x021b4848, 0x4445404C,
 800        0x021b0850, 0x38444542,
 801        0x021b4850, 0x4935493A,
 802        0x021b081c, 0x33333333,
 803        0x021b0820, 0x33333333,
 804        0x021b0824, 0x33333333,
 805        0x021b0828, 0x33333333,
 806        0x021b481c, 0x33333333,
 807        0x021b4820, 0x33333333,
 808        0x021b4824, 0x33333333,
 809        0x021b4828, 0x33333333,
 810        0x021b08b8, 0x00000800,
 811        0x021b48b8, 0x00000800,
 812        0x021b0004, 0x00020036,
 813        0x021b0008, 0x09444040,
 814        0x021b000c, 0x555A7975,
 815        0x021b0010, 0xFF538F64,
 816        0x021b0014, 0x01FF00DB,
 817        0x021b0018, 0x00001740,
 818        0x021b001c, 0x00008000,
 819        0x021b002c, 0x000026d2,
 820        0x021b0030, 0x005A1023,
 821        0x021b0040, 0x00000027,
 822        0x021b0000, 0x831A0000,
 823        0x021b001c, 0x04088032,
 824        0x021b001c, 0x00008033,
 825        0x021b001c, 0x00048031,
 826        0x021b001c, 0x09408030,
 827        0x021b001c, 0x04008040,
 828        0x021b0020, 0x00005800,
 829        0x021b0818, 0x00011117,
 830        0x021b4818, 0x00011117,
 831        0x021b0004, 0x00025576,
 832        0x021b0404, 0x00011006,
 833        0x021b001c, 0x00000000,
 834};
 835
 836static int mx6qp_dcd_table[] = {
 837        0x020e0798, 0x000c0000,
 838        0x020e0758, 0x00000000,
 839        0x020e0588, 0x00000030,
 840        0x020e0594, 0x00000030,
 841        0x020e056c, 0x00000030,
 842        0x020e0578, 0x00000030,
 843        0x020e074c, 0x00000030,
 844        0x020e057c, 0x00000030,
 845        0x020e058c, 0x00000000,
 846        0x020e059c, 0x00000030,
 847        0x020e05a0, 0x00000030,
 848        0x020e078c, 0x00000030,
 849        0x020e0750, 0x00020000,
 850        0x020e05a8, 0x00000030,
 851        0x020e05b0, 0x00000030,
 852        0x020e0524, 0x00000030,
 853        0x020e051c, 0x00000030,
 854        0x020e0518, 0x00000030,
 855        0x020e050c, 0x00000030,
 856        0x020e05b8, 0x00000030,
 857        0x020e05c0, 0x00000030,
 858        0x020e0774, 0x00020000,
 859        0x020e0784, 0x00000030,
 860        0x020e0788, 0x00000030,
 861        0x020e0794, 0x00000030,
 862        0x020e079c, 0x00000030,
 863        0x020e07a0, 0x00000030,
 864        0x020e07a4, 0x00000030,
 865        0x020e07a8, 0x00000030,
 866        0x020e0748, 0x00000030,
 867        0x020e05ac, 0x00000030,
 868        0x020e05b4, 0x00000030,
 869        0x020e0528, 0x00000030,
 870        0x020e0520, 0x00000030,
 871        0x020e0514, 0x00000030,
 872        0x020e0510, 0x00000030,
 873        0x020e05bc, 0x00000030,
 874        0x020e05c4, 0x00000030,
 875        0x021b0800, 0xa1390003,
 876        0x021b080c, 0x001b001e,
 877        0x021b0810, 0x002e0029,
 878        0x021b480c, 0x001b002a,
 879        0x021b4810, 0x0019002c,
 880        0x021b083c, 0x43240334,
 881        0x021b0840, 0x0324031a,
 882        0x021b483c, 0x43340344,
 883        0x021b4840, 0x03280276,
 884        0x021b0848, 0x44383A3E,
 885        0x021b4848, 0x3C3C3846,
 886        0x021b0850, 0x2e303230,
 887        0x021b4850, 0x38283E34,
 888        0x021b081c, 0x33333333,
 889        0x021b0820, 0x33333333,
 890        0x021b0824, 0x33333333,
 891        0x021b0828, 0x33333333,
 892        0x021b481c, 0x33333333,
 893        0x021b4820, 0x33333333,
 894        0x021b4824, 0x33333333,
 895        0x021b4828, 0x33333333,
 896        0x021b08c0, 0x24912249,
 897        0x021b48c0, 0x24914289,
 898        0x021b08b8, 0x00000800,
 899        0x021b48b8, 0x00000800,
 900        0x021b0004, 0x00020036,
 901        0x021b0008, 0x24444040,
 902        0x021b000c, 0x555A7955,
 903        0x021b0010, 0xFF320F64,
 904        0x021b0014, 0x01ff00db,
 905        0x021b0018, 0x00001740,
 906        0x021b001c, 0x00008000,
 907        0x021b002c, 0x000026d2,
 908        0x021b0030, 0x005A1023,
 909        0x021b0040, 0x00000027,
 910        0x021b0400, 0x14420000,
 911        0x021b0000, 0x831A0000,
 912        0x021b0890, 0x00400C58,
 913        0x00bb0008, 0x00000000,
 914        0x00bb000c, 0x2891E41A,
 915        0x00bb0038, 0x00000564,
 916        0x00bb0014, 0x00000040,
 917        0x00bb0028, 0x00000020,
 918        0x00bb002c, 0x00000020,
 919        0x021b001c, 0x04088032,
 920        0x021b001c, 0x00008033,
 921        0x021b001c, 0x00048031,
 922        0x021b001c, 0x09408030,
 923        0x021b001c, 0x04008040,
 924        0x021b0020, 0x00005800,
 925        0x021b0818, 0x00011117,
 926        0x021b4818, 0x00011117,
 927        0x021b0004, 0x00025576,
 928        0x021b0404, 0x00011006,
 929        0x021b001c, 0x00000000,
 930};
 931
 932static int mx6dl_dcd_table[] = {
 933        0x020e0774, 0x000C0000,
 934        0x020e0754, 0x00000000,
 935        0x020e04ac, 0x00000030,
 936        0x020e04b0, 0x00000030,
 937        0x020e0464, 0x00000030,
 938        0x020e0490, 0x00000030,
 939        0x020e074c, 0x00000030,
 940        0x020e0494, 0x00000030,
 941        0x020e04a0, 0x00000000,
 942        0x020e04b4, 0x00000030,
 943        0x020e04b8, 0x00000030,
 944        0x020e076c, 0x00000030,
 945        0x020e0750, 0x00020000,
 946        0x020e04bc, 0x00000030,
 947        0x020e04c0, 0x00000030,
 948        0x020e04c4, 0x00000030,
 949        0x020e04c8, 0x00000030,
 950        0x020e04cc, 0x00000030,
 951        0x020e04d0, 0x00000030,
 952        0x020e04d4, 0x00000030,
 953        0x020e04d8, 0x00000030,
 954        0x020e0760, 0x00020000,
 955        0x020e0764, 0x00000030,
 956        0x020e0770, 0x00000030,
 957        0x020e0778, 0x00000030,
 958        0x020e077c, 0x00000030,
 959        0x020e0780, 0x00000030,
 960        0x020e0784, 0x00000030,
 961        0x020e078c, 0x00000030,
 962        0x020e0748, 0x00000030,
 963        0x020e0470, 0x00000030,
 964        0x020e0474, 0x00000030,
 965        0x020e0478, 0x00000030,
 966        0x020e047c, 0x00000030,
 967        0x020e0480, 0x00000030,
 968        0x020e0484, 0x00000030,
 969        0x020e0488, 0x00000030,
 970        0x020e048c, 0x00000030,
 971        0x021b0800, 0xa1390003,
 972        0x021b080c, 0x001F001F,
 973        0x021b0810, 0x001F001F,
 974        0x021b480c, 0x001F001F,
 975        0x021b4810, 0x001F001F,
 976        0x021b083c, 0x4220021F,
 977        0x021b0840, 0x0207017E,
 978        0x021b483c, 0x4201020C,
 979        0x021b4840, 0x01660172,
 980        0x021b0848, 0x4A4D4E4D,
 981        0x021b4848, 0x4A4F5049,
 982        0x021b0850, 0x3F3C3D31,
 983        0x021b4850, 0x3238372B,
 984        0x021b081c, 0x33333333,
 985        0x021b0820, 0x33333333,
 986        0x021b0824, 0x33333333,
 987        0x021b0828, 0x33333333,
 988        0x021b481c, 0x33333333,
 989        0x021b4820, 0x33333333,
 990        0x021b4824, 0x33333333,
 991        0x021b4828, 0x33333333,
 992        0x021b08b8, 0x00000800,
 993        0x021b48b8, 0x00000800,
 994        0x021b0004, 0x0002002D,
 995        0x021b0008, 0x00333030,
 996        0x021b000c, 0x3F435313,
 997        0x021b0010, 0xB66E8B63,
 998        0x021b0014, 0x01FF00DB,
 999        0x021b0018, 0x00001740,
1000        0x021b001c, 0x00008000,
1001        0x021b002c, 0x000026d2,
1002        0x021b0030, 0x00431023,
1003        0x021b0040, 0x00000027,
1004        0x021b0000, 0x831A0000,
1005        0x021b001c, 0x04008032,
1006        0x021b001c, 0x00008033,
1007        0x021b001c, 0x00048031,
1008        0x021b001c, 0x05208030,
1009        0x021b001c, 0x04008040,
1010        0x021b0020, 0x00005800,
1011        0x021b0818, 0x00011117,
1012        0x021b4818, 0x00011117,
1013        0x021b0004, 0x0002556D,
1014        0x021b0404, 0x00011006,
1015        0x021b001c, 0x00000000,
1016};
1017
1018static void ddr_init(int *table, int size)
1019{
1020        int i;
1021
1022        for (i = 0; i < size / 2 ; i++)
1023                writel(table[2 * i + 1], table[2 * i]);
1024}
1025
1026static void spl_dram_init(void)
1027{
1028        if (is_mx6dq())
1029                ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1030        else if (is_mx6dqp())
1031                ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1032        else if (is_mx6sdl())
1033                ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1034}
1035
1036void board_init_f(ulong dummy)
1037{
1038        /* DDR initialization */
1039        spl_dram_init();
1040
1041        /* setup AIPS and disable watchdog */
1042        arch_cpu_init();
1043
1044        ccgr_init();
1045        gpr_init();
1046
1047        /* iomux and setup of i2c */
1048        board_early_init_f();
1049
1050        /* setup GP timer */
1051        timer_init();
1052
1053        /* UART clocks enabled and gd valid - init serial console */
1054        preloader_console_init();
1055
1056        /* Clear the BSS. */
1057        memset(__bss_start, 0, __bss_end - __bss_start);
1058
1059        /* load/boot image from boot device */
1060        board_init_r(NULL, 0);
1061}
1062#endif
1063