1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Timing and Organization details of the ddr device parts used in OMAP5
3*4882a593Smuzhiyun * EVM
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * (C) Copyright 2010
6*4882a593Smuzhiyun * Texas Instruments, <www.ti.com>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Aneesh V <aneesh@ti.com>
9*4882a593Smuzhiyun * Sricharan R <r.sricharan@ti.com>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <asm/emif.h>
15*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun /*
18*4882a593Smuzhiyun * This file provides details of the LPDDR2 SDRAM parts used on OMAP5
19*4882a593Smuzhiyun * EVM. Since the parts used and geometry are identical for
20*4882a593Smuzhiyun * evm for a given OMAP5 revision, this information is kept
21*4882a593Smuzhiyun * here instead of being in board directory. However the key functions
22*4882a593Smuzhiyun * exported are weakly linked so that they can be over-ridden in the board
23*4882a593Smuzhiyun * directory if there is a OMAP5 board in the future that uses a different
24*4882a593Smuzhiyun * memory device or geometry.
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * For any new board with different memory devices over-ride one or more
27*4882a593Smuzhiyun * of the following functions as per the CONFIG flags you intend to enable:
28*4882a593Smuzhiyun * - emif_get_reg_dump()
29*4882a593Smuzhiyun * - emif_get_dmm_regs()
30*4882a593Smuzhiyun * - emif_get_device_details()
31*4882a593Smuzhiyun * - emif_get_device_timings()
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
35*4882a593Smuzhiyun const struct emif_regs emif_regs_532_mhz_2cs = {
36*4882a593Smuzhiyun .sdram_config_init = 0x80800EBA,
37*4882a593Smuzhiyun .sdram_config = 0x808022BA,
38*4882a593Smuzhiyun .ref_ctrl = 0x0000081A,
39*4882a593Smuzhiyun .sdram_tim1 = 0x772F6873,
40*4882a593Smuzhiyun .sdram_tim2 = 0x304a129a,
41*4882a593Smuzhiyun .sdram_tim3 = 0x02f7e45f,
42*4882a593Smuzhiyun .read_idle_ctrl = 0x00050000,
43*4882a593Smuzhiyun .zq_config = 0x000b3215,
44*4882a593Smuzhiyun .temp_alert_config = 0x08000a05,
45*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1_init = 0x0E28420d,
46*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1 = 0x0E28420d,
47*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
48*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_2 = 0x28C518A3,
49*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_3 = 0x518A3146,
50*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_4 = 0x0014628C,
51*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_5 = 0x04010040
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun const struct emif_regs emif_regs_532_mhz_2cs_es2 = {
55*4882a593Smuzhiyun .sdram_config_init = 0x80800EBA,
56*4882a593Smuzhiyun .sdram_config = 0x808022BA,
57*4882a593Smuzhiyun .ref_ctrl = 0x0000081A,
58*4882a593Smuzhiyun .sdram_tim1 = 0x772F6873,
59*4882a593Smuzhiyun .sdram_tim2 = 0x304a129a,
60*4882a593Smuzhiyun .sdram_tim3 = 0x02f7e45f,
61*4882a593Smuzhiyun .read_idle_ctrl = 0x00050000,
62*4882a593Smuzhiyun .zq_config = 0x100b3215,
63*4882a593Smuzhiyun .temp_alert_config = 0x08000a05,
64*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1_init = 0x0E30400d,
65*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1 = 0x0E30400d,
66*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
67*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_2 = 0x28C518A3,
68*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_3 = 0x518A3146,
69*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_4 = 0x0014628C,
70*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_5 = 0xC330CC33,
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun const struct emif_regs emif_regs_266_mhz_2cs = {
74*4882a593Smuzhiyun .sdram_config_init = 0x80800EBA,
75*4882a593Smuzhiyun .sdram_config = 0x808022BA,
76*4882a593Smuzhiyun .ref_ctrl = 0x0000040D,
77*4882a593Smuzhiyun .sdram_tim1 = 0x2A86B419,
78*4882a593Smuzhiyun .sdram_tim2 = 0x1025094A,
79*4882a593Smuzhiyun .sdram_tim3 = 0x026BA22F,
80*4882a593Smuzhiyun .read_idle_ctrl = 0x00050000,
81*4882a593Smuzhiyun .zq_config = 0x000b3215,
82*4882a593Smuzhiyun .temp_alert_config = 0x08000a05,
83*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1_init = 0x0E28420d,
84*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1 = 0x0E28420d,
85*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
86*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_2 = 0x0A414829,
87*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_3 = 0x14829052,
88*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_4 = 0x000520A4,
89*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_5 = 0x04010040
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun const struct emif_regs emif_regs_ddr3_532_mhz_1cs = {
93*4882a593Smuzhiyun .sdram_config_init = 0x61851B32,
94*4882a593Smuzhiyun .sdram_config = 0x61851B32,
95*4882a593Smuzhiyun .sdram_config2 = 0x0,
96*4882a593Smuzhiyun .ref_ctrl = 0x00001035,
97*4882a593Smuzhiyun .sdram_tim1 = 0xCCCF36B3,
98*4882a593Smuzhiyun .sdram_tim2 = 0x308F7FDA,
99*4882a593Smuzhiyun .sdram_tim3 = 0x027F88A8,
100*4882a593Smuzhiyun .read_idle_ctrl = 0x00050000,
101*4882a593Smuzhiyun .zq_config = 0x0007190B,
102*4882a593Smuzhiyun .temp_alert_config = 0x00000000,
103*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1_init = 0x0020420A,
104*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1 = 0x0024420A,
105*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
106*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_2 = 0x00000000,
107*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_3 = 0x00000000,
108*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_4 = 0x00000000,
109*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_5 = 0x04010040,
110*4882a593Smuzhiyun .emif_rd_wr_lvl_rmp_win = 0x00000000,
111*4882a593Smuzhiyun .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
112*4882a593Smuzhiyun .emif_rd_wr_lvl_ctl = 0x00000000,
113*4882a593Smuzhiyun .emif_rd_wr_exec_thresh = 0x00000305
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun const struct emif_regs emif_regs_ddr3_532_mhz_1cs_es2 = {
117*4882a593Smuzhiyun .sdram_config_init = 0x61851B32,
118*4882a593Smuzhiyun .sdram_config = 0x61851B32,
119*4882a593Smuzhiyun .sdram_config2 = 0x0,
120*4882a593Smuzhiyun .ref_ctrl = 0x00001035,
121*4882a593Smuzhiyun .sdram_tim1 = 0xCCCF36B3,
122*4882a593Smuzhiyun .sdram_tim2 = 0x308F7FDA,
123*4882a593Smuzhiyun .sdram_tim3 = 0x027F88A8,
124*4882a593Smuzhiyun .read_idle_ctrl = 0x00050000,
125*4882a593Smuzhiyun .zq_config = 0x1007190B,
126*4882a593Smuzhiyun .temp_alert_config = 0x00000000,
127*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1_init = 0x0030400A,
128*4882a593Smuzhiyun .emif_ddr_phy_ctlr_1 = 0x0034400A,
129*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
130*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_2 = 0x00000000,
131*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_3 = 0x00000000,
132*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_4 = 0x00000000,
133*4882a593Smuzhiyun .emif_ddr_ext_phy_ctrl_5 = 0x4350D435,
134*4882a593Smuzhiyun .emif_rd_wr_lvl_rmp_win = 0x00000000,
135*4882a593Smuzhiyun .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
136*4882a593Smuzhiyun .emif_rd_wr_lvl_ctl = 0x00000000,
137*4882a593Smuzhiyun .emif_rd_wr_exec_thresh = 0x40000305
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
141*4882a593Smuzhiyun .dmm_lisa_map_0 = 0x0,
142*4882a593Smuzhiyun .dmm_lisa_map_1 = 0x0,
143*4882a593Smuzhiyun .dmm_lisa_map_2 = 0x80740300,
144*4882a593Smuzhiyun .dmm_lisa_map_3 = 0xFF020100,
145*4882a593Smuzhiyun .is_ma_present = 0x1
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun
emif_get_reg_dump_sdp(u32 emif_nr,const struct emif_regs ** regs)148*4882a593Smuzhiyun static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun switch (omap_revision()) {
151*4882a593Smuzhiyun case OMAP5430_ES1_0:
152*4882a593Smuzhiyun *regs = &emif_regs_532_mhz_2cs;
153*4882a593Smuzhiyun break;
154*4882a593Smuzhiyun case OMAP5432_ES1_0:
155*4882a593Smuzhiyun *regs = &emif_regs_ddr3_532_mhz_1cs;
156*4882a593Smuzhiyun break;
157*4882a593Smuzhiyun case OMAP5430_ES2_0:
158*4882a593Smuzhiyun *regs = &emif_regs_532_mhz_2cs_es2;
159*4882a593Smuzhiyun break;
160*4882a593Smuzhiyun case OMAP5432_ES2_0:
161*4882a593Smuzhiyun default:
162*4882a593Smuzhiyun *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
163*4882a593Smuzhiyun break;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
168*4882a593Smuzhiyun __attribute__((weak, alias("emif_get_reg_dump_sdp")));
169*4882a593Smuzhiyun
emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs ** dmm_lisa_regs)170*4882a593Smuzhiyun static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
171*4882a593Smuzhiyun **dmm_lisa_regs)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun switch (omap_revision()) {
174*4882a593Smuzhiyun case OMAP5430_ES1_0:
175*4882a593Smuzhiyun case OMAP5430_ES2_0:
176*4882a593Smuzhiyun case OMAP5432_ES1_0:
177*4882a593Smuzhiyun case OMAP5432_ES2_0:
178*4882a593Smuzhiyun default:
179*4882a593Smuzhiyun *dmm_lisa_regs = &lisa_map_4G_x_2_x_2;
180*4882a593Smuzhiyun break;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
186*4882a593Smuzhiyun __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
187*4882a593Smuzhiyun #else
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun static const struct lpddr2_device_details dev_4G_S4_details = {
190*4882a593Smuzhiyun .type = LPDDR2_TYPE_S4,
191*4882a593Smuzhiyun .density = LPDDR2_DENSITY_4Gb,
192*4882a593Smuzhiyun .io_width = LPDDR2_IO_WIDTH_32,
193*4882a593Smuzhiyun .manufacturer = LPDDR2_MANUFACTURER_SAMSUNG
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun
emif_get_device_details_sdp(u32 emif_nr,struct lpddr2_device_details * cs0_device_details,struct lpddr2_device_details * cs1_device_details)196*4882a593Smuzhiyun static void emif_get_device_details_sdp(u32 emif_nr,
197*4882a593Smuzhiyun struct lpddr2_device_details *cs0_device_details,
198*4882a593Smuzhiyun struct lpddr2_device_details *cs1_device_details)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun /* EMIF1 & EMIF2 have identical configuration */
201*4882a593Smuzhiyun *cs0_device_details = dev_4G_S4_details;
202*4882a593Smuzhiyun *cs1_device_details = dev_4G_S4_details;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun void emif_get_device_details(u32 emif_nr,
206*4882a593Smuzhiyun struct lpddr2_device_details *cs0_device_details,
207*4882a593Smuzhiyun struct lpddr2_device_details *cs1_device_details)
208*4882a593Smuzhiyun __attribute__((weak, alias("emif_get_device_details_sdp")));
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun #endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun const u32 ext_phy_ctrl_const_base[] = {
213*4882a593Smuzhiyun 0x01004010,
214*4882a593Smuzhiyun 0x00001004,
215*4882a593Smuzhiyun 0x04010040,
216*4882a593Smuzhiyun 0x01004010,
217*4882a593Smuzhiyun 0x00001004,
218*4882a593Smuzhiyun 0x00000000,
219*4882a593Smuzhiyun 0x00000000,
220*4882a593Smuzhiyun 0x00000000,
221*4882a593Smuzhiyun 0x80080080,
222*4882a593Smuzhiyun 0x00800800,
223*4882a593Smuzhiyun 0x08102040,
224*4882a593Smuzhiyun 0x00000001,
225*4882a593Smuzhiyun 0x540A8150,
226*4882a593Smuzhiyun 0xA81502a0,
227*4882a593Smuzhiyun 0x002A0540,
228*4882a593Smuzhiyun 0x00000000,
229*4882a593Smuzhiyun 0x00000000,
230*4882a593Smuzhiyun 0x00000000,
231*4882a593Smuzhiyun 0x00000077,
232*4882a593Smuzhiyun 0x0
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {
236*4882a593Smuzhiyun 0x01004010,
237*4882a593Smuzhiyun 0x00001004,
238*4882a593Smuzhiyun 0x04010040,
239*4882a593Smuzhiyun 0x01004010,
240*4882a593Smuzhiyun 0x00001004,
241*4882a593Smuzhiyun 0x00000000,
242*4882a593Smuzhiyun 0x00000000,
243*4882a593Smuzhiyun 0x00000000,
244*4882a593Smuzhiyun 0x80080080,
245*4882a593Smuzhiyun 0x00800800,
246*4882a593Smuzhiyun 0x08102040,
247*4882a593Smuzhiyun 0x00000002,
248*4882a593Smuzhiyun 0x0,
249*4882a593Smuzhiyun 0x0,
250*4882a593Smuzhiyun 0x0,
251*4882a593Smuzhiyun 0x00000000,
252*4882a593Smuzhiyun 0x00000000,
253*4882a593Smuzhiyun 0x00000000,
254*4882a593Smuzhiyun 0x00000057,
255*4882a593Smuzhiyun 0x0
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
259*4882a593Smuzhiyun 0x50D4350D,
260*4882a593Smuzhiyun 0x00000D43,
261*4882a593Smuzhiyun 0x04010040,
262*4882a593Smuzhiyun 0x01004010,
263*4882a593Smuzhiyun 0x00001004,
264*4882a593Smuzhiyun 0x00000000,
265*4882a593Smuzhiyun 0x00000000,
266*4882a593Smuzhiyun 0x00000000,
267*4882a593Smuzhiyun 0x80080080,
268*4882a593Smuzhiyun 0x00800800,
269*4882a593Smuzhiyun 0x08102040,
270*4882a593Smuzhiyun 0x00000002,
271*4882a593Smuzhiyun 0x00000000,
272*4882a593Smuzhiyun 0x00000000,
273*4882a593Smuzhiyun 0x00000000,
274*4882a593Smuzhiyun 0x00000000,
275*4882a593Smuzhiyun 0x00000000,
276*4882a593Smuzhiyun 0x00000000,
277*4882a593Smuzhiyun 0x00000057,
278*4882a593Smuzhiyun 0x0
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /* Ext phy ctrl 1-35 regs */
282*4882a593Smuzhiyun const u32
283*4882a593Smuzhiyun dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
284*4882a593Smuzhiyun 0x10040100,
285*4882a593Smuzhiyun 0x00910091,
286*4882a593Smuzhiyun 0x00950095,
287*4882a593Smuzhiyun 0x009B009B,
288*4882a593Smuzhiyun 0x009E009E,
289*4882a593Smuzhiyun 0x00980098,
290*4882a593Smuzhiyun 0x00340034,
291*4882a593Smuzhiyun 0x00350035,
292*4882a593Smuzhiyun 0x00340034,
293*4882a593Smuzhiyun 0x00310031,
294*4882a593Smuzhiyun 0x00340034,
295*4882a593Smuzhiyun 0x007F007F,
296*4882a593Smuzhiyun 0x007F007F,
297*4882a593Smuzhiyun 0x007F007F,
298*4882a593Smuzhiyun 0x007F007F,
299*4882a593Smuzhiyun 0x007F007F,
300*4882a593Smuzhiyun 0x00480048,
301*4882a593Smuzhiyun 0x004A004A,
302*4882a593Smuzhiyun 0x00520052,
303*4882a593Smuzhiyun 0x00550055,
304*4882a593Smuzhiyun 0x00500050,
305*4882a593Smuzhiyun 0x00000000,
306*4882a593Smuzhiyun 0x00600020,
307*4882a593Smuzhiyun 0x40011080,
308*4882a593Smuzhiyun 0x08102040,
309*4882a593Smuzhiyun 0x0,
310*4882a593Smuzhiyun 0x0,
311*4882a593Smuzhiyun 0x0,
312*4882a593Smuzhiyun 0x0,
313*4882a593Smuzhiyun 0x0,
314*4882a593Smuzhiyun 0x0,
315*4882a593Smuzhiyun 0x0,
316*4882a593Smuzhiyun 0x0,
317*4882a593Smuzhiyun 0x0,
318*4882a593Smuzhiyun 0x0
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* Ext phy ctrl 1-35 regs */
322*4882a593Smuzhiyun const u32
323*4882a593Smuzhiyun dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
324*4882a593Smuzhiyun 0x10040100,
325*4882a593Smuzhiyun 0x00910091,
326*4882a593Smuzhiyun 0x00950095,
327*4882a593Smuzhiyun 0x009B009B,
328*4882a593Smuzhiyun 0x009E009E,
329*4882a593Smuzhiyun 0x00980098,
330*4882a593Smuzhiyun 0x00330033,
331*4882a593Smuzhiyun 0x00330033,
332*4882a593Smuzhiyun 0x002F002F,
333*4882a593Smuzhiyun 0x00320032,
334*4882a593Smuzhiyun 0x00310031,
335*4882a593Smuzhiyun 0x007F007F,
336*4882a593Smuzhiyun 0x007F007F,
337*4882a593Smuzhiyun 0x007F007F,
338*4882a593Smuzhiyun 0x007F007F,
339*4882a593Smuzhiyun 0x007F007F,
340*4882a593Smuzhiyun 0x00520052,
341*4882a593Smuzhiyun 0x00520052,
342*4882a593Smuzhiyun 0x00470047,
343*4882a593Smuzhiyun 0x00490049,
344*4882a593Smuzhiyun 0x00500050,
345*4882a593Smuzhiyun 0x00000000,
346*4882a593Smuzhiyun 0x00600020,
347*4882a593Smuzhiyun 0x40011080,
348*4882a593Smuzhiyun 0x08102040,
349*4882a593Smuzhiyun 0x0,
350*4882a593Smuzhiyun 0x0,
351*4882a593Smuzhiyun 0x0,
352*4882a593Smuzhiyun 0x0,
353*4882a593Smuzhiyun 0x0,
354*4882a593Smuzhiyun 0x0,
355*4882a593Smuzhiyun 0x0,
356*4882a593Smuzhiyun 0x0,
357*4882a593Smuzhiyun 0x0,
358*4882a593Smuzhiyun 0x0
359*4882a593Smuzhiyun };
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun /* Ext phy ctrl 1-35 regs */
362*4882a593Smuzhiyun const u32
363*4882a593Smuzhiyun dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
364*4882a593Smuzhiyun 0x10040100,
365*4882a593Smuzhiyun 0x00A400A4,
366*4882a593Smuzhiyun 0x00A900A9,
367*4882a593Smuzhiyun 0x00B000B0,
368*4882a593Smuzhiyun 0x00B000B0,
369*4882a593Smuzhiyun 0x00A400A4,
370*4882a593Smuzhiyun 0x00390039,
371*4882a593Smuzhiyun 0x00320032,
372*4882a593Smuzhiyun 0x00320032,
373*4882a593Smuzhiyun 0x00320032,
374*4882a593Smuzhiyun 0x00440044,
375*4882a593Smuzhiyun 0x00550055,
376*4882a593Smuzhiyun 0x00550055,
377*4882a593Smuzhiyun 0x00550055,
378*4882a593Smuzhiyun 0x00550055,
379*4882a593Smuzhiyun 0x007F007F,
380*4882a593Smuzhiyun 0x004D004D,
381*4882a593Smuzhiyun 0x00430043,
382*4882a593Smuzhiyun 0x00560056,
383*4882a593Smuzhiyun 0x00540054,
384*4882a593Smuzhiyun 0x00600060,
385*4882a593Smuzhiyun 0x0,
386*4882a593Smuzhiyun 0x00600020,
387*4882a593Smuzhiyun 0x40010080,
388*4882a593Smuzhiyun 0x08102040,
389*4882a593Smuzhiyun 0x0,
390*4882a593Smuzhiyun 0x0,
391*4882a593Smuzhiyun 0x0,
392*4882a593Smuzhiyun 0x0,
393*4882a593Smuzhiyun 0x0,
394*4882a593Smuzhiyun 0x0,
395*4882a593Smuzhiyun 0x0,
396*4882a593Smuzhiyun 0x0,
397*4882a593Smuzhiyun 0x0,
398*4882a593Smuzhiyun 0x0
399*4882a593Smuzhiyun };
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun const u32 dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2[] = {
402*4882a593Smuzhiyun 0x04040100,
403*4882a593Smuzhiyun 0x006B009F,
404*4882a593Smuzhiyun 0x006B00A2,
405*4882a593Smuzhiyun 0x006B00A8,
406*4882a593Smuzhiyun 0x006B00A8,
407*4882a593Smuzhiyun 0x006B00B2,
408*4882a593Smuzhiyun 0x002F002F,
409*4882a593Smuzhiyun 0x002F002F,
410*4882a593Smuzhiyun 0x002F002F,
411*4882a593Smuzhiyun 0x002F002F,
412*4882a593Smuzhiyun 0x002F002F,
413*4882a593Smuzhiyun 0x00600073,
414*4882a593Smuzhiyun 0x00600071,
415*4882a593Smuzhiyun 0x0060007C,
416*4882a593Smuzhiyun 0x0060007E,
417*4882a593Smuzhiyun 0x00600084,
418*4882a593Smuzhiyun 0x00400053,
419*4882a593Smuzhiyun 0x00400051,
420*4882a593Smuzhiyun 0x0040005C,
421*4882a593Smuzhiyun 0x0040005E,
422*4882a593Smuzhiyun 0x00400064,
423*4882a593Smuzhiyun 0x00800080,
424*4882a593Smuzhiyun 0x00800080,
425*4882a593Smuzhiyun 0x40010080,
426*4882a593Smuzhiyun 0x08102040,
427*4882a593Smuzhiyun 0x005B008F,
428*4882a593Smuzhiyun 0x005B0092,
429*4882a593Smuzhiyun 0x005B0098,
430*4882a593Smuzhiyun 0x005B0098,
431*4882a593Smuzhiyun 0x005B00A2,
432*4882a593Smuzhiyun 0x00300043,
433*4882a593Smuzhiyun 0x00300041,
434*4882a593Smuzhiyun 0x0030004C,
435*4882a593Smuzhiyun 0x0030004E,
436*4882a593Smuzhiyun 0x00300054,
437*4882a593Smuzhiyun 0x00000077
438*4882a593Smuzhiyun };
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun const struct lpddr2_mr_regs mr_regs = {
441*4882a593Smuzhiyun .mr1 = MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8,
442*4882a593Smuzhiyun .mr2 = 0x6,
443*4882a593Smuzhiyun .mr3 = 0x1,
444*4882a593Smuzhiyun .mr10 = MR10_ZQ_ZQINIT,
445*4882a593Smuzhiyun .mr16 = MR16_REF_FULL_ARRAY
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun
emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,const u32 ** regs,u32 * size)448*4882a593Smuzhiyun void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
449*4882a593Smuzhiyun const u32 **regs,
450*4882a593Smuzhiyun u32 *size)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun switch (omap_revision()) {
453*4882a593Smuzhiyun case OMAP5430_ES1_0:
454*4882a593Smuzhiyun case OMAP5430_ES2_0:
455*4882a593Smuzhiyun *regs = ext_phy_ctrl_const_base;
456*4882a593Smuzhiyun *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
457*4882a593Smuzhiyun break;
458*4882a593Smuzhiyun case OMAP5432_ES1_0:
459*4882a593Smuzhiyun *regs = ddr3_ext_phy_ctrl_const_base_es1;
460*4882a593Smuzhiyun *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
461*4882a593Smuzhiyun break;
462*4882a593Smuzhiyun case OMAP5432_ES2_0:
463*4882a593Smuzhiyun *regs = ddr3_ext_phy_ctrl_const_base_es2;
464*4882a593Smuzhiyun *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
465*4882a593Smuzhiyun break;
466*4882a593Smuzhiyun case DRA752_ES1_0:
467*4882a593Smuzhiyun case DRA752_ES1_1:
468*4882a593Smuzhiyun case DRA752_ES2_0:
469*4882a593Smuzhiyun if (emif_nr == 1) {
470*4882a593Smuzhiyun *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
471*4882a593Smuzhiyun *size =
472*4882a593Smuzhiyun ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
473*4882a593Smuzhiyun } else {
474*4882a593Smuzhiyun *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
475*4882a593Smuzhiyun *size =
476*4882a593Smuzhiyun ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun break;
479*4882a593Smuzhiyun case DRA722_ES1_0:
480*4882a593Smuzhiyun *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz;
481*4882a593Smuzhiyun *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz);
482*4882a593Smuzhiyun break;
483*4882a593Smuzhiyun case DRA722_ES2_0:
484*4882a593Smuzhiyun *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2;
485*4882a593Smuzhiyun *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2);
486*4882a593Smuzhiyun break;
487*4882a593Smuzhiyun default:
488*4882a593Smuzhiyun *regs = ddr3_ext_phy_ctrl_const_base_es2;
489*4882a593Smuzhiyun *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
get_lpddr2_mr_regs(const struct lpddr2_mr_regs ** regs)494*4882a593Smuzhiyun void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun *regs = &mr_regs;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun
do_ext_phy_settings_omap5(u32 base,const struct emif_regs * regs)499*4882a593Smuzhiyun static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun u32 *ext_phy_ctrl_base = 0;
502*4882a593Smuzhiyun u32 *emif_ext_phy_ctrl_base = 0;
503*4882a593Smuzhiyun u32 emif_nr;
504*4882a593Smuzhiyun const u32 *ext_phy_ctrl_const_regs;
505*4882a593Smuzhiyun u32 i = 0;
506*4882a593Smuzhiyun u32 size;
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun emif_nr = (base == EMIF1_BASE) ? 1 : 2;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
513*4882a593Smuzhiyun emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun /* Configure external phy control timing registers */
516*4882a593Smuzhiyun for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
517*4882a593Smuzhiyun writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
518*4882a593Smuzhiyun /* Update shadow registers */
519*4882a593Smuzhiyun writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /*
523*4882a593Smuzhiyun * external phy 6-24 registers do not change with
524*4882a593Smuzhiyun * ddr frequency
525*4882a593Smuzhiyun */
526*4882a593Smuzhiyun emif_get_ext_phy_ctrl_const_regs(emif_nr,
527*4882a593Smuzhiyun &ext_phy_ctrl_const_regs, &size);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun for (i = 0; i < size; i++) {
530*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
531*4882a593Smuzhiyun emif_ext_phy_ctrl_base++);
532*4882a593Smuzhiyun /* Update shadow registers */
533*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
534*4882a593Smuzhiyun emif_ext_phy_ctrl_base++);
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun
do_ext_phy_settings_dra7(u32 base,const struct emif_regs * regs)538*4882a593Smuzhiyun static void do_ext_phy_settings_dra7(u32 base, const struct emif_regs *regs)
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
541*4882a593Smuzhiyun u32 *emif_ext_phy_ctrl_base = 0;
542*4882a593Smuzhiyun u32 emif_nr;
543*4882a593Smuzhiyun const u32 *ext_phy_ctrl_const_regs;
544*4882a593Smuzhiyun u32 i, hw_leveling, size, phy;
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun emif_nr = (base == EMIF1_BASE) ? 1 : 2;
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun hw_leveling = regs->emif_rd_wr_lvl_rmp_ctl >> EMIF_REG_RDWRLVL_EN_SHIFT;
549*4882a593Smuzhiyun phy = regs->emif_ddr_phy_ctlr_1_init;
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun emif_ext_phy_ctrl_base = (u32 *)&(emif->emif_ddr_ext_phy_ctrl_1);
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun emif_get_ext_phy_ctrl_const_regs(emif_nr,
554*4882a593Smuzhiyun &ext_phy_ctrl_const_regs, &size);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[0]);
557*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[1]);
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun /*
560*4882a593Smuzhiyun * Copy the predefined PHY register values
561*4882a593Smuzhiyun * if leveling is disabled.
562*4882a593Smuzhiyun */
563*4882a593Smuzhiyun if (phy & EMIF_DDR_PHY_CTRL_1_RDLVLGATE_MASK_MASK)
564*4882a593Smuzhiyun for (i = 1; i < 6; i++) {
565*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
566*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2]);
567*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
568*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2 + 1]);
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun if (phy & EMIF_DDR_PHY_CTRL_1_RDLVL_MASK_MASK)
572*4882a593Smuzhiyun for (i = 6; i < 11; i++) {
573*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
574*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2]);
575*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
576*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2 + 1]);
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun if (phy & EMIF_DDR_PHY_CTRL_1_WRLVL_MASK_MASK)
580*4882a593Smuzhiyun for (i = 11; i < 25; i++) {
581*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
582*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2]);
583*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
584*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2 + 1]);
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun if (hw_leveling) {
588*4882a593Smuzhiyun /*
589*4882a593Smuzhiyun * Write the init value for HW levling to occur
590*4882a593Smuzhiyun */
591*4882a593Smuzhiyun for (i = 21; i < 35; i++) {
592*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
593*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2]);
594*4882a593Smuzhiyun writel(ext_phy_ctrl_const_regs[i],
595*4882a593Smuzhiyun &emif_ext_phy_ctrl_base[i * 2 + 1]);
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun
do_ext_phy_settings(u32 base,const struct emif_regs * regs)600*4882a593Smuzhiyun void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
601*4882a593Smuzhiyun {
602*4882a593Smuzhiyun if (is_omap54xx())
603*4882a593Smuzhiyun do_ext_phy_settings_omap5(base, regs);
604*4882a593Smuzhiyun else
605*4882a593Smuzhiyun do_ext_phy_settings_dra7(base, regs);
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun #ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
609*4882a593Smuzhiyun static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
610*4882a593Smuzhiyun .max_freq = 532000000,
611*4882a593Smuzhiyun .RL = 8,
612*4882a593Smuzhiyun .tRPab = 21,
613*4882a593Smuzhiyun .tRCD = 18,
614*4882a593Smuzhiyun .tWR = 15,
615*4882a593Smuzhiyun .tRASmin = 42,
616*4882a593Smuzhiyun .tRRD = 10,
617*4882a593Smuzhiyun .tWTRx2 = 15,
618*4882a593Smuzhiyun .tXSR = 140,
619*4882a593Smuzhiyun .tXPx2 = 15,
620*4882a593Smuzhiyun .tRFCab = 130,
621*4882a593Smuzhiyun .tRTPx2 = 15,
622*4882a593Smuzhiyun .tCKE = 3,
623*4882a593Smuzhiyun .tCKESR = 15,
624*4882a593Smuzhiyun .tZQCS = 90,
625*4882a593Smuzhiyun .tZQCL = 360,
626*4882a593Smuzhiyun .tZQINIT = 1000,
627*4882a593Smuzhiyun .tDQSCKMAXx2 = 11,
628*4882a593Smuzhiyun .tRASmax = 70,
629*4882a593Smuzhiyun .tFAW = 50
630*4882a593Smuzhiyun };
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun static const struct lpddr2_min_tck min_tck = {
633*4882a593Smuzhiyun .tRL = 3,
634*4882a593Smuzhiyun .tRP_AB = 3,
635*4882a593Smuzhiyun .tRCD = 3,
636*4882a593Smuzhiyun .tWR = 3,
637*4882a593Smuzhiyun .tRAS_MIN = 3,
638*4882a593Smuzhiyun .tRRD = 2,
639*4882a593Smuzhiyun .tWTR = 2,
640*4882a593Smuzhiyun .tXP = 2,
641*4882a593Smuzhiyun .tRTP = 2,
642*4882a593Smuzhiyun .tCKE = 3,
643*4882a593Smuzhiyun .tCKESR = 3,
644*4882a593Smuzhiyun .tFAW = 8
645*4882a593Smuzhiyun };
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
648*4882a593Smuzhiyun &timings_jedec_532_mhz
649*4882a593Smuzhiyun };
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun static const struct lpddr2_device_timings dev_4G_S4_timings = {
652*4882a593Smuzhiyun .ac_timings = ac_timings,
653*4882a593Smuzhiyun .min_tck = &min_tck,
654*4882a593Smuzhiyun };
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun /*
657*4882a593Smuzhiyun * List of status registers to be controlled back to control registers
658*4882a593Smuzhiyun * after initial leveling
659*4882a593Smuzhiyun * readreg, writereg
660*4882a593Smuzhiyun */
661*4882a593Smuzhiyun const struct read_write_regs omap5_bug_00339_regs[] = {
662*4882a593Smuzhiyun { 8, 5 },
663*4882a593Smuzhiyun { 9, 6 },
664*4882a593Smuzhiyun { 10, 7 },
665*4882a593Smuzhiyun { 14, 8 },
666*4882a593Smuzhiyun { 15, 9 },
667*4882a593Smuzhiyun { 16, 10 },
668*4882a593Smuzhiyun { 11, 2 },
669*4882a593Smuzhiyun { 12, 3 },
670*4882a593Smuzhiyun { 13, 4 },
671*4882a593Smuzhiyun { 17, 11 },
672*4882a593Smuzhiyun { 18, 12 },
673*4882a593Smuzhiyun { 19, 13 },
674*4882a593Smuzhiyun };
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun const struct read_write_regs dra_bug_00339_regs[] = {
677*4882a593Smuzhiyun { 7, 7 },
678*4882a593Smuzhiyun { 8, 8 },
679*4882a593Smuzhiyun { 9, 9 },
680*4882a593Smuzhiyun { 10, 10 },
681*4882a593Smuzhiyun { 11, 11 },
682*4882a593Smuzhiyun { 12, 2 },
683*4882a593Smuzhiyun { 13, 3 },
684*4882a593Smuzhiyun { 14, 4 },
685*4882a593Smuzhiyun { 15, 5 },
686*4882a593Smuzhiyun { 16, 6 },
687*4882a593Smuzhiyun { 17, 12 },
688*4882a593Smuzhiyun { 18, 13 },
689*4882a593Smuzhiyun { 19, 14 },
690*4882a593Smuzhiyun { 20, 15 },
691*4882a593Smuzhiyun { 21, 16 },
692*4882a593Smuzhiyun { 22, 17 },
693*4882a593Smuzhiyun { 23, 18 },
694*4882a593Smuzhiyun { 24, 19 },
695*4882a593Smuzhiyun { 25, 20 },
696*4882a593Smuzhiyun { 26, 21}
697*4882a593Smuzhiyun };
698*4882a593Smuzhiyun
get_bug_regs(u32 * iterations)699*4882a593Smuzhiyun const struct read_write_regs *get_bug_regs(u32 *iterations)
700*4882a593Smuzhiyun {
701*4882a593Smuzhiyun const struct read_write_regs *bug_00339_regs_ptr = NULL;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun switch (omap_revision()) {
704*4882a593Smuzhiyun case OMAP5430_ES1_0:
705*4882a593Smuzhiyun case OMAP5430_ES2_0:
706*4882a593Smuzhiyun case OMAP5432_ES1_0:
707*4882a593Smuzhiyun case OMAP5432_ES2_0:
708*4882a593Smuzhiyun bug_00339_regs_ptr = omap5_bug_00339_regs;
709*4882a593Smuzhiyun *iterations = sizeof(omap5_bug_00339_regs)/
710*4882a593Smuzhiyun sizeof(omap5_bug_00339_regs[0]);
711*4882a593Smuzhiyun break;
712*4882a593Smuzhiyun case DRA752_ES1_0:
713*4882a593Smuzhiyun case DRA752_ES1_1:
714*4882a593Smuzhiyun case DRA752_ES2_0:
715*4882a593Smuzhiyun case DRA722_ES1_0:
716*4882a593Smuzhiyun case DRA722_ES2_0:
717*4882a593Smuzhiyun bug_00339_regs_ptr = dra_bug_00339_regs;
718*4882a593Smuzhiyun *iterations = sizeof(dra_bug_00339_regs)/
719*4882a593Smuzhiyun sizeof(dra_bug_00339_regs[0]);
720*4882a593Smuzhiyun break;
721*4882a593Smuzhiyun default:
722*4882a593Smuzhiyun printf("\n Error: UnKnown SOC");
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun return bug_00339_regs_ptr;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun
emif_get_device_timings_sdp(u32 emif_nr,const struct lpddr2_device_timings ** cs0_device_timings,const struct lpddr2_device_timings ** cs1_device_timings)728*4882a593Smuzhiyun void emif_get_device_timings_sdp(u32 emif_nr,
729*4882a593Smuzhiyun const struct lpddr2_device_timings **cs0_device_timings,
730*4882a593Smuzhiyun const struct lpddr2_device_timings **cs1_device_timings)
731*4882a593Smuzhiyun {
732*4882a593Smuzhiyun /* Identical devices on EMIF1 & EMIF2 */
733*4882a593Smuzhiyun *cs0_device_timings = &dev_4G_S4_timings;
734*4882a593Smuzhiyun *cs1_device_timings = &dev_4G_S4_timings;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun void emif_get_device_timings(u32 emif_nr,
738*4882a593Smuzhiyun const struct lpddr2_device_timings **cs0_device_timings,
739*4882a593Smuzhiyun const struct lpddr2_device_timings **cs1_device_timings)
740*4882a593Smuzhiyun __attribute__((weak, alias("emif_get_device_timings_sdp")));
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun #endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */
743