xref: /rk3399_rockchip-uboot/board/freescale/mpc8349itx/mpc8349itx.c (revision b3458d2cd55d01732e30a76d898afd99e871cd67)
1e58fe957SKim Phillips /*
2e58fe957SKim Phillips  * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved.
3e58fe957SKim Phillips  *
4e58fe957SKim Phillips  * See file CREDITS for list of people who contributed to this
5e58fe957SKim Phillips  * project.
6e58fe957SKim Phillips  *
7e58fe957SKim Phillips  * This program is free software; you can redistribute it and/or
8e58fe957SKim Phillips  * modify it under the terms of the GNU General Public License as
9e58fe957SKim Phillips  * published by the Free Software Foundation; either version 2 of
10e58fe957SKim Phillips  * the License, or (at your option) any later version.
11e58fe957SKim Phillips  *
12e58fe957SKim Phillips  * This program is distributed in the hope that it will be useful,
13e58fe957SKim Phillips  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14e58fe957SKim Phillips  * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE.  See the
15e58fe957SKim Phillips  * GNU General Public License for more details.
16e58fe957SKim Phillips  *
17e58fe957SKim Phillips  * You should have received a copy of the GNU General Public License
18e58fe957SKim Phillips  * along with this program; if not, write to the Free Software
19e58fe957SKim Phillips  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20e58fe957SKim Phillips  * MA 02111-1307 USA
21e58fe957SKim Phillips  */
22e58fe957SKim Phillips 
23e58fe957SKim Phillips #include <common.h>
24e58fe957SKim Phillips #include <ioports.h>
25e58fe957SKim Phillips #include <mpc83xx.h>
26e58fe957SKim Phillips #include <i2c.h>
27e58fe957SKim Phillips #include <spd.h>
28e58fe957SKim Phillips #include <miiphy.h>
29e58fe957SKim Phillips 
30e58fe957SKim Phillips #ifdef CONFIG_PCI
31e58fe957SKim Phillips #include <asm/mpc8349_pci.h>
32e58fe957SKim Phillips #include <pci.h>
33e58fe957SKim Phillips #endif
34e58fe957SKim Phillips 
35e58fe957SKim Phillips #ifdef CONFIG_SPD_EEPROM
36e58fe957SKim Phillips #include <spd_sdram.h>
37e58fe957SKim Phillips #else
38e58fe957SKim Phillips #include <asm/mmu.h>
39e58fe957SKim Phillips #endif
40*b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT)
41e58fe957SKim Phillips #include <libfdt.h>
42e58fe957SKim Phillips #endif
43e58fe957SKim Phillips 
44e58fe957SKim Phillips #ifndef CONFIG_SPD_EEPROM
45e58fe957SKim Phillips /*************************************************************************
46e58fe957SKim Phillips  *  fixed sdram init -- doesn't use serial presence detect.
47e58fe957SKim Phillips  ************************************************************************/
48e58fe957SKim Phillips int fixed_sdram(void)
49e58fe957SKim Phillips {
50e58fe957SKim Phillips 	volatile immap_t *im = (immap_t *) CFG_IMMR;
51e58fe957SKim Phillips 	u32 ddr_size;		/* The size of RAM, in bytes */
52e58fe957SKim Phillips 	u32 ddr_size_log2 = 0;
53e58fe957SKim Phillips 
54e58fe957SKim Phillips 	for (ddr_size = CFG_DDR_SIZE * 0x100000; ddr_size > 1; ddr_size >>= 1) {
55e58fe957SKim Phillips 		if (ddr_size & 1) {
56e58fe957SKim Phillips 			return -1;
57e58fe957SKim Phillips 		}
58e58fe957SKim Phillips 		ddr_size_log2++;
59e58fe957SKim Phillips 	}
60e58fe957SKim Phillips 
61e58fe957SKim Phillips 	im->sysconf.ddrlaw[0].ar =
62e58fe957SKim Phillips 	    LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
63e58fe957SKim Phillips 	im->sysconf.ddrlaw[0].bar = (CFG_DDR_SDRAM_BASE >> 12) & 0xfffff;
64e58fe957SKim Phillips 
65e58fe957SKim Phillips 	/* Only one CS0 for DDR */
66e58fe957SKim Phillips 	im->ddr.csbnds[0].csbnds = 0x0000000f;
67e58fe957SKim Phillips 	im->ddr.cs_config[0] = CFG_DDR_CONFIG;
68e58fe957SKim Phillips 
69e58fe957SKim Phillips 	debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds);
70e58fe957SKim Phillips 	debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]);
71e58fe957SKim Phillips 
72e58fe957SKim Phillips 	debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar);
73e58fe957SKim Phillips 	debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar);
74e58fe957SKim Phillips 
75e58fe957SKim Phillips 	im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
76e58fe957SKim Phillips 	im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */
77e58fe957SKim Phillips 	im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR1;
78e58fe957SKim Phillips 	im->ddr.sdram_mode =
79e58fe957SKim Phillips 	    (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT);
80e58fe957SKim Phillips 	im->ddr.sdram_interval =
81e58fe957SKim Phillips 	    (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 <<
82e58fe957SKim Phillips 						       SDRAM_INTERVAL_BSTOPRE_SHIFT);
83e58fe957SKim Phillips 	im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL;
84e58fe957SKim Phillips 
85e58fe957SKim Phillips 	udelay(200);
86e58fe957SKim Phillips 
87e58fe957SKim Phillips 	im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
88e58fe957SKim Phillips 
89e58fe957SKim Phillips 	debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1);
90e58fe957SKim Phillips 	debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2);
91e58fe957SKim Phillips 	debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode);
92e58fe957SKim Phillips 	debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval);
93e58fe957SKim Phillips 	debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg);
94e58fe957SKim Phillips 
95e58fe957SKim Phillips 	return CFG_DDR_SIZE;
96e58fe957SKim Phillips }
97e58fe957SKim Phillips #endif
98e58fe957SKim Phillips 
99e58fe957SKim Phillips #ifdef CONFIG_PCI
100e58fe957SKim Phillips /*
101e58fe957SKim Phillips  * Initialize PCI Devices, report devices found
102e58fe957SKim Phillips  */
103e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
104e58fe957SKim Phillips static struct pci_config_table pci_mpc83xxmitx_config_table[] = {
105e58fe957SKim Phillips 	{
106e58fe957SKim Phillips 	 PCI_ANY_ID,
107e58fe957SKim Phillips 	 PCI_ANY_ID,
108e58fe957SKim Phillips 	 PCI_ANY_ID,
109e58fe957SKim Phillips 	 PCI_ANY_ID,
110e58fe957SKim Phillips 	 0x0f,
111e58fe957SKim Phillips 	 PCI_ANY_ID,
112e58fe957SKim Phillips 	 pci_cfgfunc_config_device,
113e58fe957SKim Phillips 	 {
114e58fe957SKim Phillips 	  PCI_ENET0_IOADDR,
115e58fe957SKim Phillips 	  PCI_ENET0_MEMADDR,
116e58fe957SKim Phillips 	  PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER}
117e58fe957SKim Phillips 	 },
118e58fe957SKim Phillips 	{}
119e58fe957SKim Phillips }
120e58fe957SKim Phillips #endif
121e58fe957SKim Phillips 
122e58fe957SKim Phillips volatile static struct pci_controller hose[] = {
123e58fe957SKim Phillips 	{
124e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
125e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
126e58fe957SKim Phillips #endif
127e58fe957SKim Phillips 	 },
128e58fe957SKim Phillips 	{
129e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
130e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
131e58fe957SKim Phillips #endif
132e58fe957SKim Phillips 	 }
133e58fe957SKim Phillips };
134e58fe957SKim Phillips #endif				/* CONFIG_PCI */
135e58fe957SKim Phillips 
136e58fe957SKim Phillips long int initdram(int board_type)
137e58fe957SKim Phillips {
138e58fe957SKim Phillips 	volatile immap_t *im = (immap_t *) CFG_IMMR;
139e58fe957SKim Phillips 	u32 msize = 0;
140e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
141e58fe957SKim Phillips 	volatile ddr83xx_t *ddr = &im->ddr;
142e58fe957SKim Phillips #endif
143e58fe957SKim Phillips 
144e58fe957SKim Phillips 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
145e58fe957SKim Phillips 		return -1;
146e58fe957SKim Phillips 
147e58fe957SKim Phillips 	/* DDR SDRAM - Main SODIMM */
148e58fe957SKim Phillips 	im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR;
149e58fe957SKim Phillips #ifdef CONFIG_SPD_EEPROM
150e58fe957SKim Phillips 	msize = spd_sdram();
151e58fe957SKim Phillips #else
152e58fe957SKim Phillips 	msize = fixed_sdram();
153e58fe957SKim Phillips #endif
154e58fe957SKim Phillips 
155e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
156e58fe957SKim Phillips 	if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN)
157e58fe957SKim Phillips 		/* Unlike every other board, on the 83xx spd_sdram() returns
158e58fe957SKim Phillips 		   megabytes instead of just bytes.  That's why we need to
159e58fe957SKim Phillips 		   multiple by 1MB when calling ddr_enable_ecc(). */
160e58fe957SKim Phillips 		ddr_enable_ecc(msize * 1048576);
161e58fe957SKim Phillips #endif
162e58fe957SKim Phillips 
163e58fe957SKim Phillips 	/* return total bus RAM size(bytes) */
164e58fe957SKim Phillips 	return msize * 1024 * 1024;
165e58fe957SKim Phillips }
166e58fe957SKim Phillips 
167e58fe957SKim Phillips int checkboard(void)
168e58fe957SKim Phillips {
169e58fe957SKim Phillips #ifdef CONFIG_MPC8349ITX
170e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX\n");
171e58fe957SKim Phillips #else
172e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX-GP\n");
173e58fe957SKim Phillips #endif
174e58fe957SKim Phillips 
175e58fe957SKim Phillips 	return 0;
176e58fe957SKim Phillips }
177e58fe957SKim Phillips 
178e58fe957SKim Phillips /*
179e58fe957SKim Phillips  * Implement a work-around for a hardware problem with compact
180e58fe957SKim Phillips  * flash.
181e58fe957SKim Phillips  *
182e58fe957SKim Phillips  * Program the UPM if compact flash is enabled.
183e58fe957SKim Phillips  */
184e58fe957SKim Phillips int misc_init_f(void)
185e58fe957SKim Phillips {
186e58fe957SKim Phillips #ifdef CONFIG_VSC7385
187e58fe957SKim Phillips 	volatile u32 *vsc7385_cpuctrl;
188e58fe957SKim Phillips 
189e58fe957SKim Phillips 	/* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register.  The power up
190e58fe957SKim Phillips 	   default of VSC7385 L1_IRQ and L2_IRQ requests are active high.  That
191e58fe957SKim Phillips 	   means it is 0 when the IRQ is not active.  This makes the wire-AND
192e58fe957SKim Phillips 	   logic always assert IRQ7 to CPU even if there is no request from the
193e58fe957SKim Phillips 	   switch.  Since the compact flash and the switch share the same IRQ,
194e58fe957SKim Phillips 	   the Linux kernel will think that the compact flash is requesting irq
195e58fe957SKim Phillips 	   and get stuck when it tries to clear the IRQ.  Thus we need to set
196e58fe957SKim Phillips 	   the L2_IRQ0 and L2_IRQ1 to active low.
197e58fe957SKim Phillips 
198e58fe957SKim Phillips 	   The following code sets the L1_IRQ and L2_IRQ polarity to active low.
199e58fe957SKim Phillips 	   Without this code, compact flash will not work in Linux because
200e58fe957SKim Phillips 	   unlike U-Boot, Linux uses the IRQ, so this code is necessary if we
201e58fe957SKim Phillips 	   don't enable compact flash for U-Boot.
202e58fe957SKim Phillips 	 */
203e58fe957SKim Phillips 
204e58fe957SKim Phillips 	vsc7385_cpuctrl = (volatile u32 *)(CFG_VSC7385_BASE + 0x1c0c0);
205e58fe957SKim Phillips 	*vsc7385_cpuctrl |= 0x0c;
206e58fe957SKim Phillips #endif
207e58fe957SKim Phillips 
208e58fe957SKim Phillips #ifdef CONFIG_COMPACT_FLASH
209e58fe957SKim Phillips 	/* UPM Table Configuration Code */
210e58fe957SKim Phillips 	static uint UPMATable[] = {
211e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00,
212e58fe957SKim Phillips 		0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01,
213e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
214e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
215e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00,
216e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
217e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00,
218e58fe957SKim Phillips 		0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00,
219e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
220e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
221e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
222e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
223e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
224e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
225e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
226e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01
227e58fe957SKim Phillips 	};
228e58fe957SKim Phillips 	volatile immap_t *immap = (immap_t *) CFG_IMMR;
229e58fe957SKim Phillips 	volatile lbus83xx_t *lbus = &immap->lbus;
230e58fe957SKim Phillips 
231e58fe957SKim Phillips 	lbus->bank[3].br = CFG_BR3_PRELIM;
232e58fe957SKim Phillips 	lbus->bank[3].or = CFG_OR3_PRELIM;
233e58fe957SKim Phillips 
234e58fe957SKim Phillips 	/* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000,
235e58fe957SKim Phillips 	   GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000
236e58fe957SKim Phillips 	 */
237e58fe957SKim Phillips 	lbus->mamr = 0x08404440;
238e58fe957SKim Phillips 
239e58fe957SKim Phillips 	upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0]));
240e58fe957SKim Phillips 
241e58fe957SKim Phillips 	puts("UPMA:  Configured for compact flash\n");
242e58fe957SKim Phillips #endif
243e58fe957SKim Phillips 
244e58fe957SKim Phillips 	return 0;
245e58fe957SKim Phillips }
246e58fe957SKim Phillips 
247e58fe957SKim Phillips /*
248e58fe957SKim Phillips  * Make sure the EEPROM has the HRCW correctly programmed.
249e58fe957SKim Phillips  * Make sure the RTC is correctly programmed.
250e58fe957SKim Phillips  *
251e58fe957SKim Phillips  * The MPC8349E-mITX can be configured to load the HRCW from
252e58fe957SKim Phillips  * EEPROM instead of flash.  This is controlled via jumpers
253e58fe957SKim Phillips  * LGPL0, 1, and 3.  Normally, these jumpers are set to 000 (all
254e58fe957SKim Phillips  * jumpered), but if they're set to 001 or 010, then the HRCW is
255e58fe957SKim Phillips  * read from the "I2C EEPROM".
256e58fe957SKim Phillips  *
257e58fe957SKim Phillips  * This function makes sure that the I2C EEPROM is programmed
258e58fe957SKim Phillips  * correctly.
259e58fe957SKim Phillips  */
260e58fe957SKim Phillips int misc_init_r(void)
261e58fe957SKim Phillips {
262e58fe957SKim Phillips 	int rc = 0;
263e58fe957SKim Phillips 
264e58fe957SKim Phillips #ifdef CONFIG_HARD_I2C
265e58fe957SKim Phillips 
266e58fe957SKim Phillips 	unsigned int orig_bus = i2c_get_bus_num();
267e58fe957SKim Phillips 	u8 i2c_data;
268e58fe957SKim Phillips 
269e58fe957SKim Phillips #ifdef CFG_I2C_RTC_ADDR
270e58fe957SKim Phillips 	u8 ds1339_data[17];
271e58fe957SKim Phillips #endif
272e58fe957SKim Phillips 
273e58fe957SKim Phillips #ifdef CFG_I2C_EEPROM_ADDR
274e58fe957SKim Phillips 	static u8 eeprom_data[] =	/* HRCW data */
275e58fe957SKim Phillips 	{
276e58fe957SKim Phillips 		0xAA, 0x55, 0xAA,       /* Preamble */
277e58fe957SKim Phillips 		0x7C, 		        /* ACS=0, BYTE_EN=1111, CONT=1 */
278e58fe957SKim Phillips 		0x02, 0x40, 	        /* RCWL ADDR=0x0_0900 */
279e58fe957SKim Phillips 		(CFG_HRCW_LOW >> 24) & 0xFF,
280e58fe957SKim Phillips 		(CFG_HRCW_LOW >> 16) & 0xFF,
281e58fe957SKim Phillips 		(CFG_HRCW_LOW >> 8) & 0xFF,
282e58fe957SKim Phillips 		CFG_HRCW_LOW & 0xFF,
283e58fe957SKim Phillips 		0x7C, 		        /* ACS=0, BYTE_EN=1111, CONT=1 */
284e58fe957SKim Phillips 		0x02, 0x41,	        /* RCWH ADDR=0x0_0904 */
285e58fe957SKim Phillips 		(CFG_HRCW_HIGH >> 24) & 0xFF,
286e58fe957SKim Phillips 		(CFG_HRCW_HIGH >> 16) & 0xFF,
287e58fe957SKim Phillips 		(CFG_HRCW_HIGH >> 8) & 0xFF,
288e58fe957SKim Phillips 		CFG_HRCW_HIGH & 0xFF
289e58fe957SKim Phillips 	};
290e58fe957SKim Phillips 
291e58fe957SKim Phillips 	u8 data[sizeof(eeprom_data)];
292e58fe957SKim Phillips #endif
293e58fe957SKim Phillips 
294e58fe957SKim Phillips 	printf("Board revision: ");
295e58fe957SKim Phillips 	i2c_set_bus_num(1);
296e58fe957SKim Phillips 	if (i2c_read(CFG_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
297e58fe957SKim Phillips 		printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01);
298e58fe957SKim Phillips 	else if (i2c_read(CFG_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
299e58fe957SKim Phillips 		printf("%u.%u (PCF8475)\n",  (i2c_data & 0x02) >> 1, i2c_data & 0x01);
300e58fe957SKim Phillips 	else {
301e58fe957SKim Phillips 		printf("Unknown\n");
302e58fe957SKim Phillips 		rc = 1;
303e58fe957SKim Phillips 	}
304e58fe957SKim Phillips 
305e58fe957SKim Phillips #ifdef CFG_I2C_EEPROM_ADDR
306e58fe957SKim Phillips 	i2c_set_bus_num(0);
307e58fe957SKim Phillips 
308e58fe957SKim Phillips 	if (i2c_read(CFG_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) {
309e58fe957SKim Phillips 		if (memcmp(data, eeprom_data, sizeof(data)) != 0) {
310e58fe957SKim Phillips 			if (i2c_write
311e58fe957SKim Phillips 			    (CFG_I2C_EEPROM_ADDR, 0, 2, eeprom_data,
312e58fe957SKim Phillips 			     sizeof(eeprom_data)) != 0) {
313e58fe957SKim Phillips 				puts("Failure writing the HRCW to EEPROM via I2C.\n");
314e58fe957SKim Phillips 				rc = 1;
315e58fe957SKim Phillips 			}
316e58fe957SKim Phillips 		}
317e58fe957SKim Phillips 	} else {
318e58fe957SKim Phillips 		puts("Failure reading the HRCW from EEPROM via I2C.\n");
319e58fe957SKim Phillips 		rc = 1;
320e58fe957SKim Phillips 	}
321e58fe957SKim Phillips #endif
322e58fe957SKim Phillips 
323e58fe957SKim Phillips #ifdef CFG_I2C_RTC_ADDR
324e58fe957SKim Phillips 	i2c_set_bus_num(1);
325e58fe957SKim Phillips 
326e58fe957SKim Phillips 	if (i2c_read(CFG_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data))
327e58fe957SKim Phillips 	    == 0) {
328e58fe957SKim Phillips 
329e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13601.
330e58fe957SKim Phillips 		   If the RTC does not contain valid register values, the DS1339
331e58fe957SKim Phillips 		   Linux driver will not work.
332e58fe957SKim Phillips 		 */
333e58fe957SKim Phillips 
334e58fe957SKim Phillips 		/* Make sure status register bits 6-2 are zero */
335e58fe957SKim Phillips 		ds1339_data[0x0f] &= ~0x7c;
336e58fe957SKim Phillips 
337e58fe957SKim Phillips 		/* Check for a valid day register value */
338e58fe957SKim Phillips 		ds1339_data[0x03] &= ~0xf8;
339e58fe957SKim Phillips 		if (ds1339_data[0x03] == 0) {
340e58fe957SKim Phillips 			ds1339_data[0x03] = 1;
341e58fe957SKim Phillips 		}
342e58fe957SKim Phillips 
343e58fe957SKim Phillips 		/* Check for a valid date register value */
344e58fe957SKim Phillips 		ds1339_data[0x04] &= ~0xc0;
345e58fe957SKim Phillips 		if ((ds1339_data[0x04] == 0) ||
346e58fe957SKim Phillips 		    ((ds1339_data[0x04] & 0x0f) > 9) ||
347e58fe957SKim Phillips 		    (ds1339_data[0x04] >= 0x32)) {
348e58fe957SKim Phillips 			ds1339_data[0x04] = 1;
349e58fe957SKim Phillips 		}
350e58fe957SKim Phillips 
351e58fe957SKim Phillips 		/* Check for a valid month register value */
352e58fe957SKim Phillips 		ds1339_data[0x05] &= ~0x60;
353e58fe957SKim Phillips 
354e58fe957SKim Phillips 		if ((ds1339_data[0x05] == 0) ||
355e58fe957SKim Phillips 		    ((ds1339_data[0x05] & 0x0f) > 9) ||
356e58fe957SKim Phillips 		    ((ds1339_data[0x05] >= 0x13)
357e58fe957SKim Phillips 		     && (ds1339_data[0x05] <= 0x19))) {
358e58fe957SKim Phillips 			ds1339_data[0x05] = 1;
359e58fe957SKim Phillips 		}
360e58fe957SKim Phillips 
361e58fe957SKim Phillips 		/* Enable Oscillator and rate select */
362e58fe957SKim Phillips 		ds1339_data[0x0e] = 0x1c;
363e58fe957SKim Phillips 
364e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13330.
365e58fe957SKim Phillips 		   Ensure that the RTC control register contains the value 0x1c.
366e58fe957SKim Phillips 		   This affects SATA performance.
367e58fe957SKim Phillips 		 */
368e58fe957SKim Phillips 
369e58fe957SKim Phillips 		if (i2c_write
370e58fe957SKim Phillips 		    (CFG_I2C_RTC_ADDR, 0, 1, ds1339_data,
371e58fe957SKim Phillips 		     sizeof(ds1339_data))) {
372e58fe957SKim Phillips 			puts("Failure writing to the RTC via I2C.\n");
373e58fe957SKim Phillips 			rc = 1;
374e58fe957SKim Phillips 		}
375e58fe957SKim Phillips 	} else {
376e58fe957SKim Phillips 		puts("Failure reading from the RTC via I2C.\n");
377e58fe957SKim Phillips 		rc = 1;
378e58fe957SKim Phillips 	}
379e58fe957SKim Phillips #endif
380e58fe957SKim Phillips 
381e58fe957SKim Phillips 	i2c_set_bus_num(orig_bus);
382e58fe957SKim Phillips #endif
383e58fe957SKim Phillips 
384e58fe957SKim Phillips 	return rc;
385e58fe957SKim Phillips }
386e58fe957SKim Phillips 
387e58fe957SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
388e58fe957SKim Phillips void ft_board_setup(void *blob, bd_t *bd)
389e58fe957SKim Phillips {
390e58fe957SKim Phillips 	ft_cpu_setup(blob, bd);
391e58fe957SKim Phillips #ifdef CONFIG_PCI
392e58fe957SKim Phillips 	ft_pci_setup(blob, bd);
393e58fe957SKim Phillips #endif
394e58fe957SKim Phillips }
395e58fe957SKim Phillips #endif
396