blob: 00c793afd0111ffcadbebafbc6eb4e3afaf114c9 [file] [log] [blame]
Stefan Roese8a316c92005-08-01 16:49:12 +02001/*
Stefan Roesea471db02007-06-01 15:19:29 +02002 * (C) Copyright 2005-2007
Stefan Roese8a316c92005-08-01 16:49:12 +02003 * Stefan Roese, DENX Software Engineering, sr@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Wolfgang Denkf901a832005-08-06 01:42:58 +020015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Stefan Roese8a316c92005-08-01 16:49:12 +020016 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24#include <common.h>
25#include <asm/processor.h>
Stefan Roese0d974d52007-03-24 15:57:09 +010026#include <asm/gpio.h>
Stefan Roese8a316c92005-08-01 16:49:12 +020027#include <spd_sdram.h>
Stefan Roese17f50f222005-08-04 17:09:16 +020028#include <ppc440.h>
29#include "bamboo.h"
30
31void ext_bus_cntlr_init(void);
32void configure_ppc440ep_pins(void);
Stefan Roesec57c7982005-08-11 17:56:56 +020033int is_nand_selected(void);
Stefan Roese17f50f222005-08-04 17:09:16 +020034
Eugene OBriend2f68002007-07-31 10:24:56 +020035#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
36/*************************************************************************
37 *
38 * Bamboo has one bank onboard sdram (plus DIMM)
39 *
40 * Fixed memory is composed of :
41 * MT46V16M16TG-75 from Micron (x 2), 256Mb, 16 M x16, DDR266,
42 * 13 row add bits, 10 column add bits (but 12 row used only).
43 * ECC device: MT46V16M8TG-75 from Micron (x 1), 128Mb, x8, DDR266,
44 * 12 row add bits, 10 column add bits.
45 * Prepare a subset (only the used ones) of SPD data
46 *
47 * Note : if the ECC is enabled (SDRAM_ECC_ENABLE) the size of
48 * the corresponding bank is divided by 2 due to number of Row addresses
49 * 12 in the ECC module
50 *
51 * Assumes: 64 MB, ECC, non-registered
52 * PLB @ 133 MHz
53 *
54 ************************************************************************/
55const unsigned char cfg_simulate_spd_eeprom[128] = {
56 0x80, /* number of SPD bytes used: 128 */
57 0x08, /* total number bytes in SPD device = 256 */
58 0x07, /* DDR ram */
59#ifdef CONFIG_DDR_ECC
60 0x0C, /* num Row Addr: 12 */
61#else
62 0x0D, /* num Row Addr: 13 */
63#endif
64 0x09, /* numColAddr: 9 */
65 0x01, /* numBanks: 1 */
66 0x20, /* Module data width: 32 bits */
67 0x00, /* Module data width continued: +0 */
68 0x04, /* 2.5 Volt */
69 0x75, /* SDRAM Cycle Time (cas latency 2.5) = 7.5 ns */
70#ifdef CONFIG_DDR_ECC
71 0x02, /* ECC ON : 02 OFF : 00 */
72#else
73 0x00, /* ECC ON : 02 OFF : 00 */
74#endif
75 0x82, /* refresh Rate Type: Normal (15.625us) + Self refresh */
76 0,
77 0,
78 0,
79 0x01, /* wcsbc = 1 */
80 0,
81 0,
82 0x0C, /* casBit (2,2.5) */
83 0,
84 0,
85 0x00, /* not registered: 0 registered : 0x02*/
86 0,
87 0xA0, /* SDRAM Cycle Time (cas latency 2) = 10 ns */
88 0,
89 0x00, /* SDRAM Cycle Time (cas latency 1.5) = N.A */
90 0,
91 0x50, /* tRpNs = 20 ns */
92 0,
93 0x50, /* tRcdNs = 20 ns */
94 45, /* tRasNs */
95#ifdef CONFIG_DDR_ECC
96 0x08, /* bankSizeID: 32MB */
97#else
98 0x10, /* bankSizeID: 64MB */
99#endif
100 0,
101 0,
102 0,
103 0,
104 0,
105 0,
106 0,
107 0,
108 0,
109 0,
110 0,
111 0,
112 0,
113 0,
114 0,
115 0,
116 0,
117 0,
118 0,
119 0,
120 0,
121 0,
122 0,
123 0,
124 0,
125 0,
126 0,
127 0,
128 0,
129 0,
130 0,
131 0,
132 0,
133 0,
134 0,
135 0,
136 0,
137 0,
138 0,
139 0,
140 0,
141 0,
142 0,
143 0,
144 0,
145 0,
146 0,
147 0,
148 0,
149 0,
150 0,
151 0,
152 0,
153 0,
154 0,
155 0,
156 0,
157 0,
158 0,
159 0,
160 0,
161 0,
162 0,
163 0,
164 0,
165 0,
166 0,
167 0,
168 0,
169 0,
170 0,
171 0,
172 0,
173 0,
174 0,
175 0,
176 0,
177 0,
178 0,
179 0,
180 0,
181 0,
182 0,
183 0,
184 0,
185 0,
186 0,
187 0,
188 0,
189 0,
190 0,
191 0,
192 0,
193 0,
194 0,
195 0
196};
197#endif
Stefan Roesefd49bf02005-11-15 16:04:58 +0100198
Stefan Roese17f50f222005-08-04 17:09:16 +0200199#if 0
Wolfgang Denkf901a832005-08-06 01:42:58 +0200200{ /* GPIO Alternate1 Alternate2 Alternate3 */
201 {
202 /* GPIO Core 0 */
203 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_0 -> EBC_ADDR(7) DMA_REQ(2) */
204 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_1 -> EBC_ADDR(6) DMA_ACK(2) */
205 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_2 -> EBC_ADDR(5) DMA_EOT/TC(2) */
206 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_3 -> EBC_ADDR(4) DMA_REQ(3) */
207 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_4 -> EBC_ADDR(3) DMA_ACK(3) */
208 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_5 ................. */
209 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_6 -> EBC_CS_N(1) */
210 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_7 -> EBC_CS_N(2) */
211 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_8 -> EBC_CS_N(3) */
212 { GPIO0_BASE, GPIO_DIS, GPIO_ALT1 }, /* GPIO0_9 -> EBC_CS_N(4) */
213 { GPIO0_BASE, GPIO_OUT, GPIO_ALT1 }, /* GPIO0_10 -> EBC_CS_N(5) */
214 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_11 -> EBC_BUS_ERR */
215 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_12 -> ZII_p0Rxd(0) */
216 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_13 -> ZII_p0Rxd(1) */
217 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_14 -> ZII_p0Rxd(2) */
218 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_15 -> ZII_p0Rxd(3) */
219 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_16 -> ZII_p0Txd(0) */
220 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_17 -> ZII_p0Txd(1) */
221 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_18 -> ZII_p0Txd(2) */
222 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_19 -> ZII_p0Txd(3) */
223 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_20 -> ZII_p0Rx_er */
224 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_21 -> ZII_p0Rx_dv */
225 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_22 -> ZII_p0RxCrs */
226 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_23 -> ZII_p0Tx_er */
227 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_24 -> ZII_p0Tx_en */
228 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_25 -> ZII_p0Col */
229 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_26 -> USB2D_RXVALID */
230 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_27 -> EXT_EBC_REQ USB2D_RXERROR */
231 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_28 -> USB2D_TXVALID */
232 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_29 -> EBC_EXT_HDLA USB2D_PAD_SUSPNDM */
233 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_30 -> EBC_EXT_ACK USB2D_XCVRSELECT */
234 { GPIO0_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO0_31 -> EBC_EXR_BUSREQ USB2D_TERMSELECT */
235 },
236 {
237 /* GPIO Core 1 */
238 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_0 -> USB2D_OPMODE0 */
239 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_1 -> USB2D_OPMODE1 */
240 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_2 -> UART0_DCD_N UART1_DSR_CTS_N UART2_SOUT */
241 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_3 -> UART0_8PIN_DSR_N UART1_RTS_DTR_N UART2_SIN */
242 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_4 -> UART0_8PIN_CTS_N UART3_SIN */
243 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_5 -> UART0_RTS_N */
244 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_6 -> UART0_DTR_N UART1_SOUT */
245 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_7 -> UART0_RI_N UART1_SIN */
246 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_8 -> UIC_IRQ(0) */
247 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_9 -> UIC_IRQ(1) */
248 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_10 -> UIC_IRQ(2) */
249 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_11 -> UIC_IRQ(3) */
250 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_12 -> UIC_IRQ(4) DMA_ACK(1) */
251 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_13 -> UIC_IRQ(6) DMA_EOT/TC(1) */
252 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_14 -> UIC_IRQ(7) DMA_REQ(0) */
253 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_15 -> UIC_IRQ(8) DMA_ACK(0) */
254 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_16 -> UIC_IRQ(9) DMA_EOT/TC(0) */
255 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_17 -> - */
256 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_18 -> | */
257 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_19 -> | */
258 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_20 -> | */
259 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_21 -> | */
260 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_22 -> | */
261 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_23 -> \ Can be unselected thru TraceSelect Bit */
262 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_24 -> / in PowerPC440EP Chip */
263 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_25 -> | */
264 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_26 -> | */
265 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_27 -> | */
266 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_28 -> | */
267 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_29 -> | */
268 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_30 -> | */
269 { GPIO1_BASE, GPIO_DIS, GPIO_SEL }, /* GPIO1_31 -> - */
270 }
Stefan Roese17f50f222005-08-04 17:09:16 +0200271};
272#endif
273
274/*----------------------------------------------------------------------------+
275 | EBC Devices Characteristics
Wolfgang Denkf901a832005-08-06 01:42:58 +0200276 | Peripheral Bank Access Parameters - EBC0_BnAP
277 | Peripheral Bank Configuration Register - EBC0_BnCR
Stefan Roese17f50f222005-08-04 17:09:16 +0200278 +----------------------------------------------------------------------------*/
279/* Small Flash */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200280#define EBC0_BNAP_SMALL_FLASH \
281 EBC0_BNAP_BME_DISABLED | \
282 EBC0_BNAP_TWT_ENCODE(6) | \
283 EBC0_BNAP_CSN_ENCODE(0) | \
284 EBC0_BNAP_OEN_ENCODE(1) | \
285 EBC0_BNAP_WBN_ENCODE(1) | \
286 EBC0_BNAP_WBF_ENCODE(3) | \
287 EBC0_BNAP_TH_ENCODE(1) | \
288 EBC0_BNAP_RE_ENABLED | \
289 EBC0_BNAP_SOR_DELAYED | \
290 EBC0_BNAP_BEM_WRITEONLY | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200291 EBC0_BNAP_PEN_DISABLED
292
Wolfgang Denkf901a832005-08-06 01:42:58 +0200293#define EBC0_BNCR_SMALL_FLASH_CS0 \
294 EBC0_BNCR_BAS_ENCODE(0xFFF00000) | \
295 EBC0_BNCR_BS_1MB | \
296 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200297 EBC0_BNCR_BW_8BIT
298
Wolfgang Denkf901a832005-08-06 01:42:58 +0200299#define EBC0_BNCR_SMALL_FLASH_CS4 \
Stefan Roesec57c7982005-08-11 17:56:56 +0200300 EBC0_BNCR_BAS_ENCODE(0x87F00000) | \
301 EBC0_BNCR_BS_1MB | \
Wolfgang Denkf901a832005-08-06 01:42:58 +0200302 EBC0_BNCR_BU_RW | \
Stefan Roesec57c7982005-08-11 17:56:56 +0200303 EBC0_BNCR_BW_8BIT
Stefan Roese17f50f222005-08-04 17:09:16 +0200304
305/* Large Flash or SRAM */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200306#define EBC0_BNAP_LARGE_FLASH_OR_SRAM \
307 EBC0_BNAP_BME_DISABLED | \
308 EBC0_BNAP_TWT_ENCODE(8) | \
309 EBC0_BNAP_CSN_ENCODE(0) | \
310 EBC0_BNAP_OEN_ENCODE(1) | \
311 EBC0_BNAP_WBN_ENCODE(1) | \
312 EBC0_BNAP_WBF_ENCODE(1) | \
313 EBC0_BNAP_TH_ENCODE(2) | \
314 EBC0_BNAP_SOR_DELAYED | \
315 EBC0_BNAP_BEM_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200316 EBC0_BNAP_PEN_DISABLED
317
Wolfgang Denkf901a832005-08-06 01:42:58 +0200318#define EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS0 \
319 EBC0_BNCR_BAS_ENCODE(0xFF800000) | \
320 EBC0_BNCR_BS_8MB | \
321 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200322 EBC0_BNCR_BW_16BIT
323
324
Wolfgang Denkf901a832005-08-06 01:42:58 +0200325#define EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4 \
326 EBC0_BNCR_BAS_ENCODE(0x87800000) | \
327 EBC0_BNCR_BS_8MB | \
328 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200329 EBC0_BNCR_BW_16BIT
330
331/* NVRAM - FPGA */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200332#define EBC0_BNAP_NVRAM_FPGA \
333 EBC0_BNAP_BME_DISABLED | \
334 EBC0_BNAP_TWT_ENCODE(9) | \
335 EBC0_BNAP_CSN_ENCODE(0) | \
336 EBC0_BNAP_OEN_ENCODE(1) | \
337 EBC0_BNAP_WBN_ENCODE(1) | \
338 EBC0_BNAP_WBF_ENCODE(0) | \
339 EBC0_BNAP_TH_ENCODE(2) | \
340 EBC0_BNAP_RE_ENABLED | \
341 EBC0_BNAP_SOR_DELAYED | \
342 EBC0_BNAP_BEM_WRITEONLY | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200343 EBC0_BNAP_PEN_DISABLED
344
Wolfgang Denkf901a832005-08-06 01:42:58 +0200345#define EBC0_BNCR_NVRAM_FPGA_CS5 \
346 EBC0_BNCR_BAS_ENCODE(0x80000000) | \
347 EBC0_BNCR_BS_1MB | \
348 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200349 EBC0_BNCR_BW_8BIT
350
351/* Nand Flash */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200352#define EBC0_BNAP_NAND_FLASH \
353 EBC0_BNAP_BME_DISABLED | \
354 EBC0_BNAP_TWT_ENCODE(3) | \
355 EBC0_BNAP_CSN_ENCODE(0) | \
356 EBC0_BNAP_OEN_ENCODE(0) | \
357 EBC0_BNAP_WBN_ENCODE(0) | \
358 EBC0_BNAP_WBF_ENCODE(0) | \
359 EBC0_BNAP_TH_ENCODE(1) | \
360 EBC0_BNAP_RE_ENABLED | \
361 EBC0_BNAP_SOR_NOT_DELAYED | \
362 EBC0_BNAP_BEM_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200363 EBC0_BNAP_PEN_DISABLED
364
365
Wolfgang Denkf901a832005-08-06 01:42:58 +0200366#define EBC0_BNCR_NAND_FLASH_CS0 0xB8400000
Stefan Roese17f50f222005-08-04 17:09:16 +0200367
368/* NAND0 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200369#define EBC0_BNCR_NAND_FLASH_CS1 \
370 EBC0_BNCR_BAS_ENCODE(0x90000000) | \
371 EBC0_BNCR_BS_1MB | \
372 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200373 EBC0_BNCR_BW_32BIT
374/* NAND1 - Bank2 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200375#define EBC0_BNCR_NAND_FLASH_CS2 \
376 EBC0_BNCR_BAS_ENCODE(0x94000000) | \
377 EBC0_BNCR_BS_1MB | \
378 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200379 EBC0_BNCR_BW_32BIT
380
381/* NAND1 - Bank3 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200382#define EBC0_BNCR_NAND_FLASH_CS3 \
383 EBC0_BNCR_BAS_ENCODE(0x94000000) | \
384 EBC0_BNCR_BS_1MB | \
385 EBC0_BNCR_BU_RW | \
Stefan Roese17f50f222005-08-04 17:09:16 +0200386 EBC0_BNCR_BW_32BIT
Stefan Roese8a316c92005-08-01 16:49:12 +0200387
388int board_early_init_f(void)
389{
Stefan Roese17f50f222005-08-04 17:09:16 +0200390 ext_bus_cntlr_init();
Stefan Roese8a316c92005-08-01 16:49:12 +0200391
392 /*--------------------------------------------------------------------
393 * Setup the interrupt controller polarities, triggers, etc.
394 *-------------------------------------------------------------------*/
395 mtdcr(uic0sr, 0xffffffff); /* clear all */
396 mtdcr(uic0er, 0x00000000); /* disable all */
397 mtdcr(uic0cr, 0x00000009); /* ATI & UIC1 crit are critical */
398 mtdcr(uic0pr, 0xfffffe13); /* per ref-board manual */
399 mtdcr(uic0tr, 0x01c00008); /* per ref-board manual */
400 mtdcr(uic0vr, 0x00000001); /* int31 highest, base=0x000 */
401 mtdcr(uic0sr, 0xffffffff); /* clear all */
402
403 mtdcr(uic1sr, 0xffffffff); /* clear all */
404 mtdcr(uic1er, 0x00000000); /* disable all */
405 mtdcr(uic1cr, 0x00000000); /* all non-critical */
406 mtdcr(uic1pr, 0xffffe0ff); /* per ref-board manual */
407 mtdcr(uic1tr, 0x00ffc000); /* per ref-board manual */
408 mtdcr(uic1vr, 0x00000001); /* int31 highest, base=0x000 */
409 mtdcr(uic1sr, 0xffffffff); /* clear all */
410
411 /*--------------------------------------------------------------------
412 * Setup the GPIO pins
413 *-------------------------------------------------------------------*/
Stefan Roese17f50f222005-08-04 17:09:16 +0200414 out32(GPIO0_OSRL, 0x00000400);
415 out32(GPIO0_OSRH, 0x00000000);
416 out32(GPIO0_TSRL, 0x00000400);
417 out32(GPIO0_TSRH, 0x00000000);
418 out32(GPIO0_ISR1L, 0x00000000);
419 out32(GPIO0_ISR1H, 0x00000000);
420 out32(GPIO0_ISR2L, 0x00000000);
421 out32(GPIO0_ISR2H, 0x00000000);
422 out32(GPIO0_ISR3L, 0x00000000);
423 out32(GPIO0_ISR3H, 0x00000000);
Stefan Roese8a316c92005-08-01 16:49:12 +0200424
Stefan Roese17f50f222005-08-04 17:09:16 +0200425 out32(GPIO1_OSRL, 0x0C380000);
426 out32(GPIO1_OSRH, 0x00000000);
427 out32(GPIO1_TSRL, 0x0C380000);
428 out32(GPIO1_TSRH, 0x00000000);
429 out32(GPIO1_ISR1L, 0x0FC30000);
430 out32(GPIO1_ISR1H, 0x00000000);
431 out32(GPIO1_ISR2L, 0x0C010000);
432 out32(GPIO1_ISR2H, 0x00000000);
433 out32(GPIO1_ISR3L, 0x01400000);
434 out32(GPIO1_ISR3H, 0x00000000);
Stefan Roese8a316c92005-08-01 16:49:12 +0200435
Stefan Roese17f50f222005-08-04 17:09:16 +0200436 configure_ppc440ep_pins();
Stefan Roese8a316c92005-08-01 16:49:12 +0200437
438 return 0;
439}
440
441int checkboard(void)
442{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100443 char *s = getenv("serial#");
Stefan Roese8a316c92005-08-01 16:49:12 +0200444
445 printf("Board: Bamboo - AMCC PPC440EP Evaluation Board");
446 if (s != NULL) {
447 puts(", serial# ");
448 puts(s);
449 }
450 putc('\n');
451
Stefan Roese8a316c92005-08-01 16:49:12 +0200452 return (0);
453}
454
Stefan Roese8a316c92005-08-01 16:49:12 +0200455
Stefan Roese17f50f222005-08-04 17:09:16 +0200456long int initdram (int board_type)
Stefan Roese8a316c92005-08-01 16:49:12 +0200457{
Stefan Roesea471db02007-06-01 15:19:29 +0200458#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
459 long dram_size;
Stefan Roese17f50f222005-08-04 17:09:16 +0200460
Marian Balakowiczd19206b2006-07-04 01:27:46 +0200461 dram_size = spd_sdram();
Stefan Roese17f50f222005-08-04 17:09:16 +0200462
463 return dram_size;
Stefan Roesea471db02007-06-01 15:19:29 +0200464#else
465 return CFG_MBYTES_SDRAM << 20;
466#endif
Stefan Roese8a316c92005-08-01 16:49:12 +0200467}
468
469#if defined(CFG_DRAM_TEST)
470int testdram(void)
471{
472 unsigned long *mem = (unsigned long *)0;
473 const unsigned long kend = (1024 / sizeof(unsigned long));
Eugene OBriend2f68002007-07-31 10:24:56 +0200474 unsigned long k, n, *p32, ctr;
475 const unsigned long bend = CFG_MBYTES_SDRAM * 1024 * 1024;
Stefan Roese8a316c92005-08-01 16:49:12 +0200476
477 mtmsr(0);
478
Eugene OBriend2f68002007-07-31 10:24:56 +0200479 for (k = 0; k < CFG_MBYTES_SDRAM*1024;
Stefan Roese8a316c92005-08-01 16:49:12 +0200480 ++k, mem += (1024 / sizeof(unsigned long))) {
481 if ((k & 1023) == 0) {
482 printf("%3d MB\r", k / 1024);
483 }
484
485 memset(mem, 0xaaaaaaaa, 1024);
486 for (n = 0; n < kend; ++n) {
487 if (mem[n] != 0xaaaaaaaa) {
488 printf("SDRAM test fails at: %08x\n",
489 (uint) & mem[n]);
490 return 1;
491 }
492 }
493
494 memset(mem, 0x55555555, 1024);
495 for (n = 0; n < kend; ++n) {
496 if (mem[n] != 0x55555555) {
497 printf("SDRAM test fails at: %08x\n",
498 (uint) & mem[n]);
499 return 1;
500 }
501 }
502 }
Eugene OBriend2f68002007-07-31 10:24:56 +0200503
504 /*
505 * Perform a sequence test to ensure that all
506 * memory locations are uniquely addressable
507 */
508 ctr = 0;
509 p32 = 0;
510 while ((unsigned long)p32 != bend) {
511 if (0 == ((unsigned long)p32 & ((1<<20)-1)))
512 printf("Writing %3d MB\r", (unsigned long)p32 >> 20);
513 *p32++ = ctr++;
514 }
515
516 ctr = 0;
517 p32 = 0;
518 while ((unsigned long)p32 != bend) {
519 if (0 == ((unsigned long)p32 & ((1<<20)-1)))
520 printf("Verifying %3d MB\r", (unsigned long)p32 >> 20);
521
522 if (*p32 != ctr) {
523 printf("SDRAM test fails at: %08x\n", p32);
524 return 1;
525 }
526
527 ctr++;
528 p32++;
529 }
530
Stefan Roese8a316c92005-08-01 16:49:12 +0200531 printf("SDRAM test passes\n");
532 return 0;
533}
534#endif
535
536/*************************************************************************
537 * pci_pre_init
538 *
539 * This routine is called just prior to registering the hose and gives
540 * the board the opportunity to check things. Returning a value of zero
541 * indicates that things are bad & PCI initialization should be aborted.
542 *
543 * Different boards may wish to customize the pci controller structure
544 * (add regions, override default access routines, etc) or perform
545 * certain pre-initialization actions.
546 *
547 ************************************************************************/
Stefan Roese466fff12007-06-25 15:57:39 +0200548#if defined(CONFIG_PCI)
Stefan Roese8a316c92005-08-01 16:49:12 +0200549int pci_pre_init(struct pci_controller *hose)
550{
Stefan Roese8a316c92005-08-01 16:49:12 +0200551 unsigned long addr;
552
Stefan Roese8a316c92005-08-01 16:49:12 +0200553 /*-------------------------------------------------------------------------+
554 | Set priority for all PLB3 devices to 0.
555 | Set PLB3 arbiter to fair mode.
556 +-------------------------------------------------------------------------*/
557 mfsdr(sdr_amp1, addr);
558 mtsdr(sdr_amp1, (addr & 0x000000FF) | 0x0000FF00);
559 addr = mfdcr(plb3_acr);
560 mtdcr(plb3_acr, addr | 0x80000000);
561
562 /*-------------------------------------------------------------------------+
563 | Set priority for all PLB4 devices to 0.
564 +-------------------------------------------------------------------------*/
565 mfsdr(sdr_amp0, addr);
566 mtsdr(sdr_amp0, (addr & 0x000000FF) | 0x0000FF00);
567 addr = mfdcr(plb4_acr) | 0xa0000000; /* Was 0x8---- */
568 mtdcr(plb4_acr, addr);
569
570 /*-------------------------------------------------------------------------+
571 | Set Nebula PLB4 arbiter to fair mode.
572 +-------------------------------------------------------------------------*/
573 /* Segment0 */
574 addr = (mfdcr(plb0_acr) & ~plb0_acr_ppm_mask) | plb0_acr_ppm_fair;
575 addr = (addr & ~plb0_acr_hbu_mask) | plb0_acr_hbu_enabled;
576 addr = (addr & ~plb0_acr_rdp_mask) | plb0_acr_rdp_4deep;
577 addr = (addr & ~plb0_acr_wrp_mask) | plb0_acr_wrp_2deep;
578 mtdcr(plb0_acr, addr);
579
580 /* Segment1 */
581 addr = (mfdcr(plb1_acr) & ~plb1_acr_ppm_mask) | plb1_acr_ppm_fair;
582 addr = (addr & ~plb1_acr_hbu_mask) | plb1_acr_hbu_enabled;
583 addr = (addr & ~plb1_acr_rdp_mask) | plb1_acr_rdp_4deep;
584 addr = (addr & ~plb1_acr_wrp_mask) | plb1_acr_wrp_2deep;
585 mtdcr(plb1_acr, addr);
586
587 return 1;
588}
Stefan Roese466fff12007-06-25 15:57:39 +0200589#endif /* defined(CONFIG_PCI) */
Stefan Roese8a316c92005-08-01 16:49:12 +0200590
591/*************************************************************************
592 * pci_target_init
593 *
594 * The bootstrap configuration provides default settings for the pci
595 * inbound map (PIM). But the bootstrap config choices are limited and
596 * may not be sufficient for a given board.
597 *
598 ************************************************************************/
599#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT)
600void pci_target_init(struct pci_controller *hose)
601{
602 /*--------------------------------------------------------------------------+
603 * Set up Direct MMIO registers
604 *--------------------------------------------------------------------------*/
605 /*--------------------------------------------------------------------------+
606 | PowerPC440 EP PCI Master configuration.
607 | Map one 1Gig range of PLB/processor addresses to PCI memory space.
608 | PLB address 0xA0000000-0xDFFFFFFF ==> PCI address 0xA0000000-0xDFFFFFFF
609 | Use byte reversed out routines to handle endianess.
610 | Make this region non-prefetchable.
611 +--------------------------------------------------------------------------*/
612 out32r(PCIX0_PMM0MA, 0x00000000); /* PMM0 Mask/Attribute - disabled b4 setting */
613 out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE); /* PMM0 Local Address */
614 out32r(PCIX0_PMM0PCILA, CFG_PCI_MEMBASE); /* PMM0 PCI Low Address */
615 out32r(PCIX0_PMM0PCIHA, 0x00000000); /* PMM0 PCI High Address */
616 out32r(PCIX0_PMM0MA, 0xE0000001); /* 512M + No prefetching, and enable region */
617
618 out32r(PCIX0_PMM1MA, 0x00000000); /* PMM0 Mask/Attribute - disabled b4 setting */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200619 out32r(PCIX0_PMM1LA, CFG_PCI_MEMBASE2); /* PMM0 Local Address */
Stefan Roese8a316c92005-08-01 16:49:12 +0200620 out32r(PCIX0_PMM1PCILA, CFG_PCI_MEMBASE2); /* PMM0 PCI Low Address */
621 out32r(PCIX0_PMM1PCIHA, 0x00000000); /* PMM0 PCI High Address */
622 out32r(PCIX0_PMM1MA, 0xE0000001); /* 512M + No prefetching, and enable region */
623
624 out32r(PCIX0_PTM1MS, 0x00000001); /* Memory Size/Attribute */
625 out32r(PCIX0_PTM1LA, 0); /* Local Addr. Reg */
626 out32r(PCIX0_PTM2MS, 0); /* Memory Size/Attribute */
627 out32r(PCIX0_PTM2LA, 0); /* Local Addr. Reg */
628
629 /*--------------------------------------------------------------------------+
630 * Set up Configuration registers
631 *--------------------------------------------------------------------------*/
632
633 /* Program the board's subsystem id/vendor id */
634 pci_write_config_word(0, PCI_SUBSYSTEM_VENDOR_ID,
635 CFG_PCI_SUBSYS_VENDORID);
636 pci_write_config_word(0, PCI_SUBSYSTEM_ID, CFG_PCI_SUBSYS_ID);
637
638 /* Configure command register as bus master */
639 pci_write_config_word(0, PCI_COMMAND, PCI_COMMAND_MASTER);
640
641 /* 240nS PCI clock */
642 pci_write_config_word(0, PCI_LATENCY_TIMER, 1);
643
644 /* No error reporting */
645 pci_write_config_word(0, PCI_ERREN, 0);
646
647 pci_write_config_dword(0, PCI_BRDGOPT2, 0x00000101);
648
649}
650#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */
651
652/*************************************************************************
653 * pci_master_init
654 *
655 ************************************************************************/
656#if defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT)
657void pci_master_init(struct pci_controller *hose)
658{
659 unsigned short temp_short;
660
661 /*--------------------------------------------------------------------------+
662 | Write the PowerPC440 EP PCI Configuration regs.
663 | Enable PowerPC440 EP to be a master on the PCI bus (PMM).
664 | Enable PowerPC440 EP to act as a PCI memory target (PTM).
665 +--------------------------------------------------------------------------*/
666 pci_read_config_word(0, PCI_COMMAND, &temp_short);
667 pci_write_config_word(0, PCI_COMMAND,
668 temp_short | PCI_COMMAND_MASTER |
669 PCI_COMMAND_MEMORY);
670}
671#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) */
672
673/*************************************************************************
674 * is_pci_host
675 *
676 * This routine is called to determine if a pci scan should be
677 * performed. With various hardware environments (especially cPCI and
678 * PPMC) it's insufficient to depend on the state of the arbiter enable
679 * bit in the strap register, or generic host/adapter assumptions.
680 *
681 * Rather than hard-code a bad assumption in the general 440 code, the
682 * 440 pci code requires the board to decide at runtime.
683 *
684 * Return 0 for adapter mode, non-zero for host (monarch) mode.
685 *
686 *
687 ************************************************************************/
688#if defined(CONFIG_PCI)
689int is_pci_host(struct pci_controller *hose)
690{
691 /* Bamboo is always configured as host. */
692 return (1);
693}
694#endif /* defined(CONFIG_PCI) */
695
Stefan Roese17f50f222005-08-04 17:09:16 +0200696/*----------------------------------------------------------------------------+
697 | is_powerpc440ep_pass1.
698 +----------------------------------------------------------------------------*/
699int is_powerpc440ep_pass1(void)
700{
701 unsigned long pvr;
702
703 pvr = get_pvr();
704
705 if (pvr == PVR_POWERPC_440EP_PASS1)
706 return TRUE;
707 else if (pvr == PVR_POWERPC_440EP_PASS2)
708 return FALSE;
709 else {
710 printf("brdutil error 3\n");
711 for (;;)
712 ;
713 }
714
715 return(FALSE);
716}
717
718/*----------------------------------------------------------------------------+
719 | is_nand_selected.
720 +----------------------------------------------------------------------------*/
721int is_nand_selected(void)
722{
Stefan Roesec57c7982005-08-11 17:56:56 +0200723#ifdef CONFIG_BAMBOO_NAND
724 return TRUE;
725#else
726 return FALSE;
727#endif
Stefan Roese17f50f222005-08-04 17:09:16 +0200728}
729
730/*----------------------------------------------------------------------------+
731 | config_on_ebc_cs4_is_small_flash => from EPLD
732 +----------------------------------------------------------------------------*/
733unsigned char config_on_ebc_cs4_is_small_flash(void)
734{
735 /* Not implemented yet => returns constant value */
736 return TRUE;
737}
738
739/*----------------------------------------------------------------------------+
740 | Ext_bus_cntlr_init.
741 | Initialize the external bus controller
742 +----------------------------------------------------------------------------*/
743void ext_bus_cntlr_init(void)
744{
745 unsigned long sdr0_pstrp0, sdr0_sdstp1;
746 unsigned long bootstrap_settings, boot_selection, ebc_boot_size;
Wolfgang Denkf901a832005-08-06 01:42:58 +0200747 int computed_boot_device = BOOT_DEVICE_UNKNOWN;
Stefan Roese17f50f222005-08-04 17:09:16 +0200748 unsigned long ebc0_cs0_bnap_value = 0, ebc0_cs0_bncr_value = 0;
749 unsigned long ebc0_cs1_bnap_value = 0, ebc0_cs1_bncr_value = 0;
750 unsigned long ebc0_cs2_bnap_value = 0, ebc0_cs2_bncr_value = 0;
751 unsigned long ebc0_cs3_bnap_value = 0, ebc0_cs3_bncr_value = 0;
752 unsigned long ebc0_cs4_bnap_value = 0, ebc0_cs4_bncr_value = 0;
753
754
755 /*-------------------------------------------------------------------------+
756 |
757 | PART 1 : Initialize EBC Bank 5
758 | ==============================
759 | Bank5 is always associated to the NVRAM/EPLD.
760 | It has to be initialized prior to other banks settings computation since
761 | some board registers values may be needed
762 |
763 +-------------------------------------------------------------------------*/
764 /* NVRAM - FPGA */
765 mtebc(pb5ap, EBC0_BNAP_NVRAM_FPGA);
766 mtebc(pb5cr, EBC0_BNCR_NVRAM_FPGA_CS5);
767
768 /*-------------------------------------------------------------------------+
769 |
770 | PART 2 : Determine which boot device was selected
771 | =========================================
772 |
773 | Read Pin Strap Register in PPC440EP
774 | In case of boot from IIC, read Serial Device Strap Register1
775 |
776 | Result can either be :
777 | - Boot from EBC 8bits => SMALL FLASH
778 | - Boot from EBC 16bits => Large Flash or SRAM
779 | - Boot from NAND Flash
780 | - Boot from PCI
781 |
782 +-------------------------------------------------------------------------*/
783 /* Read Pin Strap Register in PPC440EP */
784 mfsdr(sdr_pstrp0, sdr0_pstrp0);
785 bootstrap_settings = sdr0_pstrp0 & SDR0_PSTRP0_BOOTSTRAP_MASK;
786
787 /*-------------------------------------------------------------------------+
788 | PPC440EP Pass1
789 +-------------------------------------------------------------------------*/
790 if (is_powerpc440ep_pass1() == TRUE) {
791 switch(bootstrap_settings) {
792 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS0:
793 /* Default Strap Settings 0 : CPU 400 - PLB 133 - Boot EBC 8 bit 33MHz */
794 /* Boot from Small Flash */
795 computed_boot_device = BOOT_FROM_SMALL_FLASH;
796 break;
797 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS1:
798 /* Default Strap Settings 1 : CPU 533 - PLB 133 - Boot PCI 66MHz */
799 /* Boot from PCI */
800 computed_boot_device = BOOT_FROM_PCI;
801 break;
802
803 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS2:
804 /* Default Strap Settings 2 : CPU 500 - PLB 100 - Boot NDFC16 66MHz */
805 /* Boot from Nand Flash */
806 computed_boot_device = BOOT_FROM_NAND_FLASH0;
807 break;
808
809 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS3:
810 /* Default Strap Settings 3 : CPU 333 - PLB 133 - Boot EBC 8 bit 66MHz */
811 /* Boot from Small Flash */
812 computed_boot_device = BOOT_FROM_SMALL_FLASH;
813 break;
814
815 case SDR0_PSTRP0_BOOTSTRAP_IIC_A8_EN:
816 case SDR0_PSTRP0_BOOTSTRAP_IIC_A4_EN:
817 /* Boot Settings in IIC EEprom address 0xA8 or 0xA4 */
818 /* Read Serial Device Strap Register1 in PPC440EP */
819 mfsdr(sdr_sdstp1, sdr0_sdstp1);
Wolfgang Denkf901a832005-08-06 01:42:58 +0200820 boot_selection = sdr0_sdstp1 & SDR0_SDSTP1_BOOT_SEL_MASK;
821 ebc_boot_size = sdr0_sdstp1 & SDR0_SDSTP1_EBC_ROM_BS_MASK;
Stefan Roese17f50f222005-08-04 17:09:16 +0200822
823 switch(boot_selection) {
824 case SDR0_SDSTP1_BOOT_SEL_EBC:
825 switch(ebc_boot_size) {
826 case SDR0_SDSTP1_EBC_ROM_BS_16BIT:
827 computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
828 break;
829 case SDR0_SDSTP1_EBC_ROM_BS_8BIT:
830 computed_boot_device = BOOT_FROM_SMALL_FLASH;
831 break;
832 }
833 break;
834
835 case SDR0_SDSTP1_BOOT_SEL_PCI:
836 computed_boot_device = BOOT_FROM_PCI;
837 break;
838
839 case SDR0_SDSTP1_BOOT_SEL_NDFC:
840 computed_boot_device = BOOT_FROM_NAND_FLASH0;
841 break;
842 }
843 break;
844 }
845 }
846
847 /*-------------------------------------------------------------------------+
848 | PPC440EP Pass2
849 +-------------------------------------------------------------------------*/
850 else {
851 switch(bootstrap_settings) {
852 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS0:
853 /* Default Strap Settings 0 : CPU 400 - PLB 133 - Boot EBC 8 bit 33MHz */
854 /* Boot from Small Flash */
855 computed_boot_device = BOOT_FROM_SMALL_FLASH;
856 break;
857 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS1:
858 /* Default Strap Settings 1 : CPU 333 - PLB 133 - Boot PCI 66MHz */
859 /* Boot from PCI */
860 computed_boot_device = BOOT_FROM_PCI;
861 break;
862
863 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS2:
864 /* Default Strap Settings 2 : CPU 400 - PLB 100 - Boot NDFC16 33MHz */
865 /* Boot from Nand Flash */
866 computed_boot_device = BOOT_FROM_NAND_FLASH0;
867 break;
868
869 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS3:
870 /* Default Strap Settings 3 : CPU 400 - PLB 100 - Boot EBC 16 bit 33MHz */
871 /* Boot from Large Flash or SRAM */
872 computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
873 break;
874
875 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS4:
876 /* Default Strap Settings 4 : CPU 333 - PLB 133 - Boot EBC 16 bit 66MHz */
877 /* Boot from Large Flash or SRAM */
878 computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
879 break;
880
881 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS6:
882 /* Default Strap Settings 6 : CPU 400 - PLB 100 - Boot PCI 33MHz */
883 /* Boot from PCI */
884 computed_boot_device = BOOT_FROM_PCI;
885 break;
886
887 case SDR0_PSTRP0_BOOTSTRAP_IIC_A8_EN:
888 case SDR0_PSTRP0_BOOTSTRAP_IIC_A4_EN:
889 /* Default Strap Settings 5-7 */
890 /* Boot Settings in IIC EEprom address 0xA8 or 0xA4 */
891 /* Read Serial Device Strap Register1 in PPC440EP */
892 mfsdr(sdr_sdstp1, sdr0_sdstp1);
Wolfgang Denkf901a832005-08-06 01:42:58 +0200893 boot_selection = sdr0_sdstp1 & SDR0_SDSTP1_BOOT_SEL_MASK;
894 ebc_boot_size = sdr0_sdstp1 & SDR0_SDSTP1_EBC_ROM_BS_MASK;
Stefan Roese17f50f222005-08-04 17:09:16 +0200895
896 switch(boot_selection) {
897 case SDR0_SDSTP1_BOOT_SEL_EBC:
898 switch(ebc_boot_size) {
899 case SDR0_SDSTP1_EBC_ROM_BS_16BIT:
900 computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
901 break;
902 case SDR0_SDSTP1_EBC_ROM_BS_8BIT:
903 computed_boot_device = BOOT_FROM_SMALL_FLASH;
904 break;
905 }
906 break;
907
908 case SDR0_SDSTP1_BOOT_SEL_PCI:
909 computed_boot_device = BOOT_FROM_PCI;
910 break;
911
912 case SDR0_SDSTP1_BOOT_SEL_NDFC:
913 computed_boot_device = BOOT_FROM_NAND_FLASH0;
914 break;
915 }
916 break;
917 }
918 }
919
920 /*-------------------------------------------------------------------------+
921 |
922 | PART 3 : Compute EBC settings depending on selected boot device
923 | ====== ======================================================
924 |
925 | Resulting EBC init will be among following configurations :
926 |
927 | - Boot from EBC 8bits => boot from SMALL FLASH selected
Wolfgang Denkf901a832005-08-06 01:42:58 +0200928 | EBC-CS0 = Small Flash
929 | EBC-CS1,2,3 = NAND Flash or
930 | Exp.Slot depending on Soft Config
931 | EBC-CS4 = SRAM/Large Flash or
932 | Large Flash/SRAM depending on jumpers
933 | EBC-CS5 = NVRAM / EPLD
Stefan Roese17f50f222005-08-04 17:09:16 +0200934 |
935 | - Boot from EBC 16bits => boot from Large Flash or SRAM selected
Wolfgang Denkf901a832005-08-06 01:42:58 +0200936 | EBC-CS0 = SRAM/Large Flash or
937 | Large Flash/SRAM depending on jumpers
938 | EBC-CS1,2,3 = NAND Flash or
939 | Exp.Slot depending on Software Configuration
940 | EBC-CS4 = Small Flash
941 | EBC-CS5 = NVRAM / EPLD
Stefan Roese17f50f222005-08-04 17:09:16 +0200942 |
943 | - Boot from NAND Flash
Wolfgang Denkf901a832005-08-06 01:42:58 +0200944 | EBC-CS0 = NAND Flash0
945 | EBC-CS1,2,3 = NAND Flash1
946 | EBC-CS4 = SRAM/Large Flash or
947 | Large Flash/SRAM depending on jumpers
948 | EBC-CS5 = NVRAM / EPLD
Stefan Roese17f50f222005-08-04 17:09:16 +0200949 |
950 | - Boot from PCI
Wolfgang Denkf901a832005-08-06 01:42:58 +0200951 | EBC-CS0 = ...
952 | EBC-CS1,2,3 = NAND Flash or
953 | Exp.Slot depending on Software Configuration
954 | EBC-CS4 = SRAM/Large Flash or
955 | Large Flash/SRAM or
956 | Small Flash depending on jumpers
957 | EBC-CS5 = NVRAM / EPLD
Stefan Roese17f50f222005-08-04 17:09:16 +0200958 |
959 +-------------------------------------------------------------------------*/
960
961 switch(computed_boot_device) {
962 /*------------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200963 case BOOT_FROM_SMALL_FLASH:
Stefan Roese17f50f222005-08-04 17:09:16 +0200964 /*------------------------------------------------------------------------- */
965 ebc0_cs0_bnap_value = EBC0_BNAP_SMALL_FLASH;
966 ebc0_cs0_bncr_value = EBC0_BNCR_SMALL_FLASH_CS0;
967 if ((is_nand_selected()) == TRUE) {
968 /* NAND Flash */
969 ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
970 ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
Stefan Roesec57c7982005-08-11 17:56:56 +0200971 ebc0_cs2_bnap_value = EBC0_BNAP_NAND_FLASH;
972 ebc0_cs2_bncr_value = EBC0_BNCR_NAND_FLASH_CS2;
Stefan Roese17f50f222005-08-04 17:09:16 +0200973 ebc0_cs3_bnap_value = 0;
974 ebc0_cs3_bncr_value = 0;
975 } else {
976 /* Expansion Slot */
977 ebc0_cs1_bnap_value = 0;
978 ebc0_cs1_bncr_value = 0;
979 ebc0_cs2_bnap_value = 0;
980 ebc0_cs2_bncr_value = 0;
981 ebc0_cs3_bnap_value = 0;
982 ebc0_cs3_bncr_value = 0;
983 }
984 ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
985 ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
986
987 break;
988
989 /*------------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200990 case BOOT_FROM_LARGE_FLASH_OR_SRAM:
Stefan Roese17f50f222005-08-04 17:09:16 +0200991 /*------------------------------------------------------------------------- */
992 ebc0_cs0_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
993 ebc0_cs0_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS0;
994 if ((is_nand_selected()) == TRUE) {
995 /* NAND Flash */
996 ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
997 ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
998 ebc0_cs2_bnap_value = 0;
999 ebc0_cs2_bncr_value = 0;
1000 ebc0_cs3_bnap_value = 0;
1001 ebc0_cs3_bncr_value = 0;
1002 } else {
1003 /* Expansion Slot */
1004 ebc0_cs1_bnap_value = 0;
1005 ebc0_cs1_bncr_value = 0;
1006 ebc0_cs2_bnap_value = 0;
1007 ebc0_cs2_bncr_value = 0;
1008 ebc0_cs3_bnap_value = 0;
1009 ebc0_cs3_bncr_value = 0;
1010 }
1011 ebc0_cs4_bnap_value = EBC0_BNAP_SMALL_FLASH;
1012 ebc0_cs4_bncr_value = EBC0_BNCR_SMALL_FLASH_CS4;
1013
1014 break;
1015
1016 /*------------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001017 case BOOT_FROM_NAND_FLASH0:
Stefan Roese17f50f222005-08-04 17:09:16 +02001018 /*------------------------------------------------------------------------- */
Stefan Roesea471db02007-06-01 15:19:29 +02001019 ebc0_cs0_bnap_value = EBC0_BNAP_NAND_FLASH;
1020 ebc0_cs0_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001021
Stefan Roesea471db02007-06-01 15:19:29 +02001022 ebc0_cs1_bnap_value = 0;
1023 ebc0_cs1_bncr_value = 0;
Stefan Roese17f50f222005-08-04 17:09:16 +02001024 ebc0_cs2_bnap_value = 0;
1025 ebc0_cs2_bncr_value = 0;
1026 ebc0_cs3_bnap_value = 0;
1027 ebc0_cs3_bncr_value = 0;
1028
1029 /* Large Flash or SRAM */
1030 ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
1031 ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
1032
1033 break;
1034
1035 /*------------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001036 case BOOT_FROM_PCI:
Stefan Roese17f50f222005-08-04 17:09:16 +02001037 /*------------------------------------------------------------------------- */
1038 ebc0_cs0_bnap_value = 0;
1039 ebc0_cs0_bncr_value = 0;
1040
1041 if ((is_nand_selected()) == TRUE) {
1042 /* NAND Flash */
1043 ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
1044 ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
1045 ebc0_cs2_bnap_value = 0;
1046 ebc0_cs2_bncr_value = 0;
1047 ebc0_cs3_bnap_value = 0;
1048 ebc0_cs3_bncr_value = 0;
1049 } else {
1050 /* Expansion Slot */
1051 ebc0_cs1_bnap_value = 0;
1052 ebc0_cs1_bncr_value = 0;
1053 ebc0_cs2_bnap_value = 0;
1054 ebc0_cs2_bncr_value = 0;
1055 ebc0_cs3_bnap_value = 0;
1056 ebc0_cs3_bncr_value = 0;
1057 }
1058
1059 if ((config_on_ebc_cs4_is_small_flash()) == TRUE) {
1060 /* Small Flash */
1061 ebc0_cs4_bnap_value = EBC0_BNAP_SMALL_FLASH;
1062 ebc0_cs4_bncr_value = EBC0_BNCR_SMALL_FLASH_CS4;
1063 } else {
1064 /* Large Flash or SRAM */
1065 ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
1066 ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
1067 }
1068
1069 break;
1070
1071 /*------------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001072 case BOOT_DEVICE_UNKNOWN:
Stefan Roese17f50f222005-08-04 17:09:16 +02001073 /*------------------------------------------------------------------------- */
1074 /* Error */
1075 break;
1076
1077 }
1078
1079
1080 /*-------------------------------------------------------------------------+
1081 | Initialize EBC CONFIG
1082 +-------------------------------------------------------------------------*/
1083 mtdcr(ebccfga, xbcfg);
Wolfgang Denkf901a832005-08-06 01:42:58 +02001084 mtdcr(ebccfgd, EBC0_CFG_EBTC_DRIVEN |
1085 EBC0_CFG_PTD_ENABLED |
1086 EBC0_CFG_RTC_2048PERCLK |
1087 EBC0_CFG_EMPL_LOW |
1088 EBC0_CFG_EMPH_LOW |
1089 EBC0_CFG_CSTC_DRIVEN |
1090 EBC0_CFG_BPF_ONEDW |
1091 EBC0_CFG_EMS_8BIT |
1092 EBC0_CFG_PME_DISABLED |
1093 EBC0_CFG_PMT_ENCODE(0) );
Stefan Roese17f50f222005-08-04 17:09:16 +02001094
1095 /*-------------------------------------------------------------------------+
1096 | Initialize EBC Bank 0-4
1097 +-------------------------------------------------------------------------*/
1098 /* EBC Bank0 */
1099 mtebc(pb0ap, ebc0_cs0_bnap_value);
1100 mtebc(pb0cr, ebc0_cs0_bncr_value);
1101 /* EBC Bank1 */
1102 mtebc(pb1ap, ebc0_cs1_bnap_value);
1103 mtebc(pb1cr, ebc0_cs1_bncr_value);
1104 /* EBC Bank2 */
1105 mtebc(pb2ap, ebc0_cs2_bnap_value);
1106 mtebc(pb2cr, ebc0_cs2_bncr_value);
1107 /* EBC Bank3 */
1108 mtebc(pb3ap, ebc0_cs3_bnap_value);
1109 mtebc(pb3cr, ebc0_cs3_bncr_value);
1110 /* EBC Bank4 */
1111 mtebc(pb4ap, ebc0_cs4_bnap_value);
1112 mtebc(pb4cr, ebc0_cs4_bncr_value);
1113
1114 return;
1115}
1116
1117
1118/*----------------------------------------------------------------------------+
1119 | get_uart_configuration.
1120 +----------------------------------------------------------------------------*/
1121uart_config_nb_t get_uart_configuration(void)
1122{
Stefan Roesec57c7982005-08-11 17:56:56 +02001123 return (L4);
Stefan Roese17f50f222005-08-04 17:09:16 +02001124}
1125
1126/*----------------------------------------------------------------------------+
1127 | set_phy_configuration_through_fpga => to EPLD
1128 +----------------------------------------------------------------------------*/
1129void set_phy_configuration_through_fpga(zmii_config_t config)
Stefan Roese8a316c92005-08-01 16:49:12 +02001130{
1131
Stefan Roese17f50f222005-08-04 17:09:16 +02001132 unsigned long fpga_selection_reg;
1133
1134 fpga_selection_reg = in8(FPGA_SELECTION_1_REG) & ~FPGA_SEL_1_REG_PHY_MASK;
1135
1136 switch(config)
1137 {
Wolfgang Denkf901a832005-08-06 01:42:58 +02001138 case ZMII_CONFIGURATION_IS_MII:
Stefan Roese17f50f222005-08-04 17:09:16 +02001139 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_MII;
1140 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02001141 case ZMII_CONFIGURATION_IS_RMII:
Stefan Roese17f50f222005-08-04 17:09:16 +02001142 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_RMII;
1143 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02001144 case ZMII_CONFIGURATION_IS_SMII:
Stefan Roese17f50f222005-08-04 17:09:16 +02001145 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_SMII;
1146 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02001147 case ZMII_CONFIGURATION_UNKNOWN:
1148 default:
Stefan Roese17f50f222005-08-04 17:09:16 +02001149 break;
1150 }
1151 out8(FPGA_SELECTION_1_REG,fpga_selection_reg);
1152
Stefan Roese8a316c92005-08-01 16:49:12 +02001153}
Stefan Roese17f50f222005-08-04 17:09:16 +02001154
1155/*----------------------------------------------------------------------------+
1156 | scp_selection_in_fpga.
1157 +----------------------------------------------------------------------------*/
1158void scp_selection_in_fpga(void)
1159{
1160 unsigned long fpga_selection_2_reg;
1161
1162 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_IIC1_SCP_SEL_MASK;
1163 fpga_selection_2_reg |= FPGA_SEL2_REG_SEL_SCP;
1164 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1165}
1166
1167/*----------------------------------------------------------------------------+
1168 | iic1_selection_in_fpga.
1169 +----------------------------------------------------------------------------*/
1170void iic1_selection_in_fpga(void)
1171{
1172 unsigned long fpga_selection_2_reg;
1173
1174 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_IIC1_SCP_SEL_MASK;
1175 fpga_selection_2_reg |= FPGA_SEL2_REG_SEL_IIC1;
1176 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1177}
1178
1179/*----------------------------------------------------------------------------+
1180 | dma_a_b_selection_in_fpga.
1181 +----------------------------------------------------------------------------*/
1182void dma_a_b_selection_in_fpga(void)
1183{
1184 unsigned long fpga_selection_2_reg;
1185
1186 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) | FPGA_SEL2_REG_SEL_DMA_A_B;
1187 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1188}
1189
1190/*----------------------------------------------------------------------------+
1191 | dma_a_b_unselect_in_fpga.
1192 +----------------------------------------------------------------------------*/
1193void dma_a_b_unselect_in_fpga(void)
1194{
1195 unsigned long fpga_selection_2_reg;
1196
1197 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_SEL_DMA_A_B;
1198 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1199}
1200
1201/*----------------------------------------------------------------------------+
1202 | dma_c_d_selection_in_fpga.
1203 +----------------------------------------------------------------------------*/
1204void dma_c_d_selection_in_fpga(void)
1205{
1206 unsigned long fpga_selection_2_reg;
1207
1208 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) | FPGA_SEL2_REG_SEL_DMA_C_D;
1209 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1210}
1211
1212/*----------------------------------------------------------------------------+
1213 | dma_c_d_unselect_in_fpga.
1214 +----------------------------------------------------------------------------*/
1215void dma_c_d_unselect_in_fpga(void)
1216{
1217 unsigned long fpga_selection_2_reg;
1218
1219 fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_SEL_DMA_C_D;
1220 out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
1221}
1222
1223/*----------------------------------------------------------------------------+
1224 | usb2_device_selection_in_fpga.
1225 +----------------------------------------------------------------------------*/
1226void usb2_device_selection_in_fpga(void)
1227{
1228 unsigned long fpga_selection_1_reg;
1229
1230 fpga_selection_1_reg = in8(FPGA_SELECTION_1_REG) | FPGA_SEL_1_REG_USB2_DEV_SEL;
1231 out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1232}
1233
1234/*----------------------------------------------------------------------------+
1235 | usb2_device_reset_through_fpga.
1236 +----------------------------------------------------------------------------*/
1237void usb2_device_reset_through_fpga(void)
1238{
1239 /* Perform soft Reset pulse */
1240 unsigned long fpga_reset_reg;
1241 int i;
1242
1243 fpga_reset_reg = in8(FPGA_RESET_REG);
1244 out8(FPGA_RESET_REG,fpga_reset_reg | FPGA_RESET_REG_RESET_USB20_DEV);
1245 for (i=0; i<500; i++)
1246 udelay(1000);
1247 out8(FPGA_RESET_REG,fpga_reset_reg);
1248}
1249
1250/*----------------------------------------------------------------------------+
1251 | usb2_host_selection_in_fpga.
1252 +----------------------------------------------------------------------------*/
1253void usb2_host_selection_in_fpga(void)
1254{
1255 unsigned long fpga_selection_1_reg;
1256
1257 fpga_selection_1_reg = in8(FPGA_SELECTION_1_REG) | FPGA_SEL_1_REG_USB2_HOST_SEL;
1258 out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1259}
1260
1261/*----------------------------------------------------------------------------+
1262 | ndfc_selection_in_fpga.
1263 +----------------------------------------------------------------------------*/
1264void ndfc_selection_in_fpga(void)
1265{
1266 unsigned long fpga_selection_1_reg;
1267
1268 fpga_selection_1_reg = in8(FPGA_SELECTION_1_REG) &~FPGA_SEL_1_REG_NF_SELEC_MASK;
1269 fpga_selection_1_reg |= FPGA_SEL_1_REG_NF0_SEL_BY_NFCS1;
Stefan Roesec57c7982005-08-11 17:56:56 +02001270 fpga_selection_1_reg |= FPGA_SEL_1_REG_NF1_SEL_BY_NFCS2;
Stefan Roese17f50f222005-08-04 17:09:16 +02001271 out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1272}
1273
1274/*----------------------------------------------------------------------------+
1275 | uart_selection_in_fpga.
1276 +----------------------------------------------------------------------------*/
1277void uart_selection_in_fpga(uart_config_nb_t uart_config)
1278{
1279 /* FPGA register */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001280 unsigned char fpga_selection_3_reg;
Stefan Roese17f50f222005-08-04 17:09:16 +02001281
1282 /* Read FPGA Reagister */
1283 fpga_selection_3_reg = in8(FPGA_SELECTION_3_REG);
1284
1285 switch (uart_config)
1286 {
1287 case L1:
1288 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001289 /* L1 configuration: UART0 = 8 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001290 /* ----------------------------------------------------------------------- */
1291 /* Configure FPGA */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001292 fpga_selection_3_reg = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1293 fpga_selection_3_reg = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001294 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1295
1296 break;
1297
1298 case L2:
1299 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001300 /* L2 configuration: UART0 = 4 pins */
1301 /* UART1 = 4 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001302 /* ----------------------------------------------------------------------- */
1303 /* Configure FPGA */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001304 fpga_selection_3_reg = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1305 fpga_selection_3_reg = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG2;
Stefan Roese17f50f222005-08-04 17:09:16 +02001306 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1307
1308 break;
1309
1310 case L3:
1311 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001312 /* L3 configuration: UART0 = 4 pins */
1313 /* UART1 = 2 pins */
1314 /* UART2 = 2 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001315 /* ----------------------------------------------------------------------- */
1316 /* Configure FPGA */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001317 fpga_selection_3_reg = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1318 fpga_selection_3_reg = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG3;
Stefan Roese17f50f222005-08-04 17:09:16 +02001319 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1320 break;
1321
1322 case L4:
1323 /* Configure FPGA */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001324 fpga_selection_3_reg = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1325 fpga_selection_3_reg = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG4;
Stefan Roese17f50f222005-08-04 17:09:16 +02001326 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1327
1328 break;
1329
1330 default:
1331 /* Unsupported UART configuration number */
1332 for (;;)
1333 ;
1334 break;
1335
1336 }
1337}
1338
1339
1340/*----------------------------------------------------------------------------+
1341 | init_default_gpio
1342 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001343void init_default_gpio(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001344{
1345 int i;
1346
1347 /* Init GPIO0 */
1348 for(i=0; i<GPIO_MAX; i++)
1349 {
Wolfgang Denkf901a832005-08-06 01:42:58 +02001350 gpio_tab[GPIO0][i].add = GPIO0_BASE;
Stefan Roese17f50f222005-08-04 17:09:16 +02001351 gpio_tab[GPIO0][i].in_out = GPIO_DIS;
1352 gpio_tab[GPIO0][i].alt_nb = GPIO_SEL;
1353 }
1354
1355 /* Init GPIO1 */
1356 for(i=0; i<GPIO_MAX; i++)
1357 {
Wolfgang Denkf901a832005-08-06 01:42:58 +02001358 gpio_tab[GPIO1][i].add = GPIO1_BASE;
Stefan Roese17f50f222005-08-04 17:09:16 +02001359 gpio_tab[GPIO1][i].in_out = GPIO_DIS;
1360 gpio_tab[GPIO1][i].alt_nb = GPIO_SEL;
1361 }
1362
1363 /* EBC_CS_N(5) - GPIO0_10 */
1364 gpio_tab[GPIO0][10].in_out = GPIO_OUT;
1365 gpio_tab[GPIO0][10].alt_nb = GPIO_ALT1;
1366
1367 /* EBC_CS_N(4) - GPIO0_9 */
1368 gpio_tab[GPIO0][9].in_out = GPIO_OUT;
1369 gpio_tab[GPIO0][9].alt_nb = GPIO_ALT1;
1370}
1371
1372/*----------------------------------------------------------------------------+
1373 | update_uart_ios
1374 +------------------------------------------------------------------------------
1375 |
1376 | Set UART Configuration in PowerPC440EP
1377 |
1378 | +---------------------------------------------------------------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001379 | | Configuartion | Connector | Nb of pins | Pins | Associated |
1380 | | Number | Port Name | available | naming | CORE |
Stefan Roese17f50f222005-08-04 17:09:16 +02001381 | +-----------------+---------------+------------+--------+-------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001382 | | L1 | Port_A | 8 | UART | UART core 0 |
Stefan Roese17f50f222005-08-04 17:09:16 +02001383 | +-----------------+---------------+------------+--------+-------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001384 | | L2 | Port_A | 4 | UART1 | UART core 0 |
1385 | | (L2D) | Port_B | 4 | UART2 | UART core 1 |
Stefan Roese17f50f222005-08-04 17:09:16 +02001386 | +-----------------+---------------+------------+--------+-------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001387 | | L3 | Port_A | 4 | UART1 | UART core 0 |
1388 | | (L3D) | Port_B | 2 | UART2 | UART core 1 |
1389 | | | Port_C | 2 | UART3 | UART core 2 |
Stefan Roese17f50f222005-08-04 17:09:16 +02001390 | +-----------------+---------------+------------+--------+-------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001391 | | | Port_A | 2 | UART1 | UART core 0 |
1392 | | L4 | Port_B | 2 | UART2 | UART core 1 |
1393 | | (L4D) | Port_C | 2 | UART3 | UART core 2 |
1394 | | | Port_D | 2 | UART4 | UART core 3 |
Stefan Roese17f50f222005-08-04 17:09:16 +02001395 | +-----------------+---------------+------------+--------+-------------+
1396 |
1397 | Involved GPIOs
1398 |
1399 | +------------------------------------------------------------------------------+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001400 | | GPIO | Aternate 1 | I/O | Alternate 2 | I/O | Alternate 3 | I/O |
Stefan Roese17f50f222005-08-04 17:09:16 +02001401 | +---------+------------------+-----+-----------------+-----+-------------+-----+
Wolfgang Denkf901a832005-08-06 01:42:58 +02001402 | | GPIO1_2 | UART0_DCD_N | I | UART1_DSR_CTS_N | I | UART2_SOUT | O |
1403 | | GPIO1_3 | UART0_8PIN_DSR_N | I | UART1_RTS_DTR_N | O | UART2_SIN | I |
1404 | | GPIO1_4 | UART0_8PIN_CTS_N | I | NA | NA | UART3_SIN | I |
1405 | | GPIO1_5 | UART0_RTS_N | O | NA | NA | UART3_SOUT | O |
1406 | | GPIO1_6 | UART0_DTR_N | O | UART1_SOUT | O | NA | NA |
1407 | | GPIO1_7 | UART0_RI_N | I | UART1_SIN | I | NA | NA |
Stefan Roese17f50f222005-08-04 17:09:16 +02001408 | +------------------------------------------------------------------------------+
1409 |
1410 |
1411 +----------------------------------------------------------------------------*/
1412
Eugene OBriend2f68002007-07-31 10:24:56 +02001413void update_uart_ios(uart_config_nb_t uart_config, gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001414{
1415 switch (uart_config)
1416 {
1417 case L1:
1418 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001419 /* L1 configuration: UART0 = 8 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001420 /* ----------------------------------------------------------------------- */
1421 /* Update GPIO Configuration Table */
1422 gpio_tab[GPIO1][2].in_out = GPIO_IN;
1423 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT1;
1424
1425 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1426 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT1;
1427
1428 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1429 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1430
1431 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1432 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1433
1434 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1435 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT1;
1436
1437 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1438 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT1;
1439
1440 break;
1441
1442 case L2:
1443 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001444 /* L2 configuration: UART0 = 4 pins */
1445 /* UART1 = 4 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001446 /* ----------------------------------------------------------------------- */
1447 /* Update GPIO Configuration Table */
1448 gpio_tab[GPIO1][2].in_out = GPIO_IN;
1449 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT2;
1450
1451 gpio_tab[GPIO1][3].in_out = GPIO_OUT;
1452 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT2;
1453
1454 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1455 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1456
1457 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1458 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1459
1460 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1461 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1462
1463 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1464 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1465
1466 break;
1467
1468 case L3:
1469 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001470 /* L3 configuration: UART0 = 4 pins */
1471 /* UART1 = 2 pins */
1472 /* UART2 = 2 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001473 /* ----------------------------------------------------------------------- */
1474 /* Update GPIO Configuration Table */
1475 gpio_tab[GPIO1][2].in_out = GPIO_OUT;
1476 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT3;
1477
1478 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1479 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT3;
1480
1481 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1482 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1483
1484 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1485 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1486
1487 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1488 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1489
1490 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1491 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1492
1493 break;
1494
1495 case L4:
1496 /* ----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001497 /* L4 configuration: UART0 = 2 pins */
1498 /* UART1 = 2 pins */
1499 /* UART2 = 2 pins */
1500 /* UART3 = 2 pins */
Stefan Roese17f50f222005-08-04 17:09:16 +02001501 /* ----------------------------------------------------------------------- */
1502 /* Update GPIO Configuration Table */
1503 gpio_tab[GPIO1][2].in_out = GPIO_OUT;
1504 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT3;
1505
1506 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1507 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT3;
1508
1509 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1510 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT3;
1511
1512 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1513 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT3;
1514
1515 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1516 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1517
1518 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1519 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1520
1521 break;
1522
1523 default:
1524 /* Unsupported UART configuration number */
1525 printf("ERROR - Unsupported UART configuration number.\n\n");
1526 for (;;)
1527 ;
1528 break;
1529
1530 }
1531
1532 /* Set input Selection Register on Alt_Receive for UART Input Core */
1533 out32(GPIO1_IS1L, (in32(GPIO1_IS1L) | 0x0FC30000));
1534 out32(GPIO1_IS2L, (in32(GPIO1_IS2L) | 0x0C030000));
1535 out32(GPIO1_IS3L, (in32(GPIO1_IS3L) | 0x03C00000));
1536}
1537
1538/*----------------------------------------------------------------------------+
1539 | update_ndfc_ios(void).
1540 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001541void update_ndfc_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001542{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001543 /* Update GPIO Configuration Table */
1544 gpio_tab[GPIO0][6].in_out = GPIO_OUT; /* EBC_CS_N(1) */
1545 gpio_tab[GPIO0][6].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001546
Wolfgang Denkf901a832005-08-06 01:42:58 +02001547 gpio_tab[GPIO0][7].in_out = GPIO_OUT; /* EBC_CS_N(2) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001548 gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
1549
Stefan Roesea471db02007-06-01 15:19:29 +02001550#if 0
Wolfgang Denkf901a832005-08-06 01:42:58 +02001551 gpio_tab[GPIO0][7].in_out = GPIO_OUT; /* EBC_CS_N(3) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001552 gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
Stefan Roese8a316c92005-08-01 16:49:12 +02001553#endif
Stefan Roese17f50f222005-08-04 17:09:16 +02001554}
1555
1556/*----------------------------------------------------------------------------+
1557 | update_zii_ios(void).
1558 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001559void update_zii_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001560{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001561 /* Update GPIO Configuration Table */
1562 gpio_tab[GPIO0][12].in_out = GPIO_IN; /* ZII_p0Rxd(0) */
1563 gpio_tab[GPIO0][12].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001564
Wolfgang Denkf901a832005-08-06 01:42:58 +02001565 gpio_tab[GPIO0][13].in_out = GPIO_IN; /* ZII_p0Rxd(1) */
1566 gpio_tab[GPIO0][13].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001567
Wolfgang Denkf901a832005-08-06 01:42:58 +02001568 gpio_tab[GPIO0][14].in_out = GPIO_IN; /* ZII_p0Rxd(2) */
1569 gpio_tab[GPIO0][14].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001570
Wolfgang Denkf901a832005-08-06 01:42:58 +02001571 gpio_tab[GPIO0][15].in_out = GPIO_IN; /* ZII_p0Rxd(3) */
1572 gpio_tab[GPIO0][15].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001573
Wolfgang Denkf901a832005-08-06 01:42:58 +02001574 gpio_tab[GPIO0][16].in_out = GPIO_OUT; /* ZII_p0Txd(0) */
1575 gpio_tab[GPIO0][16].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001576
Wolfgang Denkf901a832005-08-06 01:42:58 +02001577 gpio_tab[GPIO0][17].in_out = GPIO_OUT; /* ZII_p0Txd(1) */
1578 gpio_tab[GPIO0][17].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001579
Wolfgang Denkf901a832005-08-06 01:42:58 +02001580 gpio_tab[GPIO0][18].in_out = GPIO_OUT; /* ZII_p0Txd(2) */
1581 gpio_tab[GPIO0][18].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001582
Wolfgang Denkf901a832005-08-06 01:42:58 +02001583 gpio_tab[GPIO0][19].in_out = GPIO_OUT; /* ZII_p0Txd(3) */
1584 gpio_tab[GPIO0][19].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001585
Wolfgang Denkf901a832005-08-06 01:42:58 +02001586 gpio_tab[GPIO0][20].in_out = GPIO_IN; /* ZII_p0Rx_er */
1587 gpio_tab[GPIO0][20].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001588
Wolfgang Denkf901a832005-08-06 01:42:58 +02001589 gpio_tab[GPIO0][21].in_out = GPIO_IN; /* ZII_p0Rx_dv */
1590 gpio_tab[GPIO0][21].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001591
Wolfgang Denkf901a832005-08-06 01:42:58 +02001592 gpio_tab[GPIO0][22].in_out = GPIO_IN; /* ZII_p0Crs */
1593 gpio_tab[GPIO0][22].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001594
Wolfgang Denkf901a832005-08-06 01:42:58 +02001595 gpio_tab[GPIO0][23].in_out = GPIO_OUT; /* ZII_p0Tx_er */
1596 gpio_tab[GPIO0][23].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001597
Wolfgang Denkf901a832005-08-06 01:42:58 +02001598 gpio_tab[GPIO0][24].in_out = GPIO_OUT; /* ZII_p0Tx_en */
1599 gpio_tab[GPIO0][24].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001600
Wolfgang Denkf901a832005-08-06 01:42:58 +02001601 gpio_tab[GPIO0][25].in_out = GPIO_IN; /* ZII_p0Col */
1602 gpio_tab[GPIO0][25].alt_nb = GPIO_ALT1;
Stefan Roese17f50f222005-08-04 17:09:16 +02001603
1604}
1605
1606/*----------------------------------------------------------------------------+
1607 | update_uic_0_3_irq_ios().
1608 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001609void update_uic_0_3_irq_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001610{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001611 gpio_tab[GPIO1][8].in_out = GPIO_IN; /* UIC_IRQ(0) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001612 gpio_tab[GPIO1][8].alt_nb = GPIO_ALT1;
1613
Wolfgang Denkf901a832005-08-06 01:42:58 +02001614 gpio_tab[GPIO1][9].in_out = GPIO_IN; /* UIC_IRQ(1) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001615 gpio_tab[GPIO1][9].alt_nb = GPIO_ALT1;
1616
Wolfgang Denkf901a832005-08-06 01:42:58 +02001617 gpio_tab[GPIO1][10].in_out = GPIO_IN; /* UIC_IRQ(2) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001618 gpio_tab[GPIO1][10].alt_nb = GPIO_ALT1;
1619
Wolfgang Denkf901a832005-08-06 01:42:58 +02001620 gpio_tab[GPIO1][11].in_out = GPIO_IN; /* UIC_IRQ(3) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001621 gpio_tab[GPIO1][11].alt_nb = GPIO_ALT1;
1622}
1623
1624/*----------------------------------------------------------------------------+
1625 | update_uic_4_9_irq_ios().
1626 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001627void update_uic_4_9_irq_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001628{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001629 gpio_tab[GPIO1][12].in_out = GPIO_IN; /* UIC_IRQ(4) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001630 gpio_tab[GPIO1][12].alt_nb = GPIO_ALT1;
1631
Wolfgang Denkf901a832005-08-06 01:42:58 +02001632 gpio_tab[GPIO1][13].in_out = GPIO_IN; /* UIC_IRQ(6) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001633 gpio_tab[GPIO1][13].alt_nb = GPIO_ALT1;
1634
Wolfgang Denkf901a832005-08-06 01:42:58 +02001635 gpio_tab[GPIO1][14].in_out = GPIO_IN; /* UIC_IRQ(7) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001636 gpio_tab[GPIO1][14].alt_nb = GPIO_ALT1;
1637
Wolfgang Denkf901a832005-08-06 01:42:58 +02001638 gpio_tab[GPIO1][15].in_out = GPIO_IN; /* UIC_IRQ(8) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001639 gpio_tab[GPIO1][15].alt_nb = GPIO_ALT1;
1640
Wolfgang Denkf901a832005-08-06 01:42:58 +02001641 gpio_tab[GPIO1][16].in_out = GPIO_IN; /* UIC_IRQ(9) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001642 gpio_tab[GPIO1][16].alt_nb = GPIO_ALT1;
1643}
1644
1645/*----------------------------------------------------------------------------+
1646 | update_dma_a_b_ios().
1647 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001648void update_dma_a_b_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001649{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001650 gpio_tab[GPIO1][12].in_out = GPIO_OUT; /* DMA_ACK(1) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001651 gpio_tab[GPIO1][12].alt_nb = GPIO_ALT2;
1652
Wolfgang Denkf901a832005-08-06 01:42:58 +02001653 gpio_tab[GPIO1][13].in_out = GPIO_BI; /* DMA_EOT/TC(1) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001654 gpio_tab[GPIO1][13].alt_nb = GPIO_ALT2;
1655
Wolfgang Denkf901a832005-08-06 01:42:58 +02001656 gpio_tab[GPIO1][14].in_out = GPIO_IN; /* DMA_REQ(0) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001657 gpio_tab[GPIO1][14].alt_nb = GPIO_ALT2;
1658
Wolfgang Denkf901a832005-08-06 01:42:58 +02001659 gpio_tab[GPIO1][15].in_out = GPIO_OUT; /* DMA_ACK(0) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001660 gpio_tab[GPIO1][15].alt_nb = GPIO_ALT2;
1661
Wolfgang Denkf901a832005-08-06 01:42:58 +02001662 gpio_tab[GPIO1][16].in_out = GPIO_BI; /* DMA_EOT/TC(0) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001663 gpio_tab[GPIO1][16].alt_nb = GPIO_ALT2;
1664}
1665
1666/*----------------------------------------------------------------------------+
1667 | update_dma_c_d_ios().
1668 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001669void update_dma_c_d_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001670{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001671 gpio_tab[GPIO0][0].in_out = GPIO_IN; /* DMA_REQ(2) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001672 gpio_tab[GPIO0][0].alt_nb = GPIO_ALT2;
1673
Wolfgang Denkf901a832005-08-06 01:42:58 +02001674 gpio_tab[GPIO0][1].in_out = GPIO_OUT; /* DMA_ACK(2) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001675 gpio_tab[GPIO0][1].alt_nb = GPIO_ALT2;
1676
Wolfgang Denkf901a832005-08-06 01:42:58 +02001677 gpio_tab[GPIO0][2].in_out = GPIO_BI; /* DMA_EOT/TC(2) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001678 gpio_tab[GPIO0][2].alt_nb = GPIO_ALT2;
1679
Wolfgang Denkf901a832005-08-06 01:42:58 +02001680 gpio_tab[GPIO0][3].in_out = GPIO_IN; /* DMA_REQ(3) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001681 gpio_tab[GPIO0][3].alt_nb = GPIO_ALT2;
1682
Wolfgang Denkf901a832005-08-06 01:42:58 +02001683 gpio_tab[GPIO0][4].in_out = GPIO_OUT; /* DMA_ACK(3) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001684 gpio_tab[GPIO0][4].alt_nb = GPIO_ALT2;
1685
Wolfgang Denkf901a832005-08-06 01:42:58 +02001686 gpio_tab[GPIO0][5].in_out = GPIO_BI; /* DMA_EOT/TC(3) */
Stefan Roese17f50f222005-08-04 17:09:16 +02001687 gpio_tab[GPIO0][5].alt_nb = GPIO_ALT2;
1688
1689}
1690
1691/*----------------------------------------------------------------------------+
1692 | update_ebc_master_ios().
1693 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001694void update_ebc_master_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001695{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001696 gpio_tab[GPIO0][27].in_out = GPIO_IN; /* EXT_EBC_REQ */
Stefan Roese17f50f222005-08-04 17:09:16 +02001697 gpio_tab[GPIO0][27].alt_nb = GPIO_ALT1;
1698
Wolfgang Denkf901a832005-08-06 01:42:58 +02001699 gpio_tab[GPIO0][29].in_out = GPIO_OUT; /* EBC_EXT_HDLA */
Stefan Roese17f50f222005-08-04 17:09:16 +02001700 gpio_tab[GPIO0][29].alt_nb = GPIO_ALT1;
1701
Wolfgang Denkf901a832005-08-06 01:42:58 +02001702 gpio_tab[GPIO0][30].in_out = GPIO_OUT; /* EBC_EXT_ACK */
Stefan Roese17f50f222005-08-04 17:09:16 +02001703 gpio_tab[GPIO0][30].alt_nb = GPIO_ALT1;
1704
Wolfgang Denkf901a832005-08-06 01:42:58 +02001705 gpio_tab[GPIO0][31].in_out = GPIO_OUT; /* EBC_EXR_BUSREQ */
Stefan Roese17f50f222005-08-04 17:09:16 +02001706 gpio_tab[GPIO0][31].alt_nb = GPIO_ALT1;
1707}
1708
1709/*----------------------------------------------------------------------------+
1710 | update_usb2_device_ios().
1711 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001712void update_usb2_device_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001713{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001714 gpio_tab[GPIO0][26].in_out = GPIO_IN; /* USB2D_RXVALID */
Stefan Roese17f50f222005-08-04 17:09:16 +02001715 gpio_tab[GPIO0][26].alt_nb = GPIO_ALT2;
1716
Wolfgang Denkf901a832005-08-06 01:42:58 +02001717 gpio_tab[GPIO0][27].in_out = GPIO_IN; /* USB2D_RXERROR */
Stefan Roese17f50f222005-08-04 17:09:16 +02001718 gpio_tab[GPIO0][27].alt_nb = GPIO_ALT2;
1719
Wolfgang Denkf901a832005-08-06 01:42:58 +02001720 gpio_tab[GPIO0][28].in_out = GPIO_OUT; /* USB2D_TXVALID */
Stefan Roese17f50f222005-08-04 17:09:16 +02001721 gpio_tab[GPIO0][28].alt_nb = GPIO_ALT2;
1722
Wolfgang Denkf901a832005-08-06 01:42:58 +02001723 gpio_tab[GPIO0][29].in_out = GPIO_OUT; /* USB2D_PAD_SUSPNDM */
Stefan Roese17f50f222005-08-04 17:09:16 +02001724 gpio_tab[GPIO0][29].alt_nb = GPIO_ALT2;
1725
Wolfgang Denkf901a832005-08-06 01:42:58 +02001726 gpio_tab[GPIO0][30].in_out = GPIO_OUT; /* USB2D_XCVRSELECT */
Stefan Roese17f50f222005-08-04 17:09:16 +02001727 gpio_tab[GPIO0][30].alt_nb = GPIO_ALT2;
1728
Wolfgang Denkf901a832005-08-06 01:42:58 +02001729 gpio_tab[GPIO0][31].in_out = GPIO_OUT; /* USB2D_TERMSELECT */
Stefan Roese17f50f222005-08-04 17:09:16 +02001730 gpio_tab[GPIO0][31].alt_nb = GPIO_ALT2;
1731
Wolfgang Denkf901a832005-08-06 01:42:58 +02001732 gpio_tab[GPIO1][0].in_out = GPIO_OUT; /* USB2D_OPMODE0 */
Stefan Roese17f50f222005-08-04 17:09:16 +02001733 gpio_tab[GPIO1][0].alt_nb = GPIO_ALT1;
1734
Wolfgang Denkf901a832005-08-06 01:42:58 +02001735 gpio_tab[GPIO1][1].in_out = GPIO_OUT; /* USB2D_OPMODE1 */
Stefan Roese17f50f222005-08-04 17:09:16 +02001736 gpio_tab[GPIO1][1].alt_nb = GPIO_ALT1;
1737
1738}
1739
1740/*----------------------------------------------------------------------------+
1741 | update_pci_patch_ios().
1742 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001743void update_pci_patch_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001744{
Wolfgang Denkf901a832005-08-06 01:42:58 +02001745 gpio_tab[GPIO0][29].in_out = GPIO_OUT; /* EBC_EXT_HDLA */
Stefan Roese17f50f222005-08-04 17:09:16 +02001746 gpio_tab[GPIO0][29].alt_nb = GPIO_ALT1;
1747}
1748
1749/*----------------------------------------------------------------------------+
Eugene OBriend2f68002007-07-31 10:24:56 +02001750 | set_chip_gpio_configuration(unsigned char gpio_core,
1751 | gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001752 | Put the core impacted by clock modification and sharing in reset.
1753 | Config the select registers to resolve the sharing depending of the config.
1754 | Configure the GPIO registers.
1755 |
1756 +----------------------------------------------------------------------------*/
Eugene OBriend2f68002007-07-31 10:24:56 +02001757void set_chip_gpio_configuration(unsigned char gpio_core, gpio_param_s (*gpio_tab)[GPIO_MAX])
Stefan Roese17f50f222005-08-04 17:09:16 +02001758{
1759 unsigned char i=0, j=0, reg_offset = 0;
1760 unsigned long gpio_reg, gpio_core_add;
1761
1762 /* GPIO config of the GPIOs 0 to 31 */
1763 for (i=0; i<GPIO_MAX; i++, j++)
1764 {
1765 if (i == GPIO_MAX/2)
1766 {
1767 reg_offset = 4;
1768 j = i-16;
1769 }
1770
1771 gpio_core_add = gpio_tab[gpio_core][i].add;
1772
1773 if ( (gpio_tab[gpio_core][i].in_out == GPIO_IN) ||
1774 (gpio_tab[gpio_core][i].in_out == GPIO_BI ))
1775 {
1776 switch (gpio_tab[gpio_core][i].alt_nb)
1777 {
1778 case GPIO_SEL:
1779 break;
1780
1781 case GPIO_ALT1:
1782 gpio_reg = in32(GPIO_IS1(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1783 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1784 out32(GPIO_IS1(gpio_core_add+reg_offset), gpio_reg);
1785 break;
1786
1787 case GPIO_ALT2:
1788 gpio_reg = in32(GPIO_IS2(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1789 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1790 out32(GPIO_IS2(gpio_core_add+reg_offset), gpio_reg);
1791 break;
1792
1793 case GPIO_ALT3:
1794 gpio_reg = in32(GPIO_IS3(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1795 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1796 out32(GPIO_IS3(gpio_core_add+reg_offset), gpio_reg);
1797 break;
1798 }
1799 }
1800 if ( (gpio_tab[gpio_core][i].in_out == GPIO_OUT) ||
1801 (gpio_tab[gpio_core][i].in_out == GPIO_BI ))
1802 {
1803
1804 switch (gpio_tab[gpio_core][i].alt_nb)
1805 {
1806 case GPIO_SEL:
1807 break;
1808 case GPIO_ALT1:
1809 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1810 gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
1811 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1812 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1813 gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
1814 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1815 break;
1816 case GPIO_ALT2:
1817 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1818 gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
1819 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1820 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1821 gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
1822 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1823 break;
1824 case GPIO_ALT3:
1825 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1826 gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
1827 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1828 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1829 gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
1830 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1831 break;
1832 }
1833 }
1834 }
1835}
1836
1837/*----------------------------------------------------------------------------+
1838 | force_bup_core_selection.
1839 +----------------------------------------------------------------------------*/
1840void force_bup_core_selection(core_selection_t *core_select_P, config_validity_t *config_val_P)
1841{
1842 /* Pointer invalid */
1843 if (core_select_P == NULL)
1844 {
1845 printf("Configuration invalid pointer 1\n");
1846 for (;;)
1847 ;
1848 }
1849
1850 /* L4 Selection */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001851 *(core_select_P+UART_CORE0) = CORE_SELECTED;
1852 *(core_select_P+UART_CORE1) = CORE_SELECTED;
1853 *(core_select_P+UART_CORE2) = CORE_SELECTED;
1854 *(core_select_P+UART_CORE3) = CORE_SELECTED;
Stefan Roese17f50f222005-08-04 17:09:16 +02001855
1856 /* RMII Selection */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001857 *(core_select_P+RMII_SEL) = CORE_SELECTED;
Stefan Roese17f50f222005-08-04 17:09:16 +02001858
1859 /* External Interrupt 0-9 selection */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001860 *(core_select_P+UIC_0_3) = CORE_SELECTED;
1861 *(core_select_P+UIC_4_9) = CORE_SELECTED;
Stefan Roese17f50f222005-08-04 17:09:16 +02001862
Stefan Roesec57c7982005-08-11 17:56:56 +02001863 *(core_select_P+SCP_CORE) = CORE_SELECTED;
1864 *(core_select_P+DMA_CHANNEL_CD) = CORE_SELECTED;
1865 *(core_select_P+PACKET_REJ_FUNC_AVAIL) = CORE_SELECTED;
Wolfgang Denkf901a832005-08-06 01:42:58 +02001866 *(core_select_P+USB1_DEVICE) = CORE_SELECTED;
Stefan Roese17f50f222005-08-04 17:09:16 +02001867
Stefan Roesec57c7982005-08-11 17:56:56 +02001868 if (is_nand_selected()) {
1869 *(core_select_P+NAND_FLASH) = CORE_SELECTED;
1870 }
1871
Stefan Roese17f50f222005-08-04 17:09:16 +02001872 *config_val_P = CONFIG_IS_VALID;
1873
1874}
1875
1876/*----------------------------------------------------------------------------+
1877 | configure_ppc440ep_pins.
1878 +----------------------------------------------------------------------------*/
1879void configure_ppc440ep_pins(void)
1880{
1881 uart_config_nb_t uart_configuration;
1882 config_validity_t config_val = CONFIG_IS_INVALID;
1883
1884 /* Create Core Selection Table */
1885 core_selection_t ppc440ep_core_selection[MAX_CORE_SELECT_NB] =
1886 {
Wolfgang Denkf901a832005-08-06 01:42:58 +02001887 CORE_NOT_SELECTED, /* IIC_CORE, */
1888 CORE_NOT_SELECTED, /* SPC_CORE, */
1889 CORE_NOT_SELECTED, /* DMA_CHANNEL_AB, */
1890 CORE_NOT_SELECTED, /* UIC_4_9, */
1891 CORE_NOT_SELECTED, /* USB2_HOST, */
1892 CORE_NOT_SELECTED, /* DMA_CHANNEL_CD, */
1893 CORE_NOT_SELECTED, /* USB2_DEVICE, */
1894 CORE_NOT_SELECTED, /* PACKET_REJ_FUNC_AVAIL, */
1895 CORE_NOT_SELECTED, /* USB1_DEVICE, */
1896 CORE_NOT_SELECTED, /* EBC_MASTER, */
1897 CORE_NOT_SELECTED, /* NAND_FLASH, */
1898 CORE_NOT_SELECTED, /* UART_CORE0, */
1899 CORE_NOT_SELECTED, /* UART_CORE1, */
1900 CORE_NOT_SELECTED, /* UART_CORE2, */
1901 CORE_NOT_SELECTED, /* UART_CORE3, */
1902 CORE_NOT_SELECTED, /* MII_SEL, */
1903 CORE_NOT_SELECTED, /* RMII_SEL, */
1904 CORE_NOT_SELECTED, /* SMII_SEL, */
1905 CORE_NOT_SELECTED, /* PACKET_REJ_FUNC_EN */
1906 CORE_NOT_SELECTED, /* UIC_0_3 */
1907 CORE_NOT_SELECTED, /* USB1_HOST */
1908 CORE_NOT_SELECTED /* PCI_PATCH */
Stefan Roese17f50f222005-08-04 17:09:16 +02001909 };
1910
Eugene OBriend2f68002007-07-31 10:24:56 +02001911 gpio_param_s gpio_tab[GPIO_GROUP_MAX][GPIO_MAX];
Stefan Roese17f50f222005-08-04 17:09:16 +02001912
1913 /* Table Default Initialisation + FPGA Access */
Eugene OBriend2f68002007-07-31 10:24:56 +02001914 init_default_gpio(gpio_tab);
1915 set_chip_gpio_configuration(GPIO0, gpio_tab);
1916 set_chip_gpio_configuration(GPIO1, gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001917
1918 /* Update Table */
1919 force_bup_core_selection(ppc440ep_core_selection, &config_val);
1920#if 0 /* test-only */
1921 /* If we are running PIBS 1, force known configuration */
1922 update_core_selection_table(ppc440ep_core_selection, &config_val);
1923#endif
1924
1925 /*----------------------------------------------------------------------------+
1926 | SDR + ios table update + fpga initialization
1927 +----------------------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001928 unsigned long sdr0_pfc1 = 0;
1929 unsigned long sdr0_usb0 = 0;
1930 unsigned long sdr0_mfr = 0;
Stefan Roese17f50f222005-08-04 17:09:16 +02001931
1932 /* PCI Always selected */
1933
1934 /* I2C Selection */
1935 if (ppc440ep_core_selection[IIC_CORE] == CORE_SELECTED)
1936 {
1937 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SIS_MASK) | SDR0_PFC1_SIS_IIC1_SEL;
1938 iic1_selection_in_fpga();
1939 }
1940
1941 /* SCP Selection */
1942 if (ppc440ep_core_selection[SCP_CORE] == CORE_SELECTED)
1943 {
1944 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SIS_MASK) | SDR0_PFC1_SIS_SCP_SEL;
1945 scp_selection_in_fpga();
1946 }
1947
1948 /* UIC 0:3 Selection */
1949 if (ppc440ep_core_selection[UIC_0_3] == CORE_SELECTED)
1950 {
Eugene OBriend2f68002007-07-31 10:24:56 +02001951 update_uic_0_3_irq_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001952 dma_a_b_unselect_in_fpga();
1953 }
1954
1955 /* UIC 4:9 Selection */
1956 if (ppc440ep_core_selection[UIC_4_9] == CORE_SELECTED)
1957 {
1958 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_DIS_MASK) | SDR0_PFC1_DIS_UICIRQ5_SEL;
Eugene OBriend2f68002007-07-31 10:24:56 +02001959 update_uic_4_9_irq_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001960 }
1961
1962 /* DMA AB Selection */
1963 if (ppc440ep_core_selection[DMA_CHANNEL_AB] == CORE_SELECTED)
1964 {
1965 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_DIS_MASK) | SDR0_PFC1_DIS_DMAR_SEL;
Eugene OBriend2f68002007-07-31 10:24:56 +02001966 update_dma_a_b_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001967 dma_a_b_selection_in_fpga();
1968 }
1969
1970 /* DMA CD Selection */
1971 if (ppc440ep_core_selection[DMA_CHANNEL_CD] == CORE_SELECTED)
1972 {
Eugene OBriend2f68002007-07-31 10:24:56 +02001973 update_dma_c_d_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001974 dma_c_d_selection_in_fpga();
1975 }
1976
1977 /* EBC Master Selection */
1978 if (ppc440ep_core_selection[EBC_MASTER] == CORE_SELECTED)
1979 {
1980 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_ERE_MASK) | SDR0_PFC1_ERE_EXTR_SEL;
1981 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_EBCHR_SEL;
Eugene OBriend2f68002007-07-31 10:24:56 +02001982 update_ebc_master_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001983 }
1984
1985 /* PCI Patch Enable */
1986 if (ppc440ep_core_selection[PCI_PATCH] == CORE_SELECTED)
1987 {
1988 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_EBCHR_SEL;
Eugene OBriend2f68002007-07-31 10:24:56 +02001989 update_pci_patch_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02001990 }
1991
1992 /* USB2 Host Selection - Not Implemented in PowerPC 440EP Pass1 */
1993 if (ppc440ep_core_selection[USB2_HOST] == CORE_SELECTED)
1994 {
1995 /* Not Implemented in PowerPC 440EP Pass1-Pass2 */
1996 printf("Invalid configuration => USB2 Host selected\n");
1997 for (;;)
1998 ;
1999 /*usb2_host_selection_in_fpga(); */
2000 }
2001
2002 /* USB2.0 Device Selection */
2003 if (ppc440ep_core_selection[USB2_DEVICE] == CORE_SELECTED)
2004 {
Eugene OBriend2f68002007-07-31 10:24:56 +02002005 update_usb2_device_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002006 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_USB2D_SEL;
2007 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UPR_MASK) | SDR0_PFC1_UPR_DISABLE;
2008
2009 mfsdr(sdr_usb0, sdr0_usb0);
2010 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_USB_DEVSEL_MASK;
2011 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_USB20D_DEVSEL;
2012 mtsdr(sdr_usb0, sdr0_usb0);
2013
2014 usb2_device_selection_in_fpga();
2015 }
2016
2017 /* USB1.1 Device Selection */
2018 if (ppc440ep_core_selection[USB1_DEVICE] == CORE_SELECTED)
2019 {
2020 mfsdr(sdr_usb0, sdr0_usb0);
2021 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_USB_DEVSEL_MASK;
2022 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_USB11D_DEVSEL;
2023 mtsdr(sdr_usb0, sdr0_usb0);
2024 }
2025
2026 /* USB1.1 Host Selection */
2027 if (ppc440ep_core_selection[USB1_HOST] == CORE_SELECTED)
2028 {
2029 mfsdr(sdr_usb0, sdr0_usb0);
2030 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_LEEN_MASK;
2031 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_LEEN_ENABLE;
2032 mtsdr(sdr_usb0, sdr0_usb0);
2033 }
2034
2035 /* NAND Flash Selection */
2036 if (ppc440ep_core_selection[NAND_FLASH] == CORE_SELECTED)
2037 {
Eugene OBriend2f68002007-07-31 10:24:56 +02002038 update_ndfc_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002039
Stefan Roesea471db02007-06-01 15:19:29 +02002040#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
Stefan Roese17f50f222005-08-04 17:09:16 +02002041 mtsdr(sdr_cust0, SDR0_CUST0_MUX_NDFC_SEL |
Wolfgang Denkf901a832005-08-06 01:42:58 +02002042 SDR0_CUST0_NDFC_ENABLE |
2043 SDR0_CUST0_NDFC_BW_8_BIT |
2044 SDR0_CUST0_NDFC_ARE_MASK |
Stefan Roesec57c7982005-08-11 17:56:56 +02002045 SDR0_CUST0_CHIPSELGAT_EN1 |
2046 SDR0_CUST0_CHIPSELGAT_EN2);
Stefan Roesea471db02007-06-01 15:19:29 +02002047#else
2048 mtsdr(sdr_cust0, SDR0_CUST0_MUX_NDFC_SEL |
2049 SDR0_CUST0_NDFC_ENABLE |
2050 SDR0_CUST0_NDFC_BW_8_BIT |
2051 SDR0_CUST0_NDFC_ARE_MASK |
2052 SDR0_CUST0_CHIPSELGAT_EN0 |
2053 SDR0_CUST0_CHIPSELGAT_EN2);
2054#endif
Stefan Roese17f50f222005-08-04 17:09:16 +02002055
2056 ndfc_selection_in_fpga();
2057 }
2058 else
2059 {
2060 /* Set Mux on EMAC */
2061 mtsdr(sdr_cust0, SDR0_CUST0_MUX_EMAC_SEL);
2062 }
2063
2064 /* MII Selection */
2065 if (ppc440ep_core_selection[MII_SEL] == CORE_SELECTED)
2066 {
Eugene OBriend2f68002007-07-31 10:24:56 +02002067 update_zii_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002068 mfsdr(sdr_mfr, sdr0_mfr);
2069 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_MII;
2070 mtsdr(sdr_mfr, sdr0_mfr);
2071
2072 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_MII);
2073 }
2074
2075 /* RMII Selection */
2076 if (ppc440ep_core_selection[RMII_SEL] == CORE_SELECTED)
2077 {
Eugene OBriend2f68002007-07-31 10:24:56 +02002078 update_zii_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002079 mfsdr(sdr_mfr, sdr0_mfr);
2080 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_RMII_10M;
2081 mtsdr(sdr_mfr, sdr0_mfr);
2082
2083 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_RMII);
2084 }
2085
2086 /* SMII Selection */
2087 if (ppc440ep_core_selection[SMII_SEL] == CORE_SELECTED)
2088 {
Eugene OBriend2f68002007-07-31 10:24:56 +02002089 update_zii_ios(gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002090 mfsdr(sdr_mfr, sdr0_mfr);
2091 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_SMII;
2092 mtsdr(sdr_mfr, sdr0_mfr);
2093
2094 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_SMII);
2095 }
2096
2097 /* UART Selection */
2098 uart_configuration = get_uart_configuration();
2099 switch (uart_configuration)
2100 {
Wolfgang Denkf901a832005-08-06 01:42:58 +02002101 case L1: /* L1 Selection */
Stefan Roese17f50f222005-08-04 17:09:16 +02002102 /* UART0 8 pins Only */
2103 /*sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U0ME_DSR_DTR; */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002104 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) |SDR0_PFC1_U0ME_CTS_RTS; /* Chip Pb */
Stefan Roese17f50f222005-08-04 17:09:16 +02002105 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_8PINS;
2106 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02002107 case L2: /* L2 Selection */
Stefan Roese17f50f222005-08-04 17:09:16 +02002108 /* UART0 and UART1 4 pins */
2109 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
2110 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
2111 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
2112 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02002113 case L3: /* L3 Selection */
Stefan Roese17f50f222005-08-04 17:09:16 +02002114 /* UART0 4 pins, UART1 and UART2 2 pins */
2115 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
2116 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
2117 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
2118 break;
Wolfgang Denkf901a832005-08-06 01:42:58 +02002119 case L4: /* L4 Selection */
Stefan Roese17f50f222005-08-04 17:09:16 +02002120 /* UART0, UART1, UART2 and UART3 2 pins */
2121 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U0ME_DSR_DTR;
2122 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
2123 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
2124 break;
2125 }
Eugene OBriend2f68002007-07-31 10:24:56 +02002126 update_uart_ios(uart_configuration, gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002127
2128 /* UART Selection in all cases */
2129 uart_selection_in_fpga(uart_configuration);
2130
2131 /* Packet Reject Function Available */
2132 if (ppc440ep_core_selection[PACKET_REJ_FUNC_AVAIL] == CORE_SELECTED)
2133 {
2134 /* Set UPR Bit in SDR0_PFC1 Register */
2135 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UPR_MASK) | SDR0_PFC1_UPR_ENABLE;
2136 }
2137
2138 /* Packet Reject Function Enable */
2139 if (ppc440ep_core_selection[PACKET_REJ_FUNC_EN] == CORE_SELECTED)
2140 {
2141 mfsdr(sdr_mfr, sdr0_mfr);
2142 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_PKT_REJ_MASK) | SDR0_MFR_PKT_REJ_EN;;
2143 mtsdr(sdr_mfr, sdr0_mfr);
2144 }
2145
2146 /* Perform effective access to hardware */
2147 mtsdr(sdr_pfc1, sdr0_pfc1);
Eugene OBriend2f68002007-07-31 10:24:56 +02002148 set_chip_gpio_configuration(GPIO0, gpio_tab);
2149 set_chip_gpio_configuration(GPIO1, gpio_tab);
Stefan Roese17f50f222005-08-04 17:09:16 +02002150
2151 /* USB2.0 Device Reset must be done after GPIO setting */
2152 if (ppc440ep_core_selection[USB2_DEVICE] == CORE_SELECTED)
2153 usb2_device_reset_through_fpga();
2154
2155}