1*11bd5e7bSLukasz Majewski /* 2*11bd5e7bSLukasz Majewski * Copyright (C) 2014 Wandboard 3*11bd5e7bSLukasz Majewski * Author: Tungyi Lin <tungyilin1127@gmail.com> 4*11bd5e7bSLukasz Majewski * Richard Hu <hakahu@gmail.com> 5*11bd5e7bSLukasz Majewski * SPDX-License-Identifier: GPL-2.0+ 6*11bd5e7bSLukasz Majewski */ 7*11bd5e7bSLukasz Majewski 8*11bd5e7bSLukasz Majewski #include <asm/arch/clock.h> 9*11bd5e7bSLukasz Majewski #include <asm/arch/imx-regs.h> 10*11bd5e7bSLukasz Majewski #include <asm/arch/iomux.h> 11*11bd5e7bSLukasz Majewski #include <asm/arch/mx6-pins.h> 12*11bd5e7bSLukasz Majewski #include <errno.h> 13*11bd5e7bSLukasz Majewski #include <asm/gpio.h> 14*11bd5e7bSLukasz Majewski #include <asm/imx-common/iomux-v3.h> 15*11bd5e7bSLukasz Majewski #include <asm/imx-common/video.h> 16*11bd5e7bSLukasz Majewski #include <mmc.h> 17*11bd5e7bSLukasz Majewski #include <fsl_esdhc.h> 18*11bd5e7bSLukasz Majewski #include <asm/arch/crm_regs.h> 19*11bd5e7bSLukasz Majewski #include <asm/io.h> 20*11bd5e7bSLukasz Majewski #include <asm/arch/sys_proto.h> 21*11bd5e7bSLukasz Majewski #include <spl.h> 22*11bd5e7bSLukasz Majewski 23*11bd5e7bSLukasz Majewski DECLARE_GLOBAL_DATA_PTR; 24*11bd5e7bSLukasz Majewski 25*11bd5e7bSLukasz Majewski #if defined(CONFIG_SPL_BUILD) 26*11bd5e7bSLukasz Majewski #include <asm/arch/mx6-ddr.h> 27*11bd5e7bSLukasz Majewski /* 28*11bd5e7bSLukasz Majewski * Driving strength: 29*11bd5e7bSLukasz Majewski * 0x30 == 40 Ohm 30*11bd5e7bSLukasz Majewski * 0x28 == 48 Ohm 31*11bd5e7bSLukasz Majewski */ 32*11bd5e7bSLukasz Majewski 33*11bd5e7bSLukasz Majewski #define IMX6DQ_DRIVE_STRENGTH 0x30 34*11bd5e7bSLukasz Majewski #define IMX6SDL_DRIVE_STRENGTH 0x28 35*11bd5e7bSLukasz Majewski 36*11bd5e7bSLukasz Majewski /* configure MX6Q/DUAL mmdc DDR io registers */ 37*11bd5e7bSLukasz Majewski static struct mx6dq_iomux_ddr_regs mx6dq_ddr_ioregs = { 38*11bd5e7bSLukasz Majewski .dram_sdclk_0 = IMX6DQ_DRIVE_STRENGTH, 39*11bd5e7bSLukasz Majewski .dram_sdclk_1 = IMX6DQ_DRIVE_STRENGTH, 40*11bd5e7bSLukasz Majewski .dram_cas = IMX6DQ_DRIVE_STRENGTH, 41*11bd5e7bSLukasz Majewski .dram_ras = IMX6DQ_DRIVE_STRENGTH, 42*11bd5e7bSLukasz Majewski .dram_reset = IMX6DQ_DRIVE_STRENGTH, 43*11bd5e7bSLukasz Majewski .dram_sdcke0 = IMX6DQ_DRIVE_STRENGTH, 44*11bd5e7bSLukasz Majewski .dram_sdcke1 = IMX6DQ_DRIVE_STRENGTH, 45*11bd5e7bSLukasz Majewski .dram_sdba2 = 0x00000000, 46*11bd5e7bSLukasz Majewski .dram_sdodt0 = IMX6DQ_DRIVE_STRENGTH, 47*11bd5e7bSLukasz Majewski .dram_sdodt1 = IMX6DQ_DRIVE_STRENGTH, 48*11bd5e7bSLukasz Majewski .dram_sdqs0 = IMX6DQ_DRIVE_STRENGTH, 49*11bd5e7bSLukasz Majewski .dram_sdqs1 = IMX6DQ_DRIVE_STRENGTH, 50*11bd5e7bSLukasz Majewski .dram_sdqs2 = IMX6DQ_DRIVE_STRENGTH, 51*11bd5e7bSLukasz Majewski .dram_sdqs3 = IMX6DQ_DRIVE_STRENGTH, 52*11bd5e7bSLukasz Majewski .dram_sdqs4 = IMX6DQ_DRIVE_STRENGTH, 53*11bd5e7bSLukasz Majewski .dram_sdqs5 = IMX6DQ_DRIVE_STRENGTH, 54*11bd5e7bSLukasz Majewski .dram_sdqs6 = IMX6DQ_DRIVE_STRENGTH, 55*11bd5e7bSLukasz Majewski .dram_sdqs7 = IMX6DQ_DRIVE_STRENGTH, 56*11bd5e7bSLukasz Majewski .dram_dqm0 = IMX6DQ_DRIVE_STRENGTH, 57*11bd5e7bSLukasz Majewski .dram_dqm1 = IMX6DQ_DRIVE_STRENGTH, 58*11bd5e7bSLukasz Majewski .dram_dqm2 = IMX6DQ_DRIVE_STRENGTH, 59*11bd5e7bSLukasz Majewski .dram_dqm3 = IMX6DQ_DRIVE_STRENGTH, 60*11bd5e7bSLukasz Majewski .dram_dqm4 = IMX6DQ_DRIVE_STRENGTH, 61*11bd5e7bSLukasz Majewski .dram_dqm5 = IMX6DQ_DRIVE_STRENGTH, 62*11bd5e7bSLukasz Majewski .dram_dqm6 = IMX6DQ_DRIVE_STRENGTH, 63*11bd5e7bSLukasz Majewski .dram_dqm7 = IMX6DQ_DRIVE_STRENGTH, 64*11bd5e7bSLukasz Majewski }; 65*11bd5e7bSLukasz Majewski 66*11bd5e7bSLukasz Majewski /* configure MX6Q/DUAL mmdc GRP io registers */ 67*11bd5e7bSLukasz Majewski static struct mx6dq_iomux_grp_regs mx6dq_grp_ioregs = { 68*11bd5e7bSLukasz Majewski .grp_ddr_type = 0x000c0000, 69*11bd5e7bSLukasz Majewski .grp_ddrmode_ctl = 0x00020000, 70*11bd5e7bSLukasz Majewski .grp_ddrpke = 0x00000000, 71*11bd5e7bSLukasz Majewski .grp_addds = IMX6DQ_DRIVE_STRENGTH, 72*11bd5e7bSLukasz Majewski .grp_ctlds = IMX6DQ_DRIVE_STRENGTH, 73*11bd5e7bSLukasz Majewski .grp_ddrmode = 0x00020000, 74*11bd5e7bSLukasz Majewski .grp_b0ds = IMX6DQ_DRIVE_STRENGTH, 75*11bd5e7bSLukasz Majewski .grp_b1ds = IMX6DQ_DRIVE_STRENGTH, 76*11bd5e7bSLukasz Majewski .grp_b2ds = IMX6DQ_DRIVE_STRENGTH, 77*11bd5e7bSLukasz Majewski .grp_b3ds = IMX6DQ_DRIVE_STRENGTH, 78*11bd5e7bSLukasz Majewski .grp_b4ds = IMX6DQ_DRIVE_STRENGTH, 79*11bd5e7bSLukasz Majewski .grp_b5ds = IMX6DQ_DRIVE_STRENGTH, 80*11bd5e7bSLukasz Majewski .grp_b6ds = IMX6DQ_DRIVE_STRENGTH, 81*11bd5e7bSLukasz Majewski .grp_b7ds = IMX6DQ_DRIVE_STRENGTH, 82*11bd5e7bSLukasz Majewski }; 83*11bd5e7bSLukasz Majewski 84*11bd5e7bSLukasz Majewski /* configure MX6SOLO/DUALLITE mmdc DDR io registers */ 85*11bd5e7bSLukasz Majewski struct mx6sdl_iomux_ddr_regs mx6sdl_ddr_ioregs = { 86*11bd5e7bSLukasz Majewski .dram_sdclk_0 = IMX6SDL_DRIVE_STRENGTH, 87*11bd5e7bSLukasz Majewski .dram_sdclk_1 = IMX6SDL_DRIVE_STRENGTH, 88*11bd5e7bSLukasz Majewski .dram_cas = IMX6SDL_DRIVE_STRENGTH, 89*11bd5e7bSLukasz Majewski .dram_ras = IMX6SDL_DRIVE_STRENGTH, 90*11bd5e7bSLukasz Majewski .dram_reset = IMX6SDL_DRIVE_STRENGTH, 91*11bd5e7bSLukasz Majewski .dram_sdcke0 = IMX6SDL_DRIVE_STRENGTH, 92*11bd5e7bSLukasz Majewski .dram_sdcke1 = IMX6SDL_DRIVE_STRENGTH, 93*11bd5e7bSLukasz Majewski .dram_sdba2 = 0x00000000, 94*11bd5e7bSLukasz Majewski .dram_sdodt0 = IMX6SDL_DRIVE_STRENGTH, 95*11bd5e7bSLukasz Majewski .dram_sdodt1 = IMX6SDL_DRIVE_STRENGTH, 96*11bd5e7bSLukasz Majewski .dram_sdqs0 = IMX6SDL_DRIVE_STRENGTH, 97*11bd5e7bSLukasz Majewski .dram_sdqs1 = IMX6SDL_DRIVE_STRENGTH, 98*11bd5e7bSLukasz Majewski .dram_sdqs2 = IMX6SDL_DRIVE_STRENGTH, 99*11bd5e7bSLukasz Majewski .dram_sdqs3 = IMX6SDL_DRIVE_STRENGTH, 100*11bd5e7bSLukasz Majewski .dram_sdqs4 = IMX6SDL_DRIVE_STRENGTH, 101*11bd5e7bSLukasz Majewski .dram_sdqs5 = IMX6SDL_DRIVE_STRENGTH, 102*11bd5e7bSLukasz Majewski .dram_sdqs6 = IMX6SDL_DRIVE_STRENGTH, 103*11bd5e7bSLukasz Majewski .dram_sdqs7 = IMX6SDL_DRIVE_STRENGTH, 104*11bd5e7bSLukasz Majewski .dram_dqm0 = IMX6SDL_DRIVE_STRENGTH, 105*11bd5e7bSLukasz Majewski .dram_dqm1 = IMX6SDL_DRIVE_STRENGTH, 106*11bd5e7bSLukasz Majewski .dram_dqm2 = IMX6SDL_DRIVE_STRENGTH, 107*11bd5e7bSLukasz Majewski .dram_dqm3 = IMX6SDL_DRIVE_STRENGTH, 108*11bd5e7bSLukasz Majewski .dram_dqm4 = IMX6SDL_DRIVE_STRENGTH, 109*11bd5e7bSLukasz Majewski .dram_dqm5 = IMX6SDL_DRIVE_STRENGTH, 110*11bd5e7bSLukasz Majewski .dram_dqm6 = IMX6SDL_DRIVE_STRENGTH, 111*11bd5e7bSLukasz Majewski .dram_dqm7 = IMX6SDL_DRIVE_STRENGTH, 112*11bd5e7bSLukasz Majewski }; 113*11bd5e7bSLukasz Majewski 114*11bd5e7bSLukasz Majewski /* configure MX6SOLO/DUALLITE mmdc GRP io registers */ 115*11bd5e7bSLukasz Majewski struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = { 116*11bd5e7bSLukasz Majewski .grp_ddr_type = 0x000c0000, 117*11bd5e7bSLukasz Majewski .grp_ddrmode_ctl = 0x00020000, 118*11bd5e7bSLukasz Majewski .grp_ddrpke = 0x00000000, 119*11bd5e7bSLukasz Majewski .grp_addds = IMX6SDL_DRIVE_STRENGTH, 120*11bd5e7bSLukasz Majewski .grp_ctlds = IMX6SDL_DRIVE_STRENGTH, 121*11bd5e7bSLukasz Majewski .grp_ddrmode = 0x00020000, 122*11bd5e7bSLukasz Majewski .grp_b0ds = IMX6SDL_DRIVE_STRENGTH, 123*11bd5e7bSLukasz Majewski .grp_b1ds = IMX6SDL_DRIVE_STRENGTH, 124*11bd5e7bSLukasz Majewski .grp_b2ds = IMX6SDL_DRIVE_STRENGTH, 125*11bd5e7bSLukasz Majewski .grp_b3ds = IMX6SDL_DRIVE_STRENGTH, 126*11bd5e7bSLukasz Majewski .grp_b4ds = IMX6SDL_DRIVE_STRENGTH, 127*11bd5e7bSLukasz Majewski .grp_b5ds = IMX6SDL_DRIVE_STRENGTH, 128*11bd5e7bSLukasz Majewski .grp_b6ds = IMX6SDL_DRIVE_STRENGTH, 129*11bd5e7bSLukasz Majewski .grp_b7ds = IMX6SDL_DRIVE_STRENGTH, 130*11bd5e7bSLukasz Majewski }; 131*11bd5e7bSLukasz Majewski 132*11bd5e7bSLukasz Majewski /* H5T04G63AFR-PB */ 133*11bd5e7bSLukasz Majewski static struct mx6_ddr3_cfg h5t04g63afr = { 134*11bd5e7bSLukasz Majewski .mem_speed = 1600, 135*11bd5e7bSLukasz Majewski .density = 4, 136*11bd5e7bSLukasz Majewski .width = 16, 137*11bd5e7bSLukasz Majewski .banks = 8, 138*11bd5e7bSLukasz Majewski .rowaddr = 15, 139*11bd5e7bSLukasz Majewski .coladdr = 10, 140*11bd5e7bSLukasz Majewski .pagesz = 2, 141*11bd5e7bSLukasz Majewski .trcd = 1375, 142*11bd5e7bSLukasz Majewski .trcmin = 4875, 143*11bd5e7bSLukasz Majewski .trasmin = 3500, 144*11bd5e7bSLukasz Majewski }; 145*11bd5e7bSLukasz Majewski 146*11bd5e7bSLukasz Majewski /* H5TQ2G63DFR-H9 */ 147*11bd5e7bSLukasz Majewski static struct mx6_ddr3_cfg h5tq2g63dfr = { 148*11bd5e7bSLukasz Majewski .mem_speed = 1333, 149*11bd5e7bSLukasz Majewski .density = 2, 150*11bd5e7bSLukasz Majewski .width = 16, 151*11bd5e7bSLukasz Majewski .banks = 8, 152*11bd5e7bSLukasz Majewski .rowaddr = 14, 153*11bd5e7bSLukasz Majewski .coladdr = 10, 154*11bd5e7bSLukasz Majewski .pagesz = 2, 155*11bd5e7bSLukasz Majewski .trcd = 1350, 156*11bd5e7bSLukasz Majewski .trcmin = 4950, 157*11bd5e7bSLukasz Majewski .trasmin = 3600, 158*11bd5e7bSLukasz Majewski }; 159*11bd5e7bSLukasz Majewski 160*11bd5e7bSLukasz Majewski static struct mx6_mmdc_calibration mx6q_2g_mmdc_calib = { 161*11bd5e7bSLukasz Majewski .p0_mpwldectrl0 = 0x001f001f, 162*11bd5e7bSLukasz Majewski .p0_mpwldectrl1 = 0x001f001f, 163*11bd5e7bSLukasz Majewski .p1_mpwldectrl0 = 0x001f001f, 164*11bd5e7bSLukasz Majewski .p1_mpwldectrl1 = 0x001f001f, 165*11bd5e7bSLukasz Majewski .p0_mpdgctrl0 = 0x4301030d, 166*11bd5e7bSLukasz Majewski .p0_mpdgctrl1 = 0x03020277, 167*11bd5e7bSLukasz Majewski .p1_mpdgctrl0 = 0x4300030a, 168*11bd5e7bSLukasz Majewski .p1_mpdgctrl1 = 0x02780248, 169*11bd5e7bSLukasz Majewski .p0_mprddlctl = 0x4536393b, 170*11bd5e7bSLukasz Majewski .p1_mprddlctl = 0x36353441, 171*11bd5e7bSLukasz Majewski .p0_mpwrdlctl = 0x41414743, 172*11bd5e7bSLukasz Majewski .p1_mpwrdlctl = 0x462f453f, 173*11bd5e7bSLukasz Majewski }; 174*11bd5e7bSLukasz Majewski 175*11bd5e7bSLukasz Majewski /* DDR 64bit 2GB */ 176*11bd5e7bSLukasz Majewski static struct mx6_ddr_sysinfo mem_q = { 177*11bd5e7bSLukasz Majewski .dsize = 2, 178*11bd5e7bSLukasz Majewski .cs1_mirror = 0, 179*11bd5e7bSLukasz Majewski /* config for full 4GB range so that get_mem_size() works */ 180*11bd5e7bSLukasz Majewski .cs_density = 32, 181*11bd5e7bSLukasz Majewski .ncs = 1, 182*11bd5e7bSLukasz Majewski .bi_on = 1, 183*11bd5e7bSLukasz Majewski .rtt_nom = 1, 184*11bd5e7bSLukasz Majewski .rtt_wr = 0, 185*11bd5e7bSLukasz Majewski .ralat = 5, 186*11bd5e7bSLukasz Majewski .walat = 0, 187*11bd5e7bSLukasz Majewski .mif3_mode = 3, 188*11bd5e7bSLukasz Majewski .rst_to_cke = 0x23, 189*11bd5e7bSLukasz Majewski .sde_to_rst = 0x10, 190*11bd5e7bSLukasz Majewski }; 191*11bd5e7bSLukasz Majewski 192*11bd5e7bSLukasz Majewski static struct mx6_mmdc_calibration mx6dl_1g_mmdc_calib = { 193*11bd5e7bSLukasz Majewski .p0_mpwldectrl0 = 0x001f001f, 194*11bd5e7bSLukasz Majewski .p0_mpwldectrl1 = 0x001f001f, 195*11bd5e7bSLukasz Majewski .p1_mpwldectrl0 = 0x001f001f, 196*11bd5e7bSLukasz Majewski .p1_mpwldectrl1 = 0x001f001f, 197*11bd5e7bSLukasz Majewski .p0_mpdgctrl0 = 0x420e020e, 198*11bd5e7bSLukasz Majewski .p0_mpdgctrl1 = 0x02000200, 199*11bd5e7bSLukasz Majewski .p1_mpdgctrl0 = 0x42020202, 200*11bd5e7bSLukasz Majewski .p1_mpdgctrl1 = 0x01720172, 201*11bd5e7bSLukasz Majewski .p0_mprddlctl = 0x494c4f4c, 202*11bd5e7bSLukasz Majewski .p1_mprddlctl = 0x4a4c4c49, 203*11bd5e7bSLukasz Majewski .p0_mpwrdlctl = 0x3f3f3133, 204*11bd5e7bSLukasz Majewski .p1_mpwrdlctl = 0x39373f2e, 205*11bd5e7bSLukasz Majewski }; 206*11bd5e7bSLukasz Majewski 207*11bd5e7bSLukasz Majewski static struct mx6_mmdc_calibration mx6s_512m_mmdc_calib = { 208*11bd5e7bSLukasz Majewski .p0_mpwldectrl0 = 0x0040003c, 209*11bd5e7bSLukasz Majewski .p0_mpwldectrl1 = 0x0032003e, 210*11bd5e7bSLukasz Majewski .p0_mpdgctrl0 = 0x42350231, 211*11bd5e7bSLukasz Majewski .p0_mpdgctrl1 = 0x021a0218, 212*11bd5e7bSLukasz Majewski .p0_mprddlctl = 0x4b4b4e49, 213*11bd5e7bSLukasz Majewski .p0_mpwrdlctl = 0x3f3f3035, 214*11bd5e7bSLukasz Majewski }; 215*11bd5e7bSLukasz Majewski 216*11bd5e7bSLukasz Majewski /* DDR 64bit 1GB */ 217*11bd5e7bSLukasz Majewski static struct mx6_ddr_sysinfo mem_dl = { 218*11bd5e7bSLukasz Majewski .dsize = 2, 219*11bd5e7bSLukasz Majewski .cs1_mirror = 0, 220*11bd5e7bSLukasz Majewski /* config for full 4GB range so that get_mem_size() works */ 221*11bd5e7bSLukasz Majewski .cs_density = 32, 222*11bd5e7bSLukasz Majewski .ncs = 1, 223*11bd5e7bSLukasz Majewski .bi_on = 1, 224*11bd5e7bSLukasz Majewski .rtt_nom = 1, 225*11bd5e7bSLukasz Majewski .rtt_wr = 0, 226*11bd5e7bSLukasz Majewski .ralat = 5, 227*11bd5e7bSLukasz Majewski .walat = 0, 228*11bd5e7bSLukasz Majewski .mif3_mode = 3, 229*11bd5e7bSLukasz Majewski .rst_to_cke = 0x23, 230*11bd5e7bSLukasz Majewski .sde_to_rst = 0x10, 231*11bd5e7bSLukasz Majewski }; 232*11bd5e7bSLukasz Majewski 233*11bd5e7bSLukasz Majewski /* DDR 32bit 512MB */ 234*11bd5e7bSLukasz Majewski static struct mx6_ddr_sysinfo mem_s = { 235*11bd5e7bSLukasz Majewski .dsize = 1, 236*11bd5e7bSLukasz Majewski .cs1_mirror = 0, 237*11bd5e7bSLukasz Majewski /* config for full 4GB range so that get_mem_size() works */ 238*11bd5e7bSLukasz Majewski .cs_density = 32, 239*11bd5e7bSLukasz Majewski .ncs = 1, 240*11bd5e7bSLukasz Majewski .bi_on = 1, 241*11bd5e7bSLukasz Majewski .rtt_nom = 1, 242*11bd5e7bSLukasz Majewski .rtt_wr = 0, 243*11bd5e7bSLukasz Majewski .ralat = 5, 244*11bd5e7bSLukasz Majewski .walat = 0, 245*11bd5e7bSLukasz Majewski .mif3_mode = 3, 246*11bd5e7bSLukasz Majewski .rst_to_cke = 0x23, 247*11bd5e7bSLukasz Majewski .sde_to_rst = 0x10, 248*11bd5e7bSLukasz Majewski }; 249*11bd5e7bSLukasz Majewski 250*11bd5e7bSLukasz Majewski static void ccgr_init(void) 251*11bd5e7bSLukasz Majewski { 252*11bd5e7bSLukasz Majewski struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; 253*11bd5e7bSLukasz Majewski 254*11bd5e7bSLukasz Majewski writel(0x00C03F3F, &ccm->CCGR0); 255*11bd5e7bSLukasz Majewski writel(0x0030FC03, &ccm->CCGR1); 256*11bd5e7bSLukasz Majewski writel(0x0FFFC000, &ccm->CCGR2); 257*11bd5e7bSLukasz Majewski writel(0x3FF00000, &ccm->CCGR3); 258*11bd5e7bSLukasz Majewski writel(0x00FFF300, &ccm->CCGR4); 259*11bd5e7bSLukasz Majewski writel(0x0F0000C3, &ccm->CCGR5); 260*11bd5e7bSLukasz Majewski writel(0x000003FF, &ccm->CCGR6); 261*11bd5e7bSLukasz Majewski } 262*11bd5e7bSLukasz Majewski 263*11bd5e7bSLukasz Majewski static void gpr_init(void) 264*11bd5e7bSLukasz Majewski { 265*11bd5e7bSLukasz Majewski struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; 266*11bd5e7bSLukasz Majewski 267*11bd5e7bSLukasz Majewski /* enable AXI cache for VDOA/VPU/IPU */ 268*11bd5e7bSLukasz Majewski writel(0xF00000CF, &iomux->gpr[4]); 269*11bd5e7bSLukasz Majewski /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ 270*11bd5e7bSLukasz Majewski writel(0x007F007F, &iomux->gpr[6]); 271*11bd5e7bSLukasz Majewski writel(0x007F007F, &iomux->gpr[7]); 272*11bd5e7bSLukasz Majewski } 273*11bd5e7bSLukasz Majewski 274*11bd5e7bSLukasz Majewski static void spl_dram_init(void) 275*11bd5e7bSLukasz Majewski { 276*11bd5e7bSLukasz Majewski if (is_cpu_type(MXC_CPU_MX6SOLO)) { 277*11bd5e7bSLukasz Majewski mx6sdl_dram_iocfg(32, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs); 278*11bd5e7bSLukasz Majewski mx6_dram_cfg(&mem_s, &mx6s_512m_mmdc_calib, &h5tq2g63dfr); 279*11bd5e7bSLukasz Majewski } else if (is_cpu_type(MXC_CPU_MX6DL)) { 280*11bd5e7bSLukasz Majewski mx6sdl_dram_iocfg(64, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs); 281*11bd5e7bSLukasz Majewski mx6_dram_cfg(&mem_dl, &mx6dl_1g_mmdc_calib, &h5tq2g63dfr); 282*11bd5e7bSLukasz Majewski } else if (is_cpu_type(MXC_CPU_MX6Q)) { 283*11bd5e7bSLukasz Majewski mx6dq_dram_iocfg(64, &mx6dq_ddr_ioregs, &mx6dq_grp_ioregs); 284*11bd5e7bSLukasz Majewski mx6_dram_cfg(&mem_q, &mx6q_2g_mmdc_calib, &h5t04g63afr); 285*11bd5e7bSLukasz Majewski } 286*11bd5e7bSLukasz Majewski 287*11bd5e7bSLukasz Majewski udelay(100); 288*11bd5e7bSLukasz Majewski } 289*11bd5e7bSLukasz Majewski 290*11bd5e7bSLukasz Majewski void board_init_f(ulong dummy) 291*11bd5e7bSLukasz Majewski { 292*11bd5e7bSLukasz Majewski ccgr_init(); 293*11bd5e7bSLukasz Majewski 294*11bd5e7bSLukasz Majewski /* setup AIPS and disable watchdog */ 295*11bd5e7bSLukasz Majewski arch_cpu_init(); 296*11bd5e7bSLukasz Majewski 297*11bd5e7bSLukasz Majewski gpr_init(); 298*11bd5e7bSLukasz Majewski 299*11bd5e7bSLukasz Majewski /* iomux */ 300*11bd5e7bSLukasz Majewski board_early_init_f(); 301*11bd5e7bSLukasz Majewski 302*11bd5e7bSLukasz Majewski /* setup GP timer */ 303*11bd5e7bSLukasz Majewski timer_init(); 304*11bd5e7bSLukasz Majewski 305*11bd5e7bSLukasz Majewski /* UART clocks enabled and gd valid - init serial console */ 306*11bd5e7bSLukasz Majewski preloader_console_init(); 307*11bd5e7bSLukasz Majewski 308*11bd5e7bSLukasz Majewski /* DDR initialization */ 309*11bd5e7bSLukasz Majewski spl_dram_init(); 310*11bd5e7bSLukasz Majewski 311*11bd5e7bSLukasz Majewski /* Clear the BSS. */ 312*11bd5e7bSLukasz Majewski memset(__bss_start, 0, __bss_end - __bss_start); 313*11bd5e7bSLukasz Majewski 314*11bd5e7bSLukasz Majewski /* load/boot image from boot device */ 315*11bd5e7bSLukasz Majewski board_init_r(NULL, 0); 316*11bd5e7bSLukasz Majewski } 317*11bd5e7bSLukasz Majewski #endif 318