1 /* 2 * Copyright 2013 Freescale Semiconductor, Inc. 3 * 4 * See file CREDITS for list of people who contributed to this 5 * project. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of 10 * the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20 * MA 02111-1307 USA 21 */ 22 23 #include <common.h> 24 #include <asm/processor.h> 25 #include <asm/mmu.h> 26 #include <asm/cache.h> 27 #include <asm/immap_85xx.h> 28 #include <asm/io.h> 29 #include <miiphy.h> 30 #include <libfdt.h> 31 #include <fdt_support.h> 32 #include <fsl_mdio.h> 33 #include <tsec.h> 34 #include <mmc.h> 35 #include <netdev.h> 36 #include <asm/fsl_ifc.h> 37 #include <hwconfig.h> 38 #include <i2c.h> 39 #include <asm/fsl_ddr_sdram.h> 40 41 #ifdef CONFIG_PCI 42 #include <pci.h> 43 #include <asm/fsl_pci.h> 44 #endif 45 46 #include "../common/qixis.h" 47 DECLARE_GLOBAL_DATA_PTR; 48 49 50 int board_early_init_f(void) 51 { 52 struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR; 53 54 setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT); 55 56 return 0; 57 } 58 59 void board_config_serdes_mux(void) 60 { 61 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 62 u32 pordevsr = in_be32(&gur->pordevsr); 63 u32 srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 64 MPC85xx_PORDEVSR_IO_SEL_SHIFT; 65 66 switch (srds_cfg) { 67 /* PEX(1) PEX(2) CPRI 2 CPRI 1 */ 68 case 1: 69 case 2: 70 case 3: 71 case 4: 72 case 5: 73 case 22: 74 case 23: 75 case 24: 76 case 25: 77 case 26: 78 QIXIS_WRITE_I2C(brdcfg[4], 0x03); 79 break; 80 81 /* PEX(1) PEX(2) SGMII1 CPRI 1 */ 82 case 6: 83 case 7: 84 case 8: 85 case 9: 86 case 10: 87 case 27: 88 case 28: 89 case 29: 90 case 30: 91 case 31: 92 QIXIS_WRITE_I2C(brdcfg[4], 0x01); 93 break; 94 95 /* PEX(1) PEX(2) SGMII1 SGMII2 */ 96 case 11: 97 case 32: 98 QIXIS_WRITE_I2C(brdcfg[4], 0x00); 99 break; 100 101 /* PEX(1) SGMII2 CPRI 2 CPRI 1 */ 102 case 12: 103 case 13: 104 case 14: 105 case 15: 106 case 16: 107 case 33: 108 case 34: 109 case 35: 110 case 36: 111 case 37: 112 QIXIS_WRITE_I2C(brdcfg[4], 0x07); 113 break; 114 115 /* PEX(1) SGMII2 SGMII1 CPRI 1 */ 116 case 17: 117 case 18: 118 case 19: 119 case 20: 120 case 21: 121 case 38: 122 case 39: 123 case 40: 124 case 41: 125 case 42: 126 QIXIS_WRITE_I2C(brdcfg[4], 0x05); 127 break; 128 129 /* SGMII1 SGMII2 CPRI 2 CPRI 1 */ 130 case 43: 131 case 44: 132 case 45: 133 case 46: 134 case 47: 135 QIXIS_WRITE_I2C(brdcfg[4], 0x0F); 136 break; 137 138 139 default: 140 break; 141 } 142 } 143 144 int board_early_init_r(void) 145 { 146 #ifndef CONFIG_SYS_NO_FLASH 147 const unsigned int flashbase = CONFIG_SYS_FLASH_BASE; 148 const u8 flash_esel = find_tlb_idx((void *)flashbase, 1); 149 150 /* 151 * Remap Boot flash region to caching-inhibited 152 * so that flash can be erased properly. 153 */ 154 155 /* Flush d-cache and invalidate i-cache of any FLASH data */ 156 flush_dcache(); 157 invalidate_icache(); 158 159 /* invalidate existing TLB entry for flash */ 160 disable_tlb(flash_esel); 161 162 set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, 163 MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, 164 0, flash_esel, BOOKE_PAGESZ_64M, 1); 165 166 set_tlb(1, flashbase + 0x4000000, 167 CONFIG_SYS_FLASH_BASE_PHYS + 0x4000000, 168 MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, 169 0, flash_esel+1, BOOKE_PAGESZ_64M, 1); 170 #endif 171 board_config_serdes_mux(); 172 return 0; 173 } 174 175 #ifdef CONFIG_PCI 176 void pci_init_board(void) 177 { 178 fsl_pcie_init_board(0); 179 } 180 #endif /* ifdef CONFIG_PCI */ 181 182 int checkboard(void) 183 { 184 struct cpu_type *cpu; 185 u8 sw; 186 187 cpu = gd->arch.cpu; 188 printf("Board: %sQDS\n", cpu->name); 189 190 printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, FPGA Ver: 0x%02x,\n", 191 QIXIS_READ(id), QIXIS_READ(arch), QIXIS_READ(scver)); 192 193 sw = QIXIS_READ(brdcfg[0]); 194 sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT; 195 196 printf("IFC chip select:"); 197 switch (sw) { 198 case 0: 199 printf("NOR\n"); 200 break; 201 case 2: 202 printf("Promjet\n"); 203 break; 204 case 4: 205 printf("NAND\n"); 206 break; 207 default: 208 printf("Invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH); 209 break; 210 } 211 212 return 0; 213 } 214 215 #ifdef CONFIG_TSEC_ENET 216 int board_eth_init(bd_t *bis) 217 { 218 struct fsl_pq_mdio_info mdio_info; 219 struct tsec_info_struct tsec_info[4]; 220 int num = 0; 221 222 #ifdef CONFIG_TSEC1 223 SET_STD_TSEC_INFO(tsec_info[num], 1); 224 num++; 225 226 #endif 227 228 #ifdef CONFIG_TSEC2 229 SET_STD_TSEC_INFO(tsec_info[num], 2); 230 num++; 231 #endif 232 233 mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR; 234 mdio_info.name = DEFAULT_MII_NAME; 235 236 fsl_pq_mdio_init(bis, &mdio_info); 237 tsec_eth_init(bis, tsec_info, num); 238 239 #ifdef CONFIG_PCI 240 pci_eth_init(bis); 241 #endif 242 243 return 0; 244 } 245 #endif 246 247 #define USBMUX_SEL_MASK 0xc0 248 #define USBMUX_SEL_UART2 0xc0 249 #define USBMUX_SEL_USB 0x40 250 #define SPIMUX_SEL_UART3 0x80 251 #define GPS_MUX_SEL_GPS 0x40 252 253 #define TSEC_1588_CLKIN_MASK 0x03 254 #define CON_XCVR_REF_CLK 0x00 255 256 int misc_init_r(void) 257 { 258 u8 val; 259 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 260 u32 porbmsr = in_be32(&gur->porbmsr); 261 u32 romloc = (porbmsr >> MPC85XX_PORBMSR_ROMLOC_SHIFT) & 0xf; 262 263 /*Configure 1588 clock-in source from RF Card*/ 264 val = QIXIS_READ_I2C(brdcfg[5]); 265 QIXIS_WRITE_I2C(brdcfg[5], 266 (val & ~(TSEC_1588_CLKIN_MASK)) | CON_XCVR_REF_CLK); 267 268 if (hwconfig("uart2") && hwconfig("usb1")) { 269 printf("UART2 and USB cannot work together on the board\n"); 270 printf("Remove one from hwconfig and reset\n"); 271 } else { 272 if (hwconfig("uart2")) { 273 val = QIXIS_READ_I2C(brdcfg[5]); 274 QIXIS_WRITE_I2C(brdcfg[5], 275 (val & ~(USBMUX_SEL_MASK)) | USBMUX_SEL_UART2); 276 clrbits_be32(&gur->pmuxcr3, 277 MPC85xx_PMUXCR3_USB_SEL_MASK); 278 setbits_be32(&gur->pmuxcr3, MPC85xx_PMUXCR3_UART2_SEL); 279 } else { 280 /* By default USB should be selected. 281 * Programming FPGA to select USB. */ 282 val = QIXIS_READ_I2C(brdcfg[5]); 283 QIXIS_WRITE_I2C(brdcfg[5], 284 (val & ~(USBMUX_SEL_MASK)) | USBMUX_SEL_USB); 285 } 286 287 } 288 289 if (hwconfig("sim")) { 290 if (romloc == PORBMSR_ROMLOC_NAND_2K || 291 romloc == PORBMSR_ROMLOC_NOR || 292 romloc == PORBMSR_ROMLOC_SPI) { 293 294 val = QIXIS_READ_I2C(brdcfg[3]); 295 QIXIS_WRITE_I2C(brdcfg[3], val|0x10); 296 clrbits_be32(&gur->pmuxcr, 297 MPC85xx_PMUXCR0_SIM_SEL_MASK); 298 setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR0_SIM_SEL); 299 } 300 } 301 302 if (hwconfig("uart3")) { 303 if (romloc == PORBMSR_ROMLOC_NAND_2K || 304 romloc == PORBMSR_ROMLOC_NOR || 305 romloc == PORBMSR_ROMLOC_SDHC) { 306 307 /* UART3 and SPI1 (Flashes) are muxed together */ 308 val = QIXIS_READ_I2C(brdcfg[3]); 309 QIXIS_WRITE_I2C(brdcfg[3], (val | SPIMUX_SEL_UART3)); 310 clrbits_be32(&gur->pmuxcr3, 311 MPC85xx_PMUXCR3_UART3_SEL_MASK); 312 setbits_be32(&gur->pmuxcr3, MPC85xx_PMUXCR3_UART3_SEL); 313 314 /* MUX to select UART3 connection to J24 header 315 * or to GPS */ 316 val = QIXIS_READ_I2C(brdcfg[6]); 317 if (hwconfig("gps")) 318 QIXIS_WRITE_I2C(brdcfg[6], 319 (val | GPS_MUX_SEL_GPS)); 320 else 321 QIXIS_WRITE_I2C(brdcfg[6], 322 (val & ~(GPS_MUX_SEL_GPS))); 323 } 324 } 325 return 0; 326 } 327 328 void fdt_del_node_compat(void *blob, const char *compatible) 329 { 330 int err; 331 int off = fdt_node_offset_by_compatible(blob, -1, compatible); 332 if (off < 0) { 333 printf("WARNING: could not find compatible node %s: %s.\n", 334 compatible, fdt_strerror(off)); 335 return; 336 } 337 err = fdt_del_node(blob, off); 338 if (err < 0) { 339 printf("WARNING: could not remove %s: %s.\n", 340 compatible, fdt_strerror(err)); 341 } 342 } 343 344 #if defined(CONFIG_OF_BOARD_SETUP) 345 void ft_board_setup(void *blob, bd_t *bd) 346 { 347 phys_addr_t base; 348 phys_size_t size; 349 350 ft_cpu_setup(blob, bd); 351 352 base = getenv_bootm_low(); 353 size = getenv_bootm_size(); 354 355 #if defined(CONFIG_PCI) 356 FT_FSL_PCI_SETUP; 357 #endif 358 359 fdt_fixup_memory(blob, (u64)base, (u64)size); 360 361 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 362 u32 porbmsr = in_be32(&gur->porbmsr); 363 u32 romloc = (porbmsr >> MPC85XX_PORBMSR_ROMLOC_SHIFT) & 0xf; 364 365 if (!(hwconfig("uart2") && hwconfig("usb1"))) { 366 /* If uart2 is there in hwconfig remove usb node from 367 * device tree */ 368 369 if (hwconfig("uart2")) { 370 /* remove dts usb node */ 371 fdt_del_node_compat(blob, "fsl-usb2-dr"); 372 } else { 373 fdt_fixup_dr_usb(blob, bd); 374 fdt_del_node_and_alias(blob, "serial2"); 375 } 376 } 377 378 if (hwconfig("uart3")) { 379 if (romloc == PORBMSR_ROMLOC_NAND_2K || 380 romloc == PORBMSR_ROMLOC_NOR || 381 romloc == PORBMSR_ROMLOC_SDHC) 382 /* Delete SPI node from the device tree */ 383 fdt_del_node_and_alias(blob, "spi1"); 384 } else 385 fdt_del_node_and_alias(blob, "serial3"); 386 387 if (hwconfig("sim")) { 388 if (romloc == PORBMSR_ROMLOC_NAND_2K || 389 romloc == PORBMSR_ROMLOC_NOR || 390 romloc == PORBMSR_ROMLOC_SPI) { 391 392 /* remove dts sdhc node */ 393 fdt_del_node_compat(blob, "fsl,esdhc"); 394 } else if (romloc == PORBMSR_ROMLOC_SDHC) { 395 396 /* remove dts sim node */ 397 fdt_del_node_compat(blob, "fsl,sim-v1.0"); 398 printf("SIM & SDHC can't work together on the board"); 399 printf("\nRemove sim from hwconfig and reset\n"); 400 } 401 } 402 } 403 #endif 404