1e58fe957SKim Phillips /* 2*4c2e3da8SKumar 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; 46e58fe957SKim Phillips u32 ddr_size; /* The size of RAM, in bytes */ 47e58fe957SKim Phillips u32 ddr_size_log2 = 0; 48e58fe957SKim Phillips 496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD for (ddr_size = CONFIG_SYS_DDR_SIZE * 0x100000; ddr_size > 1; ddr_size >>= 1) { 50e58fe957SKim Phillips if (ddr_size & 1) { 51e58fe957SKim Phillips return -1; 52e58fe957SKim Phillips } 53e58fe957SKim Phillips ddr_size_log2++; 54e58fe957SKim Phillips } 55e58fe957SKim Phillips 56e58fe957SKim Phillips im->sysconf.ddrlaw[0].ar = 57e58fe957SKim Phillips LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); 586d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000; 59e58fe957SKim Phillips 60e58fe957SKim Phillips /* Only one CS0 for DDR */ 61e58fe957SKim Phillips im->ddr.csbnds[0].csbnds = 0x0000000f; 626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.cs_config[0] = CONFIG_SYS_DDR_CONFIG; 63e58fe957SKim Phillips 64e58fe957SKim Phillips debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds); 65e58fe957SKim Phillips debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]); 66e58fe957SKim Phillips 67e58fe957SKim Phillips debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar); 68e58fe957SKim Phillips debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar); 69e58fe957SKim Phillips 706d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; 716d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */ 72e58fe957SKim Phillips im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR1; 73e58fe957SKim Phillips im->ddr.sdram_mode = 74e58fe957SKim Phillips (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT); 75e58fe957SKim Phillips im->ddr.sdram_interval = 76e58fe957SKim Phillips (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 << 77e58fe957SKim Phillips SDRAM_INTERVAL_BSTOPRE_SHIFT); 786d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL; 79e58fe957SKim Phillips 80e58fe957SKim Phillips udelay(200); 81e58fe957SKim Phillips 82e58fe957SKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 83e58fe957SKim Phillips 84e58fe957SKim Phillips debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1); 85e58fe957SKim Phillips debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2); 86e58fe957SKim Phillips debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode); 87e58fe957SKim Phillips debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval); 88e58fe957SKim Phillips debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg); 89e58fe957SKim Phillips 906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_DDR_SIZE; 91e58fe957SKim Phillips } 92e58fe957SKim Phillips #endif 93e58fe957SKim Phillips 94e58fe957SKim Phillips #ifdef CONFIG_PCI 95e58fe957SKim Phillips /* 96e58fe957SKim Phillips * Initialize PCI Devices, report devices found 97e58fe957SKim Phillips */ 98e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP 99e58fe957SKim Phillips static struct pci_config_table pci_mpc83xxmitx_config_table[] = { 100e58fe957SKim Phillips { 101e58fe957SKim Phillips PCI_ANY_ID, 102e58fe957SKim Phillips PCI_ANY_ID, 103e58fe957SKim Phillips PCI_ANY_ID, 104e58fe957SKim Phillips PCI_ANY_ID, 105e58fe957SKim Phillips 0x0f, 106e58fe957SKim Phillips PCI_ANY_ID, 107e58fe957SKim Phillips pci_cfgfunc_config_device, 108e58fe957SKim Phillips { 109e58fe957SKim Phillips PCI_ENET0_IOADDR, 110e58fe957SKim Phillips PCI_ENET0_MEMADDR, 111e58fe957SKim Phillips PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} 112e58fe957SKim Phillips }, 113e58fe957SKim Phillips {} 114e58fe957SKim Phillips } 115e58fe957SKim Phillips #endif 116e58fe957SKim Phillips 117e58fe957SKim Phillips volatile static struct pci_controller hose[] = { 118e58fe957SKim Phillips { 119e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP 120e58fe957SKim Phillips config_table:pci_mpc83xxmitx_config_table, 121e58fe957SKim Phillips #endif 122e58fe957SKim Phillips }, 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 #endif /* CONFIG_PCI */ 130e58fe957SKim Phillips 1319973e3c6SBecky Bruce phys_size_t initdram(int board_type) 132e58fe957SKim Phillips { 1336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR; 134e58fe957SKim Phillips u32 msize = 0; 135e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC 136e58fe957SKim Phillips volatile ddr83xx_t *ddr = &im->ddr; 137e58fe957SKim Phillips #endif 138e58fe957SKim Phillips 139e58fe957SKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 140e58fe957SKim Phillips return -1; 141e58fe957SKim Phillips 142e58fe957SKim Phillips /* DDR SDRAM - Main SODIMM */ 1436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_BASE & LAWBAR_BAR; 144e58fe957SKim Phillips #ifdef CONFIG_SPD_EEPROM 145e58fe957SKim Phillips msize = spd_sdram(); 146e58fe957SKim Phillips #else 147e58fe957SKim Phillips msize = fixed_sdram(); 148e58fe957SKim Phillips #endif 149e58fe957SKim Phillips 150e58fe957SKim Phillips #ifdef CONFIG_DDR_ECC 151e58fe957SKim Phillips if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) 152e58fe957SKim Phillips /* Unlike every other board, on the 83xx spd_sdram() returns 153e58fe957SKim Phillips megabytes instead of just bytes. That's why we need to 154e58fe957SKim Phillips multiple by 1MB when calling ddr_enable_ecc(). */ 155e58fe957SKim Phillips ddr_enable_ecc(msize * 1048576); 156e58fe957SKim Phillips #endif 157e58fe957SKim Phillips 158e58fe957SKim Phillips /* return total bus RAM size(bytes) */ 159e58fe957SKim Phillips return msize * 1024 * 1024; 160e58fe957SKim Phillips } 161e58fe957SKim Phillips 162e58fe957SKim Phillips int checkboard(void) 163e58fe957SKim Phillips { 164e58fe957SKim Phillips #ifdef CONFIG_MPC8349ITX 165e58fe957SKim Phillips puts("Board: Freescale MPC8349E-mITX\n"); 166e58fe957SKim Phillips #else 167e58fe957SKim Phillips puts("Board: Freescale MPC8349E-mITX-GP\n"); 168e58fe957SKim Phillips #endif 169e58fe957SKim Phillips 170e58fe957SKim Phillips return 0; 171e58fe957SKim Phillips } 172e58fe957SKim Phillips 173e58fe957SKim Phillips /* 174e58fe957SKim Phillips * Implement a work-around for a hardware problem with compact 175e58fe957SKim Phillips * flash. 176e58fe957SKim Phillips * 177e58fe957SKim Phillips * Program the UPM if compact flash is enabled. 178e58fe957SKim Phillips */ 179e58fe957SKim Phillips int misc_init_f(void) 180e58fe957SKim Phillips { 18189c7784eSTimur Tabi #ifdef CONFIG_VSC7385_ENET 182e58fe957SKim Phillips volatile u32 *vsc7385_cpuctrl; 183e58fe957SKim Phillips 184e58fe957SKim Phillips /* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register. The power up 185e58fe957SKim Phillips default of VSC7385 L1_IRQ and L2_IRQ requests are active high. That 186e58fe957SKim Phillips means it is 0 when the IRQ is not active. This makes the wire-AND 187e58fe957SKim Phillips logic always assert IRQ7 to CPU even if there is no request from the 188e58fe957SKim Phillips switch. Since the compact flash and the switch share the same IRQ, 189e58fe957SKim Phillips the Linux kernel will think that the compact flash is requesting irq 190e58fe957SKim Phillips and get stuck when it tries to clear the IRQ. Thus we need to set 191e58fe957SKim Phillips the L2_IRQ0 and L2_IRQ1 to active low. 192e58fe957SKim Phillips 193e58fe957SKim Phillips The following code sets the L1_IRQ and L2_IRQ polarity to active low. 194e58fe957SKim Phillips Without this code, compact flash will not work in Linux because 195e58fe957SKim Phillips unlike U-Boot, Linux uses the IRQ, so this code is necessary if we 196e58fe957SKim Phillips don't enable compact flash for U-Boot. 197e58fe957SKim Phillips */ 198e58fe957SKim Phillips 1996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD vsc7385_cpuctrl = (volatile u32 *)(CONFIG_SYS_VSC7385_BASE + 0x1c0c0); 200e58fe957SKim Phillips *vsc7385_cpuctrl |= 0x0c; 201e58fe957SKim Phillips #endif 202e58fe957SKim Phillips 203e58fe957SKim Phillips #ifdef CONFIG_COMPACT_FLASH 204e58fe957SKim Phillips /* UPM Table Configuration Code */ 205e58fe957SKim Phillips static uint UPMATable[] = { 206e58fe957SKim Phillips 0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00, 207e58fe957SKim Phillips 0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01, 208e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 209e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 210e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00, 211e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, 212e58fe957SKim Phillips 0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00, 213e58fe957SKim Phillips 0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00, 214e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 215e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 216e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 217e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, 218e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 219e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, 220e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, 221e58fe957SKim Phillips 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01 222e58fe957SKim Phillips }; 2236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR; 2244e190b03SHaiying Wang volatile fsl_lbus_t *lbus = &immap->lbus; 225e58fe957SKim Phillips 2266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD lbus->bank[3].br = CONFIG_SYS_BR3_PRELIM; 2276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD lbus->bank[3].or = CONFIG_SYS_OR3_PRELIM; 228e58fe957SKim Phillips 229e58fe957SKim Phillips /* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000, 230e58fe957SKim Phillips GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000 231e58fe957SKim Phillips */ 232e58fe957SKim Phillips lbus->mamr = 0x08404440; 233e58fe957SKim Phillips 234e58fe957SKim Phillips upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0])); 235e58fe957SKim Phillips 236e58fe957SKim Phillips puts("UPMA: Configured for compact flash\n"); 237e58fe957SKim Phillips #endif 238e58fe957SKim Phillips 239e58fe957SKim Phillips return 0; 240e58fe957SKim Phillips } 241e58fe957SKim Phillips 242e58fe957SKim Phillips /* 24389c7784eSTimur Tabi * Miscellaneous late-boot configurations 24489c7784eSTimur Tabi * 245e58fe957SKim Phillips * Make sure the EEPROM has the HRCW correctly programmed. 246e58fe957SKim Phillips * Make sure the RTC is correctly programmed. 247e58fe957SKim Phillips * 248e58fe957SKim Phillips * The MPC8349E-mITX can be configured to load the HRCW from 249e58fe957SKim Phillips * EEPROM instead of flash. This is controlled via jumpers 250e58fe957SKim Phillips * LGPL0, 1, and 3. Normally, these jumpers are set to 000 (all 251e58fe957SKim Phillips * jumpered), but if they're set to 001 or 010, then the HRCW is 252e58fe957SKim Phillips * read from the "I2C EEPROM". 253e58fe957SKim Phillips * 254e58fe957SKim Phillips * This function makes sure that the I2C EEPROM is programmed 255e58fe957SKim Phillips * correctly. 25689c7784eSTimur Tabi * 25789c7784eSTimur Tabi * If a VSC7385 microcode image is present, then upload it. 258e58fe957SKim Phillips */ 259e58fe957SKim Phillips int misc_init_r(void) 260e58fe957SKim Phillips { 261e58fe957SKim Phillips int rc = 0; 262e58fe957SKim Phillips 263e58fe957SKim Phillips #ifdef CONFIG_HARD_I2C 264e58fe957SKim Phillips 265e58fe957SKim Phillips unsigned int orig_bus = i2c_get_bus_num(); 266e58fe957SKim Phillips u8 i2c_data; 267e58fe957SKim Phillips 2686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR 269e58fe957SKim Phillips u8 ds1339_data[17]; 270e58fe957SKim Phillips #endif 271e58fe957SKim Phillips 2726d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR 273e58fe957SKim Phillips static u8 eeprom_data[] = /* HRCW data */ 274e58fe957SKim Phillips { 275e58fe957SKim Phillips 0xAA, 0x55, 0xAA, /* Preamble */ 276e58fe957SKim Phillips 0x7C, /* ACS=0, BYTE_EN=1111, CONT=1 */ 277e58fe957SKim Phillips 0x02, 0x40, /* RCWL ADDR=0x0_0900 */ 2786d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_LOW >> 24) & 0xFF, 2796d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_LOW >> 16) & 0xFF, 2806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_LOW >> 8) & 0xFF, 2816d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_HRCW_LOW & 0xFF, 282e58fe957SKim Phillips 0x7C, /* ACS=0, BYTE_EN=1111, CONT=1 */ 283e58fe957SKim Phillips 0x02, 0x41, /* RCWH ADDR=0x0_0904 */ 2846d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_HIGH >> 24) & 0xFF, 2856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_HIGH >> 16) & 0xFF, 2866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_HRCW_HIGH >> 8) & 0xFF, 2876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_HRCW_HIGH & 0xFF 288e58fe957SKim Phillips }; 289e58fe957SKim Phillips 290e58fe957SKim Phillips u8 data[sizeof(eeprom_data)]; 291e58fe957SKim Phillips #endif 292e58fe957SKim Phillips 293e58fe957SKim Phillips printf("Board revision: "); 294e58fe957SKim Phillips i2c_set_bus_num(1); 2956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0) 296e58fe957SKim Phillips printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01); 2976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD else if (i2c_read(CONFIG_SYS_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0) 298e58fe957SKim Phillips printf("%u.%u (PCF8475)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01); 299e58fe957SKim Phillips else { 300e58fe957SKim Phillips printf("Unknown\n"); 301e58fe957SKim Phillips rc = 1; 302e58fe957SKim Phillips } 303e58fe957SKim Phillips 3046d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_EEPROM_ADDR 305e58fe957SKim Phillips i2c_set_bus_num(0); 306e58fe957SKim Phillips 3076d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) { 308e58fe957SKim Phillips if (memcmp(data, eeprom_data, sizeof(data)) != 0) { 309e58fe957SKim Phillips if (i2c_write 3106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, eeprom_data, 311e58fe957SKim Phillips sizeof(eeprom_data)) != 0) { 312e58fe957SKim Phillips puts("Failure writing the HRCW to EEPROM via I2C.\n"); 313e58fe957SKim Phillips rc = 1; 314e58fe957SKim Phillips } 315e58fe957SKim Phillips } 316e58fe957SKim Phillips } else { 317e58fe957SKim Phillips puts("Failure reading the HRCW from EEPROM via I2C.\n"); 318e58fe957SKim Phillips rc = 1; 319e58fe957SKim Phillips } 320e58fe957SKim Phillips #endif 321e58fe957SKim Phillips 3226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_I2C_RTC_ADDR 323e58fe957SKim Phillips i2c_set_bus_num(1); 324e58fe957SKim Phillips 3256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data)) 326e58fe957SKim Phillips == 0) { 327e58fe957SKim Phillips 328e58fe957SKim Phillips /* Work-around for MPC8349E-mITX bug #13601. 329e58fe957SKim Phillips If the RTC does not contain valid register values, the DS1339 330e58fe957SKim Phillips Linux driver will not work. 331e58fe957SKim Phillips */ 332e58fe957SKim Phillips 333e58fe957SKim Phillips /* Make sure status register bits 6-2 are zero */ 334e58fe957SKim Phillips ds1339_data[0x0f] &= ~0x7c; 335e58fe957SKim Phillips 336e58fe957SKim Phillips /* Check for a valid day register value */ 337e58fe957SKim Phillips ds1339_data[0x03] &= ~0xf8; 338e58fe957SKim Phillips if (ds1339_data[0x03] == 0) { 339e58fe957SKim Phillips ds1339_data[0x03] = 1; 340e58fe957SKim Phillips } 341e58fe957SKim Phillips 342e58fe957SKim Phillips /* Check for a valid date register value */ 343e58fe957SKim Phillips ds1339_data[0x04] &= ~0xc0; 344e58fe957SKim Phillips if ((ds1339_data[0x04] == 0) || 345e58fe957SKim Phillips ((ds1339_data[0x04] & 0x0f) > 9) || 346e58fe957SKim Phillips (ds1339_data[0x04] >= 0x32)) { 347e58fe957SKim Phillips ds1339_data[0x04] = 1; 348e58fe957SKim Phillips } 349e58fe957SKim Phillips 350e58fe957SKim Phillips /* Check for a valid month register value */ 351e58fe957SKim Phillips ds1339_data[0x05] &= ~0x60; 352e58fe957SKim Phillips 353e58fe957SKim Phillips if ((ds1339_data[0x05] == 0) || 354e58fe957SKim Phillips ((ds1339_data[0x05] & 0x0f) > 9) || 355e58fe957SKim Phillips ((ds1339_data[0x05] >= 0x13) 356e58fe957SKim Phillips && (ds1339_data[0x05] <= 0x19))) { 357e58fe957SKim Phillips ds1339_data[0x05] = 1; 358e58fe957SKim Phillips } 359e58fe957SKim Phillips 360e58fe957SKim Phillips /* Enable Oscillator and rate select */ 361e58fe957SKim Phillips ds1339_data[0x0e] = 0x1c; 362e58fe957SKim Phillips 363e58fe957SKim Phillips /* Work-around for MPC8349E-mITX bug #13330. 364e58fe957SKim Phillips Ensure that the RTC control register contains the value 0x1c. 365e58fe957SKim Phillips This affects SATA performance. 366e58fe957SKim Phillips */ 367e58fe957SKim Phillips 368e58fe957SKim Phillips if (i2c_write 3696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_I2C_RTC_ADDR, 0, 1, ds1339_data, 370e58fe957SKim Phillips sizeof(ds1339_data))) { 371e58fe957SKim Phillips puts("Failure writing to the RTC via I2C.\n"); 372e58fe957SKim Phillips rc = 1; 373e58fe957SKim Phillips } 374e58fe957SKim Phillips } else { 375e58fe957SKim Phillips puts("Failure reading from the RTC via I2C.\n"); 376e58fe957SKim Phillips rc = 1; 377e58fe957SKim Phillips } 378e58fe957SKim Phillips #endif 379e58fe957SKim Phillips 380e58fe957SKim Phillips i2c_set_bus_num(orig_bus); 381e58fe957SKim Phillips #endif 382e58fe957SKim Phillips 38389c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE 38489c7784eSTimur Tabi if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE, 38589c7784eSTimur Tabi CONFIG_VSC7385_IMAGE_SIZE)) { 38689c7784eSTimur Tabi puts("Failure uploading VSC7385 microcode.\n"); 38789c7784eSTimur Tabi rc = 1; 38889c7784eSTimur Tabi } 38989c7784eSTimur Tabi #endif 39089c7784eSTimur Tabi 391e58fe957SKim Phillips return rc; 392e58fe957SKim Phillips } 393e58fe957SKim Phillips 394e58fe957SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP) 395e58fe957SKim Phillips void ft_board_setup(void *blob, bd_t *bd) 396e58fe957SKim Phillips { 397e58fe957SKim Phillips ft_cpu_setup(blob, bd); 398e58fe957SKim Phillips #ifdef CONFIG_PCI 399e58fe957SKim Phillips ft_pci_setup(blob, bd); 400e58fe957SKim Phillips #endif 401e58fe957SKim Phillips } 402e58fe957SKim Phillips #endif 403