13a0398d7SOtavio Salvador /*
23a0398d7SOtavio Salvador * Freescale i.MX28 RAM init
33a0398d7SOtavio Salvador *
43a0398d7SOtavio Salvador * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
53a0398d7SOtavio Salvador * on behalf of DENX Software Engineering GmbH
63a0398d7SOtavio Salvador *
71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
83a0398d7SOtavio Salvador */
93a0398d7SOtavio Salvador
103a0398d7SOtavio Salvador #include <common.h>
113a0398d7SOtavio Salvador #include <config.h>
123a0398d7SOtavio Salvador #include <asm/io.h>
133a0398d7SOtavio Salvador #include <asm/arch/imx-regs.h>
145c2f444cSMarek Vasut #include <asm/arch/sys_proto.h>
15f0930882SFabio Estevam #include <linux/compiler.h>
163a0398d7SOtavio Salvador
171e0cf5c3SOtavio Salvador #include "mxs_init.h"
183a0398d7SOtavio Salvador
19393ff47bSOtavio Salvador static uint32_t dram_vals[] = {
20393ff47bSOtavio Salvador /*
21393ff47bSOtavio Salvador * i.MX28 DDR2 at 200MHz
22393ff47bSOtavio Salvador */
23393ff47bSOtavio Salvador #if defined(CONFIG_MX28)
243a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
253a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
263a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
273a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
283a0398d7SOtavio Salvador 0x00000000, 0x00000100, 0x00000000, 0x00000000,
293a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
303a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00010101, 0x01010101,
313a0398d7SOtavio Salvador 0x000f0f01, 0x0f02020a, 0x00000000, 0x00010101,
323a0398d7SOtavio Salvador 0x00000100, 0x00000100, 0x00000000, 0x00000002,
33b33426caSFabio Estevam 0x01010000, 0x07080403, 0x06005003, 0x0a0000c8,
34b33426caSFabio Estevam 0x02009c40, 0x0002030c, 0x0036a609, 0x031a0612,
353a0398d7SOtavio Salvador 0x02030202, 0x00c8001c, 0x00000000, 0x00000000,
363a0398d7SOtavio Salvador 0x00012100, 0xffff0303, 0x00012100, 0xffff0303,
373a0398d7SOtavio Salvador 0x00012100, 0xffff0303, 0x00012100, 0xffff0303,
383a0398d7SOtavio Salvador 0x00000003, 0x00000000, 0x00000000, 0x00000000,
393a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
403a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000612, 0x01000F02,
41b33426caSFabio Estevam 0x06120612, 0x00000200, 0x00020007, 0xf4004a27,
42b33426caSFabio Estevam 0xf4004a27, 0xf4004a27, 0xf4004a27, 0x07000300,
43b33426caSFabio Estevam 0x07000300, 0x07400300, 0x07400300, 0x00000005,
443a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x01000000, 0x01020408,
453a0398d7SOtavio Salvador 0x08040201, 0x000f1133, 0x00000000, 0x00001f04,
463a0398d7SOtavio Salvador 0x00001f04, 0x00001f04, 0x00001f04, 0x00001f04,
473a0398d7SOtavio Salvador 0x00001f04, 0x00001f04, 0x00001f04, 0x00000000,
483a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
493a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
503a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
513a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
523a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
533a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
543a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
553a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
563a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
573a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
583a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
593a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
603a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
613a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
623a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
633a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x00000000,
64b33426caSFabio Estevam 0x00000000, 0x00000000, 0x00010000, 0x00030404,
65b33426caSFabio Estevam 0x00000003, 0x00000000, 0x00000000, 0x00000000,
663a0398d7SOtavio Salvador 0x00000000, 0x00000000, 0x00000000, 0x01010000,
673a0398d7SOtavio Salvador 0x01000000, 0x03030000, 0x00010303, 0x01020202,
683a0398d7SOtavio Salvador 0x00000000, 0x02040303, 0x21002103, 0x00061200,
69b33426caSFabio Estevam 0x06120612, 0x04420442, 0x04420442, 0x00040004,
703a0398d7SOtavio Salvador 0x00040004, 0x00000000, 0x00000000, 0x00000000,
71b33426caSFabio Estevam 0x00000000, 0xffffffff
721ddf386eSOtavio Salvador
731ddf386eSOtavio Salvador /*
741ddf386eSOtavio Salvador * i.MX23 DDR at 133MHz
751ddf386eSOtavio Salvador */
761ddf386eSOtavio Salvador #elif defined(CONFIG_MX23)
771ddf386eSOtavio Salvador 0x01010001, 0x00010100, 0x01000101, 0x00000001,
781ddf386eSOtavio Salvador 0x00000101, 0x00000000, 0x00010000, 0x01000001,
791ddf386eSOtavio Salvador 0x00000000, 0x00000001, 0x07000200, 0x00070202,
801ddf386eSOtavio Salvador 0x02020000, 0x04040a01, 0x00000201, 0x02040000,
811ddf386eSOtavio Salvador 0x02000000, 0x19000f08, 0x0d0d0000, 0x02021313,
821ddf386eSOtavio Salvador 0x02061521, 0x0000000a, 0x00080008, 0x00200020,
831ddf386eSOtavio Salvador 0x00200020, 0x00200020, 0x000003f7, 0x00000000,
841ddf386eSOtavio Salvador 0x00000000, 0x00000020, 0x00000020, 0x00c80000,
851ddf386eSOtavio Salvador 0x000a23cd, 0x000000c8, 0x00006665, 0x00000000,
861ddf386eSOtavio Salvador 0x00000101, 0x00040001, 0x00000000, 0x00000000,
871ddf386eSOtavio Salvador 0x00010000
88393ff47bSOtavio Salvador #else
89393ff47bSOtavio Salvador #error Unsupported memory initialization
90393ff47bSOtavio Salvador #endif
913a0398d7SOtavio Salvador };
923a0398d7SOtavio Salvador
mxs_adjust_memory_params(uint32_t * dram_vals)93f0930882SFabio Estevam __weak void mxs_adjust_memory_params(uint32_t *dram_vals)
943a0398d7SOtavio Salvador {
95*950eaf62SGraeme Russ debug("SPL: Using default SDRAM parameters\n");
963a0398d7SOtavio Salvador }
973a0398d7SOtavio Salvador
9839a538d9SFabio Estevam #ifdef CONFIG_MX28
initialize_dram_values(void)99393ff47bSOtavio Salvador static void initialize_dram_values(void)
1003a0398d7SOtavio Salvador {
1013a0398d7SOtavio Salvador int i;
1023a0398d7SOtavio Salvador
103*950eaf62SGraeme Russ debug("SPL: Setting mx28 board specific SDRAM parameters\n");
104393ff47bSOtavio Salvador mxs_adjust_memory_params(dram_vals);
1053a0398d7SOtavio Salvador
106*950eaf62SGraeme Russ debug("SPL: Applying SDRAM parameters\n");
107393ff47bSOtavio Salvador for (i = 0; i < ARRAY_SIZE(dram_vals); i++)
108393ff47bSOtavio Salvador writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));
10939a538d9SFabio Estevam }
11039a538d9SFabio Estevam #else
initialize_dram_values(void)11139a538d9SFabio Estevam static void initialize_dram_values(void)
11239a538d9SFabio Estevam {
11339a538d9SFabio Estevam int i;
1141ddf386eSOtavio Salvador
115*950eaf62SGraeme Russ debug("SPL: Setting mx23 board specific SDRAM parameters\n");
11639a538d9SFabio Estevam mxs_adjust_memory_params(dram_vals);
11739a538d9SFabio Estevam
118286a88cfSFabio Estevam /*
119286a88cfSFabio Estevam * HW_DRAM_CTL27, HW_DRAM_CTL28 and HW_DRAM_CTL35 are not initialized as
120286a88cfSFabio Estevam * per FSL bootlets code.
121286a88cfSFabio Estevam *
122286a88cfSFabio Estevam * mx23 Reference Manual marks HW_DRAM_CTL27 and HW_DRAM_CTL28 as
123286a88cfSFabio Estevam * "reserved".
124286a88cfSFabio Estevam * HW_DRAM_CTL8 is setup as the last element.
125286a88cfSFabio Estevam * So skip the initialization of these HW_DRAM_CTL registers.
126286a88cfSFabio Estevam */
127*950eaf62SGraeme Russ debug("SPL: Applying SDRAM parameters\n");
12839a538d9SFabio Estevam for (i = 0; i < ARRAY_SIZE(dram_vals); i++) {
12939a538d9SFabio Estevam if (i == 8 || i == 27 || i == 28 || i == 35)
13039a538d9SFabio Estevam continue;
13139a538d9SFabio Estevam writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));
13239a538d9SFabio Estevam }
13339a538d9SFabio Estevam
13489075d3fSOtavio Salvador /*
13589075d3fSOtavio Salvador * Enable tRAS lockout in HW_DRAM_CTL08 ; it must be the last
13689075d3fSOtavio Salvador * element to be set
13789075d3fSOtavio Salvador */
1381ddf386eSOtavio Salvador writel((1 << 24), MXS_DRAM_BASE + (4 * 8));
1393a0398d7SOtavio Salvador }
14039a538d9SFabio Estevam #endif
1413a0398d7SOtavio Salvador
mxs_mem_init_clock(void)142a918a53cSMarek Vasut static void mxs_mem_init_clock(void)
1433a0398d7SOtavio Salvador {
1449c471142SOtavio Salvador struct mxs_clkctrl_regs *clkctrl_regs =
1459c471142SOtavio Salvador (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
14630af6c0bSOtavio Salvador #if defined(CONFIG_MX23)
14730af6c0bSOtavio Salvador /* Fractional divider for ref_emi is 33 ; 480 * 18 / 33 = 266MHz */
14830af6c0bSOtavio Salvador const unsigned char divider = 33;
14930af6c0bSOtavio Salvador #elif defined(CONFIG_MX28)
15030af6c0bSOtavio Salvador /* Fractional divider for ref_emi is 21 ; 480 * 18 / 21 = 411MHz */
15130af6c0bSOtavio Salvador const unsigned char divider = 21;
15230af6c0bSOtavio Salvador #endif
1533a0398d7SOtavio Salvador
154*950eaf62SGraeme Russ debug("SPL: Initialising FRAC0\n");
155*950eaf62SGraeme Russ
1563a0398d7SOtavio Salvador /* Gate EMI clock */
1573a0398d7SOtavio Salvador writeb(CLKCTRL_FRAC_CLKGATE,
1583a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_frac0_set[CLKCTRL_FRAC0_EMI]);
1593a0398d7SOtavio Salvador
16030af6c0bSOtavio Salvador /* Set fractional divider for ref_emi */
16130af6c0bSOtavio Salvador writeb(CLKCTRL_FRAC_CLKGATE | (divider & CLKCTRL_FRAC_FRAC_MASK),
1623a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_EMI]);
1633a0398d7SOtavio Salvador
1643a0398d7SOtavio Salvador /* Ungate EMI clock */
1653a0398d7SOtavio Salvador writeb(CLKCTRL_FRAC_CLKGATE,
1663a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_frac0_clr[CLKCTRL_FRAC0_EMI]);
1673a0398d7SOtavio Salvador
1683a0398d7SOtavio Salvador early_delay(11000);
1693a0398d7SOtavio Salvador
1703a0398d7SOtavio Salvador /* Set EMI clock divider for EMI clock to 411 / 2 = 205MHz */
1713a0398d7SOtavio Salvador writel((2 << CLKCTRL_EMI_DIV_EMI_OFFSET) |
1723a0398d7SOtavio Salvador (1 << CLKCTRL_EMI_DIV_XTAL_OFFSET),
1733a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_emi);
1743a0398d7SOtavio Salvador
1753a0398d7SOtavio Salvador /* Unbypass EMI */
1763a0398d7SOtavio Salvador writel(CLKCTRL_CLKSEQ_BYPASS_EMI,
1773a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_clkseq_clr);
1783a0398d7SOtavio Salvador
1793a0398d7SOtavio Salvador early_delay(10000);
180*950eaf62SGraeme Russ debug("SPL: FRAC0 Initialised\n");
1813a0398d7SOtavio Salvador }
1823a0398d7SOtavio Salvador
mxs_mem_setup_cpu_and_hbus(void)183a918a53cSMarek Vasut static void mxs_mem_setup_cpu_and_hbus(void)
1843a0398d7SOtavio Salvador {
1859c471142SOtavio Salvador struct mxs_clkctrl_regs *clkctrl_regs =
1869c471142SOtavio Salvador (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
1873a0398d7SOtavio Salvador
188*950eaf62SGraeme Russ debug("SPL: Setting CPU and HBUS clock frequencies\n");
189*950eaf62SGraeme Russ
1903a0398d7SOtavio Salvador /* Set fractional divider for ref_cpu to 480 * 18 / 19 = 454MHz
1913a0398d7SOtavio Salvador * and ungate CPU clock */
1923a0398d7SOtavio Salvador writeb(19 & CLKCTRL_FRAC_FRAC_MASK,
1933a0398d7SOtavio Salvador (uint8_t *)&clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_CPU]);
1943a0398d7SOtavio Salvador
1953a0398d7SOtavio Salvador /* Set CPU bypass */
1963a0398d7SOtavio Salvador writel(CLKCTRL_CLKSEQ_BYPASS_CPU,
1973a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_clkseq_set);
1983a0398d7SOtavio Salvador
1993a0398d7SOtavio Salvador /* HBUS = 151MHz */
2003a0398d7SOtavio Salvador writel(CLKCTRL_HBUS_DIV_MASK, &clkctrl_regs->hw_clkctrl_hbus_set);
2013a0398d7SOtavio Salvador writel(((~3) << CLKCTRL_HBUS_DIV_OFFSET) & CLKCTRL_HBUS_DIV_MASK,
2023a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_hbus_clr);
2033a0398d7SOtavio Salvador
2043a0398d7SOtavio Salvador early_delay(10000);
2053a0398d7SOtavio Salvador
2063a0398d7SOtavio Salvador /* CPU clock divider = 1 */
2073a0398d7SOtavio Salvador clrsetbits_le32(&clkctrl_regs->hw_clkctrl_cpu,
2083a0398d7SOtavio Salvador CLKCTRL_CPU_DIV_CPU_MASK, 1);
2093a0398d7SOtavio Salvador
2103a0398d7SOtavio Salvador /* Disable CPU bypass */
2113a0398d7SOtavio Salvador writel(CLKCTRL_CLKSEQ_BYPASS_CPU,
2123a0398d7SOtavio Salvador &clkctrl_regs->hw_clkctrl_clkseq_clr);
2133a0398d7SOtavio Salvador
2143a0398d7SOtavio Salvador early_delay(15000);
2153a0398d7SOtavio Salvador }
2163a0398d7SOtavio Salvador
mxs_mem_setup_vdda(void)217a918a53cSMarek Vasut static void mxs_mem_setup_vdda(void)
2183a0398d7SOtavio Salvador {
2199c471142SOtavio Salvador struct mxs_power_regs *power_regs =
2209c471142SOtavio Salvador (struct mxs_power_regs *)MXS_POWER_BASE;
2213a0398d7SOtavio Salvador
222*950eaf62SGraeme Russ debug("SPL: Configuring VDDA\n");
223*950eaf62SGraeme Russ
2243a0398d7SOtavio Salvador writel((0xc << POWER_VDDACTRL_TRG_OFFSET) |
2253a0398d7SOtavio Salvador (0x7 << POWER_VDDACTRL_BO_OFFSET_OFFSET) |
2263a0398d7SOtavio Salvador POWER_VDDACTRL_LINREG_OFFSET_1STEPS_BELOW,
2273a0398d7SOtavio Salvador &power_regs->hw_power_vddactrl);
2283a0398d7SOtavio Salvador }
2293a0398d7SOtavio Salvador
mxs_mem_get_size(void)2301e0cf5c3SOtavio Salvador uint32_t mxs_mem_get_size(void)
2313a0398d7SOtavio Salvador {
2323a0398d7SOtavio Salvador uint32_t sz, da;
2333a0398d7SOtavio Salvador uint32_t *vt = (uint32_t *)0x20;
2343a0398d7SOtavio Salvador /* The following is "subs pc, r14, #4", used as return from DABT. */
2353a0398d7SOtavio Salvador const uint32_t data_abort_memdetect_handler = 0xe25ef004;
2363a0398d7SOtavio Salvador
2373a0398d7SOtavio Salvador /* Replace the DABT handler. */
2383a0398d7SOtavio Salvador da = vt[4];
2393a0398d7SOtavio Salvador vt[4] = data_abort_memdetect_handler;
2403a0398d7SOtavio Salvador
2413a0398d7SOtavio Salvador sz = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
2423a0398d7SOtavio Salvador
2433a0398d7SOtavio Salvador /* Restore the old DABT handler. */
2443a0398d7SOtavio Salvador vt[4] = da;
2453a0398d7SOtavio Salvador
2463a0398d7SOtavio Salvador return sz;
2473a0398d7SOtavio Salvador }
2483a0398d7SOtavio Salvador
24930af6c0bSOtavio Salvador #ifdef CONFIG_MX23
mx23_mem_setup_vddmem(void)25030af6c0bSOtavio Salvador static void mx23_mem_setup_vddmem(void)
2513a0398d7SOtavio Salvador {
25230af6c0bSOtavio Salvador struct mxs_power_regs *power_regs =
25330af6c0bSOtavio Salvador (struct mxs_power_regs *)MXS_POWER_BASE;
25430af6c0bSOtavio Salvador
255*950eaf62SGraeme Russ debug("SPL: Setting mx23 VDDMEM\n");
256*950eaf62SGraeme Russ
257be0ecdbeSMarek Vasut /* We must wait before and after disabling the current limiter! */
258be0ecdbeSMarek Vasut early_delay(10000);
259be0ecdbeSMarek Vasut
260dd3ecf02SMarek Vasut clrbits_le32(&power_regs->hw_power_vddmemctrl,
261dd3ecf02SMarek Vasut POWER_VDDMEMCTRL_ENABLE_ILIMIT);
26230af6c0bSOtavio Salvador
263be0ecdbeSMarek Vasut early_delay(10000);
264be0ecdbeSMarek Vasut
26530af6c0bSOtavio Salvador }
26630af6c0bSOtavio Salvador
mx23_mem_init(void)26730af6c0bSOtavio Salvador static void mx23_mem_init(void)
26830af6c0bSOtavio Salvador {
269*950eaf62SGraeme Russ debug("SPL: Initialising mx23 SDRAM Controller\n");
270*950eaf62SGraeme Russ
2715c2f444cSMarek Vasut /*
2725c2f444cSMarek Vasut * Reset/ungate the EMI block. This is essential, otherwise the system
2735c2f444cSMarek Vasut * suffers from memory instability. This thing is mx23 specific and is
2745c2f444cSMarek Vasut * no longer present on mx28.
2755c2f444cSMarek Vasut */
2765c2f444cSMarek Vasut mxs_reset_block((struct mxs_register_32 *)MXS_EMI_BASE);
2775c2f444cSMarek Vasut
27830af6c0bSOtavio Salvador mx23_mem_setup_vddmem();
27930af6c0bSOtavio Salvador
28030af6c0bSOtavio Salvador /*
28130af6c0bSOtavio Salvador * Configure the DRAM registers
28230af6c0bSOtavio Salvador */
28330af6c0bSOtavio Salvador
28430af6c0bSOtavio Salvador /* Clear START and SREFRESH bit from DRAM_CTL8 */
28530af6c0bSOtavio Salvador clrbits_le32(MXS_DRAM_BASE + 0x20, (1 << 16) | (1 << 8));
28630af6c0bSOtavio Salvador
28730af6c0bSOtavio Salvador initialize_dram_values();
28830af6c0bSOtavio Salvador
2898a47c997SFabio Estevam /* Set START bit in DRAM_CTL8 */
29030af6c0bSOtavio Salvador setbits_le32(MXS_DRAM_BASE + 0x20, 1 << 16);
29130af6c0bSOtavio Salvador
29230af6c0bSOtavio Salvador clrbits_le32(MXS_DRAM_BASE + 0x40, 1 << 17);
2937c604e98SMarek Vasut
2947c604e98SMarek Vasut /* Wait for EMI_STAT bit DRAM_HALTED */
2957c604e98SMarek Vasut for (;;) {
2967c604e98SMarek Vasut if (!(readl(MXS_EMI_BASE + 0x10) & (1 << 1)))
2977c604e98SMarek Vasut break;
2987c604e98SMarek Vasut early_delay(1000);
2997c604e98SMarek Vasut }
30030af6c0bSOtavio Salvador
30130af6c0bSOtavio Salvador /* Adjust EMI port priority. */
302fb7383a7SFabio Estevam clrsetbits_le32(0x80020000, 0x1f << 16, 0x2);
30330af6c0bSOtavio Salvador early_delay(20000);
30430af6c0bSOtavio Salvador
30530af6c0bSOtavio Salvador setbits_le32(MXS_DRAM_BASE + 0x40, 1 << 19);
30630af6c0bSOtavio Salvador setbits_le32(MXS_DRAM_BASE + 0x40, 1 << 11);
30730af6c0bSOtavio Salvador }
30830af6c0bSOtavio Salvador #endif
30930af6c0bSOtavio Salvador
31030af6c0bSOtavio Salvador #ifdef CONFIG_MX28
mx28_mem_init(void)31130af6c0bSOtavio Salvador static void mx28_mem_init(void)
31230af6c0bSOtavio Salvador {
3139c471142SOtavio Salvador struct mxs_pinctrl_regs *pinctrl_regs =
3149c471142SOtavio Salvador (struct mxs_pinctrl_regs *)MXS_PINCTRL_BASE;
3153a0398d7SOtavio Salvador
316*950eaf62SGraeme Russ debug("SPL: Initialising mx28 SDRAM Controller\n");
317*950eaf62SGraeme Russ
3183a0398d7SOtavio Salvador /* Set DDR2 mode */
3193a0398d7SOtavio Salvador writel(PINCTRL_EMI_DS_CTRL_DDR_MODE_DDR2,
3203a0398d7SOtavio Salvador &pinctrl_regs->hw_pinctrl_emi_ds_ctrl_set);
3213a0398d7SOtavio Salvador
3223a0398d7SOtavio Salvador /*
3233a0398d7SOtavio Salvador * Configure the DRAM registers
3243a0398d7SOtavio Salvador */
3253a0398d7SOtavio Salvador
3263a0398d7SOtavio Salvador /* Clear START bit from DRAM_CTL16 */
3273a0398d7SOtavio Salvador clrbits_le32(MXS_DRAM_BASE + 0x40, 1);
3283a0398d7SOtavio Salvador
329393ff47bSOtavio Salvador initialize_dram_values();
3303a0398d7SOtavio Salvador
3313a0398d7SOtavio Salvador /* Clear SREFRESH bit from DRAM_CTL17 */
3323a0398d7SOtavio Salvador clrbits_le32(MXS_DRAM_BASE + 0x44, 1);
3333a0398d7SOtavio Salvador
3343a0398d7SOtavio Salvador /* Set START bit in DRAM_CTL16 */
3353a0398d7SOtavio Salvador setbits_le32(MXS_DRAM_BASE + 0x40, 1);
3363a0398d7SOtavio Salvador
3373a0398d7SOtavio Salvador /* Wait for bit 20 (DRAM init complete) in DRAM_CTL58 */
3383a0398d7SOtavio Salvador while (!(readl(MXS_DRAM_BASE + 0xe8) & (1 << 20)))
3393a0398d7SOtavio Salvador ;
34030af6c0bSOtavio Salvador }
34130af6c0bSOtavio Salvador #endif
34230af6c0bSOtavio Salvador
mxs_mem_init(void)34330af6c0bSOtavio Salvador void mxs_mem_init(void)
34430af6c0bSOtavio Salvador {
34530af6c0bSOtavio Salvador early_delay(11000);
34630af6c0bSOtavio Salvador
34730af6c0bSOtavio Salvador mxs_mem_init_clock();
34830af6c0bSOtavio Salvador
34930af6c0bSOtavio Salvador mxs_mem_setup_vdda();
35030af6c0bSOtavio Salvador
35130af6c0bSOtavio Salvador #if defined(CONFIG_MX23)
35230af6c0bSOtavio Salvador mx23_mem_init();
35330af6c0bSOtavio Salvador #elif defined(CONFIG_MX28)
35430af6c0bSOtavio Salvador mx28_mem_init();
35530af6c0bSOtavio Salvador #endif
3563a0398d7SOtavio Salvador
3573a0398d7SOtavio Salvador early_delay(10000);
3583a0398d7SOtavio Salvador
3591e0cf5c3SOtavio Salvador mxs_mem_setup_cpu_and_hbus();
3603a0398d7SOtavio Salvador }
361