xref: /rk3399_rockchip-uboot/board/freescale/mpc8349itx/mpc8349itx.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
1e58fe957SKim Phillips /*
24c2e3da8SKumar Gala  * Copyright (C) Freescale Semiconductor, Inc. 2006.
3e58fe957SKim Phillips  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
5e58fe957SKim Phillips  */
6e58fe957SKim Phillips 
7e58fe957SKim Phillips #include <common.h>
8e58fe957SKim Phillips #include <ioports.h>
9e58fe957SKim Phillips #include <mpc83xx.h>
10e58fe957SKim Phillips #include <i2c.h>
11e58fe957SKim Phillips #include <miiphy.h>
1289c7784eSTimur Tabi #include <vsc7385.h>
13e58fe957SKim Phillips #ifdef CONFIG_PCI
14e58fe957SKim Phillips #include <asm/mpc8349_pci.h>
15e58fe957SKim Phillips #include <pci.h>
16e58fe957SKim Phillips #endif
17e58fe957SKim Phillips #include <spd_sdram.h>
18e58fe957SKim Phillips #include <asm/mmu.h>
19b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT)
20*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
21e58fe957SKim Phillips #endif
22e58fe957SKim Phillips 
23088454cdSSimon Glass DECLARE_GLOBAL_DATA_PTR;
24088454cdSSimon Glass 
25e58fe957SKim Phillips #ifndef CONFIG_SPD_EEPROM
26e58fe957SKim Phillips /*************************************************************************
27e58fe957SKim Phillips  *  fixed sdram init -- doesn't use serial presence detect.
28e58fe957SKim Phillips  ************************************************************************/
fixed_sdram(void)29e58fe957SKim Phillips int fixed_sdram(void)
30e58fe957SKim Phillips {
316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
322e651b24SJoe Hershberger 	/* The size of RAM, in bytes */
332e651b24SJoe Hershberger 	u32 ddr_size = CONFIG_SYS_DDR_SIZE << 20;
342e651b24SJoe Hershberger 	u32 ddr_size_log2 = __ilog2(ddr_size);
35e58fe957SKim Phillips 
36e58fe957SKim Phillips 	im->sysconf.ddrlaw[0].ar =
37e58fe957SKim Phillips 	    LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000;
39e58fe957SKim Phillips 
402e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
412e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments
422e651b24SJoe Hershberger #endif
432e651b24SJoe Hershberger 	im->ddr.csbnds[0].csbnds =
442e651b24SJoe Hershberger 		((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
452e651b24SJoe Hershberger 		(((CONFIG_SYS_DDR_SDRAM_BASE + ddr_size - 1) >>
462e651b24SJoe Hershberger 				CSBNDS_EA_SHIFT) & CSBNDS_EA);
472e651b24SJoe Hershberger 	im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG;
482e651b24SJoe Hershberger 
492e651b24SJoe Hershberger 	/* Only one CS for DDR */
502e651b24SJoe Hershberger 	im->ddr.cs_config[1] = 0;
512e651b24SJoe Hershberger 	im->ddr.cs_config[2] = 0;
522e651b24SJoe Hershberger 	im->ddr.cs_config[3] = 0;
53e58fe957SKim Phillips 
54e58fe957SKim Phillips 	debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds);
55e58fe957SKim Phillips 	debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]);
56e58fe957SKim Phillips 
57e58fe957SKim Phillips 	debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar);
58e58fe957SKim Phillips 	debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar);
59e58fe957SKim Phillips 
606d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */
62e58fe957SKim Phillips 	im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR1;
63e58fe957SKim Phillips 	im->ddr.sdram_mode =
64e58fe957SKim Phillips 	    (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT);
65e58fe957SKim Phillips 	im->ddr.sdram_interval =
66e58fe957SKim Phillips 	    (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 <<
67e58fe957SKim Phillips 						       SDRAM_INTERVAL_BSTOPRE_SHIFT);
686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL;
69e58fe957SKim Phillips 
70e58fe957SKim Phillips 	udelay(200);
71e58fe957SKim Phillips 
72e58fe957SKim Phillips 	im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
73e58fe957SKim Phillips 
74e58fe957SKim Phillips 	debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1);
75e58fe957SKim Phillips 	debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2);
76e58fe957SKim Phillips 	debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode);
77e58fe957SKim Phillips 	debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval);
78e58fe957SKim Phillips 	debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg);
79e58fe957SKim Phillips 
806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	return CONFIG_SYS_DDR_SIZE;
81e58fe957SKim Phillips }
82e58fe957SKim Phillips #endif
83e58fe957SKim Phillips 
84e58fe957SKim Phillips #ifdef CONFIG_PCI
85e58fe957SKim Phillips /*
86e58fe957SKim Phillips  * Initialize PCI Devices, report devices found
87e58fe957SKim Phillips  */
88e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
89e58fe957SKim Phillips static struct pci_config_table pci_mpc83xxmitx_config_table[] = {
90e58fe957SKim Phillips 	{
91e58fe957SKim Phillips 	 PCI_ANY_ID,
92e58fe957SKim Phillips 	 PCI_ANY_ID,
93e58fe957SKim Phillips 	 PCI_ANY_ID,
94e58fe957SKim Phillips 	 PCI_ANY_ID,
95e58fe957SKim Phillips 	 0x0f,
96e58fe957SKim Phillips 	 PCI_ANY_ID,
97e58fe957SKim Phillips 	 pci_cfgfunc_config_device,
98e58fe957SKim Phillips 	 {
99e58fe957SKim Phillips 	  PCI_ENET0_IOADDR,
100e58fe957SKim Phillips 	  PCI_ENET0_MEMADDR,
101e58fe957SKim Phillips 	  PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER}
102e58fe957SKim Phillips 	 },
103e58fe957SKim Phillips 	{}
104e58fe957SKim Phillips }
105e58fe957SKim Phillips #endif
106e58fe957SKim Phillips 
107e58fe957SKim Phillips volatile static struct pci_controller hose[] = {
108e58fe957SKim Phillips 	{
109e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
110e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
111e58fe957SKim Phillips #endif
112e58fe957SKim Phillips 	 },
113e58fe957SKim Phillips 	{
114e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP
115e58fe957SKim Phillips 	      config_table:pci_mpc83xxmitx_config_table,
116e58fe957SKim Phillips #endif
117e58fe957SKim Phillips 	 }
118e58fe957SKim Phillips };
119e58fe957SKim Phillips #endif				/* CONFIG_PCI */
120e58fe957SKim Phillips 
dram_init(void)121f1683aa7SSimon Glass int dram_init(void)
122e58fe957SKim Phillips {
1236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
124e58fe957SKim Phillips 	u32 msize = 0;
125e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
126e58fe957SKim Phillips 	volatile ddr83xx_t *ddr = &im->ddr;
127e58fe957SKim Phillips #endif
128e58fe957SKim Phillips 
129e58fe957SKim Phillips 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
130088454cdSSimon Glass 		return -ENXIO;
131e58fe957SKim Phillips 
132e58fe957SKim Phillips 	/* DDR SDRAM - Main SODIMM */
1336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_BASE & LAWBAR_BAR;
134e58fe957SKim Phillips #ifdef CONFIG_SPD_EEPROM
135e58fe957SKim Phillips 	msize = spd_sdram();
136e58fe957SKim Phillips #else
137e58fe957SKim Phillips 	msize = fixed_sdram();
138e58fe957SKim Phillips #endif
139e58fe957SKim Phillips 
140e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC
141e58fe957SKim Phillips 	if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN)
142e58fe957SKim Phillips 		/* Unlike every other board, on the 83xx spd_sdram() returns
143e58fe957SKim Phillips 		   megabytes instead of just bytes.  That's why we need to
144e58fe957SKim Phillips 		   multiple by 1MB when calling ddr_enable_ecc(). */
145e58fe957SKim Phillips 		ddr_enable_ecc(msize * 1048576);
146e58fe957SKim Phillips #endif
147e58fe957SKim Phillips 
148e58fe957SKim Phillips 	/* return total bus RAM size(bytes) */
149088454cdSSimon Glass 	gd->ram_size = msize * 1024 * 1024;
150088454cdSSimon Glass 
151088454cdSSimon Glass 	return 0;
152e58fe957SKim Phillips }
153e58fe957SKim Phillips 
checkboard(void)154e58fe957SKim Phillips int checkboard(void)
155e58fe957SKim Phillips {
156e58fe957SKim Phillips #ifdef CONFIG_MPC8349ITX
157e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX\n");
158e58fe957SKim Phillips #else
159e58fe957SKim Phillips 	puts("Board: Freescale MPC8349E-mITX-GP\n");
160e58fe957SKim Phillips #endif
161e58fe957SKim Phillips 
162e58fe957SKim Phillips 	return 0;
163e58fe957SKim Phillips }
164e58fe957SKim Phillips 
165e58fe957SKim Phillips /*
166e58fe957SKim Phillips  * Implement a work-around for a hardware problem with compact
167e58fe957SKim Phillips  * flash.
168e58fe957SKim Phillips  *
169e58fe957SKim Phillips  * Program the UPM if compact flash is enabled.
170e58fe957SKim Phillips  */
misc_init_f(void)171e58fe957SKim Phillips int misc_init_f(void)
172e58fe957SKim Phillips {
17389c7784eSTimur Tabi #ifdef CONFIG_VSC7385_ENET
174e58fe957SKim Phillips 	volatile u32 *vsc7385_cpuctrl;
175e58fe957SKim Phillips 
176e58fe957SKim Phillips 	/* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register.  The power up
177e58fe957SKim Phillips 	   default of VSC7385 L1_IRQ and L2_IRQ requests are active high.  That
178e58fe957SKim Phillips 	   means it is 0 when the IRQ is not active.  This makes the wire-AND
179e58fe957SKim Phillips 	   logic always assert IRQ7 to CPU even if there is no request from the
180e58fe957SKim Phillips 	   switch.  Since the compact flash and the switch share the same IRQ,
181e58fe957SKim Phillips 	   the Linux kernel will think that the compact flash is requesting irq
182e58fe957SKim Phillips 	   and get stuck when it tries to clear the IRQ.  Thus we need to set
183e58fe957SKim Phillips 	   the L2_IRQ0 and L2_IRQ1 to active low.
184e58fe957SKim Phillips 
185e58fe957SKim Phillips 	   The following code sets the L1_IRQ and L2_IRQ polarity to active low.
186e58fe957SKim Phillips 	   Without this code, compact flash will not work in Linux because
187e58fe957SKim Phillips 	   unlike U-Boot, Linux uses the IRQ, so this code is necessary if we
188e58fe957SKim Phillips 	   don't enable compact flash for U-Boot.
189e58fe957SKim Phillips 	 */
190e58fe957SKim Phillips 
1916d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	vsc7385_cpuctrl = (volatile u32 *)(CONFIG_SYS_VSC7385_BASE + 0x1c0c0);
192e58fe957SKim Phillips 	*vsc7385_cpuctrl |= 0x0c;
193e58fe957SKim Phillips #endif
194e58fe957SKim Phillips 
195e58fe957SKim Phillips #ifdef CONFIG_COMPACT_FLASH
196e58fe957SKim Phillips 	/* UPM Table Configuration Code */
197e58fe957SKim Phillips 	static uint UPMATable[] = {
198e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00,
199e58fe957SKim Phillips 		0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01,
200e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
201e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
202e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00,
203e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
204e58fe957SKim Phillips 		0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00,
205e58fe957SKim Phillips 		0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00,
206e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
207e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
208e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
209e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
210e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
211e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
212e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
213e58fe957SKim Phillips 		0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01
214e58fe957SKim Phillips 	};
2156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
216e58fe957SKim Phillips 
217f51cdaf1SBecky Bruce 	set_lbc_br(3, CONFIG_SYS_BR3_PRELIM);
218f51cdaf1SBecky Bruce 	set_lbc_or(3, CONFIG_SYS_OR3_PRELIM);
219e58fe957SKim Phillips 
220e58fe957SKim Phillips 	/* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000,
221e58fe957SKim Phillips 	   GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000
222e58fe957SKim Phillips 	 */
223f51cdaf1SBecky Bruce 	immap->im_lbc.mamr = 0x08404440;
224e58fe957SKim Phillips 
225e58fe957SKim Phillips 	upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0]));
226e58fe957SKim Phillips 
227e58fe957SKim Phillips 	puts("UPMA:  Configured for compact flash\n");
228e58fe957SKim Phillips #endif
229e58fe957SKim Phillips 
230e58fe957SKim Phillips 	return 0;
231e58fe957SKim Phillips }
232e58fe957SKim Phillips 
233e58fe957SKim Phillips /*
23489c7784eSTimur Tabi  * Miscellaneous late-boot configurations
23589c7784eSTimur Tabi  *
236e58fe957SKim Phillips  * Make sure the EEPROM has the HRCW correctly programmed.
237e58fe957SKim Phillips  * Make sure the RTC is correctly programmed.
238e58fe957SKim Phillips  *
239e58fe957SKim Phillips  * The MPC8349E-mITX can be configured to load the HRCW from
240e58fe957SKim Phillips  * EEPROM instead of flash.  This is controlled via jumpers
241e58fe957SKim Phillips  * LGPL0, 1, and 3.  Normally, these jumpers are set to 000 (all
242e58fe957SKim Phillips  * jumpered), but if they're set to 001 or 010, then the HRCW is
243e58fe957SKim Phillips  * read from the "I2C EEPROM".
244e58fe957SKim Phillips  *
245e58fe957SKim Phillips  * This function makes sure that the I2C EEPROM is programmed
246e58fe957SKim Phillips  * correctly.
24789c7784eSTimur Tabi  *
24889c7784eSTimur Tabi  * If a VSC7385 microcode image is present, then upload it.
249e58fe957SKim Phillips  */
misc_init_r(void)250e58fe957SKim Phillips int misc_init_r(void)
251e58fe957SKim Phillips {
252e58fe957SKim Phillips 	int rc = 0;
253e58fe957SKim Phillips 
25400f792e0SHeiko Schocher #if defined(CONFIG_SYS_I2C)
255e58fe957SKim Phillips 	unsigned int orig_bus = i2c_get_bus_num();
256e58fe957SKim Phillips 	u8 i2c_data;
257e58fe957SKim Phillips 
2586d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR
259e58fe957SKim Phillips 	u8 ds1339_data[17];
260e58fe957SKim Phillips #endif
261e58fe957SKim Phillips 
2626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR
263e58fe957SKim Phillips 	static u8 eeprom_data[] =	/* HRCW data */
264e58fe957SKim Phillips 	{
265e58fe957SKim Phillips 		0xAA, 0x55, 0xAA,       /* Preamble */
266e58fe957SKim Phillips 		0x7C,		        /* ACS=0, BYTE_EN=1111, CONT=1 */
267e58fe957SKim Phillips 		0x02, 0x40,	        /* RCWL ADDR=0x0_0900 */
2686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 24) & 0xFF,
2696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 16) & 0xFF,
2706d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_LOW >> 8) & 0xFF,
2716d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		CONFIG_SYS_HRCW_LOW & 0xFF,
272e58fe957SKim Phillips 		0x7C,		        /* ACS=0, BYTE_EN=1111, CONT=1 */
273e58fe957SKim Phillips 		0x02, 0x41,	        /* RCWH ADDR=0x0_0904 */
2746d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 24) & 0xFF,
2756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 16) & 0xFF,
2766d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		(CONFIG_SYS_HRCW_HIGH >> 8) & 0xFF,
2776d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		CONFIG_SYS_HRCW_HIGH & 0xFF
278e58fe957SKim Phillips 	};
279e58fe957SKim Phillips 
280e58fe957SKim Phillips 	u8 data[sizeof(eeprom_data)];
281e58fe957SKim Phillips #endif
282e58fe957SKim Phillips 
283e58fe957SKim Phillips 	printf("Board revision: ");
284e58fe957SKim Phillips 	i2c_set_bus_num(1);
2856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
286e58fe957SKim Phillips 		printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01);
2876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	else if (i2c_read(CONFIG_SYS_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
288e58fe957SKim Phillips 		printf("%u.%u (PCF8475)\n",  (i2c_data & 0x02) >> 1, i2c_data & 0x01);
289e58fe957SKim Phillips 	else {
290e58fe957SKim Phillips 		printf("Unknown\n");
291e58fe957SKim Phillips 		rc = 1;
292e58fe957SKim Phillips 	}
293e58fe957SKim Phillips 
2946d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR
295e58fe957SKim Phillips 	i2c_set_bus_num(0);
296e58fe957SKim Phillips 
2976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) {
298e58fe957SKim Phillips 		if (memcmp(data, eeprom_data, sizeof(data)) != 0) {
299e58fe957SKim Phillips 			if (i2c_write
3006d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 			    (CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, eeprom_data,
301e58fe957SKim Phillips 			     sizeof(eeprom_data)) != 0) {
302e58fe957SKim Phillips 				puts("Failure writing the HRCW to EEPROM via I2C.\n");
303e58fe957SKim Phillips 				rc = 1;
304e58fe957SKim Phillips 			}
305e58fe957SKim Phillips 		}
306e58fe957SKim Phillips 	} else {
307e58fe957SKim Phillips 		puts("Failure reading the HRCW from EEPROM via I2C.\n");
308e58fe957SKim Phillips 		rc = 1;
309e58fe957SKim Phillips 	}
310e58fe957SKim Phillips #endif
311e58fe957SKim Phillips 
3126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR
313e58fe957SKim Phillips 	i2c_set_bus_num(1);
314e58fe957SKim Phillips 
3156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if (i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data))
316e58fe957SKim Phillips 	    == 0) {
317e58fe957SKim Phillips 
318e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13601.
319e58fe957SKim Phillips 		   If the RTC does not contain valid register values, the DS1339
320e58fe957SKim Phillips 		   Linux driver will not work.
321e58fe957SKim Phillips 		 */
322e58fe957SKim Phillips 
323e58fe957SKim Phillips 		/* Make sure status register bits 6-2 are zero */
324e58fe957SKim Phillips 		ds1339_data[0x0f] &= ~0x7c;
325e58fe957SKim Phillips 
326e58fe957SKim Phillips 		/* Check for a valid day register value */
327e58fe957SKim Phillips 		ds1339_data[0x03] &= ~0xf8;
328e58fe957SKim Phillips 		if (ds1339_data[0x03] == 0) {
329e58fe957SKim Phillips 			ds1339_data[0x03] = 1;
330e58fe957SKim Phillips 		}
331e58fe957SKim Phillips 
332e58fe957SKim Phillips 		/* Check for a valid date register value */
333e58fe957SKim Phillips 		ds1339_data[0x04] &= ~0xc0;
334e58fe957SKim Phillips 		if ((ds1339_data[0x04] == 0) ||
335e58fe957SKim Phillips 		    ((ds1339_data[0x04] & 0x0f) > 9) ||
336e58fe957SKim Phillips 		    (ds1339_data[0x04] >= 0x32)) {
337e58fe957SKim Phillips 			ds1339_data[0x04] = 1;
338e58fe957SKim Phillips 		}
339e58fe957SKim Phillips 
340e58fe957SKim Phillips 		/* Check for a valid month register value */
341e58fe957SKim Phillips 		ds1339_data[0x05] &= ~0x60;
342e58fe957SKim Phillips 
343e58fe957SKim Phillips 		if ((ds1339_data[0x05] == 0) ||
344e58fe957SKim Phillips 		    ((ds1339_data[0x05] & 0x0f) > 9) ||
345e58fe957SKim Phillips 		    ((ds1339_data[0x05] >= 0x13)
346e58fe957SKim Phillips 		     && (ds1339_data[0x05] <= 0x19))) {
347e58fe957SKim Phillips 			ds1339_data[0x05] = 1;
348e58fe957SKim Phillips 		}
349e58fe957SKim Phillips 
350e58fe957SKim Phillips 		/* Enable Oscillator and rate select */
351e58fe957SKim Phillips 		ds1339_data[0x0e] = 0x1c;
352e58fe957SKim Phillips 
353e58fe957SKim Phillips 		/* Work-around for MPC8349E-mITX bug #13330.
354e58fe957SKim Phillips 		   Ensure that the RTC control register contains the value 0x1c.
355e58fe957SKim Phillips 		   This affects SATA performance.
356e58fe957SKim Phillips 		 */
357e58fe957SKim Phillips 
358e58fe957SKim Phillips 		if (i2c_write
3596d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		    (CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data,
360e58fe957SKim Phillips 		     sizeof(ds1339_data))) {
361e58fe957SKim Phillips 			puts("Failure writing to the RTC via I2C.\n");
362e58fe957SKim Phillips 			rc = 1;
363e58fe957SKim Phillips 		}
364e58fe957SKim Phillips 	} else {
365e58fe957SKim Phillips 		puts("Failure reading from the RTC via I2C.\n");
366e58fe957SKim Phillips 		rc = 1;
367e58fe957SKim Phillips 	}
368e58fe957SKim Phillips #endif
369e58fe957SKim Phillips 
370e58fe957SKim Phillips 	i2c_set_bus_num(orig_bus);
371e58fe957SKim Phillips #endif
372e58fe957SKim Phillips 
37389c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE
37489c7784eSTimur Tabi 	if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE,
37589c7784eSTimur Tabi 		CONFIG_VSC7385_IMAGE_SIZE)) {
37689c7784eSTimur Tabi 		puts("Failure uploading VSC7385 microcode.\n");
37789c7784eSTimur Tabi 		rc = 1;
37889c7784eSTimur Tabi 	}
37989c7784eSTimur Tabi #endif
38089c7784eSTimur Tabi 
381e58fe957SKim Phillips 	return rc;
382e58fe957SKim Phillips }
383e58fe957SKim Phillips 
384e58fe957SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)385e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
386e58fe957SKim Phillips {
387e58fe957SKim Phillips 	ft_cpu_setup(blob, bd);
388e58fe957SKim Phillips #ifdef CONFIG_PCI
389e58fe957SKim Phillips 	ft_pci_setup(blob, bd);
390e58fe957SKim Phillips #endif
391e895a4b0SSimon Glass 
392e895a4b0SSimon Glass 	return 0;
393e58fe957SKim Phillips }
394e58fe957SKim Phillips #endif
395