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