1*dd02936fSMingkai Hu /* 2*dd02936fSMingkai Hu * Copyright 2016 Freescale Semiconductor, Inc. 3*dd02936fSMingkai Hu * 4*dd02936fSMingkai Hu * SPDX-License-Identifier: GPL-2.0+ 5*dd02936fSMingkai Hu */ 6*dd02936fSMingkai Hu 7*dd02936fSMingkai Hu #include <common.h> 8*dd02936fSMingkai Hu #include <i2c.h> 9*dd02936fSMingkai Hu #include <fdt_support.h> 10*dd02936fSMingkai Hu #include <asm/io.h> 11*dd02936fSMingkai Hu #include <asm/arch/clock.h> 12*dd02936fSMingkai Hu #include <asm/arch/fsl_serdes.h> 13*dd02936fSMingkai Hu #include <asm/arch/ppa.h> 14*dd02936fSMingkai Hu #include <asm/arch/soc.h> 15*dd02936fSMingkai Hu #include <hwconfig.h> 16*dd02936fSMingkai Hu #include <ahci.h> 17*dd02936fSMingkai Hu #include <mmc.h> 18*dd02936fSMingkai Hu #include <scsi.h> 19*dd02936fSMingkai Hu #include <fm_eth.h> 20*dd02936fSMingkai Hu #include <fsl_csu.h> 21*dd02936fSMingkai Hu #include <fsl_esdhc.h> 22*dd02936fSMingkai Hu #include "cpld.h" 23*dd02936fSMingkai Hu 24*dd02936fSMingkai Hu DECLARE_GLOBAL_DATA_PTR; 25*dd02936fSMingkai Hu 26*dd02936fSMingkai Hu int checkboard(void) 27*dd02936fSMingkai Hu { 28*dd02936fSMingkai Hu static const char *freq[2] = {"100.00MHZ", "156.25MHZ"}; 29*dd02936fSMingkai Hu u8 cfg_rcw_src1, cfg_rcw_src2; 30*dd02936fSMingkai Hu u16 cfg_rcw_src; 31*dd02936fSMingkai Hu u8 sd1refclk_sel; 32*dd02936fSMingkai Hu 33*dd02936fSMingkai Hu puts("Board: LS1046ARDB, boot from "); 34*dd02936fSMingkai Hu 35*dd02936fSMingkai Hu cfg_rcw_src1 = CPLD_READ(cfg_rcw_src1); 36*dd02936fSMingkai Hu cfg_rcw_src2 = CPLD_READ(cfg_rcw_src2); 37*dd02936fSMingkai Hu cpld_rev_bit(&cfg_rcw_src1); 38*dd02936fSMingkai Hu cfg_rcw_src = cfg_rcw_src1; 39*dd02936fSMingkai Hu cfg_rcw_src = (cfg_rcw_src << 1) | cfg_rcw_src2; 40*dd02936fSMingkai Hu 41*dd02936fSMingkai Hu if (cfg_rcw_src == 0x44) 42*dd02936fSMingkai Hu printf("QSPI vBank %d\n", CPLD_READ(vbank)); 43*dd02936fSMingkai Hu else if (cfg_rcw_src == 0x40) 44*dd02936fSMingkai Hu puts("SD\n"); 45*dd02936fSMingkai Hu else 46*dd02936fSMingkai Hu puts("Invalid setting of SW5\n"); 47*dd02936fSMingkai Hu 48*dd02936fSMingkai Hu printf("CPLD: V%x.%x\nPCBA: V%x.0\n", CPLD_READ(cpld_ver), 49*dd02936fSMingkai Hu CPLD_READ(cpld_ver_sub), CPLD_READ(pcba_ver)); 50*dd02936fSMingkai Hu 51*dd02936fSMingkai Hu puts("SERDES Reference Clocks:\n"); 52*dd02936fSMingkai Hu sd1refclk_sel = CPLD_READ(sd1refclk_sel); 53*dd02936fSMingkai Hu printf("SD1_CLK1 = %s, SD1_CLK2 = %s\n", freq[sd1refclk_sel], freq[0]); 54*dd02936fSMingkai Hu 55*dd02936fSMingkai Hu return 0; 56*dd02936fSMingkai Hu } 57*dd02936fSMingkai Hu 58*dd02936fSMingkai Hu int dram_init(void) 59*dd02936fSMingkai Hu { 60*dd02936fSMingkai Hu gd->ram_size = initdram(0); 61*dd02936fSMingkai Hu 62*dd02936fSMingkai Hu return 0; 63*dd02936fSMingkai Hu } 64*dd02936fSMingkai Hu 65*dd02936fSMingkai Hu int board_early_init_f(void) 66*dd02936fSMingkai Hu { 67*dd02936fSMingkai Hu fsl_lsch2_early_init_f(); 68*dd02936fSMingkai Hu 69*dd02936fSMingkai Hu return 0; 70*dd02936fSMingkai Hu } 71*dd02936fSMingkai Hu 72*dd02936fSMingkai Hu int board_init(void) 73*dd02936fSMingkai Hu { 74*dd02936fSMingkai Hu struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR; 75*dd02936fSMingkai Hu 76*dd02936fSMingkai Hu #ifdef CONFIG_LAYERSCAPE_NS_ACCESS 77*dd02936fSMingkai Hu enable_layerscape_ns_access(); 78*dd02936fSMingkai Hu #endif 79*dd02936fSMingkai Hu 80*dd02936fSMingkai Hu #ifdef CONFIG_FSL_LS_PPA 81*dd02936fSMingkai Hu ppa_init(); 82*dd02936fSMingkai Hu #endif 83*dd02936fSMingkai Hu 84*dd02936fSMingkai Hu /* invert AQR105 IRQ pins polarity */ 85*dd02936fSMingkai Hu out_be32(&scfg->intpcr, AQR105_IRQ_MASK); 86*dd02936fSMingkai Hu 87*dd02936fSMingkai Hu return 0; 88*dd02936fSMingkai Hu } 89*dd02936fSMingkai Hu 90*dd02936fSMingkai Hu void config_board_mux(void) 91*dd02936fSMingkai Hu { 92*dd02936fSMingkai Hu #ifdef CONFIG_HAS_FSL_XHCI_USB 93*dd02936fSMingkai Hu struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR; 94*dd02936fSMingkai Hu u32 usb_pwrfault; 95*dd02936fSMingkai Hu 96*dd02936fSMingkai Hu /* USB3 is not used, configure mux to IIC4_SCL/IIC4_SDA */ 97*dd02936fSMingkai Hu out_be32(&scfg->rcwpmuxcr0, 0x3300); 98*dd02936fSMingkai Hu out_be32(&scfg->usbdrvvbus_selcr, SCFG_USBDRVVBUS_SELCR_USB1); 99*dd02936fSMingkai Hu usb_pwrfault = (SCFG_USBPWRFAULT_DEDICATED << 100*dd02936fSMingkai Hu SCFG_USBPWRFAULT_USB3_SHIFT) | 101*dd02936fSMingkai Hu (SCFG_USBPWRFAULT_DEDICATED << 102*dd02936fSMingkai Hu SCFG_USBPWRFAULT_USB2_SHIFT) | 103*dd02936fSMingkai Hu (SCFG_USBPWRFAULT_SHARED << 104*dd02936fSMingkai Hu SCFG_USBPWRFAULT_USB1_SHIFT); 105*dd02936fSMingkai Hu out_be32(&scfg->usbpwrfault_selcr, usb_pwrfault); 106*dd02936fSMingkai Hu #endif 107*dd02936fSMingkai Hu } 108*dd02936fSMingkai Hu 109*dd02936fSMingkai Hu #ifdef CONFIG_MISC_INIT_R 110*dd02936fSMingkai Hu int misc_init_r(void) 111*dd02936fSMingkai Hu { 112*dd02936fSMingkai Hu config_board_mux(); 113*dd02936fSMingkai Hu return 0; 114*dd02936fSMingkai Hu } 115*dd02936fSMingkai Hu #endif 116*dd02936fSMingkai Hu 117*dd02936fSMingkai Hu int ft_board_setup(void *blob, bd_t *bd) 118*dd02936fSMingkai Hu { 119*dd02936fSMingkai Hu u64 base[CONFIG_NR_DRAM_BANKS]; 120*dd02936fSMingkai Hu u64 size[CONFIG_NR_DRAM_BANKS]; 121*dd02936fSMingkai Hu 122*dd02936fSMingkai Hu /* fixup DT for the two DDR banks */ 123*dd02936fSMingkai Hu base[0] = gd->bd->bi_dram[0].start; 124*dd02936fSMingkai Hu size[0] = gd->bd->bi_dram[0].size; 125*dd02936fSMingkai Hu base[1] = gd->bd->bi_dram[1].start; 126*dd02936fSMingkai Hu size[1] = gd->bd->bi_dram[1].size; 127*dd02936fSMingkai Hu 128*dd02936fSMingkai Hu fdt_fixup_memory_banks(blob, base, size, 2); 129*dd02936fSMingkai Hu ft_cpu_setup(blob, bd); 130*dd02936fSMingkai Hu 131*dd02936fSMingkai Hu #ifdef CONFIG_SYS_DPAA_FMAN 132*dd02936fSMingkai Hu fdt_fixup_fman_ethernet(blob); 133*dd02936fSMingkai Hu #endif 134*dd02936fSMingkai Hu 135*dd02936fSMingkai Hu return 0; 136*dd02936fSMingkai Hu } 137