1*1494cc89SJagan Teki /* 2*1494cc89SJagan Teki * Copyright (C) 2018 Simone CIANNI <simone.cianni@bticino.it> 3*1494cc89SJagan Teki * Copyright (C) 2018 Raffaele RECALCATI <raffaele.recalcati@bticino.it> 4*1494cc89SJagan Teki * Copyright (C) 2018 Jagan Teki <jagan@amarulasolutions.com> 5*1494cc89SJagan Teki * 6*1494cc89SJagan Teki * SPDX-License-Identifier: GPL-2.0+ 7*1494cc89SJagan Teki */ 8*1494cc89SJagan Teki 9*1494cc89SJagan Teki #include <common.h> 10*1494cc89SJagan Teki #include <spl.h> 11*1494cc89SJagan Teki 12*1494cc89SJagan Teki #include <asm/io.h> 13*1494cc89SJagan Teki #include <linux/sizes.h> 14*1494cc89SJagan Teki 15*1494cc89SJagan Teki #include <asm/arch/clock.h> 16*1494cc89SJagan Teki #include <asm/arch/crm_regs.h> 17*1494cc89SJagan Teki #include <asm/arch/iomux.h> 18*1494cc89SJagan Teki #include <asm/arch/mx6-ddr.h> 19*1494cc89SJagan Teki #include <asm/arch/mx6-pins.h> 20*1494cc89SJagan Teki #include <asm/arch/sys_proto.h> 21*1494cc89SJagan Teki 22*1494cc89SJagan Teki DECLARE_GLOBAL_DATA_PTR; 23*1494cc89SJagan Teki 24*1494cc89SJagan Teki #define IMX6SDL_DRIVE_STRENGTH 0x28 25*1494cc89SJagan Teki #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \ 26*1494cc89SJagan Teki PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS) 27*1494cc89SJagan Teki 28*1494cc89SJagan Teki static iomux_v3_cfg_t const uart3_pads[] = { 29*1494cc89SJagan Teki IOMUX_PADS(PAD_EIM_D24__UART3_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)), 30*1494cc89SJagan Teki IOMUX_PADS(PAD_EIM_D25__UART3_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)), 31*1494cc89SJagan Teki }; 32*1494cc89SJagan Teki 33*1494cc89SJagan Teki struct mx6sdl_iomux_ddr_regs mx6sdl_ddr_ioregs = { 34*1494cc89SJagan Teki .dram_sdclk_0 = IMX6SDL_DRIVE_STRENGTH, 35*1494cc89SJagan Teki .dram_sdclk_1 = IMX6SDL_DRIVE_STRENGTH, 36*1494cc89SJagan Teki .dram_cas = IMX6SDL_DRIVE_STRENGTH, 37*1494cc89SJagan Teki .dram_ras = IMX6SDL_DRIVE_STRENGTH, 38*1494cc89SJagan Teki .dram_reset = IMX6SDL_DRIVE_STRENGTH, 39*1494cc89SJagan Teki .dram_sdcke0 = IMX6SDL_DRIVE_STRENGTH, 40*1494cc89SJagan Teki .dram_sdcke1 = IMX6SDL_DRIVE_STRENGTH, 41*1494cc89SJagan Teki .dram_sdba2 = 0x00000000, 42*1494cc89SJagan Teki .dram_sdodt0 = IMX6SDL_DRIVE_STRENGTH, 43*1494cc89SJagan Teki .dram_sdodt1 = IMX6SDL_DRIVE_STRENGTH, 44*1494cc89SJagan Teki .dram_sdqs0 = IMX6SDL_DRIVE_STRENGTH, 45*1494cc89SJagan Teki .dram_sdqs1 = IMX6SDL_DRIVE_STRENGTH, 46*1494cc89SJagan Teki .dram_sdqs2 = IMX6SDL_DRIVE_STRENGTH, 47*1494cc89SJagan Teki .dram_sdqs3 = IMX6SDL_DRIVE_STRENGTH, 48*1494cc89SJagan Teki .dram_sdqs4 = IMX6SDL_DRIVE_STRENGTH, 49*1494cc89SJagan Teki .dram_sdqs5 = IMX6SDL_DRIVE_STRENGTH, 50*1494cc89SJagan Teki .dram_sdqs6 = IMX6SDL_DRIVE_STRENGTH, 51*1494cc89SJagan Teki .dram_sdqs7 = IMX6SDL_DRIVE_STRENGTH, 52*1494cc89SJagan Teki .dram_dqm0 = IMX6SDL_DRIVE_STRENGTH, 53*1494cc89SJagan Teki .dram_dqm1 = IMX6SDL_DRIVE_STRENGTH, 54*1494cc89SJagan Teki .dram_dqm2 = IMX6SDL_DRIVE_STRENGTH, 55*1494cc89SJagan Teki .dram_dqm3 = IMX6SDL_DRIVE_STRENGTH, 56*1494cc89SJagan Teki .dram_dqm4 = IMX6SDL_DRIVE_STRENGTH, 57*1494cc89SJagan Teki .dram_dqm5 = IMX6SDL_DRIVE_STRENGTH, 58*1494cc89SJagan Teki .dram_dqm6 = IMX6SDL_DRIVE_STRENGTH, 59*1494cc89SJagan Teki .dram_dqm7 = IMX6SDL_DRIVE_STRENGTH, 60*1494cc89SJagan Teki }; 61*1494cc89SJagan Teki 62*1494cc89SJagan Teki struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = { 63*1494cc89SJagan Teki .grp_ddr_type = 0x000c0000, 64*1494cc89SJagan Teki .grp_ddrmode_ctl = 0x00020000, 65*1494cc89SJagan Teki .grp_ddrpke = 0x00000000, 66*1494cc89SJagan Teki .grp_addds = IMX6SDL_DRIVE_STRENGTH, 67*1494cc89SJagan Teki .grp_ctlds = IMX6SDL_DRIVE_STRENGTH, 68*1494cc89SJagan Teki .grp_ddrmode = 0x00020000, 69*1494cc89SJagan Teki .grp_b0ds = IMX6SDL_DRIVE_STRENGTH, 70*1494cc89SJagan Teki .grp_b1ds = IMX6SDL_DRIVE_STRENGTH, 71*1494cc89SJagan Teki .grp_b2ds = IMX6SDL_DRIVE_STRENGTH, 72*1494cc89SJagan Teki .grp_b3ds = IMX6SDL_DRIVE_STRENGTH, 73*1494cc89SJagan Teki .grp_b4ds = IMX6SDL_DRIVE_STRENGTH, 74*1494cc89SJagan Teki .grp_b5ds = IMX6SDL_DRIVE_STRENGTH, 75*1494cc89SJagan Teki .grp_b6ds = IMX6SDL_DRIVE_STRENGTH, 76*1494cc89SJagan Teki .grp_b7ds = IMX6SDL_DRIVE_STRENGTH, 77*1494cc89SJagan Teki }; 78*1494cc89SJagan Teki 79*1494cc89SJagan Teki static struct mx6_ddr3_cfg mt41k128m16jt_125 = { 80*1494cc89SJagan Teki .mem_speed = 1600, 81*1494cc89SJagan Teki .density = 4, 82*1494cc89SJagan Teki .width = 32, 83*1494cc89SJagan Teki .banks = 8, 84*1494cc89SJagan Teki .rowaddr = 14, 85*1494cc89SJagan Teki .coladdr = 10, 86*1494cc89SJagan Teki .pagesz = 2, 87*1494cc89SJagan Teki .trcd = 1375, 88*1494cc89SJagan Teki .trcmin = 4875, 89*1494cc89SJagan Teki .trasmin = 3500, 90*1494cc89SJagan Teki .SRT = 0, 91*1494cc89SJagan Teki }; 92*1494cc89SJagan Teki 93*1494cc89SJagan Teki static struct mx6_mmdc_calibration mx6dl_mmdc_calib = { 94*1494cc89SJagan Teki .p0_mpwldectrl0 = 0x0042004b, 95*1494cc89SJagan Teki .p0_mpwldectrl1 = 0x0038003c, 96*1494cc89SJagan Teki .p0_mpdgctrl0 = 0x42340230, 97*1494cc89SJagan Teki .p0_mpdgctrl1 = 0x0228022c, 98*1494cc89SJagan Teki .p0_mprddlctl = 0x42444646, 99*1494cc89SJagan Teki .p0_mpwrdlctl = 0x38382e2e, 100*1494cc89SJagan Teki }; 101*1494cc89SJagan Teki 102*1494cc89SJagan Teki static struct mx6_ddr_sysinfo mem_dl = { 103*1494cc89SJagan Teki .dsize = 1, 104*1494cc89SJagan Teki .cs1_mirror = 0, 105*1494cc89SJagan Teki /* config for full 4GB range so that get_mem_size() works */ 106*1494cc89SJagan Teki .cs_density = 32, 107*1494cc89SJagan Teki .ncs = 1, 108*1494cc89SJagan Teki .bi_on = 1, 109*1494cc89SJagan Teki .rtt_nom = 1, 110*1494cc89SJagan Teki .rtt_wr = 1, 111*1494cc89SJagan Teki .ralat = 5, 112*1494cc89SJagan Teki .walat = 0, 113*1494cc89SJagan Teki .mif3_mode = 3, 114*1494cc89SJagan Teki .rst_to_cke = 0x23, 115*1494cc89SJagan Teki .sde_to_rst = 0x10, 116*1494cc89SJagan Teki .refsel = 1, 117*1494cc89SJagan Teki .refr = 7, 118*1494cc89SJagan Teki }; 119*1494cc89SJagan Teki 120*1494cc89SJagan Teki static void spl_dram_init(void) 121*1494cc89SJagan Teki { 122*1494cc89SJagan Teki mx6sdl_dram_iocfg(64, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs); 123*1494cc89SJagan Teki mx6_dram_cfg(&mem_dl, &mx6dl_mmdc_calib, &mt41k128m16jt_125); 124*1494cc89SJagan Teki 125*1494cc89SJagan Teki udelay(100); 126*1494cc89SJagan Teki } 127*1494cc89SJagan Teki 128*1494cc89SJagan Teki static void ccgr_init(void) 129*1494cc89SJagan Teki { 130*1494cc89SJagan Teki struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; 131*1494cc89SJagan Teki 132*1494cc89SJagan Teki writel(0x00003f3f, &ccm->CCGR0); 133*1494cc89SJagan Teki writel(0x0030fc00, &ccm->CCGR1); 134*1494cc89SJagan Teki writel(0x000fc000, &ccm->CCGR2); 135*1494cc89SJagan Teki writel(0x3f300000, &ccm->CCGR3); 136*1494cc89SJagan Teki writel(0xff00f300, &ccm->CCGR4); 137*1494cc89SJagan Teki writel(0x0f0000c3, &ccm->CCGR5); 138*1494cc89SJagan Teki writel(0x000003cc, &ccm->CCGR6); 139*1494cc89SJagan Teki } 140*1494cc89SJagan Teki 141*1494cc89SJagan Teki void board_init_f(ulong dummy) 142*1494cc89SJagan Teki { 143*1494cc89SJagan Teki ccgr_init(); 144*1494cc89SJagan Teki 145*1494cc89SJagan Teki /* setup AIPS and disable watchdog */ 146*1494cc89SJagan Teki arch_cpu_init(); 147*1494cc89SJagan Teki 148*1494cc89SJagan Teki gpr_init(); 149*1494cc89SJagan Teki 150*1494cc89SJagan Teki /* iomux */ 151*1494cc89SJagan Teki SETUP_IOMUX_PADS(uart3_pads); 152*1494cc89SJagan Teki 153*1494cc89SJagan Teki /* setup GP timer */ 154*1494cc89SJagan Teki timer_init(); 155*1494cc89SJagan Teki 156*1494cc89SJagan Teki /* UART clocks enabled and gd valid - init serial console */ 157*1494cc89SJagan Teki preloader_console_init(); 158*1494cc89SJagan Teki 159*1494cc89SJagan Teki /* DDR initialization */ 160*1494cc89SJagan Teki spl_dram_init(); 161*1494cc89SJagan Teki } 162