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