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