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