1a8e6300dSMasahiro Yamada /* 2a8e6300dSMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 3a8e6300dSMasahiro Yamada * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 4a8e6300dSMasahiro Yamada * 5a8e6300dSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 6a8e6300dSMasahiro Yamada */ 7a8e6300dSMasahiro Yamada 8a8e6300dSMasahiro Yamada #include <common.h> 9a8e6300dSMasahiro Yamada #include <debug_uart.h> 10a8e6300dSMasahiro Yamada #include <spl.h> 11a8e6300dSMasahiro Yamada 12a8e6300dSMasahiro Yamada #include "init.h" 13a8e6300dSMasahiro Yamada #include "micro-support-card.h" 14a8e6300dSMasahiro Yamada #include "soc-info.h" 15a8e6300dSMasahiro Yamada 16a8e6300dSMasahiro Yamada struct uniphier_spl_initdata { 17e27d6c7dSMasahiro Yamada unsigned int soc_id; 18a8e6300dSMasahiro Yamada void (*bcu_init)(const struct uniphier_board_data *bd); 19a8e6300dSMasahiro Yamada void (*early_clk_init)(void); 20a8e6300dSMasahiro Yamada int (*dpll_init)(const struct uniphier_board_data *bd); 21a8e6300dSMasahiro Yamada int (*memconf_init)(const struct uniphier_board_data *bd); 22a8e6300dSMasahiro Yamada void (*dram_clk_init)(void); 23a8e6300dSMasahiro Yamada int (*umc_init)(const struct uniphier_board_data *bd); 24a8e6300dSMasahiro Yamada }; 25a8e6300dSMasahiro Yamada 26a8e6300dSMasahiro Yamada static const struct uniphier_spl_initdata uniphier_spl_initdata[] = { 27a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD3) 28a8e6300dSMasahiro Yamada { 29e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_SLD3_ID, 30a8e6300dSMasahiro Yamada .bcu_init = uniphier_sld3_bcu_init, 31a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 32a8e6300dSMasahiro Yamada .dpll_init = uniphier_sld3_dpll_init, 33a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_3ch_no_disbit_init, 34a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_sld3_dram_clk_init, 35a8e6300dSMasahiro Yamada .umc_init = uniphier_sld3_umc_init, 36a8e6300dSMasahiro Yamada }, 37a8e6300dSMasahiro Yamada #endif 38a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD4) 39a8e6300dSMasahiro Yamada { 40e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD4_ID, 41a8e6300dSMasahiro Yamada .bcu_init = uniphier_ld4_bcu_init, 42a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 43a8e6300dSMasahiro Yamada .dpll_init = uniphier_ld4_dpll_init, 44a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_2ch_init, 45a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_sld3_dram_clk_init, 46a8e6300dSMasahiro Yamada .umc_init = uniphier_ld4_umc_init, 47a8e6300dSMasahiro Yamada }, 48a8e6300dSMasahiro Yamada #endif 49a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 50a8e6300dSMasahiro Yamada { 51e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PRO4_ID, 52a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 53a8e6300dSMasahiro Yamada .dpll_init = uniphier_pro4_dpll_init, 54a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_2ch_init, 55a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_sld3_dram_clk_init, 56a8e6300dSMasahiro Yamada .umc_init = uniphier_pro4_umc_init, 57a8e6300dSMasahiro Yamada }, 58a8e6300dSMasahiro Yamada #endif 59a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 60a8e6300dSMasahiro Yamada { 61e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_SLD8_ID, 62a8e6300dSMasahiro Yamada .bcu_init = uniphier_ld4_bcu_init, 63a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 64a8e6300dSMasahiro Yamada .dpll_init = uniphier_sld8_dpll_init, 65a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_2ch_init, 66a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_sld3_dram_clk_init, 67a8e6300dSMasahiro Yamada .umc_init = uniphier_sld8_umc_init, 68a8e6300dSMasahiro Yamada }, 69a8e6300dSMasahiro Yamada #endif 70a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 71a8e6300dSMasahiro Yamada { 72e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PRO5_ID, 73a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 74a8e6300dSMasahiro Yamada .dpll_init = uniphier_pro5_dpll_init, 75a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_2ch_init, 76a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_pro5_dram_clk_init, 77a8e6300dSMasahiro Yamada .umc_init = uniphier_pro5_umc_init, 78a8e6300dSMasahiro Yamada }, 79a8e6300dSMasahiro Yamada #endif 80a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 81a8e6300dSMasahiro Yamada { 82e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PXS2_ID, 83a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 84a8e6300dSMasahiro Yamada .dpll_init = uniphier_pxs2_dpll_init, 85a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_3ch_init, 86a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_pxs2_dram_clk_init, 87a8e6300dSMasahiro Yamada .umc_init = uniphier_pxs2_umc_init, 88a8e6300dSMasahiro Yamada }, 89a8e6300dSMasahiro Yamada #endif 90a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 91a8e6300dSMasahiro Yamada { 92e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD6B_ID, 93a8e6300dSMasahiro Yamada .early_clk_init = uniphier_sld3_early_clk_init, 94a8e6300dSMasahiro Yamada .dpll_init = uniphier_pxs2_dpll_init, 95a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_3ch_init, 96a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_pxs2_dram_clk_init, 97a8e6300dSMasahiro Yamada .umc_init = uniphier_pxs2_umc_init, 98a8e6300dSMasahiro Yamada }, 99a8e6300dSMasahiro Yamada #endif 100a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD11) 101a8e6300dSMasahiro Yamada { 102e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD11_ID, 103a8e6300dSMasahiro Yamada .early_clk_init = uniphier_ld11_early_clk_init, 104a8e6300dSMasahiro Yamada .dpll_init = uniphier_ld11_dpll_init, 105a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_2ch_init, 106a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_ld11_dram_clk_init, 107a8e6300dSMasahiro Yamada .umc_init = uniphier_ld11_umc_init, 108a8e6300dSMasahiro Yamada }, 109a8e6300dSMasahiro Yamada #endif 110a8e6300dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD20) 111a8e6300dSMasahiro Yamada { 112e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD20_ID, 113a8e6300dSMasahiro Yamada .early_clk_init = uniphier_ld11_early_clk_init, 114a8e6300dSMasahiro Yamada .dpll_init = uniphier_ld20_dpll_init, 115a8e6300dSMasahiro Yamada .memconf_init = uniphier_memconf_3ch_init, 116a8e6300dSMasahiro Yamada .dram_clk_init = uniphier_ld20_dram_clk_init, 117a8e6300dSMasahiro Yamada .umc_init = uniphier_ld20_umc_init, 118a8e6300dSMasahiro Yamada }, 119a8e6300dSMasahiro Yamada #endif 120a8e6300dSMasahiro Yamada }; 121*ee8ef5afSMasahiro Yamada UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_spl_initdata, uniphier_spl_initdata) 122a8e6300dSMasahiro Yamada 123a8e6300dSMasahiro Yamada void spl_board_init(void) 124a8e6300dSMasahiro Yamada { 125a8e6300dSMasahiro Yamada const struct uniphier_board_data *bd; 126a8e6300dSMasahiro Yamada const struct uniphier_spl_initdata *initdata; 127a8e6300dSMasahiro Yamada int ret; 128a8e6300dSMasahiro Yamada 129a8e6300dSMasahiro Yamada #ifdef CONFIG_DEBUG_UART 130a8e6300dSMasahiro Yamada debug_uart_init(); 131a8e6300dSMasahiro Yamada #endif 132a8e6300dSMasahiro Yamada 133a8e6300dSMasahiro Yamada bd = uniphier_get_board_param(); 134a8e6300dSMasahiro Yamada if (!bd) 135a8e6300dSMasahiro Yamada hang(); 136a8e6300dSMasahiro Yamada 137*ee8ef5afSMasahiro Yamada initdata = uniphier_get_spl_initdata(); 138a8e6300dSMasahiro Yamada if (!initdata) 139a8e6300dSMasahiro Yamada hang(); 140a8e6300dSMasahiro Yamada 141a8e6300dSMasahiro Yamada if (initdata->bcu_init) 142a8e6300dSMasahiro Yamada initdata->bcu_init(bd); 143a8e6300dSMasahiro Yamada 144a8e6300dSMasahiro Yamada 145a8e6300dSMasahiro Yamada initdata->early_clk_init(); 146a8e6300dSMasahiro Yamada 147a8e6300dSMasahiro Yamada 148a8e6300dSMasahiro Yamada #ifdef CONFIG_SPL_SERIAL_SUPPORT 149a8e6300dSMasahiro Yamada preloader_console_init(); 150a8e6300dSMasahiro Yamada #endif 151a8e6300dSMasahiro Yamada 152a8e6300dSMasahiro Yamada ret = initdata->dpll_init(bd); 153a8e6300dSMasahiro Yamada if (ret) { 154a8e6300dSMasahiro Yamada pr_err("failed to init DPLL\n"); 155a8e6300dSMasahiro Yamada hang(); 156a8e6300dSMasahiro Yamada } 157a8e6300dSMasahiro Yamada 158a8e6300dSMasahiro Yamada ret = initdata->memconf_init(bd); 159a8e6300dSMasahiro Yamada if (ret) { 160a8e6300dSMasahiro Yamada pr_err("failed to init MEMCONF\n"); 161a8e6300dSMasahiro Yamada hang(); 162a8e6300dSMasahiro Yamada } 163a8e6300dSMasahiro Yamada 164a8e6300dSMasahiro Yamada initdata->dram_clk_init(); 165a8e6300dSMasahiro Yamada 166a8e6300dSMasahiro Yamada ret = initdata->umc_init(bd); 167a8e6300dSMasahiro Yamada if (ret) { 168a8e6300dSMasahiro Yamada pr_err("failed to init DRAM\n"); 169a8e6300dSMasahiro Yamada hang(); 170a8e6300dSMasahiro Yamada } 171a8e6300dSMasahiro Yamada } 172