ARM: uniphier: rework existing DDR PHY code to reuse for LD11 SoC
[oweals/u-boot.git] / arch / arm / mach-uniphier / boards.c
1 /*
2  * Copyright (C) 2015-2016 Socionext Inc.
3  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9 #include <libfdt.h>
10 #include <linux/kernel.h>
11
12 #include "init.h"
13
14 DECLARE_GLOBAL_DATA_PTR;
15
16 #if defined(CONFIG_ARCH_UNIPHIER_SLD3)
17 static const struct uniphier_board_data uniphier_sld3_data = {
18         .dram_freq = 1600,
19         .dram_nr_ch = 3,
20         .dram_ch[0] = {
21                 .base = 0x80000000,
22                 .size = 0x20000000,
23                 .width = 32,
24         },
25         .dram_ch[1] = {
26                 .base = 0xc0000000,
27                 .size = 0x20000000,
28                 .width = 16,
29         },
30         .dram_ch[2] = {
31                 .base = 0xc0000000,
32                 .size = 0x10000000,
33                 .width = 16,
34         },
35 };
36 #endif
37
38 #if defined(CONFIG_ARCH_UNIPHIER_LD4)
39 static const struct uniphier_board_data uniphier_ld4_data = {
40         .dram_freq = 1600,
41         .dram_nr_ch = 2,
42         .dram_ch[0] = {
43                 .base = 0x80000000,
44                 .size = 0x10000000,
45                 .width = 16,
46         },
47         .dram_ch[1] = {
48                 .base = 0x90000000,
49                 .size = 0x10000000,
50                 .width = 16,
51         },
52         .flags = UNIPHIER_BD_DDR3PLUS,
53 };
54 #endif
55
56 #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
57 /* 1GB RAM board */
58 static const struct uniphier_board_data uniphier_pro4_data = {
59         .dram_freq = 1600,
60         .dram_nr_ch = 2,
61         .dram_ch[0] = {
62                 .base = 0x80000000,
63                 .size = 0x20000000,
64                 .width = 32,
65         },
66         .dram_ch[1] = {
67                 .base = 0xa0000000,
68                 .size = 0x20000000,
69                 .width = 32,
70         },
71 };
72
73 /* 2GB RAM board */
74 static const struct uniphier_board_data uniphier_pro4_2g_data = {
75         .dram_freq = 1600,
76         .dram_nr_ch = 2,
77         .dram_ch[0] = {
78                 .base = 0x80000000,
79                 .size = 0x40000000,
80                 .width = 32,
81         },
82         .dram_ch[1] = {
83                 .base = 0xc0000000,
84                 .size = 0x40000000,
85                 .width = 32,
86         },
87 };
88 #endif
89
90 #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
91 static const struct uniphier_board_data uniphier_sld8_data = {
92         .dram_freq = 1333,
93         .dram_nr_ch = 2,
94         .dram_ch[0] = {
95                 .base = 0x80000000,
96                 .size = 0x10000000,
97                 .width = 16,
98         },
99         .dram_ch[1] = {
100                 .base = 0x90000000,
101                 .size = 0x10000000,
102                 .width = 16,
103         },
104         .flags = UNIPHIER_BD_DDR3PLUS,
105 };
106 #endif
107
108 #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
109 static const struct uniphier_board_data uniphier_pro5_data = {
110         .dram_freq = 1866,
111         .dram_nr_ch = 2,
112         .dram_ch[0] = {
113                 .base = 0x80000000,
114                 .size = 0x20000000,
115                 .width = 32,
116         },
117         .dram_ch[1] = {
118                 .base = 0xa0000000,
119                 .size = 0x20000000,
120                 .width = 32,
121         },
122 };
123 #endif
124
125 #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
126 static const struct uniphier_board_data uniphier_pxs2_data = {
127         .dram_freq = 2133,
128         .dram_nr_ch = 3,
129         .dram_ch[0] = {
130                 .base = 0x80000000,
131                 .size = 0x40000000,
132                 .width = 32,
133         },
134         .dram_ch[1] = {
135                 .base = 0xc0000000,
136                 .size = 0x20000000,
137                 .width = 32,
138         },
139         .dram_ch[2] = {
140                 .base = 0xe0000000,
141                 .size = 0x20000000,
142                 .width = 16,
143         },
144 };
145 #endif
146
147 #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
148 static const struct uniphier_board_data uniphier_ld6b_data = {
149         .dram_freq = 1866,
150         .dram_nr_ch = 3,
151         .dram_ch[0] = {
152                 .base = 0x80000000,
153                 .size = 0x40000000,
154                 .width = 32,
155         },
156         .dram_ch[1] = {
157                 .base = 0xc0000000,
158                 .size = 0x20000000,
159                 .width = 32,
160         },
161         .dram_ch[2] = {
162                 .base = 0xe0000000,
163                 .size = 0x20000000,
164                 .width = 16,
165         },
166 };
167 #endif
168
169 #if defined(CONFIG_ARCH_UNIPHIER_LD11)
170 static const struct uniphier_board_data uniphier_ld11_data = {
171         .dram_freq = 1600,
172         .dram_nr_ch = 2,
173         .dram_ch[0] = {
174                 .base = 0x80000000,
175                 .size = 0x20000000,
176                 .width = 16,
177         },
178         .dram_ch[1] = {
179                 .base = 0xa0000000,
180                 .size = 0x20000000,
181                 .width = 16,
182         },
183 };
184 #endif
185
186 #if defined(CONFIG_ARCH_UNIPHIER_LD20)
187 static const struct uniphier_board_data uniphier_ld20_ref_data = {
188         .dram_freq = 1866,
189         .dram_nr_ch = 3,
190         .dram_ch[0] = {
191                 .base = 0x80000000,
192                 .size = 0x40000000,
193                 .width = 32,
194         },
195         .dram_ch[1] = {
196                 .base = 0xc0000000,
197                 .size = 0x40000000,
198                 .width = 32,
199         },
200         .dram_ch[2] = {
201                 .base = 0x100000000UL,
202                 .size = 0x40000000,
203                 .width = 32,
204         },
205         .flags = UNIPHIER_BD_BOARD_LD20_REF,
206 };
207
208 static const struct uniphier_board_data uniphier_ld20_data = {
209         .dram_freq = 1866,
210         .dram_nr_ch = 3,
211         .dram_ch[0] = {
212                 .base = 0x80000000,
213                 .size = 0x40000000,
214                 .width = 32,
215         },
216         .dram_ch[1] = {
217                 .base = 0xc0000000,
218                 .size = 0x40000000,
219                 .width = 32,
220         },
221         .dram_ch[2] = {
222                 .base = 0x100000000UL,
223                 .size = 0x40000000,
224                 .width = 32,
225         },
226         .flags = UNIPHIER_BD_BOARD_LD20_GLOBAL,
227 };
228
229 static const struct uniphier_board_data uniphier_ld21_data = {
230         .dram_freq = 1866,
231         .dram_nr_ch = 2,
232         .dram_ch[0] = {
233                 .base = 0x80000000,
234                 .size = 0x20000000,
235                 .width = 32,
236         },
237         .dram_ch[1] = {
238                 .base = 0xc0000000,
239                 .size = 0x40000000,
240                 .width = 32,
241         },
242         .flags = UNIPHIER_BD_BOARD_LD21_GLOBAL,
243 };
244 #endif
245
246 struct uniphier_board_id {
247         const char *compatible;
248         const struct uniphier_board_data *param;
249 };
250
251 static const struct uniphier_board_id uniphier_boards[] = {
252 #if defined(CONFIG_ARCH_UNIPHIER_SLD3)
253         { "socionext,uniphier-sld3", &uniphier_sld3_data, },
254 #endif
255 #if defined(CONFIG_ARCH_UNIPHIER_LD4)
256         { "socionext,uniphier-ld4", &uniphier_ld4_data, },
257 #endif
258 #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
259         { "socionext,uniphier-pro4-ace", &uniphier_pro4_2g_data, },
260         { "socionext,uniphier-pro4-sanji", &uniphier_pro4_2g_data, },
261         { "socionext,uniphier-pro4", &uniphier_pro4_data, },
262 #endif
263 #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
264         { "socionext,uniphier-sld8", &uniphier_sld8_data, },
265 #endif
266 #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
267         { "socionext,uniphier-pro5", &uniphier_pro5_data, },
268 #endif
269 #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
270         { "socionext,uniphier-pxs2", &uniphier_pxs2_data, },
271 #endif
272 #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
273         { "socionext,uniphier-ld6b", &uniphier_ld6b_data, },
274 #endif
275 #if defined(CONFIG_ARCH_UNIPHIER_LD11)
276         { "socionext,uniphier-ld11", &uniphier_ld11_data, },
277 #endif
278 #if defined(CONFIG_ARCH_UNIPHIER_LD20)
279         { "socionext,uniphier-ld21", &uniphier_ld21_data, },
280         { "socionext,uniphier-ld20-ref", &uniphier_ld20_ref_data, },
281         { "socionext,uniphier-ld20", &uniphier_ld20_data, },
282 #endif
283 };
284
285 const struct uniphier_board_data *uniphier_get_board_param(void)
286 {
287         int i;
288
289         for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) {
290                 if (!fdt_node_check_compatible(gd->fdt_blob, 0,
291                                                uniphier_boards[i].compatible))
292                         return uniphier_boards[i].param;
293         }
294
295         return NULL;
296 }