xref: /rk3399_rockchip-uboot/arch/arm/mach-uniphier/board_init.c (revision ee8ef5afa87bf37d493bf7be9d475e54d6c2ebee)
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