xref: /rk3399_rockchip-uboot/board/freescale/mpc8349itx/mpc8349itx.c (revision 2e651b248348e156d193e46f7a5b827d74af90d6)
1e58fe957SKim Phillips /*
24c2e3da8SKumar Gala  * Copyright (C) Freescale Semiconductor, Inc. 2006.
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 <miiphy.h>
2889c7784eSTimur Tabi #include <vsc7385.h>
29e58fe957SKim Phillips #ifdef CONFIG_PCI
30e58fe957SKim Phillips #include <asm/mpc8349_pci.h>
31e58fe957SKim Phillips #include <pci.h>
32e58fe957SKim Phillips #endif
33e58fe957SKim Phillips #include <spd_sdram.h>
34e58fe957SKim Phillips #include <asm/mmu.h>
35b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT)
36e58fe957SKim Phillips #include <libfdt.h>
37e58fe957SKim Phillips #endif
38e58fe957SKim Phillips 
39e58fe957SKim Phillips #ifndef CONFIG_SPD_EEPROM
40e58fe957SKim Phillips /*************************************************************************
41e58fe957SKim Phillips  *  fixed sdram init -- doesn't use serial presence detect.
42e58fe957SKim Phillips  ************************************************************************/
43e58fe957SKim Phillips int fixed_sdram(void)
44e58fe957SKim Phillips {
456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
46*2e651b24SJoe Hershberger 	/* The size of RAM, in bytes */
47*2e651b24SJoe Hershberger 	u32 ddr_size = CONFIG_SYS_DDR_SIZE << 20;
48*2e651b24SJoe Hershberger 	u32 ddr_size_log2 = __ilog2(ddr_size);
49e58fe957SKim Phillips 
50e58fe957SKim Phillips 	im->sysconf.ddrlaw[0].ar =
51e58fe957SKim Phillips 	    LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000;
53e58fe957SKim Phillips 
54*2e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
55*2e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments
56*2e651b24SJoe Hershberger #endif
57*2e651b24SJoe Hershberger 	im->ddr.csbnds[0].csbnds =
58*2e651b24SJoe Hershberger 		((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
59*2e651b24SJoe Hershberger 		(((CONFIG_SYS_DDR_SDRAM_BASE + ddr_size - 1) >>
60*2e651b24SJoe Hershberger 				CSBNDS_EA_SHIFT) & CSBNDS_EA);
61*2e651b24SJoe Hershberger 	im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG;
62*2e651b24SJoe Hershberger 
63*2e651b24SJoe Hershberger 	/* Only one CS for DDR */
64*2e651b24SJoe Hershberger 	im->ddr.cs_config[1] = 0;
65*2e651b24SJoe Hershberger 	im->ddr.cs_config[2] = 0;
66*2e651b24SJoe Hershberger 	im->ddr.cs_config[3] = 0;
67e58fe957SKim Phillips 
68e58fe957SKim Phillips 	debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds);
69e58fe957SKim Phillips 	debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]);
70e58fe957SKim Phillips 
71e58fe957SKim Phillips 	debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar);
72e58fe957SKim Phillips 	debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar);
73e58fe957SKim Phillips 
746d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */
76e58fe957SKim Phillips 	im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR1;
77e58fe957SKim Phillips 	im->ddr.sdram_mode =
78e58fe957SKim Phillips 	    (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT);
79e58fe957SKim Phillips 	im->ddr.sdram_interval =
80e58fe957SKim Phillips 	    (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 <<
81e58fe957SKim Phillips 						       SDRAM_INTERVAL_BSTOPRE_SHIFT);
826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL;
83e58fe957SKim Phillips 
84e58fe957SKim Phillips 	udelay(200);
85e58fe957SKim Phillips 
86e58fe957SKim Phillips 	im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
87e58fe957SKim Phillips 
88e58fe957SKim Phillips 	debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1);
89e58fe957SKim Phillips 	debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2);
90e58fe957SKim Phillips 	debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode);
91e58fe957SKim Phillips 	debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval);
92e58fe957SKim Phillips 	debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg);
93e58fe957SKim Phillips 
946d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	return CONFIG_SYS_DDR_SIZE;
95e58fe957SKim Phillips }
96e58fe957SKim Phillips #endif
97e58fe957SKim Phillips 
98e58fe957SKim Phillips #ifdef CONFIG_PCI
99e58fe957SKim Phillips /*
100e58fe957SKim Phillips  * Initialize PCI Devices, report devices found
101e58fe957SKim Phillips  */
102e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
103e58fe957SKim Phillips static struct pci_config_table pci_mpc83xxmitx_config_table[] = {
104e58fe957SKim Phillips 	{
105e58fe957SKim Phillips 	 PCI_ANY_ID,
106e58fe957SKim Phillips 	 PCI_ANY_ID,
107e58fe957SKim Phillips 	 PCI_ANY_ID,
108e58fe957SKim Phillips 	 PCI_ANY_ID,
109e58fe957SKim Phillips 	 0x0f,
110e58fe957SKim Phillips 	 PCI_ANY_ID,
111e58fe957SKim Phillips 	 pci_cfgfunc_config_device,
112e58fe957SKim Phillips 	 {
113e58fe957SKim Phillips 	  PCI_ENET0_IOADDR,
114e58fe957SKim Phillips 	  PCI_ENET0_MEMADDR,
115e58fe957SKim Phillips 	  PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER}
116e58fe957SKim Phillips 	 },
117e58fe957SKim Phillips 	{}
118e58fe957SKim Phillips }
119e58fe957SKim Phillips #endif
120e58fe957SKim Phillips 
121e58fe957SKim Phillips volatile static struct pci_controller hose[] = {
122e58fe957SKim Phillips 	{
123e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
124e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
125e58fe957SKim Phillips #endif
126e58fe957SKim Phillips 	 },
127e58fe957SKim Phillips 	{
128e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
129e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
130e58fe957SKim Phillips #endif
131e58fe957SKim Phillips 	 }
132e58fe957SKim Phillips };
133e58fe957SKim Phillips #endif				/* CONFIG_PCI */
134e58fe957SKim Phillips 
1359973e3c6SBecky Bruce phys_size_t initdram(int board_type)
136e58fe957SKim Phillips {
1376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
138e58fe957SKim Phillips 	u32 msize = 0;
139e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
140e58fe957SKim Phillips 	volatile ddr83xx_t *ddr = &im->ddr;
141e58fe957SKim Phillips #endif
142e58fe957SKim Phillips 
143e58fe957SKim Phillips 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
144e58fe957SKim Phillips 		return -1;
145e58fe957SKim Phillips 
146e58fe957SKim Phillips 	/* DDR SDRAM - Main SODIMM */
1476d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_BASE & LAWBAR_BAR;
148e58fe957SKim Phillips #ifdef CONFIG_SPD_EEPROM
149e58fe957SKim Phillips 	msize = spd_sdram();
150e58fe957SKim Phillips #else
151e58fe957SKim Phillips 	msize = fixed_sdram();
152e58fe957SKim Phillips #endif
153e58fe957SKim Phillips 
154e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
155e58fe957SKim Phillips 	if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN)
156e58fe957SKim Phillips 		/* Unlike every other board, on the 83xx spd_sdram() returns
157e58fe957SKim Phillips 		   megabytes instead of just bytes.  That's why we need to
158e58fe957SKim Phillips 		   multiple by 1MB when calling ddr_enable_ecc(). */
159e58fe957SKim Phillips 		ddr_enable_ecc(msize * 1048576);
160e58fe957SKim Phillips #endif
161e58fe957SKim Phillips 
162e58fe957SKim Phillips 	/* return total bus RAM size(bytes) */
163e58fe957SKim Phillips 	return msize * 1024 * 1024;
164e58fe957SKim Phillips }
165e58fe957SKim Phillips 
166e58fe957SKim Phillips int checkboard(void)
167e58fe957SKim Phillips {
168e58fe957SKim Phillips #ifdef CONFIG_MPC8349ITX
169e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX\n");
170e58fe957SKim Phillips #else
171e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX-GP\n");
172e58fe957SKim Phillips #endif
173e58fe957SKim Phillips 
174e58fe957SKim Phillips 	return 0;
175e58fe957SKim Phillips }
176e58fe957SKim Phillips 
177e58fe957SKim Phillips /*
178e58fe957SKim Phillips  * Implement a work-around for a hardware problem with compact
179e58fe957SKim Phillips  * flash.
180e58fe957SKim Phillips  *
181e58fe957SKim Phillips  * Program the UPM if compact flash is enabled.
182e58fe957SKim Phillips  */
183e58fe957SKim Phillips int misc_init_f(void)
184e58fe957SKim Phillips {
18589c7784eSTimur Tabi #ifdef CONFIG_VSC7385_ENET
186e58fe957SKim Phillips 	volatile u32 *vsc7385_cpuctrl;
187e58fe957SKim Phillips 
188e58fe957SKim Phillips 	/* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register.  The power up
189e58fe957SKim Phillips 	   default of VSC7385 L1_IRQ and L2_IRQ requests are active high.  That
190e58fe957SKim Phillips 	   means it is 0 when the IRQ is not active.  This makes the wire-AND
191e58fe957SKim Phillips 	   logic always assert IRQ7 to CPU even if there is no request from the
192e58fe957SKim Phillips 	   switch.  Since the compact flash and the switch share the same IRQ,
193e58fe957SKim Phillips 	   the Linux kernel will think that the compact flash is requesting irq
194e58fe957SKim Phillips 	   and get stuck when it tries to clear the IRQ.  Thus we need to set
195e58fe957SKim Phillips 	   the L2_IRQ0 and L2_IRQ1 to active low.
196e58fe957SKim Phillips 
197e58fe957SKim Phillips 	   The following code sets the L1_IRQ and L2_IRQ polarity to active low.
198e58fe957SKim Phillips 	   Without this code, compact flash will not work in Linux because
199e58fe957SKim Phillips 	   unlike U-Boot, Linux uses the IRQ, so this code is necessary if we
200e58fe957SKim Phillips 	   don't enable compact flash for U-Boot.
201e58fe957SKim Phillips 	 */
202e58fe957SKim Phillips 
2036d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	vsc7385_cpuctrl = (volatile u32 *)(CONFIG_SYS_VSC7385_BASE + 0x1c0c0);
204e58fe957SKim Phillips 	*vsc7385_cpuctrl |= 0x0c;
205e58fe957SKim Phillips #endif
206e58fe957SKim Phillips 
207e58fe957SKim Phillips #ifdef CONFIG_COMPACT_FLASH
208e58fe957SKim Phillips 	/* UPM Table Configuration Code */
209e58fe957SKim Phillips 	static uint UPMATable[] = {
210e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00,
211e58fe957SKim Phillips 		0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01,
212e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
213e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
214e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00,
215e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
216e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00,
217e58fe957SKim Phillips 		0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00,
218e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
219e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
220e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
221e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
222e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
223e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
224e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
225e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01
226e58fe957SKim Phillips 	};
2276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
228e58fe957SKim Phillips 
229f51cdaf1SBecky Bruce 	set_lbc_br(3, CONFIG_SYS_BR3_PRELIM);
230f51cdaf1SBecky Bruce 	set_lbc_or(3, CONFIG_SYS_OR3_PRELIM);
231e58fe957SKim Phillips 
232e58fe957SKim Phillips 	/* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000,
233e58fe957SKim Phillips 	   GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000
234e58fe957SKim Phillips 	 */
235f51cdaf1SBecky Bruce 	immap->im_lbc.mamr = 0x08404440;
236e58fe957SKim Phillips 
237e58fe957SKim Phillips 	upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0]));
238e58fe957SKim Phillips 
239e58fe957SKim Phillips 	puts("UPMA:  Configured for compact flash\n");
240e58fe957SKim Phillips #endif
241e58fe957SKim Phillips 
242e58fe957SKim Phillips 	return 0;
243e58fe957SKim Phillips }
244e58fe957SKim Phillips 
245e58fe957SKim Phillips /*
24689c7784eSTimur Tabi  * Miscellaneous late-boot configurations
24789c7784eSTimur Tabi  *
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.
25989c7784eSTimur Tabi  *
26089c7784eSTimur Tabi  * If a VSC7385 microcode image is present, then upload it.
261e58fe957SKim Phillips  */
262e58fe957SKim Phillips int misc_init_r(void)
263e58fe957SKim Phillips {
264e58fe957SKim Phillips 	int rc = 0;
265e58fe957SKim Phillips 
266e58fe957SKim Phillips #ifdef CONFIG_HARD_I2C
267e58fe957SKim Phillips 
268e58fe957SKim Phillips 	unsigned int orig_bus = i2c_get_bus_num();
269e58fe957SKim Phillips 	u8 i2c_data;
270e58fe957SKim Phillips 
2716d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR
272e58fe957SKim Phillips 	u8 ds1339_data[17];
273e58fe957SKim Phillips #endif
274e58fe957SKim Phillips 
2756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR
276e58fe957SKim Phillips 	static u8 eeprom_data[] =	/* HRCW data */
277e58fe957SKim Phillips 	{
278e58fe957SKim Phillips 		0xAA, 0x55, 0xAA,       /* Preamble */
279e58fe957SKim Phillips 		0x7C,		        /* ACS=0, BYTE_EN=1111, CONT=1 */
280e58fe957SKim Phillips 		0x02, 0x40,	        /* RCWL ADDR=0x0_0900 */
2816d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 24) & 0xFF,
2826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 16) & 0xFF,
2836d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 8) & 0xFF,
2846d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		CONFIG_SYS_HRCW_LOW & 0xFF,
285e58fe957SKim Phillips 		0x7C,		        /* ACS=0, BYTE_EN=1111, CONT=1 */
286e58fe957SKim Phillips 		0x02, 0x41,	        /* RCWH ADDR=0x0_0904 */
2876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 24) & 0xFF,
2886d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 16) & 0xFF,
2896d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 8) & 0xFF,
2906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		CONFIG_SYS_HRCW_HIGH & 0xFF
291e58fe957SKim Phillips 	};
292e58fe957SKim Phillips 
293e58fe957SKim Phillips 	u8 data[sizeof(eeprom_data)];
294e58fe957SKim Phillips #endif
295e58fe957SKim Phillips 
296e58fe957SKim Phillips 	printf("Board revision: ");
297e58fe957SKim Phillips 	i2c_set_bus_num(1);
2986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
299e58fe957SKim Phillips 		printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01);
3006d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	else if (i2c_read(CONFIG_SYS_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
301e58fe957SKim Phillips 		printf("%u.%u (PCF8475)\n",  (i2c_data & 0x02) >> 1, i2c_data & 0x01);
302e58fe957SKim Phillips 	else {
303e58fe957SKim Phillips 		printf("Unknown\n");
304e58fe957SKim Phillips 		rc = 1;
305e58fe957SKim Phillips 	}
306e58fe957SKim Phillips 
3076d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR
308e58fe957SKim Phillips 	i2c_set_bus_num(0);
309e58fe957SKim Phillips 
3106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) {
311e58fe957SKim Phillips 		if (memcmp(data, eeprom_data, sizeof(data)) != 0) {
312e58fe957SKim Phillips 			if (i2c_write
3136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			    (CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, eeprom_data,
314e58fe957SKim Phillips 			     sizeof(eeprom_data)) != 0) {
315e58fe957SKim Phillips 				puts("Failure writing the HRCW to EEPROM via I2C.\n");
316e58fe957SKim Phillips 				rc = 1;
317e58fe957SKim Phillips 			}
318e58fe957SKim Phillips 		}
319e58fe957SKim Phillips 	} else {
320e58fe957SKim Phillips 		puts("Failure reading the HRCW from EEPROM via I2C.\n");
321e58fe957SKim Phillips 		rc = 1;
322e58fe957SKim Phillips 	}
323e58fe957SKim Phillips #endif
324e58fe957SKim Phillips 
3256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR
326e58fe957SKim Phillips 	i2c_set_bus_num(1);
327e58fe957SKim Phillips 
3286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data))
329e58fe957SKim Phillips 	    == 0) {
330e58fe957SKim Phillips 
331e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13601.
332e58fe957SKim Phillips 		   If the RTC does not contain valid register values, the DS1339
333e58fe957SKim Phillips 		   Linux driver will not work.
334e58fe957SKim Phillips 		 */
335e58fe957SKim Phillips 
336e58fe957SKim Phillips 		/* Make sure status register bits 6-2 are zero */
337e58fe957SKim Phillips 		ds1339_data[0x0f] &= ~0x7c;
338e58fe957SKim Phillips 
339e58fe957SKim Phillips 		/* Check for a valid day register value */
340e58fe957SKim Phillips 		ds1339_data[0x03] &= ~0xf8;
341e58fe957SKim Phillips 		if (ds1339_data[0x03] == 0) {
342e58fe957SKim Phillips 			ds1339_data[0x03] = 1;
343e58fe957SKim Phillips 		}
344e58fe957SKim Phillips 
345e58fe957SKim Phillips 		/* Check for a valid date register value */
346e58fe957SKim Phillips 		ds1339_data[0x04] &= ~0xc0;
347e58fe957SKim Phillips 		if ((ds1339_data[0x04] == 0) ||
348e58fe957SKim Phillips 		    ((ds1339_data[0x04] & 0x0f) > 9) ||
349e58fe957SKim Phillips 		    (ds1339_data[0x04] >= 0x32)) {
350e58fe957SKim Phillips 			ds1339_data[0x04] = 1;
351e58fe957SKim Phillips 		}
352e58fe957SKim Phillips 
353e58fe957SKim Phillips 		/* Check for a valid month register value */
354e58fe957SKim Phillips 		ds1339_data[0x05] &= ~0x60;
355e58fe957SKim Phillips 
356e58fe957SKim Phillips 		if ((ds1339_data[0x05] == 0) ||
357e58fe957SKim Phillips 		    ((ds1339_data[0x05] & 0x0f) > 9) ||
358e58fe957SKim Phillips 		    ((ds1339_data[0x05] >= 0x13)
359e58fe957SKim Phillips 		     && (ds1339_data[0x05] <= 0x19))) {
360e58fe957SKim Phillips 			ds1339_data[0x05] = 1;
361e58fe957SKim Phillips 		}
362e58fe957SKim Phillips 
363e58fe957SKim Phillips 		/* Enable Oscillator and rate select */
364e58fe957SKim Phillips 		ds1339_data[0x0e] = 0x1c;
365e58fe957SKim Phillips 
366e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13330.
367e58fe957SKim Phillips 		   Ensure that the RTC control register contains the value 0x1c.
368e58fe957SKim Phillips 		   This affects SATA performance.
369e58fe957SKim Phillips 		 */
370e58fe957SKim Phillips 
371e58fe957SKim Phillips 		if (i2c_write
3726d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		    (CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data,
373e58fe957SKim Phillips 		     sizeof(ds1339_data))) {
374e58fe957SKim Phillips 			puts("Failure writing to the RTC via I2C.\n");
375e58fe957SKim Phillips 			rc = 1;
376e58fe957SKim Phillips 		}
377e58fe957SKim Phillips 	} else {
378e58fe957SKim Phillips 		puts("Failure reading from the RTC via I2C.\n");
379e58fe957SKim Phillips 		rc = 1;
380e58fe957SKim Phillips 	}
381e58fe957SKim Phillips #endif
382e58fe957SKim Phillips 
383e58fe957SKim Phillips 	i2c_set_bus_num(orig_bus);
384e58fe957SKim Phillips #endif
385e58fe957SKim Phillips 
38689c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE
38789c7784eSTimur Tabi 	if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE,
38889c7784eSTimur Tabi 		CONFIG_VSC7385_IMAGE_SIZE)) {
38989c7784eSTimur Tabi 		puts("Failure uploading VSC7385 microcode.\n");
39089c7784eSTimur Tabi 		rc = 1;
39189c7784eSTimur Tabi 	}
39289c7784eSTimur Tabi #endif
39389c7784eSTimur Tabi 
394e58fe957SKim Phillips 	return rc;
395e58fe957SKim Phillips }
396e58fe957SKim Phillips 
397e58fe957SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
398e58fe957SKim Phillips void ft_board_setup(void *blob, bd_t *bd)
399e58fe957SKim Phillips {
400e58fe957SKim Phillips 	ft_cpu_setup(blob, bd);
401e58fe957SKim Phillips #ifdef CONFIG_PCI
402e58fe957SKim Phillips 	ft_pci_setup(blob, bd);
403e58fe957SKim Phillips #endif
404e58fe957SKim Phillips }
405e58fe957SKim Phillips #endif
406