xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-uniphier/boards.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2015-2016 Socionext Inc.
3*4882a593Smuzhiyun  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <linux/libfdt.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include "init.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_LD4)
17*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_ld4_data = {
18*4882a593Smuzhiyun 	.dram_freq = 1600,
19*4882a593Smuzhiyun 	.dram_ch[0] = {
20*4882a593Smuzhiyun 		.size = 0x10000000,
21*4882a593Smuzhiyun 		.width = 16,
22*4882a593Smuzhiyun 	},
23*4882a593Smuzhiyun 	.dram_ch[1] = {
24*4882a593Smuzhiyun 		.size = 0x10000000,
25*4882a593Smuzhiyun 		.width = 16,
26*4882a593Smuzhiyun 	},
27*4882a593Smuzhiyun 	.flags = UNIPHIER_BD_DDR3PLUS,
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun #endif
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
32*4882a593Smuzhiyun /* 1GB RAM board */
33*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_pro4_data = {
34*4882a593Smuzhiyun 	.dram_freq = 1600,
35*4882a593Smuzhiyun 	.dram_ch[0] = {
36*4882a593Smuzhiyun 		.size = 0x20000000,
37*4882a593Smuzhiyun 		.width = 32,
38*4882a593Smuzhiyun 	},
39*4882a593Smuzhiyun 	.dram_ch[1] = {
40*4882a593Smuzhiyun 		.size = 0x20000000,
41*4882a593Smuzhiyun 		.width = 32,
42*4882a593Smuzhiyun 	},
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* 2GB RAM board */
46*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_pro4_2g_data = {
47*4882a593Smuzhiyun 	.dram_freq = 1600,
48*4882a593Smuzhiyun 	.dram_ch[0] = {
49*4882a593Smuzhiyun 		.size = 0x40000000,
50*4882a593Smuzhiyun 		.width = 32,
51*4882a593Smuzhiyun 	},
52*4882a593Smuzhiyun 	.dram_ch[1] = {
53*4882a593Smuzhiyun 		.size = 0x40000000,
54*4882a593Smuzhiyun 		.width = 32,
55*4882a593Smuzhiyun 	},
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
60*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_sld8_data = {
61*4882a593Smuzhiyun 	.dram_freq = 1333,
62*4882a593Smuzhiyun 	.dram_ch[0] = {
63*4882a593Smuzhiyun 		.size = 0x10000000,
64*4882a593Smuzhiyun 		.width = 16,
65*4882a593Smuzhiyun 	},
66*4882a593Smuzhiyun 	.dram_ch[1] = {
67*4882a593Smuzhiyun 		.size = 0x10000000,
68*4882a593Smuzhiyun 		.width = 16,
69*4882a593Smuzhiyun 	},
70*4882a593Smuzhiyun 	.flags = UNIPHIER_BD_DDR3PLUS,
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun #endif
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
75*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_pro5_data = {
76*4882a593Smuzhiyun 	.dram_freq = 1866,
77*4882a593Smuzhiyun 	.dram_ch[0] = {
78*4882a593Smuzhiyun 		.size = 0x20000000,
79*4882a593Smuzhiyun 		.width = 32,
80*4882a593Smuzhiyun 	},
81*4882a593Smuzhiyun 	.dram_ch[1] = {
82*4882a593Smuzhiyun 		.size = 0x20000000,
83*4882a593Smuzhiyun 		.width = 32,
84*4882a593Smuzhiyun 	},
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
89*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_pxs2_data = {
90*4882a593Smuzhiyun 	.dram_freq = 2133,
91*4882a593Smuzhiyun 	.dram_ch[0] = {
92*4882a593Smuzhiyun 		.size = 0x40000000,
93*4882a593Smuzhiyun 		.width = 32,
94*4882a593Smuzhiyun 	},
95*4882a593Smuzhiyun 	.dram_ch[1] = {
96*4882a593Smuzhiyun 		.size = 0x20000000,
97*4882a593Smuzhiyun 		.width = 32,
98*4882a593Smuzhiyun 	},
99*4882a593Smuzhiyun 	.dram_ch[2] = {
100*4882a593Smuzhiyun 		.size = 0x20000000,
101*4882a593Smuzhiyun 		.width = 16,
102*4882a593Smuzhiyun 	},
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun #endif
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
107*4882a593Smuzhiyun static const struct uniphier_board_data uniphier_ld6b_data = {
108*4882a593Smuzhiyun 	.dram_freq = 1866,
109*4882a593Smuzhiyun 	.dram_ch[0] = {
110*4882a593Smuzhiyun 		.size = 0x40000000,
111*4882a593Smuzhiyun 		.width = 32,
112*4882a593Smuzhiyun 	},
113*4882a593Smuzhiyun 	.dram_ch[1] = {
114*4882a593Smuzhiyun 		.size = 0x20000000,
115*4882a593Smuzhiyun 		.width = 32,
116*4882a593Smuzhiyun 	},
117*4882a593Smuzhiyun 	.dram_ch[2] = {
118*4882a593Smuzhiyun 		.size = 0x20000000,
119*4882a593Smuzhiyun 		.width = 16,
120*4882a593Smuzhiyun 	},
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun #endif
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct uniphier_board_id {
125*4882a593Smuzhiyun 	const char *compatible;
126*4882a593Smuzhiyun 	const struct uniphier_board_data *param;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun static const struct uniphier_board_id uniphier_boards[] = {
130*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_LD4)
131*4882a593Smuzhiyun 	{ "socionext,uniphier-ld4", &uniphier_ld4_data, },
132*4882a593Smuzhiyun #endif
133*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
134*4882a593Smuzhiyun 	{ "socionext,uniphier-pro4-ace", &uniphier_pro4_2g_data, },
135*4882a593Smuzhiyun 	{ "socionext,uniphier-pro4-sanji", &uniphier_pro4_2g_data, },
136*4882a593Smuzhiyun 	{ "socionext,uniphier-pro4", &uniphier_pro4_data, },
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
139*4882a593Smuzhiyun 	{ "socionext,uniphier-sld8", &uniphier_sld8_data, },
140*4882a593Smuzhiyun #endif
141*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
142*4882a593Smuzhiyun 	{ "socionext,uniphier-pro5", &uniphier_pro5_data, },
143*4882a593Smuzhiyun #endif
144*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
145*4882a593Smuzhiyun 	{ "socionext,uniphier-pxs2", &uniphier_pxs2_data, },
146*4882a593Smuzhiyun #endif
147*4882a593Smuzhiyun #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
148*4882a593Smuzhiyun 	{ "socionext,uniphier-ld6b", &uniphier_ld6b_data, },
149*4882a593Smuzhiyun #endif
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
uniphier_get_board_param(void)152*4882a593Smuzhiyun const struct uniphier_board_data *uniphier_get_board_param(void)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	int i;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) {
157*4882a593Smuzhiyun 		if (!fdt_node_check_compatible(gd->fdt_blob, 0,
158*4882a593Smuzhiyun 					       uniphier_boards[i].compatible))
159*4882a593Smuzhiyun 			return uniphier_boards[i].param;
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	return NULL;
163*4882a593Smuzhiyun }
164