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 515ac9dfbeSMasahiro Yamada static void uniphier_nand_pin_init(bool cs2) 525ac9dfbeSMasahiro Yamada { 535ac9dfbeSMasahiro Yamada #ifdef CONFIG_NAND_DENALI 545ac9dfbeSMasahiro Yamada if (uniphier_pin_init(cs2 ? "nand2cs_grp" : "nand_grp")) 555ac9dfbeSMasahiro Yamada pr_err("failed to init NAND pins\n"); 565ac9dfbeSMasahiro Yamada #endif 575ac9dfbeSMasahiro Yamada } 585ac9dfbeSMasahiro Yamada 59b2916712SMasahiro Yamada int board_init(void) 60b2916712SMasahiro Yamada { 61682e09ffSMasahiro Yamada const struct uniphier_board_data *bd; 62682e09ffSMasahiro Yamada 63b2916712SMasahiro Yamada led_puts("U0"); 64b2916712SMasahiro Yamada 65682e09ffSMasahiro Yamada bd = uniphier_get_board_param(); 66682e09ffSMasahiro Yamada if (!bd) 67682e09ffSMasahiro Yamada return -ENODEV; 68682e09ffSMasahiro Yamada 69b2916712SMasahiro Yamada switch (uniphier_get_soc_type()) { 70b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD3) 71b2916712SMasahiro Yamada case SOC_UNIPHIER_SLD3: 725ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 73b2916712SMasahiro Yamada led_puts("U1"); 746a3e4274SMasahiro Yamada uniphier_sld3_pll_init(); 75b2916712SMasahiro Yamada uniphier_ld4_clk_init(); 76b2916712SMasahiro Yamada break; 77b2916712SMasahiro Yamada #endif 78b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD4) 79b2916712SMasahiro Yamada case SOC_UNIPHIER_LD4: 805ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 81b2916712SMasahiro Yamada led_puts("U1"); 826a3e4274SMasahiro Yamada uniphier_ld4_pll_init(); 83b2916712SMasahiro Yamada uniphier_ld4_clk_init(); 84b2916712SMasahiro Yamada break; 85b2916712SMasahiro Yamada #endif 86b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 87b2916712SMasahiro Yamada case SOC_UNIPHIER_PRO4: 885ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(false); 89b2916712SMasahiro Yamada led_puts("U1"); 906a3e4274SMasahiro Yamada uniphier_pro4_pll_init(); 91b2916712SMasahiro Yamada uniphier_pro4_clk_init(); 92b2916712SMasahiro Yamada break; 93b2916712SMasahiro Yamada #endif 94b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 95b2916712SMasahiro Yamada case SOC_UNIPHIER_SLD8: 965ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 97b2916712SMasahiro Yamada led_puts("U1"); 986a3e4274SMasahiro Yamada uniphier_ld4_pll_init(); 99b2916712SMasahiro Yamada uniphier_ld4_clk_init(); 100b2916712SMasahiro Yamada break; 101b2916712SMasahiro Yamada #endif 102b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 103b2916712SMasahiro Yamada case SOC_UNIPHIER_PRO5: 1045ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 105b2916712SMasahiro Yamada led_puts("U1"); 106b2916712SMasahiro Yamada uniphier_pro5_clk_init(); 107b2916712SMasahiro Yamada break; 108b2916712SMasahiro Yamada #endif 109b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 110b2916712SMasahiro Yamada case SOC_UNIPHIER_PXS2: 1115ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 112b2916712SMasahiro Yamada led_puts("U1"); 113b2916712SMasahiro Yamada uniphier_pxs2_clk_init(); 114b2916712SMasahiro Yamada break; 115b2916712SMasahiro Yamada #endif 116b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 117b2916712SMasahiro Yamada case SOC_UNIPHIER_LD6B: 1185ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(true); 119b2916712SMasahiro Yamada led_puts("U1"); 120b2916712SMasahiro Yamada uniphier_pxs2_clk_init(); 121b2916712SMasahiro Yamada break; 122b2916712SMasahiro Yamada #endif 123b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD11) 124b2916712SMasahiro Yamada case SOC_UNIPHIER_LD11: 1255ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(false); 126b78ffc53SMasahiro Yamada sg_set_pinsel(149, 14, 8, 4); /* XIRQ0 -> XIRQ0 */ 127b78ffc53SMasahiro Yamada sg_set_iectrl(149); 128b78ffc53SMasahiro Yamada sg_set_pinsel(153, 14, 8, 4); /* XIRQ4 -> XIRQ4 */ 129b78ffc53SMasahiro Yamada sg_set_iectrl(153); 130b2916712SMasahiro Yamada led_puts("U1"); 131*c72f4d4cSMasahiro Yamada uniphier_ld11_pll_init(); 132b2916712SMasahiro Yamada uniphier_ld11_clk_init(); 133b2916712SMasahiro Yamada break; 134b2916712SMasahiro Yamada #endif 135b2916712SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD20) 136b2916712SMasahiro Yamada case SOC_UNIPHIER_LD20: 1375ac9dfbeSMasahiro Yamada uniphier_nand_pin_init(false); 138b78ffc53SMasahiro Yamada sg_set_pinsel(149, 14, 8, 4); /* XIRQ0 -> XIRQ0 */ 139b78ffc53SMasahiro Yamada sg_set_iectrl(149); 140b78ffc53SMasahiro Yamada sg_set_pinsel(153, 14, 8, 4); /* XIRQ4 -> XIRQ4 */ 141b78ffc53SMasahiro Yamada sg_set_iectrl(153); 142b2916712SMasahiro Yamada led_puts("U1"); 143682e09ffSMasahiro Yamada uniphier_ld20_pll_init(bd); 144b2916712SMasahiro Yamada uniphier_ld20_clk_init(); 145b2916712SMasahiro Yamada cci500_init(2); 146b2916712SMasahiro Yamada break; 147b2916712SMasahiro Yamada #endif 148b2916712SMasahiro Yamada default: 149b2916712SMasahiro Yamada break; 150b2916712SMasahiro Yamada } 151b2916712SMasahiro Yamada 152b2916712SMasahiro Yamada uniphier_setup_xirq(); 153b2916712SMasahiro Yamada 154b2916712SMasahiro Yamada led_puts("U2"); 155b2916712SMasahiro Yamada 156b2916712SMasahiro Yamada support_card_late_init(); 157b2916712SMasahiro Yamada 158b2916712SMasahiro Yamada led_puts("U3"); 159b2916712SMasahiro Yamada 160b2916712SMasahiro Yamada #ifdef CONFIG_ARM64 161b2916712SMasahiro Yamada uniphier_smp_kick_all_cpus(); 162b2916712SMasahiro Yamada #endif 163b2916712SMasahiro Yamada 164b2916712SMasahiro Yamada led_puts("Uboo"); 165b2916712SMasahiro Yamada 166b2916712SMasahiro Yamada return 0; 167b2916712SMasahiro Yamada } 168