xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c (revision e1cc4d31f889428a4ca73120951389c756404184)
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