xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-omap2/omap5/sdram.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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