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