1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * MediaTek DDR3 driver for MT7629 SoC
4  *
5  * Copyright (C) 2018 MediaTek Inc.
6  * Author: Wu Zou <wu.zou@mediatek.com>
7  *	   Ryder Lee <ryder.lee@mediatek.com>
8  */
9 
10 #include <clk.h>
11 #include <common.h>
12 #include <dm.h>
13 #include <ram.h>
14 #include <asm/io.h>
15 
16 /* EMI */
17 #define EMI_CONA			0x000
18 #define EMI_CONF			0x028
19 #define EMI_CONM			0x060
20 
21 /* DDR PHY */
22 #define DDRPHY_PLL1			0x0000
23 #define DDRPHY_PLL2			0x0004
24 #define DDRPHY_PLL3			0x0008
25 #define DDRPHY_PLL4			0x000c
26 #define DDRPHY_PLL5			0x0010
27 #define DDRPHY_PLL7			0x0018
28 #define DDRPHY_B0_DLL_ARPI0		0x0080
29 #define DDRPHY_B0_DLL_ARPI1		0x0084
30 #define DDRPHY_B0_DLL_ARPI2		0x0088
31 #define DDRPHY_B0_DLL_ARPI3		0x008c
32 #define DDRPHY_B0_DLL_ARPI4		0x0090
33 #define DDRPHY_B0_DLL_ARPI5		0x0094
34 #define DDRPHY_B0_DQ2			0x00a0
35 #define DDRPHY_B0_DQ3			0x00a4
36 #define DDRPHY_B0_DQ4			0x00a8
37 #define DDRPHY_B0_DQ5			0x00ac
38 #define DDRPHY_B0_DQ6			0x00b0
39 #define DDRPHY_B0_DQ7			0x00b4
40 #define DDRPHY_B0_DQ8			0x00b8
41 #define DDRPHY_B1_DLL_ARPI0		0x0100
42 #define DDRPHY_B1_DLL_ARPI1		0x0104
43 #define DDRPHY_B1_DLL_ARPI2		0x0108
44 #define DDRPHY_B1_DLL_ARPI3		0x010c
45 #define DDRPHY_B1_DLL_ARPI4		0x0110
46 #define DDRPHY_B1_DLL_ARPI5		0x0114
47 #define DDRPHY_B1_DQ2			0x0120
48 #define DDRPHY_B1_DQ3			0x0124
49 #define DDRPHY_B1_DQ4			0x0128
50 #define DDRPHY_B1_DQ5			0x012c
51 #define DDRPHY_B1_DQ6			0x0130
52 #define DDRPHY_B1_DQ7			0x0134
53 #define DDRPHY_B1_DQ8			0x0138
54 #define DDRPHY_CA_DLL_ARPI0		0x0180
55 #define DDRPHY_CA_DLL_ARPI1		0x0184
56 #define DDRPHY_CA_DLL_ARPI2		0x0188
57 #define DDRPHY_CA_DLL_ARPI3		0x018c
58 #define DDRPHY_CA_DLL_ARPI4		0x0190
59 #define DDRPHY_CA_DLL_ARPI5		0x0194
60 #define DDRPHY_CA_CMD2			0x01a0
61 #define DDRPHY_CA_CMD3			0x01a4
62 #define DDRPHY_CA_CMD5			0x01ac
63 #define DDRPHY_CA_CMD6			0x01b0
64 #define DDRPHY_CA_CMD7			0x01b4
65 #define DDRPHY_CA_CMD8			0x01b8
66 #define DDRPHY_MISC_VREF_CTRL		0x0264
67 #define DDRPHY_MISC_IMP_CTRL0		0x0268
68 #define DDRPHY_MISC_IMP_CTRL1		0x026c
69 #define DDRPHY_MISC_SHU_OPT		0x0270
70 #define DDRPHY_MISC_SPM_CTRL0		0x0274
71 #define DDRPHY_MISC_SPM_CTRL1		0x0278
72 #define DDRPHY_MISC_SPM_CTRL2		0x027c
73 #define DDRPHY_MISC_CG_CTRL0		0x0284
74 #define DDRPHY_MISC_CG_CTRL1		0x0288
75 #define DDRPHY_MISC_CG_CTRL2		0x028c
76 #define DDRPHY_MISC_CG_CTRL4		0x0294
77 #define DDRPHY_MISC_CTRL0		0x029c
78 #define DDRPHY_MISC_CTRL1		0x02a0
79 #define DDRPHY_MISC_CTRL3		0x02a8
80 #define DDRPHY_MISC_RXDVS1		0x05e4
81 #define DDRPHY_SHU1_B0_DQ4		0x0c10
82 #define DDRPHY_SHU1_B0_DQ5		0x0c14
83 #define DDRPHY_SHU1_B0_DQ6		0x0c18
84 #define DDRPHY_SHU1_B0_DQ7		0x0c1c
85 #define DDRPHY_SHU1_B1_DQ4		0x0c90
86 #define DDRPHY_SHU1_B1_DQ5		0x0c94
87 #define DDRPHY_SHU1_B1_DQ6		0x0c98
88 #define DDRPHY_SHU1_B1_DQ7		0x0c9c
89 #define DDRPHY_SHU1_CA_CMD2		0x0d08
90 #define DDRPHY_SHU1_CA_CMD4		0x0d10
91 #define DDRPHY_SHU1_CA_CMD5		0x0d14
92 #define DDRPHY_SHU1_CA_CMD6		0x0d18
93 #define DDRPHY_SHU1_CA_CMD7		0x0d1c
94 #define DDRPHY_SHU1_PLL0		0x0d80
95 #define DDRPHY_SHU1_PLL1		0x0d84
96 #define DDRPHY_SHU1_PLL4		0x0d90
97 #define DDRPHY_SHU1_PLL5		0x0d94
98 #define DDRPHY_SHU1_PLL6		0x0d98
99 #define DDRPHY_SHU1_PLL7		0x0d9C
100 #define DDRPHY_SHU1_PLL8		0x0da0
101 #define DDRPHY_SHU1_PLL9		0x0da4
102 #define DDRPHY_SHU1_PLL10		0x0da8
103 #define DDRPHY_SHU1_PLL11		0x0dac
104 #define DDRPHY_SHU1_R0_B0_DQ2		0x0e08
105 #define DDRPHY_SHU1_R0_B0_DQ3		0x0e0c
106 #define DDRPHY_SHU1_R0_B0_DQ4		0x0e10
107 #define DDRPHY_SHU1_R0_B0_DQ5		0x0e14
108 #define DDRPHY_SHU1_R0_B0_DQ6		0x0e18
109 #define DDRPHY_SHU1_R0_B0_DQ7		0x0e1c
110 #define DDRPHY_SHU1_R0_B1_DQ2		0x0e58
111 #define DDRPHY_SHU1_R0_B1_DQ3		0x0e5c
112 #define DDRPHY_SHU1_R0_B1_DQ4		0x0e60
113 #define DDRPHY_SHU1_R0_B1_DQ5		0x0e64
114 #define DDRPHY_SHU1_R0_B1_DQ6		0x0e68
115 #define DDRPHY_SHU1_R0_B1_DQ7		0x0e6c
116 #define DDRPHY_SHU1_R0_CA_CMD9		0x0ec4
117 #define DDRPHY_SHU1_R1_B0_DQ2		0x0f08
118 #define DDRPHY_SHU1_R1_B0_DQ3		0x0f0c
119 #define DDRPHY_SHU1_R1_B0_DQ4		0x0f10
120 #define DDRPHY_SHU1_R1_B0_DQ5		0x0f14
121 #define DDRPHY_SHU1_R1_B0_DQ6		0x0f18
122 #define DDRPHY_SHU1_R1_B0_DQ7		0x0f1c
123 #define DDRPHY_SHU1_R1_B1_DQ2		0x0f58
124 #define DDRPHY_SHU1_R1_B1_DQ3		0x0f5c
125 #define DDRPHY_SHU1_R1_B1_DQ4		0x0f60
126 #define DDRPHY_SHU1_R1_B1_DQ5		0x0f64
127 #define DDRPHY_SHU1_R1_B1_DQ6		0x0f68
128 #define DDRPHY_SHU1_R1_B1_DQ7		0x0f6c
129 #define DDRPHY_SHU1_R1_CA_CMD9		0x0fc4
130 
131 /* DRAMC */
132 #define DRAMC_DDRCONF0			0x0000
133 #define DRAMC_DRAMCTRL			0x0004
134 #define DRAMC_MISCTL0			0x0008
135 #define DRAMC_PERFCTL0			0x000c
136 #define DRAMC_ARBCTL			0x0010
137 #define DRAMC_RSTMASK			0x001c
138 #define DRAMC_PADCTRL			0x0020
139 #define DRAMC_CKECTRL			0x0024
140 #define DRAMC_RKCFG			0x0034
141 #define DRAMC_DRAMC_PD_CTRL		0x0038
142 #define DRAMC_CLKAR			0x003c
143 #define DRAMC_CLKCTRL			0x0040
144 #define DRAMC_SREFCTRL			0x0048
145 #define DRAMC_REFCTRL0			0x004c
146 #define DRAMC_REFCTRL1			0x0050
147 #define DRAMC_REFRATRE_FILTER		0x0054
148 #define DRAMC_ZQCS			0x0058
149 #define DRAMC_MRS			0x005c
150 #define DRAMC_SPCMD			0x0060
151 #define DRAMC_SPCMDCTRL			0x0064
152 #define DRAMC_HW_MRR_FUN		0x0074
153 #define DRAMC_TEST2_1			0x0094
154 #define DRAMC_TEST2_2			0x0098
155 #define DRAMC_TEST2_3			0x009c
156 #define DRAMC_TEST2_4			0x00a0
157 #define DRAMC_CATRAINING1		0x00b0
158 #define DRAMC_DUMMY_RD			0x00d0
159 #define DRAMC_SHUCTRL			0x00d4
160 #define DRAMC_SHUCTRL2			0x00dc
161 #define DRAMC_STBCAL			0x0200
162 #define DRAMC_STBCAL1			0x0204
163 #define DRAMC_EYESCAN			0x020c
164 #define DRAMC_DVFSDLL			0x0210
165 #define DRAMC_SHU_ACTIM0		0x0800
166 #define DRAMC_SHU_ACTIM1		0x0804
167 #define DRAMC_SHU_ACTIM2		0x0808
168 #define DRAMC_SHU_ACTIM3		0x080c
169 #define DRAMC_SHU_ACTIM4		0x0810
170 #define DRAMC_SHU_ACTIM5		0x0814
171 #define DRAMC_SHU_ACTIM_XRT		0x081c
172 #define DRAMC_SHU_AC_TIME_05T		0x0820
173 #define DRAMC_SHU_CONF0			0x0840
174 #define DRAMC_SHU_CONF1			0x0844
175 #define DRAMC_SHU_CONF2			0x0848
176 #define DRAMC_SHU_CONF3			0x084c
177 #define DRAMC_SHU_RANKCTL		0x0858
178 #define DRAMC_SHU_CKECTRL		0x085c
179 #define DRAMC_SHU_ODTCTRL		0x0860
180 #define DRAMC_SHU_PIPE			0x0878
181 #define DRAMC_SHU_SELPH_CA1		0x0880
182 #define DRAMC_SHU_SELPH_CA2		0x0884
183 #define DRAMC_SHU_SELPH_CA3		0x0888
184 #define DRAMC_SHU_SELPH_CA4		0x088c
185 #define DRAMC_SHU_SELPH_CA5		0x0890
186 #define DRAMC_SHU_SELPH_CA6		0x0894
187 #define DRAMC_SHU_SELPH_CA7		0x0898
188 #define DRAMC_SHU_SELPH_CA8		0x089c
189 #define DRAMC_SHU_SELPH_DQS0		0x08a0
190 #define DRAMC_SHU_SELPH_DQS1		0x08a4
191 #define DRAMC_SHU1_DRVING1		0x08a8
192 #define DRAMC_SHU1_DRVING2		0x08ac
193 #define DRAMC_SHU1_WODT			0x08c0
194 #define DRAMC_SHU_SCINTV		0x08c8
195 #define DRAMC_SHURK0_DQSCTL		0x0a00
196 #define DRAMC_SHURK0_DQSIEN		0x0a04
197 #define DRAMC_SHURK0_SELPH_ODTEN0	0x0a1c
198 #define DRAMC_SHURK0_SELPH_ODTEN1	0x0a20
199 #define DRAMC_SHURK0_SELPH_DQSG0	0x0a24
200 #define DRAMC_SHURK0_SELPH_DQSG1	0x0a28
201 #define DRAMC_SHURK0_SELPH_DQ0		0x0a2c
202 #define DRAMC_SHURK0_SELPH_DQ1		0x0a30
203 #define DRAMC_SHURK0_SELPH_DQ2		0x0a34
204 #define DRAMC_SHURK0_SELPH_DQ3		0x0a38
205 #define DRAMC_SHURK1_DQSCTL		0x0b00
206 #define DRAMC_SHURK1_SELPH_ODTEN0	0x0b1c
207 #define DRAMC_SHURK1_SELPH_ODTEN1	0x0b20
208 #define DRAMC_SHURK1_SELPH_DQSG0	0x0b24
209 #define DRAMC_SHURK1_SELPH_DQSG1	0x0b28
210 #define DRAMC_SHURK1_SELPH_DQ0		0x0b2c
211 #define DRAMC_SHURK1_SELPH_DQ1		0x0b30
212 #define DRAMC_SHURK1_SELPH_DQ2		0x0b34
213 #define DRAMC_SHURK1_SELPH_DQ3		0x0b38
214 #define DRAMC_SHURK2_SELPH_ODTEN0	0x0c1c
215 #define DRAMC_SHURK2_SELPH_ODTEN1	0x0c20
216 #define DRAMC_SHU_DQSG_RETRY		0x0c54
217 
218 #define EMI_COL_ADDR_MASK		GENMASK(13, 12)
219 #define EMI_COL_ADDR_SHIFT		12
220 #define WALKING_PATTERN			0x12345678
221 #define WALKING_STEP			0x4000000
222 
223 struct mtk_ddr3_priv {
224 	fdt_addr_t emi;
225 	fdt_addr_t ddrphy;
226 	fdt_addr_t dramc_ao;
227 	struct clk phy;
228 	struct clk phy_mux;
229 	struct clk mem;
230 	struct clk mem_mux;
231 };
232 
233 #ifdef CONFIG_SPL_BUILD
234 static int mtk_ddr3_rank_size_detect(struct udevice *dev)
235 {
236 	struct mtk_ddr3_priv *priv = dev_get_priv(dev);
237 	int step;
238 	u32 start, test;
239 
240 	/* To detect size, we have to make sure it's single rank
241 	 * and it has maximum addressing region
242 	 */
243 
244 	writel(WALKING_PATTERN, CONFIG_SYS_SDRAM_BASE);
245 
246 	if (readl(CONFIG_SYS_SDRAM_BASE) != WALKING_PATTERN)
247 		return -EINVAL;
248 
249 	for (step = 0; step < 5; step++) {
250 		writel(~WALKING_PATTERN, CONFIG_SYS_SDRAM_BASE +
251 		       (WALKING_STEP << step));
252 
253 		start = readl(CONFIG_SYS_SDRAM_BASE);
254 		test = readl(CONFIG_SYS_SDRAM_BASE + (WALKING_STEP << step));
255 		if ((test != ~WALKING_PATTERN) || test == start)
256 			break;
257 	}
258 
259 	step = step ? step - 1 : 3;
260 	clrsetbits_le32(priv->emi + EMI_CONA, EMI_COL_ADDR_MASK,
261 			step << EMI_COL_ADDR_SHIFT);
262 
263 	return 0;
264 }
265 
266 static int mtk_ddr3_init(struct udevice *dev)
267 {
268 	struct mtk_ddr3_priv *priv = dev_get_priv(dev);
269 	int ret;
270 
271 	ret = clk_set_parent(&priv->phy, &priv->phy_mux);
272 	if (ret)
273 		return ret;
274 
275 	/* EMI Setting */
276 	writel(0x00003010, priv->emi + EMI_CONA);
277 	writel(0x00000000, priv->emi + EMI_CONF);
278 	writel(0x000006b8, priv->emi + EMI_CONM);
279 	/* DQS */
280 	writel(0x20c00, priv->dramc_ao + DRAMC_SHU1_DRVING1);
281 	/* Clock */
282 	writel(0x8320c83, priv->dramc_ao + DRAMC_SHU1_DRVING2);
283 
284 	/* DDRPHY setting */
285 	writel(0x2201, priv->dramc_ao + DRAMC_DRAMCTRL);
286 	writel(0x3000000c, priv->dramc_ao + DRAMC_CLKCTRL);
287 	writel(0xe08, priv->ddrphy + DDRPHY_CA_CMD5);
288 	writel(0x60e, priv->ddrphy + DDRPHY_SHU1_CA_CMD5);
289 	writel(0x0, priv->ddrphy + DDRPHY_MISC_SPM_CTRL1);
290 	writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_SPM_CTRL0);
291 	writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_SPM_CTRL2);
292 	writel(0x6003bf, priv->ddrphy + DDRPHY_MISC_CG_CTRL2);
293 	writel(0x13300000, priv->ddrphy + DDRPHY_MISC_CG_CTRL4);
294 
295 	writel(0x1, priv->ddrphy + DDRPHY_SHU1_CA_CMD7);
296 	writel(0x21, priv->ddrphy + DDRPHY_SHU1_B0_DQ7);
297 	writel(0x1, priv->ddrphy + DDRPHY_SHU1_B1_DQ7);
298 	writel(0xfff0, priv->ddrphy + DDRPHY_CA_CMD2);
299 	writel(0x0, priv->ddrphy + DDRPHY_B0_DQ2);
300 	writel(0x0, priv->ddrphy + DDRPHY_B1_DQ2);
301 	writel(0x7, priv->ddrphy + DDRPHY_MISC_RXDVS1);
302 	writel(0x10, priv->ddrphy + DDRPHY_PLL3);
303 	writel(0x8e8e0000, priv->ddrphy + DDRPHY_MISC_VREF_CTRL);
304 	writel(0x2e0040, priv->ddrphy + DDRPHY_MISC_IMP_CTRL0);
305 	writel(0x50060e, priv->ddrphy + DDRPHY_SHU1_B0_DQ5);
306 	writel(0x50060e, priv->ddrphy + DDRPHY_SHU1_B1_DQ5);
307 	udelay(1);
308 
309 	writel(0x10, priv->ddrphy + DDRPHY_B0_DQ3);
310 	writel(0x10, priv->ddrphy + DDRPHY_B1_DQ3);
311 	writel(0x3f600, priv->ddrphy + DDRPHY_MISC_CG_CTRL1);
312 	writel(0x1010, priv->ddrphy + DDRPHY_B0_DQ4);
313 	writel(0x1110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
314 	writel(0x10c10d0, priv->ddrphy + DDRPHY_B0_DQ6);
315 	writel(0x3110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
316 	writel(0x1010, priv->ddrphy + DDRPHY_B1_DQ4);
317 	writel(0x1110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
318 	writel(0x10c10d0, priv->ddrphy + DDRPHY_B1_DQ6);
319 	writel(0x3110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
320 	writel(0x7fffffc, priv->ddrphy + DDRPHY_CA_CMD3);
321 	writel(0xc0010, priv->ddrphy + DDRPHY_CA_CMD6);
322 	writel(0x101, priv->ddrphy + DDRPHY_SHU1_CA_CMD2);
323 	writel(0x41e, priv->ddrphy + DDRPHY_B0_DQ3);
324 	writel(0x41e, priv->ddrphy + DDRPHY_B1_DQ3);
325 	writel(0x180101, priv->ddrphy + DDRPHY_CA_CMD8);
326 	writel(0x0, priv->ddrphy + DDRPHY_MISC_IMP_CTRL1);
327 	writel(0x11400000, priv->ddrphy + DDRPHY_MISC_CG_CTRL4);
328 	writel(0xfff0f0f0, priv->ddrphy + DDRPHY_MISC_SHU_OPT);
329 	writel(0x1f, priv->ddrphy + DDRPHY_MISC_CG_CTRL0);
330 
331 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
332 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
333 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
334 	writel(0x40000, priv->ddrphy + DDRPHY_PLL4);
335 	writel(0x0, priv->ddrphy + DDRPHY_PLL1);
336 	writel(0x0, priv->ddrphy + DDRPHY_PLL2);
337 	writel(0x666008, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
338 	writel(0x80666008, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
339 	writel(0x80666008, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
340 	writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
341 	writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
342 	writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
343 	writel(0x400, priv->ddrphy + DDRPHY_CA_DLL_ARPI2);
344 	writel(0x20400, priv->ddrphy + DDRPHY_B0_DLL_ARPI2);
345 	writel(0x20400, priv->ddrphy + DDRPHY_B1_DLL_ARPI2);
346 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_PLL9);
347 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_PLL11);
348 	writel(0xf7f, priv->ddrphy + DDRPHY_SHU1_PLL0);
349 	writel(0x40000, priv->ddrphy + DDRPHY_SHU1_PLL8);
350 	writel(0x40000, priv->ddrphy + DDRPHY_SHU1_PLL10);
351 	writel(0xe57800fe, priv->ddrphy + DDRPHY_SHU1_PLL4);
352 	writel(0xe57800fe, priv->ddrphy + DDRPHY_SHU1_PLL6);
353 
354 	writel(0xB5000000, priv->ddrphy + DDRPHY_SHU1_PLL5);
355 	writel(0xB5000000, priv->ddrphy + DDRPHY_SHU1_PLL7);
356 
357 	writel(0x14d0002, priv->ddrphy + DDRPHY_PLL5);
358 	writel(0x14d0002, priv->ddrphy + DDRPHY_PLL7);
359 	writel(0x80040000, priv->ddrphy + DDRPHY_SHU1_PLL8);
360 	writel(0x80040000, priv->ddrphy + DDRPHY_SHU1_PLL10);
361 	writel(0xf, priv->ddrphy + DDRPHY_SHU1_PLL1);
362 	writel(0x4, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
363 	writel(0x1, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
364 	writel(0x1, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
365 	writel(0x698600, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
366 	writel(0xc0778600, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
367 	writel(0xc0778600, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
368 	writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI4);
369 	writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI4);
370 	writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI4);
371 	writel(0x2ba800, priv->ddrphy + DDRPHY_CA_DLL_ARPI1);
372 	writel(0x2ae806, priv->ddrphy + DDRPHY_B0_DLL_ARPI1);
373 	writel(0xae806, priv->ddrphy + DDRPHY_B1_DLL_ARPI1);
374 	writel(0xba000, priv->ddrphy + DDRPHY_CA_DLL_ARPI3);
375 	writel(0x2e800, priv->ddrphy + DDRPHY_B0_DLL_ARPI3);
376 	writel(0x2e800, priv->ddrphy + DDRPHY_B1_DLL_ARPI3);
377 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_CA_CMD4);
378 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_B0_DQ4);
379 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_B1_DQ4);
380 	writel(0x4, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
381 	writel(0x1, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
382 	writel(0x1, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
383 	writel(0x32cf0000, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
384 	writel(0x32cd0000, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
385 	writel(0x32cd0000, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
386 	writel(0x80010000, priv->ddrphy + DDRPHY_PLL1);
387 	writel(0x80000000, priv->ddrphy + DDRPHY_PLL2);
388 	udelay(100);
389 
390 	writel(0xc, priv->ddrphy + DDRPHY_CA_DLL_ARPI0);
391 	writel(0x9, priv->ddrphy + DDRPHY_B0_DLL_ARPI0);
392 	writel(0x9, priv->ddrphy + DDRPHY_B1_DLL_ARPI0);
393 	writel(0xd0000, priv->ddrphy + DDRPHY_PLL4);
394 	udelay(1);
395 
396 	writel(0x82, priv->ddrphy + DDRPHY_MISC_CTRL1);
397 	writel(0x2, priv->dramc_ao + DRAMC_DDRCONF0);
398 	writel(0x3acf0000, priv->ddrphy + DDRPHY_SHU1_CA_CMD6);
399 	writel(0x3acd0000, priv->ddrphy + DDRPHY_SHU1_B0_DQ6);
400 	writel(0x3acd0000, priv->ddrphy + DDRPHY_SHU1_B1_DQ6);
401 	udelay(1);
402 
403 	writel(0x0, priv->ddrphy + DDRPHY_CA_DLL_ARPI2);
404 	writel(0x0, priv->ddrphy + DDRPHY_B0_DLL_ARPI2);
405 	writel(0x0, priv->ddrphy + DDRPHY_B1_DLL_ARPI2);
406 	writel(0x80, priv->ddrphy + DDRPHY_MISC_CTRL1);
407 	writel(0x0, priv->dramc_ao + DRAMC_DDRCONF0);
408 	writel(0x80000000, priv->ddrphy + DDRPHY_PLL1);
409 	udelay(1);
410 
411 	writel(0x698e00, priv->ddrphy + DDRPHY_CA_DLL_ARPI5);
412 	udelay(1);
413 
414 	writel(0xc0778e00, priv->ddrphy + DDRPHY_B0_DLL_ARPI5);
415 	udelay(1);
416 
417 	writel(0xc0778e00, priv->ddrphy + DDRPHY_B1_DLL_ARPI5);
418 	udelay(1);
419 
420 	ret = clk_set_parent(&priv->mem, &priv->mem_mux);
421 	if (ret)
422 		return ret;
423 
424 	/* DDR PHY PLL setting */
425 	writel(0x51e, priv->ddrphy + DDRPHY_B0_DQ3);
426 	writel(0x51e, priv->ddrphy + DDRPHY_B1_DQ3);
427 	writel(0x8100008c, priv->ddrphy + DDRPHY_MISC_CTRL1);
428 	writel(0x80101, priv->ddrphy + DDRPHY_CA_CMD8);
429 	writel(0x100, priv->ddrphy + DDRPHY_CA_CMD7);
430 	writel(0x0, priv->ddrphy + DDRPHY_CA_CMD7);
431 	writel(0x0, priv->ddrphy + DDRPHY_B0_DQ7);
432 	writel(0x0, priv->ddrphy + DDRPHY_B1_DQ7);
433 	writel(0x51e, priv->ddrphy + DDRPHY_B0_DQ3);
434 	writel(0xff051e, priv->ddrphy + DDRPHY_B1_DQ3);
435 	writel(0x0, priv->ddrphy + DDRPHY_B0_DQ2);
436 	writel(0x1ff, priv->ddrphy + DDRPHY_B1_DQ2);
437 
438 	/* Update initial setting */
439 	writel(0x5fc, priv->ddrphy + DDRPHY_B0_DQ3);
440 	writel(0xff05fc, priv->ddrphy + DDRPHY_B1_DQ3);
441 	writel(0x10c12d9, priv->ddrphy + DDRPHY_B0_DQ6);
442 	writel(0x10c12d9, priv->ddrphy + DDRPHY_B1_DQ6);
443 	writel(0xc0259, priv->ddrphy + DDRPHY_CA_CMD6);
444 	writel(0x4000, priv->ddrphy + DDRPHY_B0_DQ2);
445 	writel(0x41ff, priv->ddrphy + DDRPHY_B1_DQ2);
446 	writel(0x0, priv->ddrphy + DDRPHY_B0_DQ8);
447 	writel(0x100, priv->ddrphy + DDRPHY_B1_DQ8);
448 	writel(0x3110e0e, priv->ddrphy + DDRPHY_B0_DQ5);
449 	writel(0x3110e0e, priv->ddrphy + DDRPHY_B1_DQ5);
450 	writel(0x51060e, priv->ddrphy + DDRPHY_SHU1_B0_DQ5);
451 	writel(0x51060e, priv->ddrphy + DDRPHY_SHU1_B1_DQ5);
452 	writel(0x39eff6, priv->dramc_ao + DRAMC_SHU_SCINTV);
453 	writel(0x204ffff, priv->dramc_ao + DRAMC_CLKAR);
454 	writel(0x31b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
455 	writel(0x0, priv->dramc_ao + DRAMC_PERFCTL0);
456 	writel(0x80000, priv->dramc_ao + DRAMC_PERFCTL0);
457 
458 	/* Dramc setting PC3 */
459 	writel(0x65714001, priv->dramc_ao + DRAMC_REFCTRL0);
460 
461 	writel(0x11351131, priv->ddrphy + DDRPHY_MISC_CTRL3);
462 	writel(0x200600, priv->dramc_ao + DRAMC_SHU_DQSG_RETRY);
463 	writel(0x101d007, priv->dramc_ao + DRAMC_SHUCTRL2);
464 	writel(0xe090601, priv->dramc_ao + DRAMC_DVFSDLL);
465 	writel(0x20003000, priv->dramc_ao + DRAMC_DDRCONF0);
466 	writel(0x3900020f, priv->ddrphy + DDRPHY_MISC_CTRL0);
467 	writel(0xa20810bf, priv->dramc_ao + DRAMC_SHU_CONF0);
468 	writel(0x30050, priv->dramc_ao + DRAMC_SHU_ODTCTRL);
469 	writel(0x25712000, priv->dramc_ao + DRAMC_REFCTRL0);
470 	writel(0xb0100000, priv->dramc_ao + DRAMC_STBCAL);
471 	writel(0x8000000, priv->dramc_ao + DRAMC_SREFCTRL);
472 	writel(0xc0000000, priv->dramc_ao + DRAMC_SHU_PIPE);
473 	writel(0x731004, priv->dramc_ao + DRAMC_RKCFG);
474 	writel(0x8007320f, priv->dramc_ao + DRAMC_SHU_CONF2);
475 	writel(0x2a7c0, priv->dramc_ao + DRAMC_SHU_SCINTV);
476 	writel(0xc110, priv->dramc_ao + DRAMC_SHUCTRL);
477 	writel(0x30000700, priv->dramc_ao + DRAMC_REFCTRL1);
478 	writel(0x6543b321, priv->dramc_ao + DRAMC_REFRATRE_FILTER);
479 
480 	/* Update PCDDR3 default setting */
481 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA1);
482 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA2);
483 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA3);
484 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA4);
485 	writel(0x10000111, priv->dramc_ao + DRAMC_SHU_SELPH_CA5);
486 	writel(0x1000000, priv->dramc_ao + DRAMC_SHU_SELPH_CA6);
487 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA7);
488 	writel(0x0, priv->dramc_ao + DRAMC_SHU_SELPH_CA8);
489 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_CA_CMD9);
490 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_CA_CMD9);
491 	writel(0x11112222, priv->dramc_ao + DRAMC_SHU_SELPH_DQS0);
492 	writel(0x33331111, priv->dramc_ao + DRAMC_SHU_SELPH_DQS1);
493 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ0);
494 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ1);
495 	writel(0x33331111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ2);
496 	writel(0x33331111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ3);
497 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ0);
498 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ1);
499 	writel(0x33331111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ2);
500 	writel(0x33331111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQ3);
501 	writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
502 	writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ7);
503 	writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
504 	writel(0xf0f00, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ7);
505 	writel(0x0, priv->dramc_ao + DRAMC_SHURK0_SELPH_ODTEN0);
506 	writel(0x0, priv->dramc_ao + DRAMC_SHURK0_SELPH_ODTEN1);
507 	writel(0x0, priv->dramc_ao + DRAMC_SHURK1_SELPH_ODTEN0);
508 	writel(0x0, priv->dramc_ao + DRAMC_SHURK1_SELPH_ODTEN1);
509 	writel(0x0, priv->dramc_ao + DRAMC_SHURK2_SELPH_ODTEN0);
510 	writel(0x66666666, priv->dramc_ao + DRAMC_SHURK2_SELPH_ODTEN1);
511 	writel(0x2c000b0f, priv->dramc_ao + DRAMC_SHU_CONF1);
512 	writel(0x11111111, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG0);
513 	writel(0x64646464, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG1);
514 	writel(0x11111111, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQSG0);
515 	writel(0x64646464, priv->dramc_ao + DRAMC_SHURK1_SELPH_DQSG1);
516 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ2);
517 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ3);
518 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ4);
519 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ5);
520 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ6);
521 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ2);
522 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ3);
523 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ4);
524 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ5);
525 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_B0_DQ6);
526 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ2);
527 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ3);
528 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ4);
529 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ5);
530 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ6);
531 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ2);
532 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ3);
533 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ4);
534 	writel(0xc0c0c0c, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ5);
535 	writel(0x0, priv->ddrphy + DDRPHY_SHU1_R1_B1_DQ6);
536 	writel(0x20000001, priv->dramc_ao + DRAMC_SHU_RANKCTL);
537 	writel(0x2, priv->dramc_ao + DRAMC_SHURK0_DQSCTL);
538 	writel(0x2, priv->dramc_ao + DRAMC_SHURK1_DQSCTL);
539 	writel(0x4020b07, priv->dramc_ao + DRAMC_SHU_ACTIM0);
540 	writel(0xb060400, priv->dramc_ao + DRAMC_SHU_ACTIM1);
541 	writel(0x8090200, priv->dramc_ao + DRAMC_SHU_ACTIM2);
542 	writel(0x810018, priv->dramc_ao + DRAMC_SHU_ACTIM3);
543 	writel(0x1e9700ff, priv->dramc_ao + DRAMC_SHU_ACTIM4);
544 	writel(0x1000908, priv->dramc_ao + DRAMC_SHU_ACTIM5);
545 	writel(0x801040b, priv->dramc_ao + DRAMC_SHU_ACTIM_XRT);
546 	writel(0x20000D1, priv->dramc_ao + DRAMC_SHU_AC_TIME_05T);
547 	writel(0x80010000, priv->ddrphy + DDRPHY_PLL2);
548 	udelay(500);
549 
550 	writel(0x81080000, priv->dramc_ao + DRAMC_MISCTL0);
551 	writel(0xacf13, priv->dramc_ao + DRAMC_PERFCTL0);
552 	writel(0xacf12, priv->dramc_ao + DRAMC_PERFCTL0);
553 	writel(0x80, priv->dramc_ao + DRAMC_ARBCTL);
554 	writel(0x9, priv->dramc_ao + DRAMC_PADCTRL);
555 	writel(0x80000107, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
556 	writel(0x3000000c, priv->dramc_ao + DRAMC_CLKCTRL);
557 	writel(0x25714001, priv->dramc_ao + DRAMC_REFCTRL0);
558 	writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
559 	writel(0x4300000, priv->dramc_ao + DRAMC_CATRAINING1);
560 	writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
561 	writel(0x731414, priv->dramc_ao + DRAMC_RKCFG);
562 	writel(0x733414, priv->dramc_ao + DRAMC_RKCFG);
563 	udelay(20);
564 
565 	writel(0x80002050, priv->dramc_ao + DRAMC_CKECTRL);
566 	udelay(100);
567 
568 	writel(0x400000, priv->dramc_ao + DRAMC_MRS);
569 	writel(0x401800, priv->dramc_ao + DRAMC_MRS);
570 	writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
571 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
572 	udelay(100);
573 
574 	writel(0x601800, priv->dramc_ao + DRAMC_MRS);
575 	writel(0x600000, priv->dramc_ao + DRAMC_MRS);
576 	writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
577 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
578 	udelay(100);
579 
580 	writel(0x200000, priv->dramc_ao + DRAMC_MRS);
581 	writel(0x200400, priv->dramc_ao + DRAMC_MRS);
582 	writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
583 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
584 	udelay(100);
585 
586 	writel(0x400, priv->dramc_ao + DRAMC_MRS);
587 	writel(0x1d7000, priv->dramc_ao + DRAMC_MRS);
588 	writel(0x1, priv->dramc_ao + DRAMC_SPCMD);
589 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
590 	udelay(100);
591 
592 	writel(0x702201, priv->dramc_ao + DRAMC_DRAMCTRL);
593 	writel(0x10, priv->dramc_ao + DRAMC_SPCMD);
594 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
595 	writel(0x20, priv->dramc_ao + DRAMC_SPCMD);
596 	writel(0x0, priv->dramc_ao + DRAMC_SPCMD);
597 	writel(0x1, priv->dramc_ao + DRAMC_HW_MRR_FUN);
598 	writel(0x702301, priv->dramc_ao + DRAMC_DRAMCTRL);
599 	writel(0x702301, priv->dramc_ao + DRAMC_DRAMCTRL);
600 	writel(0xa56, priv->dramc_ao + DRAMC_ZQCS);
601 	writel(0xff0000, priv->dramc_ao + DRAMC_SHU_CONF3);
602 	writel(0x15b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
603 	writel(0x2cb00b0f, priv->dramc_ao + DRAMC_SHU_CONF1);
604 	writel(0x65714001, priv->dramc_ao + DRAMC_REFCTRL0);
605 	writel(0x48000000, priv->dramc_ao + DRAMC_SREFCTRL);
606 	writel(0xc0000107, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
607 	writel(0x10002, priv->dramc_ao + DRAMC_EYESCAN);
608 	writel(0x15e00, priv->dramc_ao + DRAMC_STBCAL1);
609 	writel(0x100000, priv->dramc_ao + DRAMC_TEST2_1);
610 	writel(0x4000, priv->dramc_ao + DRAMC_TEST2_2);
611 	writel(0x12000480, priv->dramc_ao + DRAMC_TEST2_3);
612 	writel(0x301d007, priv->dramc_ao + DRAMC_SHUCTRL2);
613 	writel(0x4782321, priv->dramc_ao + DRAMC_DRAMCTRL);
614 	writel(0x30210000, priv->dramc_ao + DRAMC_SHU_CKECTRL);
615 	writel(0x20000, priv->dramc_ao + DRAMC_DUMMY_RD);
616 	writel(0x4080110d, priv->dramc_ao + DRAMC_TEST2_4);
617 	writel(0x30000721, priv->dramc_ao + DRAMC_REFCTRL1);
618 	writel(0x0, priv->dramc_ao + DRAMC_RSTMASK);
619 	writel(0x4782320, priv->dramc_ao + DRAMC_DRAMCTRL);
620 	writel(0x80002000, priv->dramc_ao + DRAMC_CKECTRL);
621 	writel(0x45714001, priv->dramc_ao + DRAMC_REFCTRL0);
622 
623 	/* Apply config before calibration */
624 	writel(0x120, priv->dramc_ao + DRAMC_DRAMC_PD_CTRL);
625 	writel(0x11351131, priv->ddrphy + DDRPHY_MISC_CTRL3);
626 	writel(0xffffffff, priv->ddrphy + DDRPHY_MISC_CG_CTRL0);
627 	writel(0x2a7fe, priv->dramc_ao + DRAMC_SHU_SCINTV);
628 	writel(0xff01ff, priv->dramc_ao + DRAMC_SHU_CONF3);
629 	writel(0x4782320, priv->dramc_ao + DRAMC_DRAMCTRL);
630 	writel(0xa56, priv->dramc_ao + DRAMC_ZQCS);
631 	writel(0x80000000, priv->dramc_ao + DRAMC_SHU1_WODT);
632 	writel(0x21, priv->ddrphy + DDRPHY_SHU1_B0_DQ7);
633 	writel(0x1, priv->ddrphy + DDRPHY_SHU1_B1_DQ7);
634 	writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
635 	writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
636 	writel(0x35b1f1cf, priv->dramc_ao + DRAMC_SPCMDCTRL);
637 	writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
638 	writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
639 	writel(0x10002, priv->dramc_ao + DRAMC_EYESCAN);
640 	writel(0x8100008c, priv->ddrphy + DDRPHY_MISC_CTRL1);
641 	writel(0x45714001, priv->dramc_ao + DRAMC_REFCTRL0);
642 	writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
643 	writel(0xb0300000, priv->dramc_ao + DRAMC_STBCAL);
644 
645 	/* Write leveling */
646 	writel(0x1f2e2e00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
647 	writel(0x202f2f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
648 	writel(0x33221100, priv->dramc_ao + DRAMC_SHU_SELPH_DQS1);
649 	writel(0x11112222, priv->dramc_ao + DRAMC_SHU_SELPH_DQS0);
650 
651 	/* RX dqs gating cal */
652 	writel(0x11111010, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG0);
653 	writel(0x20201717, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQSG1);
654 	writel(0x1d1f, priv->dramc_ao + DRAMC_SHURK0_DQSIEN);
655 
656 	/* RX window per-bit cal */
657 	writel(0x03030404, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ2);
658 	writel(0x01010303, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ3);
659 	writel(0x01010303, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ4);
660 	writel(0x01010000, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ5);
661 	writel(0x03030606, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ2);
662 	writel(0x02020202, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ3);
663 	writel(0x04040303, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ4);
664 	writel(0x06060101, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ5);
665 
666 	/* RX datlat cal */
667 	writel(0x28b00a0e, priv->dramc_ao + DRAMC_SHU_CONF1);
668 
669 	/* TX window per-byte with 2UI cal */
670 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ0);
671 	writel(0x22220000, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ2);
672 	writel(0x11112222, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ1);
673 	writel(0x22220000, priv->dramc_ao + DRAMC_SHURK0_SELPH_DQ3);
674 	writel(0x1f2e2e00, priv->ddrphy + DDRPHY_SHU1_R0_B0_DQ7);
675 	writel(0x202f2f00, priv->ddrphy + DDRPHY_SHU1_R0_B1_DQ7);
676 
677 	return mtk_ddr3_rank_size_detect(dev);
678 }
679 #endif
680 
681 static int mtk_ddr3_probe(struct udevice *dev)
682 {
683 	struct mtk_ddr3_priv *priv = dev_get_priv(dev);
684 
685 	priv->emi = dev_read_addr_index(dev, 0);
686 	if (priv->emi == FDT_ADDR_T_NONE)
687 		return -EINVAL;
688 
689 	priv->ddrphy = dev_read_addr_index(dev, 1);
690 	if (priv->ddrphy == FDT_ADDR_T_NONE)
691 		return -EINVAL;
692 
693 	priv->dramc_ao = dev_read_addr_index(dev, 2);
694 	if (priv->dramc_ao == FDT_ADDR_T_NONE)
695 		return -EINVAL;
696 
697 #ifdef CONFIG_SPL_BUILD
698 	int ret;
699 
700 	ret = clk_get_by_index(dev, 0, &priv->phy);
701 	if (ret)
702 		return ret;
703 
704 	ret = clk_get_by_index(dev, 1, &priv->phy_mux);
705 	if (ret)
706 		return ret;
707 
708 	ret = clk_get_by_index(dev, 2, &priv->mem);
709 	if (ret)
710 		return ret;
711 
712 	ret = clk_get_by_index(dev, 3, &priv->mem_mux);
713 	if (ret)
714 		return ret;
715 
716 	ret = mtk_ddr3_init(dev);
717 	if (ret)
718 		return ret;
719 #endif
720 	return 0;
721 }
722 
723 static int mtk_ddr3_get_info(struct udevice *dev, struct ram_info *info)
724 {
725 	struct mtk_ddr3_priv *priv = dev_get_priv(dev);
726 	u32 val = readl(priv->emi + EMI_CONA);
727 
728 	info->base = CONFIG_SYS_SDRAM_BASE;
729 
730 	switch ((val & EMI_COL_ADDR_MASK) >> EMI_COL_ADDR_SHIFT) {
731 	case 0:
732 		info->size = SZ_128M;
733 		break;
734 	case 1:
735 		info->size = SZ_256M;
736 		break;
737 	case 2:
738 		info->size = SZ_512M;
739 		break;
740 	case 3:
741 		info->size = SZ_1G;
742 		break;
743 	default:
744 		return -EINVAL;
745 	}
746 
747 	return 0;
748 }
749 
750 static struct ram_ops mtk_ddr3_ops = {
751 	.get_info = mtk_ddr3_get_info,
752 };
753 
754 static const struct udevice_id mtk_ddr3_ids[] = {
755 	{ .compatible = "mediatek,mt7629-dramc" },
756 	{ }
757 };
758 
759 U_BOOT_DRIVER(mediatek_ddr3) = {
760 	.name     = "mediatek_ddr3",
761 	.id       = UCLASS_RAM,
762 	.of_match = mtk_ddr3_ids,
763 	.ops      = &mtk_ddr3_ops,
764 	.probe    = mtk_ddr3_probe,
765 	.priv_auto_alloc_size = sizeof(struct mtk_ddr3_priv),
766 };
767