xref: /openbmc/u-boot/drivers/ram/mpc83xx_sdram.c (revision 4e710ebb4463c8e031eb269c012fbadb2479608b)
1*e4061556SMario Six // SPDX-License-Identifier: GPL-2.0+
2*e4061556SMario Six /*
3*e4061556SMario Six  * (C) Copyright 2018
4*e4061556SMario Six  * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5*e4061556SMario Six  */
6*e4061556SMario Six 
7*e4061556SMario Six #include <common.h>
8*e4061556SMario Six #include <dm.h>
9*e4061556SMario Six #include <ram.h>
10*e4061556SMario Six #include <dt-bindings/memory/mpc83xx-sdram.h>
11*e4061556SMario Six 
12*e4061556SMario Six DECLARE_GLOBAL_DATA_PTR;
13*e4061556SMario Six 
14*e4061556SMario Six /* Masks for the CS config register */
15*e4061556SMario Six static const u32 CSCONFIG_ENABLE = 0x80000000;
16*e4061556SMario Six 
17*e4061556SMario Six static const u32 BANK_BITS_2;
18*e4061556SMario Six static const u32 BANK_BITS_3 = 0x00004000;
19*e4061556SMario Six 
20*e4061556SMario Six static const u32 ROW_BITS_12;
21*e4061556SMario Six static const u32 ROW_BITS_13 = 0x00000100;
22*e4061556SMario Six static const u32 ROW_BITS_14 = 0x00000200;
23*e4061556SMario Six 
24*e4061556SMario Six static const u32 COL_BITS_8;
25*e4061556SMario Six static const u32 COL_BITS_9  = 0x00000001;
26*e4061556SMario Six static const u32 COL_BITS_10 = 0x00000002;
27*e4061556SMario Six static const u32 COL_BITS_11 = 0x00000003;
28*e4061556SMario Six 
29*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 3 register */
30*e4061556SMario Six static const uint TIMING_CFG3_EXT_REFREC_SHIFT = (31 - 15);
31*e4061556SMario Six 
32*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 0 register */
33*e4061556SMario Six static const uint TIMING_CFG0_RWT_SHIFT         = (31 - 1);
34*e4061556SMario Six static const uint TIMING_CFG0_WRT_SHIFT         = (31 - 3);
35*e4061556SMario Six static const uint TIMING_CFG0_RRT_SHIFT         = (31 - 5);
36*e4061556SMario Six static const uint TIMING_CFG0_WWT_SHIFT         = (31 - 7);
37*e4061556SMario Six static const uint TIMING_CFG0_ACT_PD_EXIT_SHIFT = (31 - 11);
38*e4061556SMario Six static const uint TIMING_CFG0_PRE_PD_EXIT_SHIFT = (31 - 15);
39*e4061556SMario Six static const uint TIMING_CFG0_ODT_PD_EXIT_SHIFT = (31 - 23);
40*e4061556SMario Six static const uint TIMING_CFG0_MRS_CYC_SHIFT     = (31 - 31);
41*e4061556SMario Six 
42*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 1 register */
43*e4061556SMario Six static const uint TIMING_CFG1_PRETOACT_SHIFT = (31 - 3);
44*e4061556SMario Six static const uint TIMING_CFG1_ACTTOPRE_SHIFT = (31 - 7);
45*e4061556SMario Six static const uint TIMING_CFG1_ACTTORW_SHIFT  = (31 - 11);
46*e4061556SMario Six static const uint TIMING_CFG1_CASLAT_SHIFT   = (31 - 15);
47*e4061556SMario Six static const uint TIMING_CFG1_REFREC_SHIFT   = (31 - 19);
48*e4061556SMario Six static const uint TIMING_CFG1_WRREC_SHIFT    = (31 - 23);
49*e4061556SMario Six static const uint TIMING_CFG1_ACTTOACT_SHIFT = (31 - 27);
50*e4061556SMario Six static const uint TIMING_CFG1_WRTORD_SHIFT   = (31 - 31);
51*e4061556SMario Six 
52*e4061556SMario Six /* Shifts for the DDR SDRAM Timing Configuration 2 register */
53*e4061556SMario Six static const uint TIMING_CFG2_CPO_SHIFT	          = (31 - 8);
54*e4061556SMario Six static const uint TIMING_CFG2_WR_DATA_DELAY_SHIFT = (31 - 21);
55*e4061556SMario Six static const uint TIMING_CFG2_ADD_LAT_SHIFT       = (31 - 3);
56*e4061556SMario Six static const uint TIMING_CFG2_WR_LAT_DELAY_SHIFT  = (31 - 12);
57*e4061556SMario Six static const uint TIMING_CFG2_RD_TO_PRE_SHIFT     = (31 - 18);
58*e4061556SMario Six static const uint TIMING_CFG2_CKE_PLS_SHIFT       = (31 - 25);
59*e4061556SMario Six static const uint TIMING_CFG2_FOUR_ACT_SHIFT;
60*e4061556SMario Six 
61*e4061556SMario Six /* Shifts for the DDR SDRAM Control Configuration register */
62*e4061556SMario Six static const uint SDRAM_CFG_SREN_SHIFT         = (31 - 1);
63*e4061556SMario Six static const uint SDRAM_CFG_ECC_EN_SHIFT       = (31 - 2);
64*e4061556SMario Six static const uint SDRAM_CFG_RD_EN_SHIFT        = (31 - 3);
65*e4061556SMario Six static const uint SDRAM_CFG_SDRAM_TYPE_SHIFT   = (31 - 7);
66*e4061556SMario Six static const uint SDRAM_CFG_DYN_PWR_SHIFT      = (31 - 10);
67*e4061556SMario Six static const uint SDRAM_CFG_DBW_SHIFT          = (31 - 12);
68*e4061556SMario Six static const uint SDRAM_CFG_NCAP_SHIFT         = (31 - 14);
69*e4061556SMario Six static const uint SDRAM_CFG_2T_EN_SHIFT        = (31 - 16);
70*e4061556SMario Six static const uint SDRAM_CFG_BA_INTLV_CTL_SHIFT = (31 - 23);
71*e4061556SMario Six static const uint SDRAM_CFG_PCHB8_SHIFT        = (31 - 27);
72*e4061556SMario Six static const uint SDRAM_CFG_HSE_SHIFT          = (31 - 28);
73*e4061556SMario Six static const uint SDRAM_CFG_BI_SHIFT           = (31 - 31);
74*e4061556SMario Six 
75*e4061556SMario Six /* Shifts for the DDR SDRAM Control Configuration 2 register */
76*e4061556SMario Six static const uint SDRAM_CFG2_FRC_SR_SHIFT = (31 - 0);
77*e4061556SMario Six static const uint SDRAM_CFG2_DLL_RST_DIS  = (31 - 2);
78*e4061556SMario Six static const uint SDRAM_CFG2_DQS_CFG      = (31 - 5);
79*e4061556SMario Six static const uint SDRAM_CFG2_ODT_CFG      = (31 - 10);
80*e4061556SMario Six static const uint SDRAM_CFG2_NUM_PR       = (31 - 19);
81*e4061556SMario Six 
82*e4061556SMario Six /* Shifts for the DDR SDRAM Mode register */
83*e4061556SMario Six static const uint SDRAM_MODE_ESD_SHIFT = (31 - 15);
84*e4061556SMario Six static const uint SDRAM_MODE_SD_SHIFT  = (31 - 31);
85*e4061556SMario Six 
86*e4061556SMario Six /* Shifts for the DDR SDRAM Mode 2 register */
87*e4061556SMario Six static const uint SDRAM_MODE2_ESD2_SHIFT = (31 - 15);
88*e4061556SMario Six static const uint SDRAM_MODE2_ESD3_SHIFT = (31 - 31);
89*e4061556SMario Six 
90*e4061556SMario Six /* Shifts for the DDR SDRAM Interval Configuration register */
91*e4061556SMario Six static const uint SDRAM_INTERVAL_REFINT_SHIFT  = (31 - 15);
92*e4061556SMario Six static const uint SDRAM_INTERVAL_BSTOPRE_SHIFT = (31 - 31);
93*e4061556SMario Six 
94*e4061556SMario Six /* Mask for the DDR SDRAM Mode Control register */
95*e4061556SMario Six static const u32 SDRAM_CFG_MEM_EN = 0x80000000;
96*e4061556SMario Six 
dram_init(void)97*e4061556SMario Six int dram_init(void)
98*e4061556SMario Six {
99*e4061556SMario Six 	struct udevice *ram_ctrl;
100*e4061556SMario Six 	int ret;
101*e4061556SMario Six 
102*e4061556SMario Six 	/* Current assumption: There is only one RAM controller */
103*e4061556SMario Six 	ret = uclass_first_device_err(UCLASS_RAM, &ram_ctrl);
104*e4061556SMario Six 	if (ret) {
105*e4061556SMario Six 		debug("%s: uclass_first_device_err failed: %d\n",
106*e4061556SMario Six 		      __func__, ret);
107*e4061556SMario Six 		return ret;
108*e4061556SMario Six 	}
109*e4061556SMario Six 
110*e4061556SMario Six 	/* FIXME(mario.six@gdsys.cc): Set gd->ram_size? */
111*e4061556SMario Six 
112*e4061556SMario Six 	return 0;
113*e4061556SMario Six }
114*e4061556SMario Six 
get_effective_memsize(void)115*e4061556SMario Six phys_size_t get_effective_memsize(void)
116*e4061556SMario Six {
117*e4061556SMario Six 	if (!IS_ENABLED(CONFIG_VERY_BIG_RAM))
118*e4061556SMario Six 		return gd->ram_size;
119*e4061556SMario Six 
120*e4061556SMario Six 	/* Limit stack to what we can reasonable map */
121*e4061556SMario Six 	return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
122*e4061556SMario Six 		CONFIG_MAX_MEM_MAPPED : gd->ram_size);
123*e4061556SMario Six }
124*e4061556SMario Six 
125*e4061556SMario Six /**
126*e4061556SMario Six  * struct mpc83xx_sdram_priv - Private data for MPC83xx RAM controllers
127*e4061556SMario Six  * @total_size: The total size of all RAM modules associated with this RAM
128*e4061556SMario Six  *		controller in bytes
129*e4061556SMario Six  */
130*e4061556SMario Six struct mpc83xx_sdram_priv {
131*e4061556SMario Six 	ulong total_size;
132*e4061556SMario Six };
133*e4061556SMario Six 
134*e4061556SMario Six /**
135*e4061556SMario Six  * mpc83xx_sdram_static_init() - Statically initialize a RAM module.
136*e4061556SMario Six  * @node:    Device tree node associated with ths module in question
137*e4061556SMario Six  * @cs:      The chip select to use for this RAM module
138*e4061556SMario Six  * @mapaddr: The address where the RAM module should be mapped
139*e4061556SMario Six  * @size:    The size of the RAM module to be mapped in bytes
140*e4061556SMario Six  *
141*e4061556SMario Six  * Return: 0 if OK, -ve on error
142*e4061556SMario Six  */
mpc83xx_sdram_static_init(ofnode node,u32 cs,u32 mapaddr,u32 size)143*e4061556SMario Six static int mpc83xx_sdram_static_init(ofnode node, u32 cs, u32 mapaddr, u32 size)
144*e4061556SMario Six {
145*e4061556SMario Six 	immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
146*e4061556SMario Six 	u32 msize = size;
147*e4061556SMario Six 	u32 msize_log2 = __ilog2(msize);
148*e4061556SMario Six 	u32 auto_precharge, odt_rd_cfg, odt_wr_cfg, bank_bits, row_bits,
149*e4061556SMario Six 	    col_bits;
150*e4061556SMario Six 	u32 bank_bits_mask, row_bits_mask, col_bits_mask;
151*e4061556SMario Six 
152*e4061556SMario Six 	/* Configure the DDR local access window */
153*e4061556SMario Six 	out_be32(&im->sysconf.ddrlaw[cs].bar, mapaddr & 0xfffff000);
154*e4061556SMario Six 	out_be32(&im->sysconf.ddrlaw[cs].ar, LBLAWAR_EN | (msize_log2 - 1));
155*e4061556SMario Six 
156*e4061556SMario Six 	out_be32(&im->ddr.csbnds[cs].csbnds, (msize - 1) >> 24);
157*e4061556SMario Six 
158*e4061556SMario Six 	auto_precharge = ofnode_read_u32_default(node, "auto_precharge", 0);
159*e4061556SMario Six 	switch (auto_precharge) {
160*e4061556SMario Six 	case AUTO_PRECHARGE_ENABLE:
161*e4061556SMario Six 	case AUTO_PRECHARGE_DISABLE:
162*e4061556SMario Six 		break;
163*e4061556SMario Six 	default:
164*e4061556SMario Six 		debug("%s: auto_precharge value %d invalid.\n",
165*e4061556SMario Six 		      ofnode_get_name(node), auto_precharge);
166*e4061556SMario Six 		return -EINVAL;
167*e4061556SMario Six 	}
168*e4061556SMario Six 
169*e4061556SMario Six 	odt_rd_cfg = ofnode_read_u32_default(node, "odt_rd_cfg", 0);
170*e4061556SMario Six 	switch (odt_rd_cfg) {
171*e4061556SMario Six 	case ODT_RD_ONLY_OTHER_DIMM:
172*e4061556SMario Six 		if (!IS_ENABLED(CONFIG_MPC8360) &&
173*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC837x)) {
174*e4061556SMario Six 			debug("%s: odt_rd_cfg value %d invalid.\n",
175*e4061556SMario Six 			      ofnode_get_name(node), odt_rd_cfg);
176*e4061556SMario Six 			return -EINVAL;
177*e4061556SMario Six 		}
178*e4061556SMario Six 		/* fall through */
179*e4061556SMario Six 	case ODT_RD_NEVER:
180*e4061556SMario Six 	case ODT_RD_ONLY_CURRENT:
181*e4061556SMario Six 	case ODT_RD_ONLY_OTHER_CS:
182*e4061556SMario Six 		if (!IS_ENABLED(CONFIG_MPC830x) &&
183*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC831x) &&
184*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC8360) &&
185*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC837x)) {
186*e4061556SMario Six 			debug("%s: odt_rd_cfg value %d invalid.\n",
187*e4061556SMario Six 			      ofnode_get_name(node), odt_rd_cfg);
188*e4061556SMario Six 			return -EINVAL;
189*e4061556SMario Six 		}
190*e4061556SMario Six 		/* fall through */
191*e4061556SMario Six 	/* Only MPC832x knows this value */
192*e4061556SMario Six 	case ODT_RD_ALL:
193*e4061556SMario Six 		break;
194*e4061556SMario Six 	default:
195*e4061556SMario Six 		debug("%s: odt_rd_cfg value %d invalid.\n",
196*e4061556SMario Six 		      ofnode_get_name(node), odt_rd_cfg);
197*e4061556SMario Six 		return -EINVAL;
198*e4061556SMario Six 	}
199*e4061556SMario Six 
200*e4061556SMario Six 	odt_wr_cfg = ofnode_read_u32_default(node, "odt_wr_cfg", 0);
201*e4061556SMario Six 	switch (odt_wr_cfg) {
202*e4061556SMario Six 	case ODT_WR_ONLY_OTHER_DIMM:
203*e4061556SMario Six 		if (!IS_ENABLED(CONFIG_MPC8360) &&
204*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC837x)) {
205*e4061556SMario Six 			debug("%s: odt_wr_cfg value %d invalid.\n",
206*e4061556SMario Six 			      ofnode_get_name(node), odt_wr_cfg);
207*e4061556SMario Six 			return -EINVAL;
208*e4061556SMario Six 		}
209*e4061556SMario Six 		/* fall through */
210*e4061556SMario Six 	case ODT_WR_NEVER:
211*e4061556SMario Six 	case ODT_WR_ONLY_CURRENT:
212*e4061556SMario Six 	case ODT_WR_ONLY_OTHER_CS:
213*e4061556SMario Six 		if (!IS_ENABLED(CONFIG_MPC830x) &&
214*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC831x) &&
215*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC8360) &&
216*e4061556SMario Six 		    !IS_ENABLED(CONFIG_MPC837x)) {
217*e4061556SMario Six 			debug("%s: odt_wr_cfg value %d invalid.\n",
218*e4061556SMario Six 			      ofnode_get_name(node), odt_wr_cfg);
219*e4061556SMario Six 			return -EINVAL;
220*e4061556SMario Six 		}
221*e4061556SMario Six 		/* fall through */
222*e4061556SMario Six 	/* MPC832x only knows this value */
223*e4061556SMario Six 	case ODT_WR_ALL:
224*e4061556SMario Six 		break;
225*e4061556SMario Six 	default:
226*e4061556SMario Six 		debug("%s: odt_wr_cfg value %d invalid.\n",
227*e4061556SMario Six 		      ofnode_get_name(node), odt_wr_cfg);
228*e4061556SMario Six 		return -EINVAL;
229*e4061556SMario Six 	}
230*e4061556SMario Six 
231*e4061556SMario Six 	bank_bits = ofnode_read_u32_default(node, "bank_bits", 0);
232*e4061556SMario Six 	switch (bank_bits) {
233*e4061556SMario Six 	case 2:
234*e4061556SMario Six 		bank_bits_mask = BANK_BITS_2;
235*e4061556SMario Six 		break;
236*e4061556SMario Six 	case 3:
237*e4061556SMario Six 		bank_bits_mask = BANK_BITS_3;
238*e4061556SMario Six 		break;
239*e4061556SMario Six 	default:
240*e4061556SMario Six 		debug("%s: bank_bits value %d invalid.\n",
241*e4061556SMario Six 		      ofnode_get_name(node), bank_bits);
242*e4061556SMario Six 		return -EINVAL;
243*e4061556SMario Six 	}
244*e4061556SMario Six 
245*e4061556SMario Six 	row_bits = ofnode_read_u32_default(node, "row_bits", 0);
246*e4061556SMario Six 	switch (row_bits) {
247*e4061556SMario Six 	case 12:
248*e4061556SMario Six 		row_bits_mask = ROW_BITS_12;
249*e4061556SMario Six 		break;
250*e4061556SMario Six 	case 13:
251*e4061556SMario Six 		row_bits_mask = ROW_BITS_13;
252*e4061556SMario Six 		break;
253*e4061556SMario Six 	case 14:
254*e4061556SMario Six 		row_bits_mask = ROW_BITS_14;
255*e4061556SMario Six 		break;
256*e4061556SMario Six 	default:
257*e4061556SMario Six 		debug("%s: row_bits value %d invalid.\n",
258*e4061556SMario Six 		      ofnode_get_name(node), row_bits);
259*e4061556SMario Six 		return -EINVAL;
260*e4061556SMario Six 	}
261*e4061556SMario Six 
262*e4061556SMario Six 	col_bits = ofnode_read_u32_default(node, "col_bits", 0);
263*e4061556SMario Six 	switch (col_bits) {
264*e4061556SMario Six 	case 8:
265*e4061556SMario Six 		col_bits_mask = COL_BITS_8;
266*e4061556SMario Six 		break;
267*e4061556SMario Six 	case 9:
268*e4061556SMario Six 		col_bits_mask = COL_BITS_9;
269*e4061556SMario Six 		break;
270*e4061556SMario Six 	case 10:
271*e4061556SMario Six 		col_bits_mask = COL_BITS_10;
272*e4061556SMario Six 		break;
273*e4061556SMario Six 	case 11:
274*e4061556SMario Six 		col_bits_mask = COL_BITS_11;
275*e4061556SMario Six 		break;
276*e4061556SMario Six 	default:
277*e4061556SMario Six 		debug("%s: col_bits value %d invalid.\n",
278*e4061556SMario Six 		      ofnode_get_name(node), col_bits);
279*e4061556SMario Six 		return -EINVAL;
280*e4061556SMario Six 	}
281*e4061556SMario Six 
282*e4061556SMario Six 	/* Write CS config value */
283*e4061556SMario Six 	out_be32(&im->ddr.cs_config[cs], CSCONFIG_ENABLE | auto_precharge |
284*e4061556SMario Six 					 odt_rd_cfg | odt_wr_cfg |
285*e4061556SMario Six 					 bank_bits_mask | row_bits_mask |
286*e4061556SMario Six 					 col_bits_mask);
287*e4061556SMario Six 	return 0;
288*e4061556SMario Six }
289*e4061556SMario Six 
290*e4061556SMario Six /**
291*e4061556SMario Six  * mpc83xx_sdram_spd_init() - Initialize a RAM module using a SPD flash.
292*e4061556SMario Six  * @node:    Device tree node associated with ths module in question
293*e4061556SMario Six  * @cs:      The chip select to use for this RAM module
294*e4061556SMario Six  * @mapaddr: The address where the RAM module should be mapped
295*e4061556SMario Six  * @size:    The size of the RAM module to be mapped in bytes
296*e4061556SMario Six  *
297*e4061556SMario Six  * Return: 0 if OK, -ve on error
298*e4061556SMario Six  */
mpc83xx_sdram_spd_init(ofnode node,u32 cs,u32 mapaddr,u32 size)299*e4061556SMario Six static int mpc83xx_sdram_spd_init(ofnode node, u32 cs, u32 mapaddr, u32 size)
300*e4061556SMario Six {
301*e4061556SMario Six 	/* TODO(mario.six@gdsys.cc): Implement */
302*e4061556SMario Six 	return 0;
303*e4061556SMario Six }
304*e4061556SMario Six 
mpc83xx_sdram_ofdata_to_platdata(struct udevice * dev)305*e4061556SMario Six static int mpc83xx_sdram_ofdata_to_platdata(struct udevice *dev)
306*e4061556SMario Six {
307*e4061556SMario Six 	return 0;
308*e4061556SMario Six }
309*e4061556SMario Six 
mpc83xx_sdram_probe(struct udevice * dev)310*e4061556SMario Six static int mpc83xx_sdram_probe(struct udevice *dev)
311*e4061556SMario Six {
312*e4061556SMario Six 	struct mpc83xx_sdram_priv *priv = dev_get_priv(dev);
313*e4061556SMario Six 	immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
314*e4061556SMario Six 	int ret = 0;
315*e4061556SMario Six 	ofnode subnode;
316*e4061556SMario Six 	/* DDR control driver register values */
317*e4061556SMario Six 	u32 dso, pz_override, nz_override, odt_term, ddr_type, mvref_sel, m_odr;
318*e4061556SMario Six 	u32 ddrcdr;
319*e4061556SMario Six 	/* DDR SDRAM Clock Control register values */
320*e4061556SMario Six 	u32 clock_adjust;
321*e4061556SMario Six 	/* DDR SDRAM Timing Configuration 3 register values */
322*e4061556SMario Six 	u32 ext_refresh_rec, ext_refresh_rec_mask;
323*e4061556SMario Six 	/* DDR SDRAM Timing Configuration 0 register values */
324*e4061556SMario Six 	u32 read_to_write, write_to_read, read_to_read, write_to_write,
325*e4061556SMario Six 	    active_powerdown_exit, precharge_powerdown_exit,
326*e4061556SMario Six 	    odt_powerdown_exit, mode_reg_set_cycle;
327*e4061556SMario Six 	u32 timing_cfg_0;
328*e4061556SMario Six 	/* DDR SDRAM Timing Configuration 1 register values */
329*e4061556SMario Six 	u32 precharge_to_activate, activate_to_precharge,
330*e4061556SMario Six 	    activate_to_readwrite, mcas_latency, refresh_recovery,
331*e4061556SMario Six 	    last_data_to_precharge, activate_to_activate,
332*e4061556SMario Six 	    last_write_data_to_read;
333*e4061556SMario Six 	u32 timing_cfg_1;
334*e4061556SMario Six 	/* DDR SDRAM Timing Configuration 2 register values */
335*e4061556SMario Six 	u32 additive_latency, mcas_to_preamble_override, write_latency,
336*e4061556SMario Six 	    read_to_precharge, write_cmd_to_write_data,
337*e4061556SMario Six 	    minimum_cke_pulse_width, four_activates_window;
338*e4061556SMario Six 	u32 timing_cfg_2;
339*e4061556SMario Six 	/* DDR SDRAM Control Configuration register values */
340*e4061556SMario Six 	u32 self_refresh, ecc, registered_dram, sdram_type,
341*e4061556SMario Six 	    dynamic_power_management, databus_width, nc_auto_precharge,
342*e4061556SMario Six 	    timing_2t, bank_interleaving_ctrl, precharge_bit_8, half_strength,
343*e4061556SMario Six 	    bypass_initialization;
344*e4061556SMario Six 	u32 sdram_cfg;
345*e4061556SMario Six 	/* DDR SDRAM Control Configuration 2 register values */
346*e4061556SMario Six 	u32 force_self_refresh, dll_reset, dqs_config, odt_config,
347*e4061556SMario Six 	    posted_refreshes;
348*e4061556SMario Six 	u32 sdram_cfg2;
349*e4061556SMario Six 	/* DDR SDRAM Mode Configuration register values */
350*e4061556SMario Six 	u32 sdmode, esdmode;
351*e4061556SMario Six 	u32 sdram_mode;
352*e4061556SMario Six 	/* DDR SDRAM Mode Configuration 2 register values */
353*e4061556SMario Six 	u32 esdmode2, esdmode3;
354*e4061556SMario Six 	u32 sdram_mode2;
355*e4061556SMario Six 	/* DDR SDRAM Interval Configuration register values */
356*e4061556SMario Six 	u32 refresh_interval, precharge_interval;
357*e4061556SMario Six 	u32 sdram_interval;
358*e4061556SMario Six 
359*e4061556SMario Six 	priv->total_size = 0;
360*e4061556SMario Six 
361*e4061556SMario Six 	/* Disable both banks initially (might be re-enabled in loop below) */
362*e4061556SMario Six 	out_be32(&im->ddr.cs_config[0], 0);
363*e4061556SMario Six 	out_be32(&im->ddr.cs_config[1], 0);
364*e4061556SMario Six 
365*e4061556SMario Six 	dso = dev_read_u32_default(dev, "driver_software_override", 0);
366*e4061556SMario Six 	if (dso > 1) {
367*e4061556SMario Six 		debug("%s: driver_software_override value %d invalid.\n",
368*e4061556SMario Six 		      dev->name, dso);
369*e4061556SMario Six 		return -EINVAL;
370*e4061556SMario Six 	}
371*e4061556SMario Six 
372*e4061556SMario Six 	pz_override = dev_read_u32_default(dev, "p_impedance_override", 0);
373*e4061556SMario Six 
374*e4061556SMario Six 	switch (pz_override) {
375*e4061556SMario Six 	case DSO_P_IMPEDANCE_HIGHEST_Z:
376*e4061556SMario Six 	case DSO_P_IMPEDANCE_MUCH_HIGHER_Z:
377*e4061556SMario Six 	case DSO_P_IMPEDANCE_HIGHER_Z:
378*e4061556SMario Six 	case DSO_P_IMPEDANCE_NOMINAL:
379*e4061556SMario Six 	case DSO_P_IMPEDANCE_LOWER_Z:
380*e4061556SMario Six 		break;
381*e4061556SMario Six 	default:
382*e4061556SMario Six 		debug("%s: p_impedance_override value %d invalid.\n",
383*e4061556SMario Six 		      dev->name, pz_override);
384*e4061556SMario Six 		return -EINVAL;
385*e4061556SMario Six 	}
386*e4061556SMario Six 
387*e4061556SMario Six 	nz_override = dev_read_u32_default(dev, "n_impedance_override", 0);
388*e4061556SMario Six 
389*e4061556SMario Six 	switch (nz_override) {
390*e4061556SMario Six 	case DSO_N_IMPEDANCE_HIGHEST_Z:
391*e4061556SMario Six 	case DSO_N_IMPEDANCE_MUCH_HIGHER_Z:
392*e4061556SMario Six 	case DSO_N_IMPEDANCE_HIGHER_Z:
393*e4061556SMario Six 	case DSO_N_IMPEDANCE_NOMINAL:
394*e4061556SMario Six 	case DSO_N_IMPEDANCE_LOWER_Z:
395*e4061556SMario Six 		break;
396*e4061556SMario Six 	default:
397*e4061556SMario Six 		debug("%s: n_impedance_override value %d invalid.\n",
398*e4061556SMario Six 		      dev->name, nz_override);
399*e4061556SMario Six 		return -EINVAL;
400*e4061556SMario Six 	}
401*e4061556SMario Six 
402*e4061556SMario Six 	odt_term = dev_read_u32_default(dev, "odt_termination_value", 0);
403*e4061556SMario Six 	if (odt_term > 1) {
404*e4061556SMario Six 		debug("%s: odt_termination_value value %d invalid.\n",
405*e4061556SMario Six 		      dev->name, odt_term);
406*e4061556SMario Six 		return -EINVAL;
407*e4061556SMario Six 	}
408*e4061556SMario Six 
409*e4061556SMario Six 	ddr_type = dev_read_u32_default(dev, "ddr_type", 0);
410*e4061556SMario Six 	if (ddr_type > 1) {
411*e4061556SMario Six 		debug("%s: ddr_type value %d invalid.\n",
412*e4061556SMario Six 		      dev->name, ddr_type);
413*e4061556SMario Six 		return -EINVAL;
414*e4061556SMario Six 	}
415*e4061556SMario Six 
416*e4061556SMario Six 	mvref_sel = dev_read_u32_default(dev, "mvref_sel", 0);
417*e4061556SMario Six 	if (mvref_sel > 1) {
418*e4061556SMario Six 		debug("%s: mvref_sel value %d invalid.\n",
419*e4061556SMario Six 		      dev->name, mvref_sel);
420*e4061556SMario Six 		return -EINVAL;
421*e4061556SMario Six 	}
422*e4061556SMario Six 
423*e4061556SMario Six 	m_odr = dev_read_u32_default(dev, "m_odr", 0);
424*e4061556SMario Six 	if (mvref_sel > 1) {
425*e4061556SMario Six 		debug("%s: m_odr value %d invalid.\n",
426*e4061556SMario Six 		      dev->name, m_odr);
427*e4061556SMario Six 		return -EINVAL;
428*e4061556SMario Six 	}
429*e4061556SMario Six 
430*e4061556SMario Six 	ddrcdr = dso << (31 - 1) |
431*e4061556SMario Six 		 pz_override << (31 - 5) |
432*e4061556SMario Six 		 nz_override << (31 - 9) |
433*e4061556SMario Six 		 odt_term << (31 - 12) |
434*e4061556SMario Six 		 ddr_type << (31 - 13) |
435*e4061556SMario Six 		 mvref_sel << (31 - 29) |
436*e4061556SMario Six 		 m_odr << (31 - 30) | 1;
437*e4061556SMario Six 
438*e4061556SMario Six 	/* Configure the DDR control driver register */
439*e4061556SMario Six 	out_be32(&im->sysconf.ddrcdr, ddrcdr);
440*e4061556SMario Six 
441*e4061556SMario Six 	dev_for_each_subnode(subnode, dev) {
442*e4061556SMario Six 		u32 val[3];
443*e4061556SMario Six 		u32 cs, addr, size;
444*e4061556SMario Six 
445*e4061556SMario Six 		/* CS, map address, size -> three values */
446*e4061556SMario Six 		ofnode_read_u32_array(subnode, "reg", val, 3);
447*e4061556SMario Six 
448*e4061556SMario Six 		cs = val[0];
449*e4061556SMario Six 		addr = val[1];
450*e4061556SMario Six 		size = val[2];
451*e4061556SMario Six 
452*e4061556SMario Six 		if (cs > 1) {
453*e4061556SMario Six 			debug("%s: chip select value %d invalid.\n",
454*e4061556SMario Six 			      dev->name, cs);
455*e4061556SMario Six 			return -EINVAL;
456*e4061556SMario Six 		}
457*e4061556SMario Six 
458*e4061556SMario Six 		/* TODO(mario.six@gdsys.cc): Sanity check for size. */
459*e4061556SMario Six 
460*e4061556SMario Six 		if (ofnode_read_bool(subnode, "read-spd"))
461*e4061556SMario Six 			ret = mpc83xx_sdram_spd_init(subnode, cs, addr, size);
462*e4061556SMario Six 		else
463*e4061556SMario Six 			ret = mpc83xx_sdram_static_init(subnode, cs, addr,
464*e4061556SMario Six 							size);
465*e4061556SMario Six 		if (ret) {
466*e4061556SMario Six 			debug("%s: RAM init failed.\n", dev->name);
467*e4061556SMario Six 			return ret;
468*e4061556SMario Six 		}
469*e4061556SMario Six 	};
470*e4061556SMario Six 
471*e4061556SMario Six 	/*
472*e4061556SMario Six 	 * TODO(mario.six@gdsys.cc): This should only occur for static
473*e4061556SMario Six 	 *			     configuration
474*e4061556SMario Six 	 */
475*e4061556SMario Six 
476*e4061556SMario Six 	clock_adjust = dev_read_u32_default(dev, "clock_adjust", 0);
477*e4061556SMario Six 	switch (clock_adjust) {
478*e4061556SMario Six 	case CLOCK_ADJUST_025:
479*e4061556SMario Six 	case CLOCK_ADJUST_05:
480*e4061556SMario Six 	case CLOCK_ADJUST_075:
481*e4061556SMario Six 	case CLOCK_ADJUST_1:
482*e4061556SMario Six 		break;
483*e4061556SMario Six 	default:
484*e4061556SMario Six 		debug("%s: clock_adjust value %d invalid.\n",
485*e4061556SMario Six 		      dev->name, clock_adjust);
486*e4061556SMario Six 		return -EINVAL;
487*e4061556SMario Six 	}
488*e4061556SMario Six 
489*e4061556SMario Six 	/* Configure the DDR SDRAM Clock Control register */
490*e4061556SMario Six 	out_be32(&im->ddr.sdram_clk_cntl, clock_adjust);
491*e4061556SMario Six 
492*e4061556SMario Six 	ext_refresh_rec = dev_read_u32_default(dev, "ext_refresh_rec", 0);
493*e4061556SMario Six 	switch (ext_refresh_rec) {
494*e4061556SMario Six 	case 0:
495*e4061556SMario Six 		ext_refresh_rec_mask = 0 << TIMING_CFG3_EXT_REFREC_SHIFT;
496*e4061556SMario Six 		break;
497*e4061556SMario Six 	case 16:
498*e4061556SMario Six 		ext_refresh_rec_mask = 1 << TIMING_CFG3_EXT_REFREC_SHIFT;
499*e4061556SMario Six 		break;
500*e4061556SMario Six 	case 32:
501*e4061556SMario Six 		ext_refresh_rec_mask = 2 << TIMING_CFG3_EXT_REFREC_SHIFT;
502*e4061556SMario Six 		break;
503*e4061556SMario Six 	case 48:
504*e4061556SMario Six 		ext_refresh_rec_mask = 3 << TIMING_CFG3_EXT_REFREC_SHIFT;
505*e4061556SMario Six 		break;
506*e4061556SMario Six 	case 64:
507*e4061556SMario Six 		ext_refresh_rec_mask = 4 << TIMING_CFG3_EXT_REFREC_SHIFT;
508*e4061556SMario Six 		break;
509*e4061556SMario Six 	case 80:
510*e4061556SMario Six 		ext_refresh_rec_mask = 5 << TIMING_CFG3_EXT_REFREC_SHIFT;
511*e4061556SMario Six 		break;
512*e4061556SMario Six 	case 96:
513*e4061556SMario Six 		ext_refresh_rec_mask = 6 << TIMING_CFG3_EXT_REFREC_SHIFT;
514*e4061556SMario Six 		break;
515*e4061556SMario Six 	case 112:
516*e4061556SMario Six 		ext_refresh_rec_mask = 7 << TIMING_CFG3_EXT_REFREC_SHIFT;
517*e4061556SMario Six 		break;
518*e4061556SMario Six 	default:
519*e4061556SMario Six 		debug("%s: ext_refresh_rec value %d invalid.\n",
520*e4061556SMario Six 		      dev->name, ext_refresh_rec);
521*e4061556SMario Six 		return -EINVAL;
522*e4061556SMario Six 	}
523*e4061556SMario Six 
524*e4061556SMario Six 	/* Configure the DDR SDRAM Timing Configuration 3 register */
525*e4061556SMario Six 	out_be32(&im->ddr.timing_cfg_3, ext_refresh_rec_mask);
526*e4061556SMario Six 
527*e4061556SMario Six 	read_to_write = dev_read_u32_default(dev, "read_to_write", 0);
528*e4061556SMario Six 	if (read_to_write > 3) {
529*e4061556SMario Six 		debug("%s: read_to_write value %d invalid.\n",
530*e4061556SMario Six 		      dev->name, read_to_write);
531*e4061556SMario Six 		return -EINVAL;
532*e4061556SMario Six 	}
533*e4061556SMario Six 
534*e4061556SMario Six 	write_to_read = dev_read_u32_default(dev, "write_to_read", 0);
535*e4061556SMario Six 	if (write_to_read > 3) {
536*e4061556SMario Six 		debug("%s: write_to_read value %d invalid.\n",
537*e4061556SMario Six 		      dev->name, write_to_read);
538*e4061556SMario Six 		return -EINVAL;
539*e4061556SMario Six 	}
540*e4061556SMario Six 
541*e4061556SMario Six 	read_to_read = dev_read_u32_default(dev, "read_to_read", 0);
542*e4061556SMario Six 	if (read_to_read > 3) {
543*e4061556SMario Six 		debug("%s: read_to_read value %d invalid.\n",
544*e4061556SMario Six 		      dev->name, read_to_read);
545*e4061556SMario Six 		return -EINVAL;
546*e4061556SMario Six 	}
547*e4061556SMario Six 
548*e4061556SMario Six 	write_to_write = dev_read_u32_default(dev, "write_to_write", 0);
549*e4061556SMario Six 	if (write_to_write > 3) {
550*e4061556SMario Six 		debug("%s: write_to_write value %d invalid.\n",
551*e4061556SMario Six 		      dev->name, write_to_write);
552*e4061556SMario Six 		return -EINVAL;
553*e4061556SMario Six 	}
554*e4061556SMario Six 
555*e4061556SMario Six 	active_powerdown_exit =
556*e4061556SMario Six 		dev_read_u32_default(dev, "active_powerdown_exit", 0);
557*e4061556SMario Six 	if (active_powerdown_exit > 7) {
558*e4061556SMario Six 		debug("%s: active_powerdown_exit value %d invalid.\n",
559*e4061556SMario Six 		      dev->name, active_powerdown_exit);
560*e4061556SMario Six 		return -EINVAL;
561*e4061556SMario Six 	}
562*e4061556SMario Six 
563*e4061556SMario Six 	precharge_powerdown_exit =
564*e4061556SMario Six 		dev_read_u32_default(dev, "precharge_powerdown_exit", 0);
565*e4061556SMario Six 	if (precharge_powerdown_exit > 7) {
566*e4061556SMario Six 		debug("%s: precharge_powerdown_exit value %d invalid.\n",
567*e4061556SMario Six 		      dev->name, precharge_powerdown_exit);
568*e4061556SMario Six 		return -EINVAL;
569*e4061556SMario Six 	}
570*e4061556SMario Six 
571*e4061556SMario Six 	odt_powerdown_exit = dev_read_u32_default(dev, "odt_powerdown_exit", 0);
572*e4061556SMario Six 	if (odt_powerdown_exit > 15) {
573*e4061556SMario Six 		debug("%s: odt_powerdown_exit value %d invalid.\n",
574*e4061556SMario Six 		      dev->name, odt_powerdown_exit);
575*e4061556SMario Six 		return -EINVAL;
576*e4061556SMario Six 	}
577*e4061556SMario Six 
578*e4061556SMario Six 	mode_reg_set_cycle = dev_read_u32_default(dev, "mode_reg_set_cycle", 0);
579*e4061556SMario Six 	if (mode_reg_set_cycle > 15) {
580*e4061556SMario Six 		debug("%s: mode_reg_set_cycle value %d invalid.\n",
581*e4061556SMario Six 		      dev->name, mode_reg_set_cycle);
582*e4061556SMario Six 		return -EINVAL;
583*e4061556SMario Six 	}
584*e4061556SMario Six 
585*e4061556SMario Six 	timing_cfg_0 = read_to_write << TIMING_CFG0_RWT_SHIFT |
586*e4061556SMario Six 		       write_to_read << TIMING_CFG0_WRT_SHIFT |
587*e4061556SMario Six 		       read_to_read << TIMING_CFG0_RRT_SHIFT |
588*e4061556SMario Six 		       write_to_write << TIMING_CFG0_WWT_SHIFT |
589*e4061556SMario Six 		       active_powerdown_exit << TIMING_CFG0_ACT_PD_EXIT_SHIFT |
590*e4061556SMario Six 		       precharge_powerdown_exit << TIMING_CFG0_PRE_PD_EXIT_SHIFT |
591*e4061556SMario Six 		       odt_powerdown_exit << TIMING_CFG0_ODT_PD_EXIT_SHIFT |
592*e4061556SMario Six 		       mode_reg_set_cycle << TIMING_CFG0_MRS_CYC_SHIFT;
593*e4061556SMario Six 
594*e4061556SMario Six 	out_be32(&im->ddr.timing_cfg_0, timing_cfg_0);
595*e4061556SMario Six 
596*e4061556SMario Six 	precharge_to_activate =
597*e4061556SMario Six 		dev_read_u32_default(dev, "precharge_to_activate", 0);
598*e4061556SMario Six 	if (precharge_to_activate > 7 || precharge_to_activate == 0) {
599*e4061556SMario Six 		debug("%s: precharge_to_activate value %d invalid.\n",
600*e4061556SMario Six 		      dev->name, precharge_to_activate);
601*e4061556SMario Six 		return -EINVAL;
602*e4061556SMario Six 	}
603*e4061556SMario Six 
604*e4061556SMario Six 	activate_to_precharge =
605*e4061556SMario Six 		dev_read_u32_default(dev, "activate_to_precharge", 0);
606*e4061556SMario Six 	if (activate_to_precharge > 19) {
607*e4061556SMario Six 		debug("%s: activate_to_precharge value %d invalid.\n",
608*e4061556SMario Six 		      dev->name, activate_to_precharge);
609*e4061556SMario Six 		return -EINVAL;
610*e4061556SMario Six 	}
611*e4061556SMario Six 
612*e4061556SMario Six 	activate_to_readwrite =
613*e4061556SMario Six 		dev_read_u32_default(dev, "activate_to_readwrite", 0);
614*e4061556SMario Six 	if (activate_to_readwrite > 7 || activate_to_readwrite == 0) {
615*e4061556SMario Six 		debug("%s: activate_to_readwrite value %d invalid.\n",
616*e4061556SMario Six 		      dev->name, activate_to_readwrite);
617*e4061556SMario Six 		return -EINVAL;
618*e4061556SMario Six 	}
619*e4061556SMario Six 
620*e4061556SMario Six 	mcas_latency = dev_read_u32_default(dev, "mcas_latency", 0);
621*e4061556SMario Six 	switch (mcas_latency) {
622*e4061556SMario Six 	case CASLAT_20:
623*e4061556SMario Six 	case CASLAT_25:
624*e4061556SMario Six 		if (!IS_ENABLED(CONFIG_ARCH_MPC8308)) {
625*e4061556SMario Six 			debug("%s: MCAS latency < 3.0 unsupported on MPC8308\n",
626*e4061556SMario Six 			      dev->name);
627*e4061556SMario Six 			return -EINVAL;
628*e4061556SMario Six 		}
629*e4061556SMario Six 		/* fall through */
630*e4061556SMario Six 	case CASLAT_30:
631*e4061556SMario Six 	case CASLAT_35:
632*e4061556SMario Six 	case CASLAT_40:
633*e4061556SMario Six 	case CASLAT_45:
634*e4061556SMario Six 	case CASLAT_50:
635*e4061556SMario Six 	case CASLAT_55:
636*e4061556SMario Six 	case CASLAT_60:
637*e4061556SMario Six 	case CASLAT_65:
638*e4061556SMario Six 	case CASLAT_70:
639*e4061556SMario Six 	case CASLAT_75:
640*e4061556SMario Six 	case CASLAT_80:
641*e4061556SMario Six 		break;
642*e4061556SMario Six 	default:
643*e4061556SMario Six 		debug("%s: mcas_latency value %d invalid.\n",
644*e4061556SMario Six 		      dev->name, mcas_latency);
645*e4061556SMario Six 		return -EINVAL;
646*e4061556SMario Six 	}
647*e4061556SMario Six 
648*e4061556SMario Six 	refresh_recovery = dev_read_u32_default(dev, "refresh_recovery", 0);
649*e4061556SMario Six 	if (refresh_recovery > 23 || refresh_recovery < 8) {
650*e4061556SMario Six 		debug("%s: refresh_recovery value %d invalid.\n",
651*e4061556SMario Six 		      dev->name, refresh_recovery);
652*e4061556SMario Six 		return -EINVAL;
653*e4061556SMario Six 	}
654*e4061556SMario Six 
655*e4061556SMario Six 	last_data_to_precharge =
656*e4061556SMario Six 		dev_read_u32_default(dev, "last_data_to_precharge", 0);
657*e4061556SMario Six 	if (last_data_to_precharge > 7 || last_data_to_precharge == 0) {
658*e4061556SMario Six 		debug("%s: last_data_to_precharge value %d invalid.\n",
659*e4061556SMario Six 		      dev->name, last_data_to_precharge);
660*e4061556SMario Six 		return -EINVAL;
661*e4061556SMario Six 	}
662*e4061556SMario Six 
663*e4061556SMario Six 	activate_to_activate =
664*e4061556SMario Six 		dev_read_u32_default(dev, "activate_to_activate", 0);
665*e4061556SMario Six 	if (activate_to_activate > 7 || activate_to_activate == 0) {
666*e4061556SMario Six 		debug("%s: activate_to_activate value %d invalid.\n",
667*e4061556SMario Six 		      dev->name, activate_to_activate);
668*e4061556SMario Six 		return -EINVAL;
669*e4061556SMario Six 	}
670*e4061556SMario Six 
671*e4061556SMario Six 	last_write_data_to_read =
672*e4061556SMario Six 		dev_read_u32_default(dev, "last_write_data_to_read", 0);
673*e4061556SMario Six 	if (last_write_data_to_read > 7 || last_write_data_to_read == 0) {
674*e4061556SMario Six 		debug("%s: last_write_data_to_read value %d invalid.\n",
675*e4061556SMario Six 		      dev->name, last_write_data_to_read);
676*e4061556SMario Six 		return -EINVAL;
677*e4061556SMario Six 	}
678*e4061556SMario Six 
679*e4061556SMario Six 	timing_cfg_1 = precharge_to_activate << TIMING_CFG1_PRETOACT_SHIFT |
680*e4061556SMario Six 		       (activate_to_precharge > 15 ?
681*e4061556SMario Six 			activate_to_precharge - 16 :
682*e4061556SMario Six 			activate_to_precharge) << TIMING_CFG1_ACTTOPRE_SHIFT |
683*e4061556SMario Six 		       activate_to_readwrite << TIMING_CFG1_ACTTORW_SHIFT |
684*e4061556SMario Six 		       mcas_latency << TIMING_CFG1_CASLAT_SHIFT |
685*e4061556SMario Six 		       (refresh_recovery - 8) << TIMING_CFG1_REFREC_SHIFT |
686*e4061556SMario Six 		       last_data_to_precharge << TIMING_CFG1_WRREC_SHIFT |
687*e4061556SMario Six 		       activate_to_activate << TIMING_CFG1_ACTTOACT_SHIFT |
688*e4061556SMario Six 		       last_write_data_to_read << TIMING_CFG1_WRTORD_SHIFT;
689*e4061556SMario Six 
690*e4061556SMario Six 	/* Configure the DDR SDRAM Timing Configuration 1 register */
691*e4061556SMario Six 	out_be32(&im->ddr.timing_cfg_1, timing_cfg_1);
692*e4061556SMario Six 
693*e4061556SMario Six 	additive_latency = dev_read_u32_default(dev, "additive_latency", 0);
694*e4061556SMario Six 	if (additive_latency > 5) {
695*e4061556SMario Six 		debug("%s: additive_latency value %d invalid.\n",
696*e4061556SMario Six 		      dev->name, additive_latency);
697*e4061556SMario Six 		return -EINVAL;
698*e4061556SMario Six 	}
699*e4061556SMario Six 
700*e4061556SMario Six 	mcas_to_preamble_override =
701*e4061556SMario Six 		dev_read_u32_default(dev, "mcas_to_preamble_override", 0);
702*e4061556SMario Six 	switch (mcas_to_preamble_override) {
703*e4061556SMario Six 	case READ_LAT_PLUS_1:
704*e4061556SMario Six 	case READ_LAT:
705*e4061556SMario Six 	case READ_LAT_PLUS_1_4:
706*e4061556SMario Six 	case READ_LAT_PLUS_1_2:
707*e4061556SMario Six 	case READ_LAT_PLUS_3_4:
708*e4061556SMario Six 	case READ_LAT_PLUS_5_4:
709*e4061556SMario Six 	case READ_LAT_PLUS_3_2:
710*e4061556SMario Six 	case READ_LAT_PLUS_7_4:
711*e4061556SMario Six 	case READ_LAT_PLUS_2:
712*e4061556SMario Six 	case READ_LAT_PLUS_9_4:
713*e4061556SMario Six 	case READ_LAT_PLUS_5_2:
714*e4061556SMario Six 	case READ_LAT_PLUS_11_4:
715*e4061556SMario Six 	case READ_LAT_PLUS_3:
716*e4061556SMario Six 	case READ_LAT_PLUS_13_4:
717*e4061556SMario Six 	case READ_LAT_PLUS_7_2:
718*e4061556SMario Six 	case READ_LAT_PLUS_15_4:
719*e4061556SMario Six 	case READ_LAT_PLUS_4:
720*e4061556SMario Six 	case READ_LAT_PLUS_17_4:
721*e4061556SMario Six 	case READ_LAT_PLUS_9_2:
722*e4061556SMario Six 	case READ_LAT_PLUS_19_4:
723*e4061556SMario Six 		break;
724*e4061556SMario Six 	default:
725*e4061556SMario Six 		debug("%s: mcas_to_preamble_override value %d invalid.\n",
726*e4061556SMario Six 		      dev->name, mcas_to_preamble_override);
727*e4061556SMario Six 		return -EINVAL;
728*e4061556SMario Six 	}
729*e4061556SMario Six 
730*e4061556SMario Six 	write_latency = dev_read_u32_default(dev, "write_latency", 0);
731*e4061556SMario Six 	if (write_latency > 7 || write_latency == 0) {
732*e4061556SMario Six 		debug("%s: write_latency value %d invalid.\n",
733*e4061556SMario Six 		      dev->name, write_latency);
734*e4061556SMario Six 		return -EINVAL;
735*e4061556SMario Six 	}
736*e4061556SMario Six 
737*e4061556SMario Six 	read_to_precharge = dev_read_u32_default(dev, "read_to_precharge", 0);
738*e4061556SMario Six 	if (read_to_precharge > 4 || read_to_precharge == 0) {
739*e4061556SMario Six 		debug("%s: read_to_precharge value %d invalid.\n",
740*e4061556SMario Six 		      dev->name, read_to_precharge);
741*e4061556SMario Six 		return -EINVAL;
742*e4061556SMario Six 	}
743*e4061556SMario Six 
744*e4061556SMario Six 	write_cmd_to_write_data =
745*e4061556SMario Six 		dev_read_u32_default(dev, "write_cmd_to_write_data", 0);
746*e4061556SMario Six 	switch (write_cmd_to_write_data) {
747*e4061556SMario Six 	case CLOCK_DELAY_0:
748*e4061556SMario Six 	case CLOCK_DELAY_1_4:
749*e4061556SMario Six 	case CLOCK_DELAY_1_2:
750*e4061556SMario Six 	case CLOCK_DELAY_3_4:
751*e4061556SMario Six 	case CLOCK_DELAY_1:
752*e4061556SMario Six 	case CLOCK_DELAY_5_4:
753*e4061556SMario Six 	case CLOCK_DELAY_3_2:
754*e4061556SMario Six 		break;
755*e4061556SMario Six 	default:
756*e4061556SMario Six 		debug("%s: write_cmd_to_write_data value %d invalid.\n",
757*e4061556SMario Six 		      dev->name, write_cmd_to_write_data);
758*e4061556SMario Six 		return -EINVAL;
759*e4061556SMario Six 	}
760*e4061556SMario Six 
761*e4061556SMario Six 	minimum_cke_pulse_width =
762*e4061556SMario Six 		dev_read_u32_default(dev, "minimum_cke_pulse_width", 0);
763*e4061556SMario Six 	if (minimum_cke_pulse_width > 4 || minimum_cke_pulse_width == 0) {
764*e4061556SMario Six 		debug("%s: minimum_cke_pulse_width value %d invalid.\n",
765*e4061556SMario Six 		      dev->name, minimum_cke_pulse_width);
766*e4061556SMario Six 		return -EINVAL;
767*e4061556SMario Six 	}
768*e4061556SMario Six 
769*e4061556SMario Six 	four_activates_window =
770*e4061556SMario Six 		dev_read_u32_default(dev, "four_activates_window", 0);
771*e4061556SMario Six 	if (four_activates_window > 20 || four_activates_window == 0) {
772*e4061556SMario Six 		debug("%s: four_activates_window value %d invalid.\n",
773*e4061556SMario Six 		      dev->name, four_activates_window);
774*e4061556SMario Six 		return -EINVAL;
775*e4061556SMario Six 	}
776*e4061556SMario Six 
777*e4061556SMario Six 	timing_cfg_2 = additive_latency << TIMING_CFG2_ADD_LAT_SHIFT |
778*e4061556SMario Six 		       mcas_to_preamble_override << TIMING_CFG2_CPO_SHIFT |
779*e4061556SMario Six 		       write_latency << TIMING_CFG2_WR_LAT_DELAY_SHIFT |
780*e4061556SMario Six 		       read_to_precharge << TIMING_CFG2_RD_TO_PRE_SHIFT |
781*e4061556SMario Six 		       write_cmd_to_write_data << TIMING_CFG2_WR_DATA_DELAY_SHIFT |
782*e4061556SMario Six 		       minimum_cke_pulse_width << TIMING_CFG2_CKE_PLS_SHIFT |
783*e4061556SMario Six 		       four_activates_window << TIMING_CFG2_FOUR_ACT_SHIFT;
784*e4061556SMario Six 
785*e4061556SMario Six 	out_be32(&im->ddr.timing_cfg_2, timing_cfg_2);
786*e4061556SMario Six 
787*e4061556SMario Six 	self_refresh = dev_read_u32_default(dev, "self_refresh", 0);
788*e4061556SMario Six 	switch (self_refresh) {
789*e4061556SMario Six 	case SREN_DISABLE:
790*e4061556SMario Six 	case SREN_ENABLE:
791*e4061556SMario Six 		break;
792*e4061556SMario Six 	default:
793*e4061556SMario Six 		debug("%s: self_refresh value %d invalid.\n",
794*e4061556SMario Six 		      dev->name, self_refresh);
795*e4061556SMario Six 		return -EINVAL;
796*e4061556SMario Six 	}
797*e4061556SMario Six 
798*e4061556SMario Six 	ecc = dev_read_u32_default(dev, "ecc", 0);
799*e4061556SMario Six 	switch (ecc) {
800*e4061556SMario Six 	case ECC_DISABLE:
801*e4061556SMario Six 	case ECC_ENABLE:
802*e4061556SMario Six 		break;
803*e4061556SMario Six 	default:
804*e4061556SMario Six 		debug("%s: ecc value %d invalid.\n", dev->name, ecc);
805*e4061556SMario Six 		return -EINVAL;
806*e4061556SMario Six 	}
807*e4061556SMario Six 
808*e4061556SMario Six 	registered_dram = dev_read_u32_default(dev, "registered_dram", 0);
809*e4061556SMario Six 	switch (registered_dram) {
810*e4061556SMario Six 	case RD_DISABLE:
811*e4061556SMario Six 	case RD_ENABLE:
812*e4061556SMario Six 		break;
813*e4061556SMario Six 	default:
814*e4061556SMario Six 		debug("%s: registered_dram value %d invalid.\n",
815*e4061556SMario Six 		      dev->name, registered_dram);
816*e4061556SMario Six 		return -EINVAL;
817*e4061556SMario Six 	}
818*e4061556SMario Six 
819*e4061556SMario Six 	sdram_type = dev_read_u32_default(dev, "sdram_type", 0);
820*e4061556SMario Six 	switch (sdram_type) {
821*e4061556SMario Six 	case TYPE_DDR1:
822*e4061556SMario Six 	case TYPE_DDR2:
823*e4061556SMario Six 		break;
824*e4061556SMario Six 	default:
825*e4061556SMario Six 		debug("%s: sdram_type value %d invalid.\n",
826*e4061556SMario Six 		      dev->name, sdram_type);
827*e4061556SMario Six 		return -EINVAL;
828*e4061556SMario Six 	}
829*e4061556SMario Six 
830*e4061556SMario Six 	dynamic_power_management =
831*e4061556SMario Six 		dev_read_u32_default(dev, "dynamic_power_management", 0);
832*e4061556SMario Six 	switch (dynamic_power_management) {
833*e4061556SMario Six 	case DYN_PWR_DISABLE:
834*e4061556SMario Six 	case DYN_PWR_ENABLE:
835*e4061556SMario Six 		break;
836*e4061556SMario Six 	default:
837*e4061556SMario Six 		debug("%s: dynamic_power_management value %d invalid.\n",
838*e4061556SMario Six 		      dev->name, dynamic_power_management);
839*e4061556SMario Six 		return -EINVAL;
840*e4061556SMario Six 	}
841*e4061556SMario Six 
842*e4061556SMario Six 	databus_width = dev_read_u32_default(dev, "databus_width", 0);
843*e4061556SMario Six 	switch (databus_width) {
844*e4061556SMario Six 	case DATA_BUS_WIDTH_16:
845*e4061556SMario Six 	case DATA_BUS_WIDTH_32:
846*e4061556SMario Six 		break;
847*e4061556SMario Six 	default:
848*e4061556SMario Six 		debug("%s: databus_width value %d invalid.\n",
849*e4061556SMario Six 		      dev->name, databus_width);
850*e4061556SMario Six 		return -EINVAL;
851*e4061556SMario Six 	}
852*e4061556SMario Six 
853*e4061556SMario Six 	nc_auto_precharge = dev_read_u32_default(dev, "nc_auto_precharge", 0);
854*e4061556SMario Six 	switch (nc_auto_precharge) {
855*e4061556SMario Six 	case NCAP_DISABLE:
856*e4061556SMario Six 	case NCAP_ENABLE:
857*e4061556SMario Six 		break;
858*e4061556SMario Six 	default:
859*e4061556SMario Six 		debug("%s: nc_auto_precharge value %d invalid.\n",
860*e4061556SMario Six 		      dev->name, nc_auto_precharge);
861*e4061556SMario Six 		return -EINVAL;
862*e4061556SMario Six 	}
863*e4061556SMario Six 
864*e4061556SMario Six 	timing_2t = dev_read_u32_default(dev, "timing_2t", 0);
865*e4061556SMario Six 	switch (timing_2t) {
866*e4061556SMario Six 	case TIMING_1T:
867*e4061556SMario Six 	case TIMING_2T:
868*e4061556SMario Six 		break;
869*e4061556SMario Six 	default:
870*e4061556SMario Six 		debug("%s: timing_2t value %d invalid.\n",
871*e4061556SMario Six 		      dev->name, timing_2t);
872*e4061556SMario Six 		return -EINVAL;
873*e4061556SMario Six 	}
874*e4061556SMario Six 
875*e4061556SMario Six 	bank_interleaving_ctrl =
876*e4061556SMario Six 		dev_read_u32_default(dev, "bank_interleaving_ctrl", 0);
877*e4061556SMario Six 	switch (bank_interleaving_ctrl) {
878*e4061556SMario Six 	case INTERLEAVE_NONE:
879*e4061556SMario Six 	case INTERLEAVE_1_AND_2:
880*e4061556SMario Six 		break;
881*e4061556SMario Six 	default:
882*e4061556SMario Six 		debug("%s: bank_interleaving_ctrl value %d invalid.\n",
883*e4061556SMario Six 		      dev->name, bank_interleaving_ctrl);
884*e4061556SMario Six 		return -EINVAL;
885*e4061556SMario Six 	}
886*e4061556SMario Six 
887*e4061556SMario Six 	precharge_bit_8 = dev_read_u32_default(dev, "precharge_bit_8", 0);
888*e4061556SMario Six 	switch (precharge_bit_8) {
889*e4061556SMario Six 	case PRECHARGE_MA_10:
890*e4061556SMario Six 	case PRECHARGE_MA_8:
891*e4061556SMario Six 		break;
892*e4061556SMario Six 	default:
893*e4061556SMario Six 		debug("%s: precharge_bit_8 value %d invalid.\n",
894*e4061556SMario Six 		      dev->name, precharge_bit_8);
895*e4061556SMario Six 		return -EINVAL;
896*e4061556SMario Six 	}
897*e4061556SMario Six 
898*e4061556SMario Six 	half_strength = dev_read_u32_default(dev, "half_strength", 0);
899*e4061556SMario Six 	switch (half_strength) {
900*e4061556SMario Six 	case STRENGTH_FULL:
901*e4061556SMario Six 	case STRENGTH_HALF:
902*e4061556SMario Six 		break;
903*e4061556SMario Six 	default:
904*e4061556SMario Six 		debug("%s: half_strength value %d invalid.\n",
905*e4061556SMario Six 		      dev->name, half_strength);
906*e4061556SMario Six 		return -EINVAL;
907*e4061556SMario Six 	}
908*e4061556SMario Six 
909*e4061556SMario Six 	bypass_initialization =
910*e4061556SMario Six 		dev_read_u32_default(dev, "bypass_initialization", 0);
911*e4061556SMario Six 	switch (bypass_initialization) {
912*e4061556SMario Six 	case INITIALIZATION_DONT_BYPASS:
913*e4061556SMario Six 	case INITIALIZATION_BYPASS:
914*e4061556SMario Six 		break;
915*e4061556SMario Six 	default:
916*e4061556SMario Six 		debug("%s: bypass_initialization value %d invalid.\n",
917*e4061556SMario Six 		      dev->name, bypass_initialization);
918*e4061556SMario Six 		return -EINVAL;
919*e4061556SMario Six 	}
920*e4061556SMario Six 
921*e4061556SMario Six 	sdram_cfg = self_refresh << SDRAM_CFG_SREN_SHIFT |
922*e4061556SMario Six 		    ecc << SDRAM_CFG_ECC_EN_SHIFT |
923*e4061556SMario Six 		    registered_dram << SDRAM_CFG_RD_EN_SHIFT |
924*e4061556SMario Six 		    sdram_type << SDRAM_CFG_SDRAM_TYPE_SHIFT |
925*e4061556SMario Six 		    dynamic_power_management << SDRAM_CFG_DYN_PWR_SHIFT |
926*e4061556SMario Six 		    databus_width << SDRAM_CFG_DBW_SHIFT |
927*e4061556SMario Six 		    nc_auto_precharge << SDRAM_CFG_NCAP_SHIFT |
928*e4061556SMario Six 		    timing_2t << SDRAM_CFG_2T_EN_SHIFT |
929*e4061556SMario Six 		    bank_interleaving_ctrl << SDRAM_CFG_BA_INTLV_CTL_SHIFT |
930*e4061556SMario Six 		    precharge_bit_8 << SDRAM_CFG_PCHB8_SHIFT |
931*e4061556SMario Six 		    half_strength << SDRAM_CFG_HSE_SHIFT |
932*e4061556SMario Six 		    bypass_initialization << SDRAM_CFG_BI_SHIFT;
933*e4061556SMario Six 
934*e4061556SMario Six 	out_be32(&im->ddr.sdram_cfg, sdram_cfg);
935*e4061556SMario Six 
936*e4061556SMario Six 	force_self_refresh = dev_read_u32_default(dev, "force_self_refresh", 0);
937*e4061556SMario Six 	switch (force_self_refresh) {
938*e4061556SMario Six 	case MODE_NORMAL:
939*e4061556SMario Six 	case MODE_REFRESH:
940*e4061556SMario Six 		break;
941*e4061556SMario Six 	default:
942*e4061556SMario Six 		debug("%s: force_self_refresh value %d invalid.\n",
943*e4061556SMario Six 		      dev->name, force_self_refresh);
944*e4061556SMario Six 		return -EINVAL;
945*e4061556SMario Six 	}
946*e4061556SMario Six 
947*e4061556SMario Six 	dll_reset = dev_read_u32_default(dev, "dll_reset", 0);
948*e4061556SMario Six 	switch (dll_reset) {
949*e4061556SMario Six 	case DLL_RESET_ENABLE:
950*e4061556SMario Six 	case DLL_RESET_DISABLE:
951*e4061556SMario Six 		break;
952*e4061556SMario Six 	default:
953*e4061556SMario Six 		debug("%s: dll_reset value %d invalid.\n",
954*e4061556SMario Six 		      dev->name, dll_reset);
955*e4061556SMario Six 		return -EINVAL;
956*e4061556SMario Six 	}
957*e4061556SMario Six 
958*e4061556SMario Six 	dqs_config = dev_read_u32_default(dev, "dqs_config", 0);
959*e4061556SMario Six 	switch (dqs_config) {
960*e4061556SMario Six 	case DQS_TRUE:
961*e4061556SMario Six 		break;
962*e4061556SMario Six 	default:
963*e4061556SMario Six 		debug("%s: dqs_config value %d invalid.\n",
964*e4061556SMario Six 		      dev->name, dqs_config);
965*e4061556SMario Six 		return -EINVAL;
966*e4061556SMario Six 	}
967*e4061556SMario Six 
968*e4061556SMario Six 	odt_config = dev_read_u32_default(dev, "odt_config", 0);
969*e4061556SMario Six 	switch (odt_config) {
970*e4061556SMario Six 	case ODT_ASSERT_NEVER:
971*e4061556SMario Six 	case ODT_ASSERT_WRITES:
972*e4061556SMario Six 	case ODT_ASSERT_READS:
973*e4061556SMario Six 	case ODT_ASSERT_ALWAYS:
974*e4061556SMario Six 		break;
975*e4061556SMario Six 	default:
976*e4061556SMario Six 		debug("%s: odt_config value %d invalid.\n",
977*e4061556SMario Six 		      dev->name, odt_config);
978*e4061556SMario Six 		return -EINVAL;
979*e4061556SMario Six 	}
980*e4061556SMario Six 
981*e4061556SMario Six 	posted_refreshes = dev_read_u32_default(dev, "posted_refreshes", 0);
982*e4061556SMario Six 	if (posted_refreshes > 8 || posted_refreshes == 0) {
983*e4061556SMario Six 		debug("%s: posted_refreshes value %d invalid.\n",
984*e4061556SMario Six 		      dev->name, posted_refreshes);
985*e4061556SMario Six 		return -EINVAL;
986*e4061556SMario Six 	}
987*e4061556SMario Six 
988*e4061556SMario Six 	sdram_cfg2 = force_self_refresh << SDRAM_CFG2_FRC_SR_SHIFT |
989*e4061556SMario Six 		     dll_reset << SDRAM_CFG2_DLL_RST_DIS |
990*e4061556SMario Six 		     dqs_config << SDRAM_CFG2_DQS_CFG |
991*e4061556SMario Six 		     odt_config << SDRAM_CFG2_ODT_CFG |
992*e4061556SMario Six 		     posted_refreshes << SDRAM_CFG2_NUM_PR;
993*e4061556SMario Six 
994*e4061556SMario Six 	out_be32(&im->ddr.sdram_cfg2, sdram_cfg2);
995*e4061556SMario Six 
996*e4061556SMario Six 	sdmode = dev_read_u32_default(dev, "sdmode", 0);
997*e4061556SMario Six 	if (sdmode > 0xFFFF) {
998*e4061556SMario Six 		debug("%s: sdmode value %d invalid.\n",
999*e4061556SMario Six 		      dev->name, sdmode);
1000*e4061556SMario Six 		return -EINVAL;
1001*e4061556SMario Six 	}
1002*e4061556SMario Six 
1003*e4061556SMario Six 	esdmode = dev_read_u32_default(dev, "esdmode", 0);
1004*e4061556SMario Six 	if (esdmode > 0xFFFF) {
1005*e4061556SMario Six 		debug("%s: esdmode value %d invalid.\n", dev->name, esdmode);
1006*e4061556SMario Six 		return -EINVAL;
1007*e4061556SMario Six 	}
1008*e4061556SMario Six 
1009*e4061556SMario Six 	sdram_mode = sdmode << SDRAM_MODE_SD_SHIFT |
1010*e4061556SMario Six 		     esdmode << SDRAM_MODE_ESD_SHIFT;
1011*e4061556SMario Six 
1012*e4061556SMario Six 	out_be32(&im->ddr.sdram_mode, sdram_mode);
1013*e4061556SMario Six 
1014*e4061556SMario Six 	esdmode2 = dev_read_u32_default(dev, "esdmode2", 0);
1015*e4061556SMario Six 	if (esdmode2 > 0xFFFF) {
1016*e4061556SMario Six 		debug("%s: esdmode2 value %d invalid.\n", dev->name, esdmode2);
1017*e4061556SMario Six 		return -EINVAL;
1018*e4061556SMario Six 	}
1019*e4061556SMario Six 
1020*e4061556SMario Six 	esdmode3 = dev_read_u32_default(dev, "esdmode3", 0);
1021*e4061556SMario Six 	if (esdmode3 > 0xFFFF) {
1022*e4061556SMario Six 		debug("%s: esdmode3 value %d invalid.\n", dev->name, esdmode3);
1023*e4061556SMario Six 		return -EINVAL;
1024*e4061556SMario Six 	}
1025*e4061556SMario Six 
1026*e4061556SMario Six 	sdram_mode2 = esdmode2 << SDRAM_MODE2_ESD2_SHIFT |
1027*e4061556SMario Six 		      esdmode3 << SDRAM_MODE2_ESD3_SHIFT;
1028*e4061556SMario Six 
1029*e4061556SMario Six 	out_be32(&im->ddr.sdram_mode2, sdram_mode2);
1030*e4061556SMario Six 
1031*e4061556SMario Six 	refresh_interval = dev_read_u32_default(dev, "refresh_interval", 0);
1032*e4061556SMario Six 	if (refresh_interval > 0xFFFF) {
1033*e4061556SMario Six 		debug("%s: refresh_interval value %d invalid.\n",
1034*e4061556SMario Six 		      dev->name, refresh_interval);
1035*e4061556SMario Six 		return -EINVAL;
1036*e4061556SMario Six 	}
1037*e4061556SMario Six 
1038*e4061556SMario Six 	precharge_interval = dev_read_u32_default(dev, "precharge_interval", 0);
1039*e4061556SMario Six 	if (precharge_interval > 0x3FFF) {
1040*e4061556SMario Six 		debug("%s: precharge_interval value %d invalid.\n",
1041*e4061556SMario Six 		      dev->name, precharge_interval);
1042*e4061556SMario Six 		return -EINVAL;
1043*e4061556SMario Six 	}
1044*e4061556SMario Six 
1045*e4061556SMario Six 	sdram_interval = refresh_interval << SDRAM_INTERVAL_REFINT_SHIFT |
1046*e4061556SMario Six 			 precharge_interval << SDRAM_INTERVAL_BSTOPRE_SHIFT;
1047*e4061556SMario Six 
1048*e4061556SMario Six 	out_be32(&im->ddr.sdram_interval, sdram_interval);
1049*e4061556SMario Six 	sync();
1050*e4061556SMario Six 
1051*e4061556SMario Six 	/* Enable DDR controller */
1052*e4061556SMario Six 	setbits_be32(&im->ddr.sdram_cfg, SDRAM_CFG_MEM_EN);
1053*e4061556SMario Six 	sync();
1054*e4061556SMario Six 
1055*e4061556SMario Six 	dev_for_each_subnode(subnode, dev) {
1056*e4061556SMario Six 		u32 val[3];
1057*e4061556SMario Six 		u32 addr, size;
1058*e4061556SMario Six 
1059*e4061556SMario Six 		/* CS, map address, size -> three values */
1060*e4061556SMario Six 		ofnode_read_u32_array(subnode, "reg", val, 3);
1061*e4061556SMario Six 
1062*e4061556SMario Six 		addr = val[1];
1063*e4061556SMario Six 		size = val[2];
1064*e4061556SMario Six 
1065*e4061556SMario Six 		priv->total_size += get_ram_size((long int *)addr, size);
1066*e4061556SMario Six 	};
1067*e4061556SMario Six 
1068*e4061556SMario Six 	gd->ram_size = priv->total_size;
1069*e4061556SMario Six 
1070*e4061556SMario Six 	return 0;
1071*e4061556SMario Six }
1072*e4061556SMario Six 
mpc83xx_sdram_get_info(struct udevice * dev,struct ram_info * info)1073*e4061556SMario Six static int mpc83xx_sdram_get_info(struct udevice *dev, struct ram_info *info)
1074*e4061556SMario Six {
1075*e4061556SMario Six 	/* TODO(mario.six@gdsys.cc): Implement */
1076*e4061556SMario Six 	return 0;
1077*e4061556SMario Six }
1078*e4061556SMario Six 
1079*e4061556SMario Six static struct ram_ops mpc83xx_sdram_ops = {
1080*e4061556SMario Six 	.get_info = mpc83xx_sdram_get_info,
1081*e4061556SMario Six };
1082*e4061556SMario Six 
1083*e4061556SMario Six static const struct udevice_id mpc83xx_sdram_ids[] = {
1084*e4061556SMario Six 	{ .compatible = "fsl,mpc83xx-mem-controller" },
1085*e4061556SMario Six 	{ /* sentinel */ }
1086*e4061556SMario Six };
1087*e4061556SMario Six 
1088*e4061556SMario Six U_BOOT_DRIVER(mpc83xx_sdram) = {
1089*e4061556SMario Six 	.name = "mpc83xx_sdram",
1090*e4061556SMario Six 	.id = UCLASS_RAM,
1091*e4061556SMario Six 	.of_match = mpc83xx_sdram_ids,
1092*e4061556SMario Six 	.ops = &mpc83xx_sdram_ops,
1093*e4061556SMario Six 	.ofdata_to_platdata = mpc83xx_sdram_ofdata_to_platdata,
1094*e4061556SMario Six 	.probe = mpc83xx_sdram_probe,
1095*e4061556SMario Six 	.priv_auto_alloc_size = sizeof(struct mpc83xx_sdram_priv),
1096*e4061556SMario Six };
1097