1*8b0044ffSOleksandr G Zhadan /* 2*8b0044ffSOleksandr G Zhadan * Copyright 2013-2015 Arcturus Networks, Inc. 3*8b0044ffSOleksandr G Zhadan * http://www.arcturusnetworks.com/products/ucp1020/ 4*8b0044ffSOleksandr G Zhadan * based on board/freescale/p1_p2_rdb_pc/spl_minimal.c 5*8b0044ffSOleksandr G Zhadan * original copyright follows: 6*8b0044ffSOleksandr G Zhadan * Copyright 2011 Freescale Semiconductor, Inc. 7*8b0044ffSOleksandr G Zhadan * 8*8b0044ffSOleksandr G Zhadan * SPDX-License-Identifier: GPL-2.0+ 9*8b0044ffSOleksandr G Zhadan */ 10*8b0044ffSOleksandr G Zhadan 11*8b0044ffSOleksandr G Zhadan #include <common.h> 12*8b0044ffSOleksandr G Zhadan #include <ns16550.h> 13*8b0044ffSOleksandr G Zhadan #include <asm/io.h> 14*8b0044ffSOleksandr G Zhadan #include <nand.h> 15*8b0044ffSOleksandr G Zhadan #include <linux/compiler.h> 16*8b0044ffSOleksandr G Zhadan #include <asm/fsl_law.h> 17*8b0044ffSOleksandr G Zhadan #include <fsl_ddr_sdram.h> 18*8b0044ffSOleksandr G Zhadan #include <asm/global_data.h> 19*8b0044ffSOleksandr G Zhadan 20*8b0044ffSOleksandr G Zhadan DECLARE_GLOBAL_DATA_PTR; 21*8b0044ffSOleksandr G Zhadan 22*8b0044ffSOleksandr G Zhadan void board_init_f(ulong bootflag) 23*8b0044ffSOleksandr G Zhadan { 24*8b0044ffSOleksandr G Zhadan u32 plat_ratio; 25*8b0044ffSOleksandr G Zhadan ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; 26*8b0044ffSOleksandr G Zhadan 27*8b0044ffSOleksandr G Zhadan #if defined(CONFIG_SYS_NAND_BR_PRELIM) && defined(CONFIG_SYS_NAND_OR_PRELIM) 28*8b0044ffSOleksandr G Zhadan set_lbc_br(0, CONFIG_SYS_NAND_BR_PRELIM); 29*8b0044ffSOleksandr G Zhadan set_lbc_or(0, CONFIG_SYS_NAND_OR_PRELIM); 30*8b0044ffSOleksandr G Zhadan #endif 31*8b0044ffSOleksandr G Zhadan 32*8b0044ffSOleksandr G Zhadan /* initialize selected port with appropriate baud rate */ 33*8b0044ffSOleksandr G Zhadan plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO; 34*8b0044ffSOleksandr G Zhadan plat_ratio >>= 1; 35*8b0044ffSOleksandr G Zhadan gd->bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio; 36*8b0044ffSOleksandr G Zhadan 37*8b0044ffSOleksandr G Zhadan NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1, 38*8b0044ffSOleksandr G Zhadan gd->bus_clk / 16 / CONFIG_BAUDRATE); 39*8b0044ffSOleksandr G Zhadan 40*8b0044ffSOleksandr G Zhadan puts("\nNAND boot... "); 41*8b0044ffSOleksandr G Zhadan 42*8b0044ffSOleksandr G Zhadan /* copy code to RAM and jump to it - this should not return */ 43*8b0044ffSOleksandr G Zhadan /* NOTE - code has to be copied out of NAND buffer before 44*8b0044ffSOleksandr G Zhadan * other blocks can be read. 45*8b0044ffSOleksandr G Zhadan */ 46*8b0044ffSOleksandr G Zhadan relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE); 47*8b0044ffSOleksandr G Zhadan } 48*8b0044ffSOleksandr G Zhadan 49*8b0044ffSOleksandr G Zhadan void board_init_r(gd_t *gd, ulong dest_addr) 50*8b0044ffSOleksandr G Zhadan { 51*8b0044ffSOleksandr G Zhadan puts("\nSecond program loader running in sram..."); 52*8b0044ffSOleksandr G Zhadan nand_boot(); 53*8b0044ffSOleksandr G Zhadan } 54*8b0044ffSOleksandr G Zhadan 55*8b0044ffSOleksandr G Zhadan void putc(char c) 56*8b0044ffSOleksandr G Zhadan { 57*8b0044ffSOleksandr G Zhadan if (c == '\n') 58*8b0044ffSOleksandr G Zhadan NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r'); 59*8b0044ffSOleksandr G Zhadan 60*8b0044ffSOleksandr G Zhadan NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c); 61*8b0044ffSOleksandr G Zhadan } 62*8b0044ffSOleksandr G Zhadan 63*8b0044ffSOleksandr G Zhadan void puts(const char *str) 64*8b0044ffSOleksandr G Zhadan { 65*8b0044ffSOleksandr G Zhadan while (*str) 66*8b0044ffSOleksandr G Zhadan putc(*str++); 67*8b0044ffSOleksandr G Zhadan } 68