1b2916712SMasahiro Yamada /* 2b2916712SMasahiro Yamada * Copyright (C) 2012-2015 Panasonic Corporation 3b2916712SMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 4b2916712SMasahiro Yamada * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 5b2916712SMasahiro Yamada * 6b2916712SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 7b2916712SMasahiro Yamada */ 8b2916712SMasahiro Yamada 9b2916712SMasahiro Yamada #include <common.h> 10b2916712SMasahiro Yamada #include <libfdt.h> 11b2916712SMasahiro Yamada #include <linux/io.h> 12b2916712SMasahiro Yamada 13b2916712SMasahiro Yamada #include "init.h" 14b2916712SMasahiro Yamada #include "micro-support-card.h" 15b78ffc53SMasahiro Yamada #include "sg-regs.h" 16b2916712SMasahiro Yamada #include "soc-info.h" 17b2916712SMasahiro Yamada 18b2916712SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 19b2916712SMasahiro Yamada 20b2916712SMasahiro Yamada static void uniphier_setup_xirq(void) 21b2916712SMasahiro Yamada { 22b2916712SMasahiro Yamada const void *fdt = gd->fdt_blob; 23b2916712SMasahiro Yamada int soc_node, aidet_node; 24b2916712SMasahiro Yamada const u32 *val; 25b2916712SMasahiro Yamada unsigned long aidet_base; 26b2916712SMasahiro Yamada u32 tmp; 27b2916712SMasahiro Yamada 28b2916712SMasahiro Yamada soc_node = fdt_path_offset(fdt, "/soc"); 29b2916712SMasahiro Yamada if (soc_node < 0) 30b2916712SMasahiro Yamada return; 31b2916712SMasahiro Yamada 32b2916712SMasahiro Yamada aidet_node = fdt_subnode_offset_namelen(fdt, soc_node, "aidet", 5); 33b2916712SMasahiro Yamada if (aidet_node < 0) 34b2916712SMasahiro Yamada return; 35b2916712SMasahiro Yamada 36b2916712SMasahiro Yamada val = fdt_getprop(fdt, aidet_node, "reg", NULL); 37b2916712SMasahiro Yamada if (!val) 38b2916712SMasahiro Yamada return; 39b2916712SMasahiro Yamada 40b2916712SMasahiro Yamada aidet_base = fdt32_to_cpu(*val); 41b2916712SMasahiro Yamada 42b2916712SMasahiro Yamada tmp = readl(aidet_base + 8); /* AIDET DETCONFR2 */ 43b2916712SMasahiro Yamada tmp |= 0x00ff0000; /* Set XIRQ0-7 low active */ 44b2916712SMasahiro Yamada writel(tmp, aidet_base + 8); 45b2916712SMasahiro Yamada 46b2916712SMasahiro Yamada tmp = readl(0x55000090); /* IRQCTL */ 47b2916712SMasahiro Yamada tmp |= 0x000000ff; 48b2916712SMasahiro Yamada writel(tmp, 0x55000090); 49b2916712SMasahiro Yamada } 50b2916712SMasahiro Yamada 51b61664e2SMasahiro Yamada #ifdef CONFIG_ARCH_UNIPHIER_LD11 52b61664e2SMasahiro Yamada static void uniphier_ld11_misc_init(void) 535ac9dfbeSMasahiro Yamada { 54b78ffc53SMasahiro Yamada sg_set_pinsel(149, 14, 8, 4); /* XIRQ0 -> XIRQ0 */ 55b78ffc53SMasahiro Yamada sg_set_iectrl(149); 56b78ffc53SMasahiro Yamada sg_set_pinsel(153, 14, 8, 4); /* XIRQ4 -> XIRQ4 */ 57b78ffc53SMasahiro Yamada sg_set_iectrl(153); 58b61664e2SMasahiro Yamada } 59b2916712SMasahiro Yamada #endif 60b61664e2SMasahiro Yamada 61b61664e2SMasahiro Yamada #ifdef CONFIG_ARCH_UNIPHIER_LD20 62b61664e2SMasahiro Yamada static void uniphier_ld20_misc_init(void) 63b61664e2SMasahiro Yamada { 64b61664e2SMasahiro Yamada sg_set_pinsel(149, 14, 8, 4); /* XIRQ0 -> XIRQ0 */ 65b61664e2SMasahiro Yamada sg_set_iectrl(149); 66b61664e2SMasahiro Yamada sg_set_pinsel(153, 14, 8, 4); /* XIRQ4 -> XIRQ4 */ 67b61664e2SMasahiro Yamada sg_set_iectrl(153); 68b61664e2SMasahiro Yamada 69baaafaaaSMasahiro Yamada /* ES1 errata: increase VDD09 supply to suppress VBO noise */ 70baaafaaaSMasahiro Yamada if (uniphier_get_soc_revision() == 1) { 71baaafaaaSMasahiro Yamada writel(0x00000003, 0x6184e004); 72baaafaaaSMasahiro Yamada writel(0x00000100, 0x6184e040); 73baaafaaaSMasahiro Yamada writel(0x0000b500, 0x6184e024); 74baaafaaaSMasahiro Yamada writel(0x00000001, 0x6184e000); 75baaafaaaSMasahiro Yamada } 76561ca649SMasahiro Yamada #ifdef CONFIG_ARMV8_MULTIENTRY 77b2916712SMasahiro Yamada cci500_init(2); 78561ca649SMasahiro Yamada #endif 79b61664e2SMasahiro Yamada } 80b2916712SMasahiro Yamada #endif 81b61664e2SMasahiro Yamada 82b61664e2SMasahiro Yamada struct uniphier_initdata { 83e27d6c7dSMasahiro Yamada unsigned int soc_id; 84b61664e2SMasahiro Yamada bool nand_2cs; 8526b09c02SMasahiro Yamada void (*sbc_init)(void); 86b61664e2SMasahiro Yamada void (*pll_init)(void); 87b61664e2SMasahiro Yamada void (*clk_init)(void); 88b61664e2SMasahiro Yamada void (*misc_init)(void); 89b61664e2SMasahiro Yamada }; 90b61664e2SMasahiro Yamada 917a37bd64SMasahiro Yamada static const struct uniphier_initdata uniphier_initdata[] = { 92b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD3) 93b61664e2SMasahiro Yamada { 94e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_SLD3_ID, 95b61664e2SMasahiro Yamada .nand_2cs = true, 9626b09c02SMasahiro Yamada .sbc_init = uniphier_sbc_init_admulti, 97b61664e2SMasahiro Yamada .pll_init = uniphier_sld3_pll_init, 98b61664e2SMasahiro Yamada .clk_init = uniphier_ld4_clk_init, 99b61664e2SMasahiro Yamada }, 100b61664e2SMasahiro Yamada #endif 101b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD4) 102b61664e2SMasahiro Yamada { 103e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD4_ID, 104b61664e2SMasahiro Yamada .nand_2cs = true, 10526b09c02SMasahiro Yamada .sbc_init = uniphier_ld4_sbc_init, 106b61664e2SMasahiro Yamada .pll_init = uniphier_ld4_pll_init, 107b61664e2SMasahiro Yamada .clk_init = uniphier_ld4_clk_init, 108b61664e2SMasahiro Yamada }, 109b61664e2SMasahiro Yamada #endif 110b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 111b61664e2SMasahiro Yamada { 112e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PRO4_ID, 113b61664e2SMasahiro Yamada .nand_2cs = false, 11426b09c02SMasahiro Yamada .sbc_init = uniphier_sbc_init_savepin, 115b61664e2SMasahiro Yamada .pll_init = uniphier_pro4_pll_init, 116b61664e2SMasahiro Yamada .clk_init = uniphier_pro4_clk_init, 117b61664e2SMasahiro Yamada }, 118b61664e2SMasahiro Yamada #endif 119b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 120b61664e2SMasahiro Yamada { 121e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_SLD8_ID, 122b61664e2SMasahiro Yamada .nand_2cs = true, 12326b09c02SMasahiro Yamada .sbc_init = uniphier_ld4_sbc_init, 124b61664e2SMasahiro Yamada .pll_init = uniphier_ld4_pll_init, 125b61664e2SMasahiro Yamada .clk_init = uniphier_ld4_clk_init, 126b61664e2SMasahiro Yamada }, 127b61664e2SMasahiro Yamada #endif 128b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 129b61664e2SMasahiro Yamada { 130e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PRO5_ID, 131b61664e2SMasahiro Yamada .nand_2cs = true, 13226b09c02SMasahiro Yamada .sbc_init = uniphier_sbc_init_savepin, 133b61664e2SMasahiro Yamada .clk_init = uniphier_pro5_clk_init, 134b61664e2SMasahiro Yamada }, 135b61664e2SMasahiro Yamada #endif 136b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 137b61664e2SMasahiro Yamada { 138e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_PXS2_ID, 139b61664e2SMasahiro Yamada .nand_2cs = true, 14026b09c02SMasahiro Yamada .sbc_init = uniphier_pxs2_sbc_init, 141b61664e2SMasahiro Yamada .clk_init = uniphier_pxs2_clk_init, 142b61664e2SMasahiro Yamada }, 143b61664e2SMasahiro Yamada #endif 144b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 145b61664e2SMasahiro Yamada { 146e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD6B_ID, 147b61664e2SMasahiro Yamada .nand_2cs = true, 14826b09c02SMasahiro Yamada .sbc_init = uniphier_pxs2_sbc_init, 149b61664e2SMasahiro Yamada .clk_init = uniphier_pxs2_clk_init, 150b61664e2SMasahiro Yamada }, 151b61664e2SMasahiro Yamada #endif 152b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD11) 153b61664e2SMasahiro Yamada { 154e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD11_ID, 155b61664e2SMasahiro Yamada .nand_2cs = false, 15626b09c02SMasahiro Yamada .sbc_init = uniphier_ld11_sbc_init, 157b61664e2SMasahiro Yamada .pll_init = uniphier_ld11_pll_init, 158b61664e2SMasahiro Yamada .clk_init = uniphier_ld11_clk_init, 159b61664e2SMasahiro Yamada .misc_init = uniphier_ld11_misc_init, 160b61664e2SMasahiro Yamada }, 161b61664e2SMasahiro Yamada #endif 162b61664e2SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD20) 163b61664e2SMasahiro Yamada { 164e27d6c7dSMasahiro Yamada .soc_id = UNIPHIER_LD20_ID, 165b61664e2SMasahiro Yamada .nand_2cs = false, 16626b09c02SMasahiro Yamada .sbc_init = uniphier_ld11_sbc_init, 167b61664e2SMasahiro Yamada .pll_init = uniphier_ld20_pll_init, 168b61664e2SMasahiro Yamada .misc_init = uniphier_ld20_misc_init, 169b61664e2SMasahiro Yamada }, 170b61664e2SMasahiro Yamada #endif 171b61664e2SMasahiro Yamada }; 172*ee8ef5afSMasahiro Yamada UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_initdata, uniphier_initdata) 173b61664e2SMasahiro Yamada 174b61664e2SMasahiro Yamada int board_init(void) 175b61664e2SMasahiro Yamada { 1767a37bd64SMasahiro Yamada const struct uniphier_initdata *initdata; 177b61664e2SMasahiro Yamada int ret; 178b61664e2SMasahiro Yamada 179b61664e2SMasahiro Yamada led_puts("U0"); 180b61664e2SMasahiro Yamada 181*ee8ef5afSMasahiro Yamada initdata = uniphier_get_initdata(); 182b61664e2SMasahiro Yamada if (!initdata) { 183*ee8ef5afSMasahiro Yamada pr_err("unsupported SoC\n"); 184b61664e2SMasahiro Yamada return -EINVAL; 185b61664e2SMasahiro Yamada } 186b61664e2SMasahiro Yamada 18726b09c02SMasahiro Yamada initdata->sbc_init(); 18826b09c02SMasahiro Yamada 18926b09c02SMasahiro Yamada support_card_init(); 19026b09c02SMasahiro Yamada 19126b09c02SMasahiro Yamada led_puts("U0"); 19226b09c02SMasahiro Yamada 193b61664e2SMasahiro Yamada if (IS_ENABLED(CONFIG_NAND_DENALI)) { 194b61664e2SMasahiro Yamada ret = uniphier_pin_init(initdata->nand_2cs ? 195b61664e2SMasahiro Yamada "nand2cs_grp" : "nand_grp"); 196b61664e2SMasahiro Yamada if (ret) 197b61664e2SMasahiro Yamada pr_err("failed to init NAND pins\n"); 198b61664e2SMasahiro Yamada } 199b61664e2SMasahiro Yamada 200b61664e2SMasahiro Yamada led_puts("U1"); 201b61664e2SMasahiro Yamada 202b61664e2SMasahiro Yamada if (initdata->pll_init) 203b61664e2SMasahiro Yamada initdata->pll_init(); 204b2916712SMasahiro Yamada 205b2916712SMasahiro Yamada led_puts("U2"); 206b2916712SMasahiro Yamada 207b61664e2SMasahiro Yamada if (initdata->clk_init) 208b61664e2SMasahiro Yamada initdata->clk_init(); 209b2916712SMasahiro Yamada 210b2916712SMasahiro Yamada led_puts("U3"); 211b2916712SMasahiro Yamada 212b61664e2SMasahiro Yamada if (initdata->misc_init) 213b61664e2SMasahiro Yamada initdata->misc_init(); 214b61664e2SMasahiro Yamada 215b61664e2SMasahiro Yamada led_puts("U4"); 216b61664e2SMasahiro Yamada 217b61664e2SMasahiro Yamada uniphier_setup_xirq(); 218b61664e2SMasahiro Yamada 219b61664e2SMasahiro Yamada led_puts("U5"); 220b61664e2SMasahiro Yamada 221b61664e2SMasahiro Yamada support_card_late_init(); 222b61664e2SMasahiro Yamada 223b61664e2SMasahiro Yamada led_puts("U6"); 224b61664e2SMasahiro Yamada 225561ca649SMasahiro Yamada #ifdef CONFIG_ARMV8_MULTIENTRY 226b2916712SMasahiro Yamada uniphier_smp_kick_all_cpus(); 227b2916712SMasahiro Yamada #endif 228b2916712SMasahiro Yamada 229b2916712SMasahiro Yamada led_puts("Uboo"); 230b2916712SMasahiro Yamada 231b2916712SMasahiro Yamada return 0; 232b2916712SMasahiro Yamada } 233