1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2020 Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #ifdef CONFIG_TPL_BUILD
9*4882a593Smuzhiyun #include <debug_uart.h>
10*4882a593Smuzhiyun #include <dm.h>
11*4882a593Smuzhiyun #include <dt-structs.h>
12*4882a593Smuzhiyun #include <ram.h>
13*4882a593Smuzhiyun #include <regmap.h>
14*4882a593Smuzhiyun #include <syscon.h>
15*4882a593Smuzhiyun #include <asm/io.h>
16*4882a593Smuzhiyun #include <asm/arch/clock.h>
17*4882a593Smuzhiyun #include <asm/arch/hardware.h>
18*4882a593Smuzhiyun #include <asm/arch/rk_atags.h>
19*4882a593Smuzhiyun #include <asm/arch/timer.h>
20*4882a593Smuzhiyun #include <asm/arch/grf_rk3308.h>
21*4882a593Smuzhiyun #include <asm/arch/sdram.h>
22*4882a593Smuzhiyun #include <asm/arch/sdram_rk3308.h>
23*4882a593Smuzhiyun #include <asm/arch/sdram_rv1108_pctl_phy.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #define CRU_BASE 0xff500000
28*4882a593Smuzhiyun #define GRF_BASE 0xff000000
29*4882a593Smuzhiyun #define SGRF_BASE 0xff2b0000
30*4882a593Smuzhiyun #define DDR_PHY_BASE 0xff530000
31*4882a593Smuzhiyun #define DDR_PCTL_BASE 0xff010000
32*4882a593Smuzhiyun #define DDR_STANDBY_BASE 0xff030000
33*4882a593Smuzhiyun #define PMU_BASS_ADDR 0xff520000
34*4882a593Smuzhiyun #define SERVICE_MSCH_BASE 0xff5c8000
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun struct rk3308_ddr_gd ddr_gd = {
37*4882a593Smuzhiyun #include "sdram-rk3308-ddr-skew.inc"
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun struct sdram_params sdram_configs[] = {
41*4882a593Smuzhiyun #if (CONFIG_ROCKCHIP_TPL_INIT_DRAM_TYPE == 3)
42*4882a593Smuzhiyun #include "sdram_inc/rk3308/sdram-rk3308-ddr3-detect-589.inc"
43*4882a593Smuzhiyun #elif (CONFIG_ROCKCHIP_TPL_INIT_DRAM_TYPE == 2)
44*4882a593Smuzhiyun #include "sdram_inc/rk3308/sdram-rk3308-ddr2-detect-451.inc"
45*4882a593Smuzhiyun #elif (CONFIG_ROCKCHIP_TPL_INIT_DRAM_TYPE == 5)
46*4882a593Smuzhiyun #include "sdram_inc/rk3308/sdram-rk3308-lpddr2-detect-451.inc"
47*4882a593Smuzhiyun #endif
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define DDR3_DDR2_ODT_DISABLE_FREQ (666)
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun #define DDR2_TRFC_256MBIT (75)
53*4882a593Smuzhiyun #define DDR2_TRFC_512MBIT (105)
54*4882a593Smuzhiyun #define DDR2_TRFC_1GBIT (128)
55*4882a593Smuzhiyun #define DDR2_TRFC_2GBIT (195)
56*4882a593Smuzhiyun #define DDR2_TRFC_4GBIT (328)
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #define DDR3_TRFC_512MBIT (90)
59*4882a593Smuzhiyun #define DDR3_TRFC_1GBIT (110)
60*4882a593Smuzhiyun #define DDR3_TRFC_2GBIT (160)
61*4882a593Smuzhiyun #define DDR3_TRFC_4GBIT (300)
62*4882a593Smuzhiyun #define DDR3_TRFC_8GBIT (350)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun #define LPDDR2_TRFC_8GBIT (210) /*ns*/
65*4882a593Smuzhiyun #define LPDDR2_TRFC_4GBIT (130) /*ns*/
66*4882a593Smuzhiyun #define LPDDR2_TREC_512MBIT (90) /*ns*/
67*4882a593Smuzhiyun
enable_ddr_io_ret(struct dram_info * priv)68*4882a593Smuzhiyun void enable_ddr_io_ret(struct dram_info *priv)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun rk_clrsetreg(&priv->pmu->sft_con_lo, DDR_IO_RET_CFG_MASK,
71*4882a593Smuzhiyun DDR_IO_RET_CFG << DDR_IO_RET_CFG_SHIFT);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun rk_clrsetreg(&priv->grf->upctl_con0, GRF_DDR_16BIT_EN_MASK,
74*4882a593Smuzhiyun GRF_DDR_16BIT_EN << GRF_DDR_16BIT_EN_SHIFT);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
pll_set(u32 pll_type,struct dram_info * priv,struct rockchip_pll_rate_table * pll_priv)77*4882a593Smuzhiyun void pll_set(u32 pll_type, struct dram_info *priv,
78*4882a593Smuzhiyun struct rockchip_pll_rate_table *pll_priv)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun /* pll power down */
81*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->pll[pll_type].con1, PLLPD0_MASK,
82*4882a593Smuzhiyun PLLPD0_POWER_DOWN << PLLPD0_SHIFT);
83*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->pll[pll_type].con1,
84*4882a593Smuzhiyun DSMPD_MASK, pll_priv->dsmpd << DSMPD_SHIFT);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun /* set pll freq */
87*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->pll[pll_type].con0,
88*4882a593Smuzhiyun FBDIV_MASK | POSTDIV1_MASK,
89*4882a593Smuzhiyun pll_priv->fbdiv << FBDIV_SHIFT |
90*4882a593Smuzhiyun pll_priv->postdiv1 << POSTDIV1_SHIFT);
91*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->pll[pll_type].con1,
92*4882a593Smuzhiyun POSTDIV2_MASK | REFDIV_MASK,
93*4882a593Smuzhiyun pll_priv->postdiv2 << POSTDIV2_SHIFT |
94*4882a593Smuzhiyun pll_priv->refdiv << REFDIV_SHIFT);
95*4882a593Smuzhiyun writel(pll_priv->frac << FRACDIV_SHIFT,
96*4882a593Smuzhiyun &priv->cru->pll[pll_type].con2);
97*4882a593Smuzhiyun /* pll power up */
98*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->pll[pll_type].con1, PLLPD0_MASK,
99*4882a593Smuzhiyun PLLPD0_NO_POWER_DOWN << PLLPD0_SHIFT);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* wait until pll lock */
102*4882a593Smuzhiyun while (!(readl(&priv->cru->pll[pll_type].con1) &
103*4882a593Smuzhiyun (1u << PLL_LOCK_SHIFT)))
104*4882a593Smuzhiyun udelay(1);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
rkdclk_init(struct dram_info * priv,struct sdram_params * params_priv)107*4882a593Smuzhiyun void rkdclk_init(struct dram_info *priv,
108*4882a593Smuzhiyun struct sdram_params *params_priv)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun u32 ddr_pll_sel;
111*4882a593Smuzhiyun u32 ddr_phy_div_con;
112*4882a593Smuzhiyun u32 uart_div[5] = {15, 15, 15, 15, 15};
113*4882a593Smuzhiyun struct rockchip_pll_rate_table rk3308_pll_div;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /* DPLL VPLL0 VPLL1 mode in 24MHz*/
116*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL1_WORK_MODE_MASK,
117*4882a593Smuzhiyun VPLL1_WORK_MODE_XIN_OSC0 << VPLL1_WORK_MODE_SHIFT);
118*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL0_WORK_MODE_MASK,
119*4882a593Smuzhiyun VPLL0_WORK_MODE_XIN_OSC0 << VPLL0_WORK_MODE_SHIFT);
120*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, DPLL_WORK_MODE_MASK,
121*4882a593Smuzhiyun DPLL_WORK_MODE_XIN_OSC0 << DPLL_WORK_MODE_SHIFT);
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* set PLL without level shift */
124*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL1_CLK_SEL_MASK,
125*4882a593Smuzhiyun VPLL1_CLK_SEL_WITHOUT_LVL_SHIFT << VPLL1_CLK_SEL_SHIFT);
126*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL0_CLK_SEL_MASK,
127*4882a593Smuzhiyun VPLL0_CLK_SEL_WITHOUT_LVL_SHIFT << VPLL0_CLK_SEL_SHIFT);
128*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, DPLL_CLK_SEL_MASK,
129*4882a593Smuzhiyun DPLL_CLK_SEL_WITHOUT_LVL_SHIFT << DPLL_CLK_SEL_SHIFT);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* set vpll1 in 903.168MHz vco = 1.806GHz */
132*4882a593Smuzhiyun rk3308_pll_div.refdiv = 2;
133*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 150;
134*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 2;
135*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
136*4882a593Smuzhiyun rk3308_pll_div.frac = 0x872B02;
137*4882a593Smuzhiyun rk3308_pll_div.dsmpd = 0;
138*4882a593Smuzhiyun pll_set(VPLL1, priv, &rk3308_pll_div);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq == 393) {
141*4882a593Smuzhiyun /* set vpll0 in 786.432MHz vco = 3.146GHz */
142*4882a593Smuzhiyun rk3308_pll_div.refdiv = 2;
143*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 262;
144*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 4;
145*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
146*4882a593Smuzhiyun rk3308_pll_div.frac = 0x24DD2F;
147*4882a593Smuzhiyun rk3308_pll_div.dsmpd = 0;
148*4882a593Smuzhiyun } else {
149*4882a593Smuzhiyun /* set vpll0 in 1179.648MHz, vco = 2.359GHz*/
150*4882a593Smuzhiyun rk3308_pll_div.refdiv = 2;
151*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 196;
152*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 2;
153*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
154*4882a593Smuzhiyun rk3308_pll_div.frac = 0x9BA5E3;
155*4882a593Smuzhiyun rk3308_pll_div.dsmpd = 0;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun pll_set(VPLL0, priv, &rk3308_pll_div);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq == 800) {
160*4882a593Smuzhiyun ddr_pll_sel = 0;
161*4882a593Smuzhiyun ddr_phy_div_con = 0;
162*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 589) {
163*4882a593Smuzhiyun ddr_pll_sel = 1;
164*4882a593Smuzhiyun ddr_phy_div_con = 0;
165*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 451) {
166*4882a593Smuzhiyun ddr_pll_sel = 2;
167*4882a593Smuzhiyun ddr_phy_div_con = 0;
168*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 393) {
169*4882a593Smuzhiyun ddr_pll_sel = 1;
170*4882a593Smuzhiyun ddr_phy_div_con = 0;
171*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 294) {
172*4882a593Smuzhiyun ddr_pll_sel = 1;
173*4882a593Smuzhiyun ddr_phy_div_con = 1;
174*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 225) {
175*4882a593Smuzhiyun ddr_pll_sel = 2;
176*4882a593Smuzhiyun ddr_phy_div_con = 1;
177*4882a593Smuzhiyun } else {
178*4882a593Smuzhiyun printascii("err\n");
179*4882a593Smuzhiyun while (1)
180*4882a593Smuzhiyun ;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* dpll default set in 1300MHz */
184*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq == 800) {
185*4882a593Smuzhiyun /* set dpll in 1584 MHz ,vco=3.168G*/
186*4882a593Smuzhiyun rk3308_pll_div.refdiv = 1;
187*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 132;
188*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 2;
189*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
190*4882a593Smuzhiyun rk3308_pll_div.frac = 0;
191*4882a593Smuzhiyun rk3308_pll_div.dsmpd = 1;
192*4882a593Smuzhiyun } else {
193*4882a593Smuzhiyun /* 1300000000,vco = 1.3GHz */
194*4882a593Smuzhiyun rk3308_pll_div.refdiv = 6;
195*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 325;
196*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 1;
197*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
198*4882a593Smuzhiyun rk3308_pll_div.frac = 0;
199*4882a593Smuzhiyun rk3308_pll_div.dsmpd = 1;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun pll_set(DPLL, priv, &rk3308_pll_div);
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /* set ddrphy freq */
205*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[1],
206*4882a593Smuzhiyun DDRPHY4X_PLL_CLK_SEL_MASK | DDRPHY4X_DIV_CON_MASK,
207*4882a593Smuzhiyun ddr_pll_sel << DDRPHY4X_PLL_CLK_SEL_SHIFT |
208*4882a593Smuzhiyun ddr_phy_div_con << DDRPHY4X_DIV_CON_SIHFT);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun /* set aclk_bus 216.7MHz */
211*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[5],
212*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_MASK | ACLK_BUS_DIV_CON_MASK,
213*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_DPLL << A_H_PCLK_BUS_PLL_SEL_SHIFT |
214*4882a593Smuzhiyun ACLK_BUS_DIV_CON_5 << ACLK_BUS_DIV_CON_SHIFT);
215*4882a593Smuzhiyun /* set pclk_bus 50MHz,hclk_bus 92.857MHz */
216*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[6],
217*4882a593Smuzhiyun PCLK_BUS_DIV_CON_MASK | HCLK_BUS_DIV_CON_MASK,
218*4882a593Smuzhiyun PCLK_BUS_DIV_CON_25 << PCLK_BUS_DIV_CON_SHIFT |
219*4882a593Smuzhiyun HCLK_BUS_DIV_CON_13 << HCLK_BUS_DIV_CON_SHIFT);
220*4882a593Smuzhiyun /* set crypto 92.857MHz,crypto_apk 92.857MHz */
221*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[7],
222*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_MASK | CLK_CRYPTO_APK_DIV_MASK |
223*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_MASK | CLK_CRYPTO_DIV_CON_MASK,
224*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_DPLL << CLK_CRYPTO_APK_SEL_SHIFT |
225*4882a593Smuzhiyun CLK_CRYPTO_APK_DIV_13 << CLK_CRYPTO_APK_DIV_SHIFT |
226*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_DPLL << CLK_CRYPTO_PLL_SEL_SHIFT |
227*4882a593Smuzhiyun CLK_CRYPTO_DIV_CON_13 << CLK_CRYPTO_DIV_CON_SHIFT);
228*4882a593Smuzhiyun /* set aclk_peri 216.7MHz */
229*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[36],
230*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_MASK | ACLK_PERI_DIV_CON_MASK,
231*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_DPLL << A_H_P_PERI_PLL_SEL_SHIFT |
232*4882a593Smuzhiyun ACLK_PERI_DIV_CON_5 << ACLK_PERI_DIV_CON_SHIFT);
233*4882a593Smuzhiyun /* set hclk_peri 92.857MHz,pclk_peri 46.428MHz */
234*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[37],
235*4882a593Smuzhiyun PCLK_PERI_DIV_CON_MASK | HCLK_PERI_DIV_CON_MASK,
236*4882a593Smuzhiyun PCLK_PERI_DIV_CON_27 << PCLK_PERI_DIV_CON_SHIFT |
237*4882a593Smuzhiyun HCLK_PERI_DIV_CON_13 << HCLK_PERI_DIV_CON_SHIFT);
238*4882a593Smuzhiyun /* set NANDC 92.857MHz */
239*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[38],
240*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_MASK |
241*4882a593Smuzhiyun CLK_NANDC_DIV_CON_MASK,
242*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_DPLL << CLK_NANDC_PLL_SEL_SHIFT |
243*4882a593Smuzhiyun CLK_NANDC_DIV_CON_13 << CLK_NANDC_DIV_CON_SHIFT);
244*4882a593Smuzhiyun /* set SDMMC 46.4/(internal freq_div 2)=23.2MHz */
245*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[39],
246*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_MASK |
247*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_MASK,
248*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_DPLL << CLK_SDMMC_PLL_SEL_SHIFT |
249*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_27 << CLK_SDMMC_DIV_CON_SHIFT);
250*4882a593Smuzhiyun /* set emmc 46.4/(internal freq_div 2)=23.2MHz */
251*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[41],
252*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_MASK |
253*4882a593Smuzhiyun CLK_EMMC_DIV_CON_MASK,
254*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_DPLL << CLK_EMMC_PLL_SEL_SHIFT |
255*4882a593Smuzhiyun CLK_EMMC_DIV_CON_27 << CLK_EMMC_DIV_CON_SHIFT);
256*4882a593Smuzhiyun /* set SFC 24.07/(internal freq_div 2)=12.0MHz */
257*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[42],
258*4882a593Smuzhiyun CLK_SFC_PLL_SEL_MASK | CLK_SFC_DIV_CON_MASK,
259*4882a593Smuzhiyun CLK_SFC_PLL_SEL_DPLL << CLK_SFC_PLL_SEL_SHIFT |
260*4882a593Smuzhiyun CLK_SFC_DIV_CON_53 << CLK_SFC_DIV_CON_SHIFT);
261*4882a593Smuzhiyun #if defined(CONFIG_DPLL_FREQ_1200MHZ)
262*4882a593Smuzhiyun /*vco=1.2GHz*/
263*4882a593Smuzhiyun rk3308_pll_div.refdiv = 2;
264*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 100;
265*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 1;
266*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
267*4882a593Smuzhiyun rk3308_pll_div.frac = 0;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun /* set dpll in 1200 MHz */
270*4882a593Smuzhiyun pll_set(DPLL, priv, &rk3308_pll_div);
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun /* set aclk_bus 200MHz */
273*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[5],
274*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_MASK | ACLK_BUS_DIV_CON_MASK,
275*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_DPLL << A_H_PCLK_BUS_PLL_SEL_SHIFT |
276*4882a593Smuzhiyun ACLK_BUS_DIV_CON_5 << ACLK_BUS_DIV_CON_SHIFT);
277*4882a593Smuzhiyun /* set pclk_bus 46.15MHz,hclk_bus 100MHz */
278*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[6],
279*4882a593Smuzhiyun PCLK_BUS_DIV_CON_MASK | HCLK_BUS_DIV_CON_MASK,
280*4882a593Smuzhiyun PCLK_BUS_DIV_CON_25 << PCLK_BUS_DIV_CON_SHIFT |
281*4882a593Smuzhiyun HCLK_BUS_DIV_CON_11 << HCLK_BUS_DIV_CON_SHIFT);
282*4882a593Smuzhiyun /* set crypto,crypto_apk 100MHz */
283*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[7],
284*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_MASK | CLK_CRYPTO_APK_DIV_MASK |
285*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_MASK | CLK_CRYPTO_DIV_CON_MASK,
286*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_DPLL << CLK_CRYPTO_APK_SEL_SHIFT |
287*4882a593Smuzhiyun CLK_CRYPTO_APK_DIV_11 << CLK_CRYPTO_APK_DIV_SHIFT |
288*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_DPLL << CLK_CRYPTO_PLL_SEL_SHIFT |
289*4882a593Smuzhiyun CLK_CRYPTO_DIV_CON_11 << CLK_CRYPTO_DIV_CON_SHIFT);
290*4882a593Smuzhiyun /* set aclk_peri 200MHz */
291*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[36],
292*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_MASK | ACLK_PERI_DIV_CON_MASK,
293*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_DPLL << A_H_P_PERI_PLL_SEL_SHIFT |
294*4882a593Smuzhiyun ACLK_PERI_DIV_CON_5 << ACLK_PERI_DIV_CON_SHIFT);
295*4882a593Smuzhiyun /* set hclk_peri 100MHz,pclk_peri 50MHz */
296*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[37],
297*4882a593Smuzhiyun PCLK_PERI_DIV_CON_MASK | HCLK_PERI_DIV_CON_MASK,
298*4882a593Smuzhiyun PCLK_PERI_DIV_CON_23 << PCLK_PERI_DIV_CON_SHIFT |
299*4882a593Smuzhiyun HCLK_PERI_DIV_CON_11 << HCLK_PERI_DIV_CON_SHIFT);
300*4882a593Smuzhiyun /* set NANDC 100MHz */
301*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[38],
302*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_MASK |
303*4882a593Smuzhiyun CLK_NANDC_DIV_CON_MASK,
304*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_DPLL << CLK_NANDC_PLL_SEL_SHIFT |
305*4882a593Smuzhiyun CLK_NANDC_DIV_CON_11 << CLK_NANDC_DIV_CON_SHIFT);
306*4882a593Smuzhiyun /* set SDMMC 50MHz */
307*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[39],
308*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_MASK |
309*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_MASK,
310*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_DPLL << CLK_SDMMC_PLL_SEL_SHIFT |
311*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_23 << CLK_SDMMC_DIV_CON_SHIFT);
312*4882a593Smuzhiyun /* set emmc 50MHz */
313*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[41],
314*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_MASK |
315*4882a593Smuzhiyun CLK_EMMC_DIV_CON_MASK,
316*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_DPLL << CLK_EMMC_PLL_SEL_SHIFT |
317*4882a593Smuzhiyun CLK_EMMC_DIV_CON_23 << CLK_EMMC_DIV_CON_SHIFT);
318*4882a593Smuzhiyun /* set SFC 24MHz */
319*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[42],
320*4882a593Smuzhiyun CLK_SFC_PLL_SEL_MASK | CLK_SFC_DIV_CON_MASK,
321*4882a593Smuzhiyun CLK_SFC_PLL_SEL_DPLL << CLK_SFC_PLL_SEL_SHIFT |
322*4882a593Smuzhiyun CLK_SFC_DIV_CON_49 << CLK_SFC_DIV_CON_SHIFT);
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun #elif defined(CONFIG_DPLL_FREQ_748MHZ)
325*4882a593Smuzhiyun /*vco=1.5GHz*/
326*4882a593Smuzhiyun rk3308_pll_div.refdiv = 6;
327*4882a593Smuzhiyun rk3308_pll_div.fbdiv = 374;
328*4882a593Smuzhiyun rk3308_pll_div.postdiv1 = 2;
329*4882a593Smuzhiyun rk3308_pll_div.postdiv2 = 1;
330*4882a593Smuzhiyun rk3308_pll_div.frac = 0;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun /* set dpll in 748 MHz */
333*4882a593Smuzhiyun pll_set(DPLL, priv, &rk3308_pll_div);
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun /* set aclk_bus 187MHz */
336*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[5],
337*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_MASK | ACLK_BUS_DIV_CON_MASK,
338*4882a593Smuzhiyun A_H_PCLK_BUS_PLL_SEL_DPLL << A_H_PCLK_BUS_PLL_SEL_SHIFT |
339*4882a593Smuzhiyun ACLK_BUS_DIV_CON_3 << ACLK_BUS_DIV_CON_SHIFT);
340*4882a593Smuzhiyun /* set pclk_bus 46.75MHz,hclk_bus 93.5MHz */
341*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[6],
342*4882a593Smuzhiyun PCLK_BUS_DIV_CON_MASK | HCLK_BUS_DIV_CON_MASK,
343*4882a593Smuzhiyun PCLK_BUS_DIV_CON_15 << PCLK_BUS_DIV_CON_SHIFT |
344*4882a593Smuzhiyun HCLK_BUS_DIV_CON_7 << HCLK_BUS_DIV_CON_SHIFT);
345*4882a593Smuzhiyun /* set crypto,crypto_apk 93.5MHz */
346*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[7],
347*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_MASK | CLK_CRYPTO_APK_DIV_MASK |
348*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_MASK | CLK_CRYPTO_DIV_CON_MASK,
349*4882a593Smuzhiyun CLK_CRYPTO_APK_SEL_DPLL << CLK_CRYPTO_APK_SEL_SHIFT |
350*4882a593Smuzhiyun CLK_CRYPTO_APK_DIV_7 << CLK_CRYPTO_APK_DIV_SHIFT |
351*4882a593Smuzhiyun CLK_CRYPTO_PLL_SEL_DPLL << CLK_CRYPTO_PLL_SEL_SHIFT |
352*4882a593Smuzhiyun CLK_CRYPTO_DIV_CON_7 << CLK_CRYPTO_DIV_CON_SHIFT);
353*4882a593Smuzhiyun /* set aclk_peri 187MHz */
354*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[36],
355*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_MASK | ACLK_PERI_DIV_CON_MASK,
356*4882a593Smuzhiyun A_H_P_PERI_PLL_SEL_DPLL << A_H_P_PERI_PLL_SEL_SHIFT |
357*4882a593Smuzhiyun ACLK_PERI_DIV_CON_3 << ACLK_PERI_DIV_CON_SHIFT);
358*4882a593Smuzhiyun /* set hclk_peri 93.5MHz,pclk_peri 46.75MHz */
359*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[37],
360*4882a593Smuzhiyun PCLK_PERI_DIV_CON_MASK | HCLK_PERI_DIV_CON_MASK,
361*4882a593Smuzhiyun PCLK_PERI_DIV_CON_15 << PCLK_PERI_DIV_CON_SHIFT |
362*4882a593Smuzhiyun HCLK_PERI_DIV_CON_7 << HCLK_PERI_DIV_CON_SHIFT);
363*4882a593Smuzhiyun /* set NANDC 93.5MHz */
364*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[38],
365*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_MASK |
366*4882a593Smuzhiyun CLK_NANDC_DIV_CON_MASK,
367*4882a593Smuzhiyun CLK_NANDC_SEL50_ALWAYS << CLK_NANDC_SEL50_SHIFT |
368*4882a593Smuzhiyun CLK_NANDC_PLL_SEL_DPLL << CLK_NANDC_PLL_SEL_SHIFT |
369*4882a593Smuzhiyun CLK_NANDC_DIV_CON_7 << CLK_NANDC_DIV_CON_SHIFT);
370*4882a593Smuzhiyun /* set NANDC 46.75MHz */
371*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[39],
372*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_MASK |
373*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_MASK,
374*4882a593Smuzhiyun CLK_SDMMC_PLL_SEL_DPLL << CLK_SDMMC_PLL_SEL_SHIFT |
375*4882a593Smuzhiyun CLK_SDMMC_DIV_CON_15 << CLK_SDMMC_DIV_CON_SHIFT);
376*4882a593Smuzhiyun /* set emmc 46.75MHz */
377*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[41],
378*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_MASK |
379*4882a593Smuzhiyun CLK_EMMC_DIV_CON_MASK,
380*4882a593Smuzhiyun CLK_EMMC_PLL_SEL_DPLL << CLK_EMMC_PLL_SEL_SHIFT |
381*4882a593Smuzhiyun CLK_EMMC_DIV_CON_15 << CLK_EMMC_DIV_CON_SHIFT);
382*4882a593Smuzhiyun /* set SFC 23.375MHz */
383*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[42],
384*4882a593Smuzhiyun CLK_SFC_PLL_SEL_MASK | CLK_SFC_DIV_CON_MASK,
385*4882a593Smuzhiyun CLK_SFC_PLL_SEL_DPLL << CLK_SFC_PLL_SEL_SHIFT |
386*4882a593Smuzhiyun CLK_SFC_DIV_CON_31 << CLK_SFC_DIV_CON_SHIFT);
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun #endif
389*4882a593Smuzhiyun /* set spdif tx lower than 100Mhz */
390*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[48],
391*4882a593Smuzhiyun CLK_SPDIFTX_DIV_CON_MASK,
392*4882a593Smuzhiyun CLK_SPDIFTX_DIV_CON_15 << CLK_SPDIFTX_DIV_CON_SHIFT);
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun if (UART_INFO_ID(ddr_gd.head_info.g_uart_info) < 5)
395*4882a593Smuzhiyun uart_div[UART_INFO_ID(ddr_gd.head_info.g_uart_info)] = 0;
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /* set uart0~4 lower than 100Mhz */
398*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[10],
399*4882a593Smuzhiyun CLK_UART0_DIV_CON_MASK,
400*4882a593Smuzhiyun uart_div[0] << CLK_UART0_DIV_CON_SHIFT);
401*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[13],
402*4882a593Smuzhiyun CLK_UART1_DIV_CON_MASK,
403*4882a593Smuzhiyun uart_div[1] << CLK_UART1_DIV_CON_SHIFT);
404*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[16],
405*4882a593Smuzhiyun CLK_UART2_DIV_CON_MASK,
406*4882a593Smuzhiyun uart_div[2] << CLK_UART2_DIV_CON_SHIFT);
407*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[19],
408*4882a593Smuzhiyun CLK_UART3_DIV_CON_MASK,
409*4882a593Smuzhiyun uart_div[3] << CLK_UART3_DIV_CON_SHIFT);
410*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->clksel_con[22],
411*4882a593Smuzhiyun CLK_UART4_DIV_CON_MASK,
412*4882a593Smuzhiyun uart_div[4] << CLK_UART4_DIV_CON_SHIFT);
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun /* pll clk in pll out */
415*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL1_WORK_MODE_MASK,
416*4882a593Smuzhiyun VPLL1_WORK_MODE_PLL << VPLL1_WORK_MODE_SHIFT);
417*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, VPLL0_WORK_MODE_MASK,
418*4882a593Smuzhiyun VPLL0_WORK_MODE_PLL << VPLL0_WORK_MODE_SHIFT);
419*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->mode, DPLL_WORK_MODE_MASK,
420*4882a593Smuzhiyun DPLL_WORK_MODE_PLL << DPLL_WORK_MODE_SHIFT);
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
phy_pctrl_reset_cru(struct dram_info * priv)423*4882a593Smuzhiyun void phy_pctrl_reset_cru(struct dram_info *priv)
424*4882a593Smuzhiyun {
425*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->softrst_con[1],
426*4882a593Smuzhiyun PRESETN_DDRPHY_REQ_MASK | RESETN_DDRPHYDIV_REQ_MASK |
427*4882a593Smuzhiyun RESETN_DDRPHY_REQ_MASK | PRESETN_DDRUPCTL_REQ_MASK |
428*4882a593Smuzhiyun RESETN_DDRUPCTL_REQ_MASK,
429*4882a593Smuzhiyun PRESETN_DDRPHY_REQ_EN << PRESETN_DDRPHY_REQ_SHIFT |
430*4882a593Smuzhiyun RESETN_DDRPHYDIV_REQ_EN << RESETN_DDRPHYDIV_REQ_SHIFT |
431*4882a593Smuzhiyun RESETN_DDRPHY_REQ_EN << RESETN_DDRPHY_REQ_SHIFT |
432*4882a593Smuzhiyun PRESETN_DDRUPCTL_REQ_EN << PRESETN_DDRUPCTL_REQ_SHIFT |
433*4882a593Smuzhiyun RESETN_DDRUPCTL_REQ_EN << RESETN_DDRUPCTL_REQ_SHIFT);
434*4882a593Smuzhiyun udelay(10);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->softrst_con[1],
437*4882a593Smuzhiyun PRESETN_DDRPHY_REQ_MASK | RESETN_DDRPHYDIV_REQ_MASK |
438*4882a593Smuzhiyun RESETN_DDRPHY_REQ_MASK,
439*4882a593Smuzhiyun PRESETN_DDRPHY_REQ_DIS << PRESETN_DDRPHY_REQ_SHIFT |
440*4882a593Smuzhiyun RESETN_DDRPHYDIV_REQ_DIS << RESETN_DDRPHYDIV_REQ_SHIFT |
441*4882a593Smuzhiyun RESETN_DDRPHY_REQ_DIS << RESETN_DDRPHY_REQ_SHIFT);
442*4882a593Smuzhiyun udelay(10);
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun rk_clrsetreg(&priv->cru->softrst_con[1],
445*4882a593Smuzhiyun PRESETN_DDRUPCTL_REQ_MASK | RESETN_DDRUPCTL_REQ_MASK,
446*4882a593Smuzhiyun PRESETN_DDRUPCTL_REQ_DIS << PRESETN_DDRUPCTL_REQ_SHIFT |
447*4882a593Smuzhiyun RESETN_DDRUPCTL_REQ_DIS << RESETN_DDRUPCTL_REQ_SHIFT);
448*4882a593Smuzhiyun udelay(10);
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
pctl_cfg_grf(struct dram_info * priv,struct sdram_params * params_priv)451*4882a593Smuzhiyun void pctl_cfg_grf(struct dram_info *priv,
452*4882a593Smuzhiyun struct sdram_params *params_priv)
453*4882a593Smuzhiyun {
454*4882a593Smuzhiyun if (params_priv->ddr_config_t.ddr_type == DDR3 ||
455*4882a593Smuzhiyun params_priv->ddr_config_t.ddr_type == DDR2)
456*4882a593Smuzhiyun rk_clrsetreg(&priv->grf->soc_con12, NOC_MSCH_MAINDDR3_MASK,
457*4882a593Smuzhiyun NOC_MSCH_MAINDDR3_EN << NOC_MSCH_MAINDDR3_SHIFT);
458*4882a593Smuzhiyun else
459*4882a593Smuzhiyun rk_clrsetreg(&priv->grf->soc_con12, NOC_MSCH_MAINDDR3_MASK,
460*4882a593Smuzhiyun NOC_MSCH_MAINDDR3_DIS << NOC_MSCH_MAINDDR3_SHIFT);
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
ddr_msch_cfg(struct dram_info * priv,struct sdram_params * params_priv)463*4882a593Smuzhiyun void ddr_msch_cfg(struct dram_info *priv,
464*4882a593Smuzhiyun struct sdram_params *params_priv)
465*4882a593Smuzhiyun {
466*4882a593Smuzhiyun writel(BWRATIO_HALF_BW | params_priv->ddr_timing_t.noc_timing.d32,
467*4882a593Smuzhiyun &priv->service_msch->ddrtiming);
468*4882a593Smuzhiyun writel(params_priv->ddr_timing_t.readlatency,
469*4882a593Smuzhiyun &priv->service_msch->readlatency);
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun
ddr_msch_cfg_rbc(struct sdram_params * params_priv,struct dram_info * priv)472*4882a593Smuzhiyun void ddr_msch_cfg_rbc(struct sdram_params *params_priv,
473*4882a593Smuzhiyun struct dram_info *priv)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun int i = 0;
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun if (params_priv->ddr_config_t.bank == 3) {
478*4882a593Smuzhiyun /* bank = 8 */
479*4882a593Smuzhiyun if (params_priv->ddr_config_t.col == 10)
480*4882a593Smuzhiyun i = 1;
481*4882a593Smuzhiyun else if (params_priv->ddr_config_t.col == 11)
482*4882a593Smuzhiyun i = 2;
483*4882a593Smuzhiyun else
484*4882a593Smuzhiyun goto msch_err;
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun } else if (params_priv->ddr_config_t.bank == 2) {
487*4882a593Smuzhiyun /* bank = 4 */
488*4882a593Smuzhiyun i = 0;
489*4882a593Smuzhiyun } else {
490*4882a593Smuzhiyun goto msch_err;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun writel(i, &priv->service_msch->ddrconf);
494*4882a593Smuzhiyun return;
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun msch_err:
497*4882a593Smuzhiyun printascii("msch_err\n");
498*4882a593Smuzhiyun while (1)
499*4882a593Smuzhiyun ;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
ddr_phy_skew_cfg(struct dram_info * priv)502*4882a593Smuzhiyun void ddr_phy_skew_cfg(struct dram_info *priv)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun copy_to_reg(&priv->phy->phy_reg_ca_skew[0],
505*4882a593Smuzhiyun &ddr_gd.ddr_skew.a0_a1_skew[0], 14 * 4);
506*4882a593Smuzhiyun copy_to_reg(&priv->phy->phy_reg_skew_cs0data[0],
507*4882a593Smuzhiyun &ddr_gd.ddr_skew.cs0_dm0_skew[0], 22 * 4);
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun writel(PHY_TX_DE_SKEW_EN << PHY_TX_DE_SKEW_SHIFT,
510*4882a593Smuzhiyun &priv->phy->phy_reg2);
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun
set_ds_odt(struct dram_info * priv,struct sdram_params * params_priv)513*4882a593Smuzhiyun void set_ds_odt(struct dram_info *priv,
514*4882a593Smuzhiyun struct sdram_params *params_priv)
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun /* set phy drive resistance */
517*4882a593Smuzhiyun writel(PHY_RON_RTT_56OHM, &priv->phy->phy_reg11);
518*4882a593Smuzhiyun clrsetbits_le32(&priv->phy->phy_reg12, CMD_PRCOMP_MASK,
519*4882a593Smuzhiyun PHY_RON_RTT_56OHM << CMD_PRCOMP_SHIFT);
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun writel(PHY_RON_RTT_45OHM, &priv->phy->phy_reg16);
522*4882a593Smuzhiyun writel(PHY_RON_RTT_45OHM, &priv->phy->phy_reg18);
523*4882a593Smuzhiyun writel(PHY_RON_RTT_56OHM, &priv->phy->phy_reg20);
524*4882a593Smuzhiyun writel(PHY_RON_RTT_56OHM, &priv->phy->phy_reg2f);
525*4882a593Smuzhiyun writel(PHY_RON_RTT_56OHM, &priv->phy->phy_reg30);
526*4882a593Smuzhiyun writel(PHY_RON_RTT_56OHM, &priv->phy->phy_reg3f);
527*4882a593Smuzhiyun if (params_priv->ddr_config_t.ddr_type == LPDDR2) {
528*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg21);
529*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg2e);
530*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg31);
531*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg3e);
532*4882a593Smuzhiyun } else {
533*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq >
534*4882a593Smuzhiyun DDR3_DDR2_ODT_DISABLE_FREQ) {
535*4882a593Smuzhiyun /*set phy odt*/
536*4882a593Smuzhiyun writel(PHY_RON_RTT_225OHM, &priv->phy->phy_reg21);
537*4882a593Smuzhiyun writel(PHY_RON_RTT_225OHM, &priv->phy->phy_reg2e);
538*4882a593Smuzhiyun writel(PHY_RON_RTT_225OHM, &priv->phy->phy_reg31);
539*4882a593Smuzhiyun writel(PHY_RON_RTT_225OHM, &priv->phy->phy_reg3e);
540*4882a593Smuzhiyun } else {
541*4882a593Smuzhiyun /*disable phy odt*/
542*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg21);
543*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg2e);
544*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg31);
545*4882a593Smuzhiyun writel(PHY_RON_RTT_DISABLE, &priv->phy->phy_reg3e);
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun
ddr_phy_dqs_rx_dll_cfg(struct dram_info * priv,u32 freq)550*4882a593Smuzhiyun void ddr_phy_dqs_rx_dll_cfg(struct dram_info *priv, u32 freq)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun if (freq > 736) {
553*4882a593Smuzhiyun /* 22.5 degree delay */
554*4882a593Smuzhiyun writel(LEFT_CHN_A_READ_DQS_22_5_DELAY, &priv->phy->phy_reg28);
555*4882a593Smuzhiyun writel(RIGHT_CHN_A_READ_DQS_22_5_DELAY, &priv->phy->phy_reg38);
556*4882a593Smuzhiyun } else {
557*4882a593Smuzhiyun /* 45 degree delay */
558*4882a593Smuzhiyun writel(LEFT_CHN_A_READ_DQS_45_DELAY, &priv->phy->phy_reg28);
559*4882a593Smuzhiyun writel(RIGHT_CHN_A_READ_DQS_45_DELAY, &priv->phy->phy_reg38);
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun
ddr_msch_get_max_col(struct dram_info * priv,struct ddr_schedule * sch_priv)563*4882a593Smuzhiyun void ddr_msch_get_max_col(struct dram_info *priv,
564*4882a593Smuzhiyun struct ddr_schedule *sch_priv)
565*4882a593Smuzhiyun {
566*4882a593Smuzhiyun writel(2, &priv->service_msch->ddrconf);
567*4882a593Smuzhiyun sch_priv->col = 11;
568*4882a593Smuzhiyun sch_priv->bank = 3;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun
ddr_msch_get_max_row(struct dram_info * priv,struct ddr_schedule * sch_priv)571*4882a593Smuzhiyun void ddr_msch_get_max_row(struct dram_info *priv,
572*4882a593Smuzhiyun struct ddr_schedule *sch_priv)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun writel(1, &priv->service_msch->ddrconf);
575*4882a593Smuzhiyun sch_priv->row = 15;
576*4882a593Smuzhiyun sch_priv->col = 10;
577*4882a593Smuzhiyun sch_priv->bank = 3;
578*4882a593Smuzhiyun }
579*4882a593Smuzhiyun
enable_ddr_standby(struct dram_info * priv,struct sdram_params * params_priv)580*4882a593Smuzhiyun void enable_ddr_standby(struct dram_info *priv,
581*4882a593Smuzhiyun struct sdram_params *params_priv)
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun rk_clrsetreg(&priv->grf->upctl_con0, CYSYREQ_UPCTL_DDRSTDBY_MASK,
584*4882a593Smuzhiyun CYSYREQ_UPCTL_DDRSTDBY_EN <<
585*4882a593Smuzhiyun CYSYREQ_UPCTL_DDRSTDBY_SHIFT);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun /* CG_EXIT_TH is equal phy dll lock time when we gate phy 4x clk */
588*4882a593Smuzhiyun writel(CG_EXIT_TH << CG_EXIT_TH_SHIFT, &priv->standby->con1);
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun if (params_priv->stdby_idle == 128) {
591*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq == 451)
592*4882a593Smuzhiyun params_priv->stdby_idle = 105;
593*4882a593Smuzhiyun else if (params_priv->ddr_timing_t.freq == 393)
594*4882a593Smuzhiyun params_priv->stdby_idle = 10;
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun writel(params_priv->stdby_idle << IDLE_TH_SHIFT |
597*4882a593Smuzhiyun DDRPHY4X_GATE_EN << DDRPHY4X_GATE_SHIFT |
598*4882a593Smuzhiyun UPCTL_CORE_CLK_GATE_EN << UPCTL_CORE_CLK_GATE_SHIFT |
599*4882a593Smuzhiyun UPCTL_ACLK_GATE_EN << UPCTL_ACLK_GATE_SHIFT |
600*4882a593Smuzhiyun CTL_IDLR_EN << CTL_IDLR_SHIFT |
601*4882a593Smuzhiyun STDBY_EN << STDBY_EN_SHIFT, &priv->standby->con0);
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun while (1) {
604*4882a593Smuzhiyun if ((readl(&priv->standby->status0) &
605*4882a593Smuzhiyun STDBY_STATUS_MASK) == ST_STDBY) {
606*4882a593Smuzhiyun break;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
ddr_set_atags(void)611*4882a593Smuzhiyun void ddr_set_atags(void)
612*4882a593Smuzhiyun {
613*4882a593Smuzhiyun struct tag_serial t_serial;
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun memset(&t_serial, 0, sizeof(struct tag_serial));
616*4882a593Smuzhiyun #ifdef CONFIG_DRAM_INIT_BUILD
617*4882a593Smuzhiyun u32 uart_info;
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun t_serial.version = 0;
620*4882a593Smuzhiyun uart_info = ddr_gd.head_info.g_uart_info;
621*4882a593Smuzhiyun if (UART_INFO_ID(uart_info) >= MAX_UART_NUMBER_) {
622*4882a593Smuzhiyun t_serial.enable = 0;
623*4882a593Smuzhiyun } else {
624*4882a593Smuzhiyun t_serial.enable = 1;
625*4882a593Smuzhiyun t_serial.baudrate = UART_INFO_BAUD(uart_info);
626*4882a593Smuzhiyun t_serial.m_mode = UART_INFO_IOMUX(uart_info);
627*4882a593Smuzhiyun t_serial.id = UART_INFO_ID(uart_info);
628*4882a593Smuzhiyun if (UART_INFO_ID(uart_info) == 0)
629*4882a593Smuzhiyun t_serial.addr = UART0_BASE;
630*4882a593Smuzhiyun else if (UART_INFO_ID(uart_info) == 1)
631*4882a593Smuzhiyun t_serial.addr = UART1_BASE;
632*4882a593Smuzhiyun else if (UART_INFO_ID(uart_info) == 2)
633*4882a593Smuzhiyun t_serial.addr = UART2_BASE;
634*4882a593Smuzhiyun else if (UART_INFO_ID(uart_info) == 3)
635*4882a593Smuzhiyun t_serial.addr = UART3_BASE;
636*4882a593Smuzhiyun else
637*4882a593Smuzhiyun t_serial.addr = UART4_BASE;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun #else
640*4882a593Smuzhiyun /* set serial data to &t_serial */
641*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_UART_BASE)
642*4882a593Smuzhiyun t_serial.version = 0;
643*4882a593Smuzhiyun t_serial.enable = 1;
644*4882a593Smuzhiyun t_serial.addr = CONFIG_DEBUG_UART_BASE;
645*4882a593Smuzhiyun t_serial.baudrate = CONFIG_BAUDRATE;
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun #if (CONFIG_DEBUG_UART_BASE == 0xFF0A0000)
648*4882a593Smuzhiyun /* uart0 as debug uart */
649*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M0;
650*4882a593Smuzhiyun t_serial.id = 0;
651*4882a593Smuzhiyun #elif (CONFIG_DEBUG_UART_BASE == 0xFF0B0000)
652*4882a593Smuzhiyun /* uart1 as debug uart */
653*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M0;
654*4882a593Smuzhiyun t_serial.id = 1;
655*4882a593Smuzhiyun #elif (CONFIG_DEBUG_UART_BASE == 0xFF0C0000)
656*4882a593Smuzhiyun #if (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
657*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M0;
658*4882a593Smuzhiyun #elif (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
659*4882a593Smuzhiyun /* uart2 m1 as debug uart */
660*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M1;
661*4882a593Smuzhiyun #else
662*4882a593Smuzhiyun #error "Please select M0 or M1 for uart2 !!!"
663*4882a593Smuzhiyun #endif
664*4882a593Smuzhiyun t_serial.id = 2;
665*4882a593Smuzhiyun #elif (CONFIG_DEBUG_UART_BASE == 0xFF0D0000)
666*4882a593Smuzhiyun /* uart3 as debug uart */
667*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M0;
668*4882a593Smuzhiyun t_serial.id = 3;
669*4882a593Smuzhiyun #elif (CONFIG_DEBUG_UART_BASE == 0xFF0E0000)
670*4882a593Smuzhiyun /* uart4 as debug uart */
671*4882a593Smuzhiyun t_serial.m_mode = SERIAL_M_MODE_M0;
672*4882a593Smuzhiyun t_serial.id = 4;
673*4882a593Smuzhiyun #else
674*4882a593Smuzhiyun #error "Please select proper uart as debug uart !!!"
675*4882a593Smuzhiyun #endif
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun #endif /* defined(CONFIG_DEBUG_UART_BASE) */
678*4882a593Smuzhiyun #endif /* CONFIG_DRAM_INIT_BUILD */
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun /* First pre-loader must call it before atags_set_tag() */
681*4882a593Smuzhiyun atags_destroy();
682*4882a593Smuzhiyun atags_set_tag(ATAG_SERIAL, &t_serial);
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun
modify_sdram_params(struct dram_info * priv,struct sdram_params * params_priv)685*4882a593Smuzhiyun static void modify_sdram_params(struct dram_info *priv,
686*4882a593Smuzhiyun struct sdram_params *params_priv)
687*4882a593Smuzhiyun {
688*4882a593Smuzhiyun u32 tmp = 0;
689*4882a593Smuzhiyun u32 bw = 1;
690*4882a593Smuzhiyun u32 nMHz = params_priv->ddr_timing_t.freq;
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun size_t size = 1llu << (bw +
693*4882a593Smuzhiyun params_priv->ddr_config_t.col +
694*4882a593Smuzhiyun params_priv->ddr_config_t.cs0_row +
695*4882a593Smuzhiyun params_priv->ddr_config_t.bank);
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun move_to_config_state(priv);
698*4882a593Smuzhiyun switch (params_priv->ddr_config_t.ddr_type) {
699*4882a593Smuzhiyun case DDR2:
700*4882a593Smuzhiyun if (size <= 0x4000000)
701*4882a593Smuzhiyun tmp = DDR2_TRFC_512MBIT;
702*4882a593Smuzhiyun else if (size <= 0x8000000)
703*4882a593Smuzhiyun tmp = DDR2_TRFC_1GBIT;
704*4882a593Smuzhiyun else if (size <= 0x10000000)
705*4882a593Smuzhiyun tmp = DDR2_TRFC_2GBIT;
706*4882a593Smuzhiyun else
707*4882a593Smuzhiyun tmp = DDR2_TRFC_4GBIT;
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun priv->pctl->trfc = (tmp * nMHz + 999) / 1000;
710*4882a593Smuzhiyun tmp = (((tmp + 10) * nMHz + 999) / 1000);
711*4882a593Smuzhiyun if (tmp < 200)
712*4882a593Smuzhiyun tmp = 200;
713*4882a593Smuzhiyun priv->pctl->texsr = tmp & 0x3FF;
714*4882a593Smuzhiyun break;
715*4882a593Smuzhiyun case DDR3:
716*4882a593Smuzhiyun if (size <= 0x4000000)
717*4882a593Smuzhiyun tmp = DDR3_TRFC_512MBIT;
718*4882a593Smuzhiyun else if (size <= 0x8000000)
719*4882a593Smuzhiyun tmp = DDR3_TRFC_1GBIT;
720*4882a593Smuzhiyun else if (size <= 0x10000000)
721*4882a593Smuzhiyun tmp = DDR3_TRFC_2GBIT;
722*4882a593Smuzhiyun else if (size <= 0x20000000)
723*4882a593Smuzhiyun tmp = DDR3_TRFC_4GBIT;
724*4882a593Smuzhiyun else
725*4882a593Smuzhiyun tmp = DDR3_TRFC_8GBIT;
726*4882a593Smuzhiyun priv->pctl->trfc = (tmp * nMHz + 999) / 1000;
727*4882a593Smuzhiyun break;
728*4882a593Smuzhiyun case LPDDR2:
729*4882a593Smuzhiyun if (size <= 0x4000000)
730*4882a593Smuzhiyun tmp = LPDDR2_TREC_512MBIT;
731*4882a593Smuzhiyun else if (size <= 0x20000000)
732*4882a593Smuzhiyun tmp = LPDDR2_TRFC_4GBIT;
733*4882a593Smuzhiyun else
734*4882a593Smuzhiyun tmp = LPDDR2_TRFC_8GBIT;
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun priv->pctl->trfc = (tmp * nMHz + 999) / 1000;
737*4882a593Smuzhiyun tmp = (((tmp + 10) * nMHz + 999) / 1000);
738*4882a593Smuzhiyun if (tmp < 2)
739*4882a593Smuzhiyun tmp = 2;
740*4882a593Smuzhiyun priv->pctl->texsr = tmp & 0x3FF;
741*4882a593Smuzhiyun break;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun move_to_access_state(priv);
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun
check_rd_gate(struct dram_info * priv)746*4882a593Smuzhiyun int check_rd_gate(struct dram_info *priv)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun u32 max_val = 0;
749*4882a593Smuzhiyun u32 min_val = 0xff;
750*4882a593Smuzhiyun u32 gate[2];
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun gate[0] = readl(&priv->phy->phy_regfb);
753*4882a593Smuzhiyun gate[1] = readl(&priv->phy->phy_regfc);
754*4882a593Smuzhiyun max_val = max(gate[0], gate[1]);
755*4882a593Smuzhiyun min_val = min(gate[0], gate[1]);
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun if (max_val > 0x80 || min_val < 0x20)
758*4882a593Smuzhiyun return -1;
759*4882a593Smuzhiyun else
760*4882a593Smuzhiyun return 0;
761*4882a593Smuzhiyun }
762*4882a593Smuzhiyun
dram_test(u32 i,u32 dqs)763*4882a593Smuzhiyun static u32 dram_test(u32 i, u32 dqs)
764*4882a593Smuzhiyun {
765*4882a593Smuzhiyun for (phys_addr_t j = 4 * dqs; j < 0x2000; j += 8)
766*4882a593Smuzhiyun writel(PATTERN + i, j);
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun for (phys_addr_t j = 4 * dqs; j < 0x2000; j += 8)
769*4882a593Smuzhiyun if ((PATTERN + i) != readl(j))
770*4882a593Smuzhiyun return 1;
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun return 0;
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun /**
776*4882a593Smuzhiyun * modify_data_training() - Setting DQS gating calibration bypass,
777*4882a593Smuzhiyun * scanning data training range and then select center one.
778*4882a593Smuzhiyun */
779*4882a593Smuzhiyun #define PHY_REG3C(n) (0x10 * (n))
780*4882a593Smuzhiyun
modify_data_training(struct dram_info * priv,struct sdram_params * params_priv)781*4882a593Smuzhiyun void modify_data_training(struct dram_info *priv,
782*4882a593Smuzhiyun struct sdram_params *params_priv)
783*4882a593Smuzhiyun {
784*4882a593Smuzhiyun u32 value = 0;
785*4882a593Smuzhiyun u32 i = 0, dqs = 0;
786*4882a593Smuzhiyun u32 max_value = 0, min_value = 0;
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun writel(readl(&priv->phy->phy_regfb), &priv->phy->phy_reg2c);
789*4882a593Smuzhiyun writel(readl(&priv->phy->phy_regfc), &priv->phy->phy_reg3c);
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun /* DQS gating calibration bypass */
792*4882a593Smuzhiyun setbits_le32(&priv->phy->phy_reg2, BIT(1));
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun /* rk3308 only support DQS0, DQS1 */
795*4882a593Smuzhiyun for (dqs = 0; dqs < 2; dqs++) {
796*4882a593Smuzhiyun value = readl(&priv->phy->phy_regfb + dqs);
797*4882a593Smuzhiyun i = 0;
798*4882a593Smuzhiyun while (dram_test(i, dqs) == 0) {
799*4882a593Smuzhiyun i++;
800*4882a593Smuzhiyun writel(value + i,
801*4882a593Smuzhiyun &priv->phy->phy_reg2c + PHY_REG3C(dqs));
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun max_value = value + i - 1;
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun i = 1;
806*4882a593Smuzhiyun writel(value - i, &priv->phy->phy_reg2c + PHY_REG3C(dqs));
807*4882a593Smuzhiyun while (dram_test(i, dqs) == 0) {
808*4882a593Smuzhiyun i++;
809*4882a593Smuzhiyun writel(value - i,
810*4882a593Smuzhiyun &priv->phy->phy_reg2c + PHY_REG3C(dqs));
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun min_value = value - i + 1;
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun /* select center one as gate training result */
815*4882a593Smuzhiyun writel((max_value + min_value + 1) / 2,
816*4882a593Smuzhiyun &priv->phy->phy_reg2c + PHY_REG3C(dqs));
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun printascii("REG2C: 0x");
819*4882a593Smuzhiyun printhex8(readl(&priv->phy->phy_reg2c));
820*4882a593Smuzhiyun printascii(", 0x");
821*4882a593Smuzhiyun printhex8(readl(&priv->phy->phy_reg3c));
822*4882a593Smuzhiyun printascii("\n");
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun
enable_low_power(struct dram_info * priv,struct sdram_params * params_priv)825*4882a593Smuzhiyun void enable_low_power(struct dram_info *priv,
826*4882a593Smuzhiyun struct sdram_params *params_priv)
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun move_to_config_state(priv);
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun if (params_priv->idle_pd == 48 && params_priv->idle_sr == 10) {
831*4882a593Smuzhiyun if (params_priv->ddr_timing_t.freq == 451) {
832*4882a593Smuzhiyun params_priv->idle_sr = 28;
833*4882a593Smuzhiyun params_priv->idle_pd = 7;
834*4882a593Smuzhiyun } else if (params_priv->ddr_timing_t.freq == 393) {
835*4882a593Smuzhiyun params_priv->idle_sr = 31;
836*4882a593Smuzhiyun params_priv->idle_pd = 15;
837*4882a593Smuzhiyun }
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun clrsetbits_le32(&priv->pctl->mcfg, PD_IDLE_MASK,
840*4882a593Smuzhiyun params_priv->idle_pd << PD_IDLE_SHIFT);
841*4882a593Smuzhiyun clrsetbits_le32(&priv->pctl->mcfg1,
842*4882a593Smuzhiyun SR_IDLE_MASK | HW_EXIT_IDLE_EN_MASK,
843*4882a593Smuzhiyun params_priv->idle_sr | HW_EXIT_IDLE_EN);
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun /* uPCTL in low_power status because of auto self-refresh */
846*4882a593Smuzhiyun writel(GO_STATE, &priv->pctl->sctl);
847*4882a593Smuzhiyun }
848*4882a593Smuzhiyun
get_uart_config(void)849*4882a593Smuzhiyun int get_uart_config(void)
850*4882a593Smuzhiyun {
851*4882a593Smuzhiyun return ddr_gd.head_info.g_uart_info;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun
sdram_init(void)854*4882a593Smuzhiyun int sdram_init(void)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun struct dram_info sdram_priv;
857*4882a593Smuzhiyun struct sdram_params *params = sdram_configs;
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun sdram_priv.cru = (void *)CRU_BASE;
860*4882a593Smuzhiyun sdram_priv.grf = (void *)GRF_BASE;
861*4882a593Smuzhiyun sdram_priv.sgrf = (void *)SGRF_BASE;
862*4882a593Smuzhiyun sdram_priv.phy = (void *)DDR_PHY_BASE;
863*4882a593Smuzhiyun sdram_priv.pctl = (void *)DDR_PCTL_BASE;
864*4882a593Smuzhiyun sdram_priv.standby = (void *)DDR_STANDBY_BASE;
865*4882a593Smuzhiyun sdram_priv.pmu = (void *)PMU_BASS_ADDR;
866*4882a593Smuzhiyun sdram_priv.service_msch = (void *)SERVICE_MSCH_BASE;
867*4882a593Smuzhiyun params->idle_pd = PD_INFO(ddr_gd.head_info.g_sr_pd_idle);
868*4882a593Smuzhiyun params->idle_sr = SR_INFO(ddr_gd.head_info.g_sr_pd_idle);
869*4882a593Smuzhiyun params->ddr_2t_en = DDR_2T_INFO(ddr_gd.head_info.g_2t_info);
870*4882a593Smuzhiyun params->stdby_idle = STANDBY_IDLE(ddr_gd.head_info.g_ch_info);
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun rv1108_sdram_init(&sdram_priv, params);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun modify_sdram_params(&sdram_priv, params);
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun if (params->idle_pd != 0 && params->idle_sr != 0)
877*4882a593Smuzhiyun enable_ddr_standby(&sdram_priv, params);
878*4882a593Smuzhiyun ddr_set_atags();
879*4882a593Smuzhiyun printascii("OUT\n");
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun return 0;
882*4882a593Smuzhiyun }
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun #else
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun /* return: 0 = success, other = fail */
sdram_init(void)887*4882a593Smuzhiyun int sdram_init(void)
888*4882a593Smuzhiyun {
889*4882a593Smuzhiyun return (-1);
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun #endif /* CONFIG_TPL_BUILD */
893