]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - board/amcc/bamboo/bamboo.c
ppc4xx: Move gpio.h to ppc4xx-gpio.h since its ppc4xx specific
[karo-tx-uboot.git] / board / amcc / bamboo / bamboo.c
1 /*
2  * (C) Copyright 2005-2007
3  * 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
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * 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>
26 #include <asm/ppc4xx-gpio.h>
27 #include <spd_sdram.h>
28 #include <asm/ppc440.h>
29 #include "bamboo.h"
30
31 void ext_bus_cntlr_init(void);
32 void configure_ppc440ep_pins(void);
33 int is_nand_selected(void);
34
35 #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  ************************************************************************/
55 const 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         0x00,    /* SDRAM Access from clock */
71 #ifdef CONFIG_DDR_ECC
72         0x02,    /* ECC ON : 02 OFF : 00 */
73 #else
74         0x00,    /* ECC ON : 02 OFF : 00 */
75 #endif
76         0x82,    /* refresh Rate Type: Normal (7.8us) + Self refresh */
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
198
199 #if 0
200 {          /* 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     }
271 };
272 #endif
273
274 /*----------------------------------------------------------------------------+
275   | EBC Devices Characteristics
276   |   Peripheral Bank Access Parameters       -   EBC0_BnAP
277   |   Peripheral Bank Configuration Register  -   EBC0_BnCR
278   +----------------------------------------------------------------------------*/
279 /* Small Flash */
280 #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                 |       \
291         EBC0_BNAP_PEN_DISABLED
292
293 #define EBC0_BNCR_SMALL_FLASH_CS0                       \
294         EBC0_BNCR_BAS_ENCODE(0xFFF00000)        |       \
295         EBC0_BNCR_BS_1MB                        |       \
296         EBC0_BNCR_BU_RW                         |       \
297         EBC0_BNCR_BW_8BIT
298
299 #define EBC0_BNCR_SMALL_FLASH_CS4                       \
300         EBC0_BNCR_BAS_ENCODE(0x87F00000)        |       \
301         EBC0_BNCR_BS_1MB                        |       \
302         EBC0_BNCR_BU_RW                         |       \
303         EBC0_BNCR_BW_8BIT
304
305 /* Large Flash or SRAM */
306 #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                        |       \
316         EBC0_BNAP_PEN_DISABLED
317
318 #define EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS0               \
319         EBC0_BNCR_BAS_ENCODE(0xFF800000)        |       \
320         EBC0_BNCR_BS_8MB                        |       \
321         EBC0_BNCR_BU_RW                         |       \
322         EBC0_BNCR_BW_16BIT
323
324
325 #define EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4               \
326         EBC0_BNCR_BAS_ENCODE(0x87800000)        |       \
327         EBC0_BNCR_BS_8MB                        |       \
328         EBC0_BNCR_BU_RW                         |       \
329         EBC0_BNCR_BW_16BIT
330
331 /* NVRAM - FPGA */
332 #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                 |       \
343         EBC0_BNAP_PEN_DISABLED
344
345 #define EBC0_BNCR_NVRAM_FPGA_CS5                        \
346         EBC0_BNCR_BAS_ENCODE(0x80000000)        |       \
347         EBC0_BNCR_BS_1MB                        |       \
348         EBC0_BNCR_BU_RW                         |       \
349         EBC0_BNCR_BW_8BIT
350
351 /* Nand Flash */
352 #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                        |       \
363         EBC0_BNAP_PEN_DISABLED
364
365
366 #define EBC0_BNCR_NAND_FLASH_CS0        0xB8400000
367
368 /* NAND0 */
369 #define EBC0_BNCR_NAND_FLASH_CS1                        \
370         EBC0_BNCR_BAS_ENCODE(0x90000000)        |       \
371         EBC0_BNCR_BS_1MB                        |       \
372         EBC0_BNCR_BU_RW                         |       \
373         EBC0_BNCR_BW_32BIT
374 /* NAND1 - Bank2 */
375 #define EBC0_BNCR_NAND_FLASH_CS2                        \
376         EBC0_BNCR_BAS_ENCODE(0x94000000)        |       \
377         EBC0_BNCR_BS_1MB                        |       \
378         EBC0_BNCR_BU_RW                         |       \
379         EBC0_BNCR_BW_32BIT
380
381 /* NAND1 - Bank3 */
382 #define EBC0_BNCR_NAND_FLASH_CS3                        \
383         EBC0_BNCR_BAS_ENCODE(0x94000000)        |       \
384         EBC0_BNCR_BS_1MB                        |       \
385         EBC0_BNCR_BU_RW                         |       \
386         EBC0_BNCR_BW_32BIT
387
388 int board_early_init_f(void)
389 {
390         ext_bus_cntlr_init();
391
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          *-------------------------------------------------------------------*/
414         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);
424
425         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);
435
436         configure_ppc440ep_pins();
437
438         return 0;
439 }
440
441 int checkboard(void)
442 {
443         char *s = getenv("serial#");
444
445         printf("Board: Bamboo - AMCC PPC440EP Evaluation Board");
446         if (s != NULL) {
447                 puts(", serial# ");
448                 puts(s);
449         }
450         putc('\n');
451
452         return (0);
453 }
454
455
456 phys_size_t initdram (int board_type)
457 {
458 #if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
459         long dram_size;
460
461         dram_size = spd_sdram();
462
463         return dram_size;
464 #else
465         return CONFIG_SYS_MBYTES_SDRAM << 20;
466 #endif
467 }
468
469 /*----------------------------------------------------------------------------+
470   | is_powerpc440ep_pass1.
471   +----------------------------------------------------------------------------*/
472 int is_powerpc440ep_pass1(void)
473 {
474         unsigned long pvr;
475
476         pvr = get_pvr();
477
478         if (pvr == PVR_POWERPC_440EP_PASS1)
479                 return TRUE;
480         else if (pvr == PVR_POWERPC_440EP_PASS2)
481                 return FALSE;
482         else {
483                 printf("brdutil error 3\n");
484                 for (;;)
485                         ;
486         }
487
488         return(FALSE);
489 }
490
491 /*----------------------------------------------------------------------------+
492   | is_nand_selected.
493   +----------------------------------------------------------------------------*/
494 int is_nand_selected(void)
495 {
496 #ifdef CONFIG_BAMBOO_NAND
497         return TRUE;
498 #else
499         return FALSE;
500 #endif
501 }
502
503 /*----------------------------------------------------------------------------+
504   | config_on_ebc_cs4_is_small_flash => from EPLD
505   +----------------------------------------------------------------------------*/
506 unsigned char config_on_ebc_cs4_is_small_flash(void)
507 {
508         /* Not implemented yet => returns constant value */
509         return TRUE;
510 }
511
512 /*----------------------------------------------------------------------------+
513   | Ext_bus_cntlr_init.
514   | Initialize the external bus controller
515   +----------------------------------------------------------------------------*/
516 void ext_bus_cntlr_init(void)
517 {
518         unsigned long sdr0_pstrp0, sdr0_sdstp1;
519         unsigned long bootstrap_settings, boot_selection, ebc_boot_size;
520         int           computed_boot_device = BOOT_DEVICE_UNKNOWN;
521         unsigned long ebc0_cs0_bnap_value = 0, ebc0_cs0_bncr_value = 0;
522         unsigned long ebc0_cs1_bnap_value = 0, ebc0_cs1_bncr_value = 0;
523         unsigned long ebc0_cs2_bnap_value = 0, ebc0_cs2_bncr_value = 0;
524         unsigned long ebc0_cs3_bnap_value = 0, ebc0_cs3_bncr_value = 0;
525         unsigned long ebc0_cs4_bnap_value = 0, ebc0_cs4_bncr_value = 0;
526
527
528         /*-------------------------------------------------------------------------+
529           |
530           |  PART 1 : Initialize EBC Bank 5
531           |  ==============================
532           | Bank5 is always associated to the NVRAM/EPLD.
533           | It has to be initialized prior to other banks settings computation since
534           | some board registers values may be needed
535           |
536           +-------------------------------------------------------------------------*/
537         /* NVRAM - FPGA */
538         mtebc(PB5AP, EBC0_BNAP_NVRAM_FPGA);
539         mtebc(PB5CR, EBC0_BNCR_NVRAM_FPGA_CS5);
540
541         /*-------------------------------------------------------------------------+
542           |
543           |  PART 2 : Determine which boot device was selected
544           |  =========================================
545           |
546           |  Read Pin Strap Register in PPC440EP
547           |  In case of boot from IIC, read Serial Device Strap Register1
548           |
549           |  Result can either be :
550           |   - Boot from EBC 8bits    => SMALL FLASH
551           |   - Boot from EBC 16bits   => Large Flash or SRAM
552           |   - Boot from NAND Flash
553           |   - Boot from PCI
554           |
555           +-------------------------------------------------------------------------*/
556         /* Read Pin Strap Register in PPC440EP */
557         mfsdr(sdr_pstrp0, sdr0_pstrp0);
558         bootstrap_settings = sdr0_pstrp0 & SDR0_PSTRP0_BOOTSTRAP_MASK;
559
560         /*-------------------------------------------------------------------------+
561           |  PPC440EP Pass1
562           +-------------------------------------------------------------------------*/
563         if (is_powerpc440ep_pass1() == TRUE) {
564                 switch(bootstrap_settings) {
565                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS0:
566                         /* Default Strap Settings 0 : CPU 400 - PLB 133 - Boot EBC 8 bit 33MHz */
567                         /* Boot from Small Flash */
568                         computed_boot_device = BOOT_FROM_SMALL_FLASH;
569                         break;
570                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS1:
571                         /* Default Strap Settings 1 : CPU 533 - PLB 133 - Boot PCI 66MHz */
572                         /* Boot from PCI */
573                         computed_boot_device = BOOT_FROM_PCI;
574                         break;
575
576                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS2:
577                         /* Default Strap Settings 2 : CPU 500 - PLB 100 - Boot NDFC16 66MHz */
578                         /* Boot from Nand Flash */
579                         computed_boot_device = BOOT_FROM_NAND_FLASH0;
580                         break;
581
582                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS3:
583                         /* Default Strap Settings 3 : CPU 333 - PLB 133 - Boot EBC 8 bit 66MHz */
584                         /* Boot from Small Flash */
585                         computed_boot_device = BOOT_FROM_SMALL_FLASH;
586                         break;
587
588                 case SDR0_PSTRP0_BOOTSTRAP_IIC_A8_EN:
589                 case SDR0_PSTRP0_BOOTSTRAP_IIC_A4_EN:
590                         /* Boot Settings in IIC EEprom address 0xA8 or 0xA4 */
591                         /* Read Serial Device Strap Register1 in PPC440EP */
592                         mfsdr(SDR0_SDSTP1, sdr0_sdstp1);
593                         boot_selection  = sdr0_sdstp1 & SDR0_SDSTP1_BOOT_SEL_MASK;
594                         ebc_boot_size   = sdr0_sdstp1 & SDR0_SDSTP1_EBC_ROM_BS_MASK;
595
596                         switch(boot_selection) {
597                         case SDR0_SDSTP1_BOOT_SEL_EBC:
598                                 switch(ebc_boot_size) {
599                                 case SDR0_SDSTP1_EBC_ROM_BS_16BIT:
600                                         computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
601                                         break;
602                                 case SDR0_SDSTP1_EBC_ROM_BS_8BIT:
603                                         computed_boot_device = BOOT_FROM_SMALL_FLASH;
604                                         break;
605                                 }
606                                 break;
607
608                         case SDR0_SDSTP1_BOOT_SEL_PCI:
609                                 computed_boot_device = BOOT_FROM_PCI;
610                                 break;
611
612                         case SDR0_SDSTP1_BOOT_SEL_NDFC:
613                                 computed_boot_device = BOOT_FROM_NAND_FLASH0;
614                                 break;
615                         }
616                         break;
617                 }
618         }
619
620         /*-------------------------------------------------------------------------+
621           |  PPC440EP Pass2
622           +-------------------------------------------------------------------------*/
623         else {
624                 switch(bootstrap_settings) {
625                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS0:
626                         /* Default Strap Settings 0 : CPU 400 - PLB 133 - Boot EBC 8 bit 33MHz */
627                         /* Boot from Small Flash */
628                         computed_boot_device = BOOT_FROM_SMALL_FLASH;
629                         break;
630                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS1:
631                         /* Default Strap Settings 1 : CPU 333 - PLB 133 - Boot PCI 66MHz */
632                         /* Boot from PCI */
633                         computed_boot_device = BOOT_FROM_PCI;
634                         break;
635
636                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS2:
637                         /* Default Strap Settings 2 : CPU 400 - PLB 100 - Boot NDFC16 33MHz */
638                         /* Boot from Nand Flash */
639                         computed_boot_device = BOOT_FROM_NAND_FLASH0;
640                         break;
641
642                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS3:
643                         /* Default Strap Settings 3 : CPU 400 - PLB 100 - Boot EBC 16 bit 33MHz */
644                         /* Boot from Large Flash or SRAM */
645                         computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
646                         break;
647
648                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS4:
649                         /* Default Strap Settings 4 : CPU 333 - PLB 133 - Boot EBC 16 bit 66MHz */
650                         /* Boot from Large Flash or SRAM */
651                         computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
652                         break;
653
654                 case SDR0_PSTRP0_BOOTSTRAP_SETTINGS6:
655                         /* Default Strap Settings 6 : CPU 400 - PLB 100 - Boot PCI 33MHz */
656                         /* Boot from PCI */
657                         computed_boot_device = BOOT_FROM_PCI;
658                         break;
659
660                 case SDR0_PSTRP0_BOOTSTRAP_IIC_A8_EN:
661                 case SDR0_PSTRP0_BOOTSTRAP_IIC_A4_EN:
662                         /* Default Strap Settings 5-7 */
663                         /* Boot Settings in IIC EEprom address 0xA8 or 0xA4 */
664                         /* Read Serial Device Strap Register1 in PPC440EP */
665                         mfsdr(SDR0_SDSTP1, sdr0_sdstp1);
666                         boot_selection  = sdr0_sdstp1 & SDR0_SDSTP1_BOOT_SEL_MASK;
667                         ebc_boot_size   = sdr0_sdstp1 & SDR0_SDSTP1_EBC_ROM_BS_MASK;
668
669                         switch(boot_selection) {
670                         case SDR0_SDSTP1_BOOT_SEL_EBC:
671                                 switch(ebc_boot_size) {
672                                 case SDR0_SDSTP1_EBC_ROM_BS_16BIT:
673                                         computed_boot_device = BOOT_FROM_LARGE_FLASH_OR_SRAM;
674                                         break;
675                                 case SDR0_SDSTP1_EBC_ROM_BS_8BIT:
676                                         computed_boot_device = BOOT_FROM_SMALL_FLASH;
677                                         break;
678                                 }
679                                 break;
680
681                         case SDR0_SDSTP1_BOOT_SEL_PCI:
682                                 computed_boot_device = BOOT_FROM_PCI;
683                                 break;
684
685                         case SDR0_SDSTP1_BOOT_SEL_NDFC:
686                                 computed_boot_device = BOOT_FROM_NAND_FLASH0;
687                                 break;
688                         }
689                         break;
690                 }
691         }
692
693         /*-------------------------------------------------------------------------+
694           |
695           |  PART 3 : Compute EBC settings depending on selected boot device
696           |  ======   ======================================================
697           |
698           | Resulting EBC init will be among following configurations :
699           |
700           |  - Boot from EBC 8bits => boot from SMALL FLASH selected
701           |            EBC-CS0     = Small Flash
702           |            EBC-CS1,2,3 = NAND Flash or
703           |                         Exp.Slot depending on Soft Config
704           |            EBC-CS4     = SRAM/Large Flash or
705           |                         Large Flash/SRAM depending on jumpers
706           |            EBC-CS5     = NVRAM / EPLD
707           |
708           |  - Boot from EBC 16bits => boot from Large Flash or SRAM selected
709           |            EBC-CS0     = SRAM/Large Flash or
710           |                          Large Flash/SRAM depending on jumpers
711           |            EBC-CS1,2,3 = NAND Flash or
712           |                          Exp.Slot depending on Software Configuration
713           |            EBC-CS4     = Small Flash
714           |            EBC-CS5     = NVRAM / EPLD
715           |
716           |  - Boot from NAND Flash
717           |            EBC-CS0     = NAND Flash0
718           |            EBC-CS1,2,3 = NAND Flash1
719           |            EBC-CS4     = SRAM/Large Flash or
720           |                          Large Flash/SRAM depending on jumpers
721           |            EBC-CS5     = NVRAM / EPLD
722           |
723           |    - Boot from PCI
724           |            EBC-CS0     = ...
725           |            EBC-CS1,2,3 = NAND Flash or
726           |                          Exp.Slot depending on Software Configuration
727           |            EBC-CS4     = SRAM/Large Flash or
728           |                          Large Flash/SRAM or
729           |                          Small Flash depending on jumpers
730           |            EBC-CS5     = NVRAM / EPLD
731           |
732           +-------------------------------------------------------------------------*/
733
734         switch(computed_boot_device) {
735                 /*------------------------------------------------------------------------- */
736         case BOOT_FROM_SMALL_FLASH:
737                 /*------------------------------------------------------------------------- */
738                 ebc0_cs0_bnap_value = EBC0_BNAP_SMALL_FLASH;
739                 ebc0_cs0_bncr_value = EBC0_BNCR_SMALL_FLASH_CS0;
740                 if ((is_nand_selected()) == TRUE) {
741                         /* NAND Flash */
742                         ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
743                         ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
744                         ebc0_cs2_bnap_value = EBC0_BNAP_NAND_FLASH;
745                         ebc0_cs2_bncr_value = EBC0_BNCR_NAND_FLASH_CS2;
746                         ebc0_cs3_bnap_value = 0;
747                         ebc0_cs3_bncr_value = 0;
748                 } else {
749                         /* Expansion Slot */
750                         ebc0_cs1_bnap_value = 0;
751                         ebc0_cs1_bncr_value = 0;
752                         ebc0_cs2_bnap_value = 0;
753                         ebc0_cs2_bncr_value = 0;
754                         ebc0_cs3_bnap_value = 0;
755                         ebc0_cs3_bncr_value = 0;
756                 }
757                 ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
758                 ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
759
760                 break;
761
762                 /*------------------------------------------------------------------------- */
763         case BOOT_FROM_LARGE_FLASH_OR_SRAM:
764                 /*------------------------------------------------------------------------- */
765                 ebc0_cs0_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
766                 ebc0_cs0_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS0;
767                 if ((is_nand_selected()) == TRUE) {
768                         /* NAND Flash */
769                         ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
770                         ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
771                         ebc0_cs2_bnap_value = 0;
772                         ebc0_cs2_bncr_value = 0;
773                         ebc0_cs3_bnap_value = 0;
774                         ebc0_cs3_bncr_value = 0;
775                 } else {
776                         /* Expansion Slot */
777                         ebc0_cs1_bnap_value = 0;
778                         ebc0_cs1_bncr_value = 0;
779                         ebc0_cs2_bnap_value = 0;
780                         ebc0_cs2_bncr_value = 0;
781                         ebc0_cs3_bnap_value = 0;
782                         ebc0_cs3_bncr_value = 0;
783                 }
784                 ebc0_cs4_bnap_value = EBC0_BNAP_SMALL_FLASH;
785                 ebc0_cs4_bncr_value = EBC0_BNCR_SMALL_FLASH_CS4;
786
787                 break;
788
789                 /*------------------------------------------------------------------------- */
790         case BOOT_FROM_NAND_FLASH0:
791                 /*------------------------------------------------------------------------- */
792                 ebc0_cs0_bnap_value = EBC0_BNAP_NAND_FLASH;
793                 ebc0_cs0_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
794
795                 ebc0_cs1_bnap_value = 0;
796                 ebc0_cs1_bncr_value = 0;
797                 ebc0_cs2_bnap_value = 0;
798                 ebc0_cs2_bncr_value = 0;
799                 ebc0_cs3_bnap_value = 0;
800                 ebc0_cs3_bncr_value = 0;
801
802                 /* Large Flash or SRAM */
803                 ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
804                 ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
805
806                 break;
807
808                 /*------------------------------------------------------------------------- */
809         case BOOT_FROM_PCI:
810                 /*------------------------------------------------------------------------- */
811                 ebc0_cs0_bnap_value = 0;
812                 ebc0_cs0_bncr_value = 0;
813
814                 if ((is_nand_selected()) == TRUE) {
815                         /* NAND Flash */
816                         ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
817                         ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
818                         ebc0_cs2_bnap_value = 0;
819                         ebc0_cs2_bncr_value = 0;
820                         ebc0_cs3_bnap_value = 0;
821                         ebc0_cs3_bncr_value = 0;
822                 } else {
823                         /* Expansion Slot */
824                         ebc0_cs1_bnap_value = 0;
825                         ebc0_cs1_bncr_value = 0;
826                         ebc0_cs2_bnap_value = 0;
827                         ebc0_cs2_bncr_value = 0;
828                         ebc0_cs3_bnap_value = 0;
829                         ebc0_cs3_bncr_value = 0;
830                 }
831
832                 if ((config_on_ebc_cs4_is_small_flash()) == TRUE) {
833                         /* Small Flash */
834                         ebc0_cs4_bnap_value = EBC0_BNAP_SMALL_FLASH;
835                         ebc0_cs4_bncr_value = EBC0_BNCR_SMALL_FLASH_CS4;
836                 } else {
837                         /* Large Flash or SRAM */
838                         ebc0_cs4_bnap_value = EBC0_BNAP_LARGE_FLASH_OR_SRAM;
839                         ebc0_cs4_bncr_value = EBC0_BNCR_LARGE_FLASH_OR_SRAM_CS4;
840                 }
841
842                 break;
843
844                 /*------------------------------------------------------------------------- */
845         case BOOT_DEVICE_UNKNOWN:
846                 /*------------------------------------------------------------------------- */
847                 /* Error */
848                 break;
849
850         }
851
852
853         /*-------------------------------------------------------------------------+
854           | Initialize EBC CONFIG
855           +-------------------------------------------------------------------------*/
856         mtdcr(EBC0_CFGADDR, EBC0_CFG);
857         mtdcr(EBC0_CFGDATA, EBC0_CFG_EBTC_DRIVEN           |
858               EBC0_CFG_PTD_ENABLED        |
859               EBC0_CFG_RTC_2048PERCLK     |
860               EBC0_CFG_EMPL_LOW           |
861               EBC0_CFG_EMPH_LOW           |
862               EBC0_CFG_CSTC_DRIVEN        |
863               EBC0_CFG_BPF_ONEDW          |
864               EBC0_CFG_EMS_8BIT           |
865               EBC0_CFG_PME_DISABLED       |
866               EBC0_CFG_PMT_ENCODE(0)      );
867
868         /*-------------------------------------------------------------------------+
869           | Initialize EBC Bank 0-4
870           +-------------------------------------------------------------------------*/
871         /* EBC Bank0 */
872         mtebc(PB0AP, ebc0_cs0_bnap_value);
873         mtebc(PB0CR, ebc0_cs0_bncr_value);
874         /* EBC Bank1 */
875         mtebc(PB1AP, ebc0_cs1_bnap_value);
876         mtebc(PB1CR, ebc0_cs1_bncr_value);
877         /* EBC Bank2 */
878         mtebc(PB2AP, ebc0_cs2_bnap_value);
879         mtebc(PB2CR, ebc0_cs2_bncr_value);
880         /* EBC Bank3 */
881         mtebc(PB3AP, ebc0_cs3_bnap_value);
882         mtebc(PB3CR, ebc0_cs3_bncr_value);
883         /* EBC Bank4 */
884         mtebc(PB4AP, ebc0_cs4_bnap_value);
885         mtebc(PB4CR, ebc0_cs4_bncr_value);
886
887         return;
888 }
889
890
891 /*----------------------------------------------------------------------------+
892   | get_uart_configuration.
893   +----------------------------------------------------------------------------*/
894 uart_config_nb_t get_uart_configuration(void)
895 {
896         return (L4);
897 }
898
899 /*----------------------------------------------------------------------------+
900   | set_phy_configuration_through_fpga => to EPLD
901   +----------------------------------------------------------------------------*/
902 void set_phy_configuration_through_fpga(zmii_config_t config)
903 {
904
905         unsigned long fpga_selection_reg;
906
907         fpga_selection_reg = in8(FPGA_SELECTION_1_REG) & ~FPGA_SEL_1_REG_PHY_MASK;
908
909         switch(config)
910         {
911         case ZMII_CONFIGURATION_IS_MII:
912                 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_MII;
913                 break;
914         case ZMII_CONFIGURATION_IS_RMII:
915                 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_RMII;
916                 break;
917         case ZMII_CONFIGURATION_IS_SMII:
918                 fpga_selection_reg = fpga_selection_reg | FPGA_SEL_1_REG_SMII;
919                 break;
920         case ZMII_CONFIGURATION_UNKNOWN:
921         default:
922                 break;
923         }
924         out8(FPGA_SELECTION_1_REG,fpga_selection_reg);
925
926 }
927
928 /*----------------------------------------------------------------------------+
929   | scp_selection_in_fpga.
930   +----------------------------------------------------------------------------*/
931 void scp_selection_in_fpga(void)
932 {
933         unsigned long fpga_selection_2_reg;
934
935         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_IIC1_SCP_SEL_MASK;
936         fpga_selection_2_reg |= FPGA_SEL2_REG_SEL_SCP;
937         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
938 }
939
940 /*----------------------------------------------------------------------------+
941   | iic1_selection_in_fpga.
942   +----------------------------------------------------------------------------*/
943 void iic1_selection_in_fpga(void)
944 {
945         unsigned long fpga_selection_2_reg;
946
947         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_IIC1_SCP_SEL_MASK;
948         fpga_selection_2_reg |= FPGA_SEL2_REG_SEL_IIC1;
949         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
950 }
951
952 /*----------------------------------------------------------------------------+
953   | dma_a_b_selection_in_fpga.
954   +----------------------------------------------------------------------------*/
955 void dma_a_b_selection_in_fpga(void)
956 {
957         unsigned long fpga_selection_2_reg;
958
959         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) | FPGA_SEL2_REG_SEL_DMA_A_B;
960         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
961 }
962
963 /*----------------------------------------------------------------------------+
964   | dma_a_b_unselect_in_fpga.
965   +----------------------------------------------------------------------------*/
966 void dma_a_b_unselect_in_fpga(void)
967 {
968         unsigned long fpga_selection_2_reg;
969
970         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_SEL_DMA_A_B;
971         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
972 }
973
974 /*----------------------------------------------------------------------------+
975   | dma_c_d_selection_in_fpga.
976   +----------------------------------------------------------------------------*/
977 void dma_c_d_selection_in_fpga(void)
978 {
979         unsigned long fpga_selection_2_reg;
980
981         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) | FPGA_SEL2_REG_SEL_DMA_C_D;
982         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
983 }
984
985 /*----------------------------------------------------------------------------+
986   | dma_c_d_unselect_in_fpga.
987   +----------------------------------------------------------------------------*/
988 void dma_c_d_unselect_in_fpga(void)
989 {
990         unsigned long fpga_selection_2_reg;
991
992         fpga_selection_2_reg = in8(FPGA_SELECTION_2_REG) & ~FPGA_SEL2_REG_SEL_DMA_C_D;
993         out8(FPGA_SELECTION_2_REG,fpga_selection_2_reg);
994 }
995
996 /*----------------------------------------------------------------------------+
997   | usb2_device_selection_in_fpga.
998   +----------------------------------------------------------------------------*/
999 void usb2_device_selection_in_fpga(void)
1000 {
1001         unsigned long fpga_selection_1_reg;
1002
1003         fpga_selection_1_reg = in8(FPGA_SELECTION_1_REG) | FPGA_SEL_1_REG_USB2_DEV_SEL;
1004         out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1005 }
1006
1007 /*----------------------------------------------------------------------------+
1008   | usb2_device_reset_through_fpga.
1009   +----------------------------------------------------------------------------*/
1010 void usb2_device_reset_through_fpga(void)
1011 {
1012         /* Perform soft Reset pulse */
1013         unsigned long fpga_reset_reg;
1014         int i;
1015
1016         fpga_reset_reg = in8(FPGA_RESET_REG);
1017         out8(FPGA_RESET_REG,fpga_reset_reg | FPGA_RESET_REG_RESET_USB20_DEV);
1018         for (i=0; i<500; i++)
1019                 udelay(1000);
1020         out8(FPGA_RESET_REG,fpga_reset_reg);
1021 }
1022
1023 /*----------------------------------------------------------------------------+
1024   | usb2_host_selection_in_fpga.
1025   +----------------------------------------------------------------------------*/
1026 void usb2_host_selection_in_fpga(void)
1027 {
1028         unsigned long fpga_selection_1_reg;
1029
1030         fpga_selection_1_reg = in8(FPGA_SELECTION_1_REG) | FPGA_SEL_1_REG_USB2_HOST_SEL;
1031         out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1032 }
1033
1034 /*----------------------------------------------------------------------------+
1035   | ndfc_selection_in_fpga.
1036   +----------------------------------------------------------------------------*/
1037 void ndfc_selection_in_fpga(void)
1038 {
1039         unsigned long fpga_selection_1_reg;
1040
1041         fpga_selection_1_reg  = in8(FPGA_SELECTION_1_REG) &~FPGA_SEL_1_REG_NF_SELEC_MASK;
1042         fpga_selection_1_reg |= FPGA_SEL_1_REG_NF0_SEL_BY_NFCS1;
1043         fpga_selection_1_reg |= FPGA_SEL_1_REG_NF1_SEL_BY_NFCS2;
1044         out8(FPGA_SELECTION_1_REG,fpga_selection_1_reg);
1045 }
1046
1047 /*----------------------------------------------------------------------------+
1048   | uart_selection_in_fpga.
1049   +----------------------------------------------------------------------------*/
1050 void uart_selection_in_fpga(uart_config_nb_t uart_config)
1051 {
1052         /* FPGA register */
1053         unsigned char   fpga_selection_3_reg;
1054
1055         /* Read FPGA Reagister */
1056         fpga_selection_3_reg = in8(FPGA_SELECTION_3_REG);
1057
1058         switch (uart_config)
1059         {
1060         case L1:
1061                 /* ----------------------------------------------------------------------- */
1062                 /* L1 configuration:    UART0 = 8 pins */
1063                 /* ----------------------------------------------------------------------- */
1064                 /* Configure FPGA */
1065                 fpga_selection_3_reg    = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1066                 fpga_selection_3_reg    = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG1;
1067                 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1068
1069                 break;
1070
1071         case L2:
1072                 /* ----------------------------------------------------------------------- */
1073                 /* L2 configuration:    UART0 = 4 pins */
1074                 /*                      UART1 = 4 pins */
1075                 /* ----------------------------------------------------------------------- */
1076                 /* Configure FPGA */
1077                 fpga_selection_3_reg    = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1078                 fpga_selection_3_reg    = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG2;
1079                 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1080
1081                 break;
1082
1083         case L3:
1084                 /* ----------------------------------------------------------------------- */
1085                 /* L3 configuration:    UART0 = 4 pins */
1086                 /*                      UART1 = 2 pins */
1087                 /*                      UART2 = 2 pins */
1088                 /* ----------------------------------------------------------------------- */
1089                 /* Configure FPGA */
1090                 fpga_selection_3_reg    = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1091                 fpga_selection_3_reg    = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG3;
1092                 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1093                 break;
1094
1095         case L4:
1096                 /* Configure FPGA */
1097                 fpga_selection_3_reg    = fpga_selection_3_reg & ~FPGA_SEL3_REG_SEL_UART_CONFIG_MASK;
1098                 fpga_selection_3_reg    = fpga_selection_3_reg | FPGA_SEL3_REG_SEL_UART_CONFIG4;
1099                 out8(FPGA_SELECTION_3_REG, fpga_selection_3_reg);
1100
1101                 break;
1102
1103         default:
1104                 /* Unsupported UART configuration number */
1105                 for (;;)
1106                         ;
1107                 break;
1108
1109         }
1110 }
1111
1112
1113 /*----------------------------------------------------------------------------+
1114   | init_default_gpio
1115   +----------------------------------------------------------------------------*/
1116 void init_default_gpio(gpio_param_s (*gpio_tab)[GPIO_MAX])
1117 {
1118         int i;
1119
1120         /* Init GPIO0 */
1121         for(i=0; i<GPIO_MAX; i++)
1122         {
1123                 gpio_tab[GPIO0][i].add    = GPIO0_BASE;
1124                 gpio_tab[GPIO0][i].in_out = GPIO_DIS;
1125                 gpio_tab[GPIO0][i].alt_nb = GPIO_SEL;
1126         }
1127
1128         /* Init GPIO1 */
1129         for(i=0; i<GPIO_MAX; i++)
1130         {
1131                 gpio_tab[GPIO1][i].add    = GPIO1_BASE;
1132                 gpio_tab[GPIO1][i].in_out = GPIO_DIS;
1133                 gpio_tab[GPIO1][i].alt_nb = GPIO_SEL;
1134         }
1135
1136         /* EBC_CS_N(5) - GPIO0_10 */
1137         gpio_tab[GPIO0][10].in_out    = GPIO_OUT;
1138         gpio_tab[GPIO0][10].alt_nb    = GPIO_ALT1;
1139
1140         /* EBC_CS_N(4) - GPIO0_9 */
1141         gpio_tab[GPIO0][9].in_out    = GPIO_OUT;
1142         gpio_tab[GPIO0][9].alt_nb    = GPIO_ALT1;
1143 }
1144
1145 /*----------------------------------------------------------------------------+
1146   | update_uart_ios
1147   +------------------------------------------------------------------------------
1148   |
1149   | Set UART Configuration in PowerPC440EP
1150   |
1151   | +---------------------------------------------------------------------+
1152   | | Configuartion   |   Connector   | Nb of pins | Pins   | Associated  |
1153   | |    Number       |   Port Name   |  available | naming |   CORE      |
1154   | +-----------------+---------------+------------+--------+-------------+
1155   | |     L1          |   Port_A      |     8      | UART   | UART core 0 |
1156   | +-----------------+---------------+------------+--------+-------------+
1157   | |     L2          |   Port_A      |     4      | UART1  | UART core 0 |
1158   | |    (L2D)        |   Port_B      |     4      | UART2  | UART core 1 |
1159   | +-----------------+---------------+------------+--------+-------------+
1160   | |     L3          |   Port_A      |     4      | UART1  | UART core 0 |
1161   | |    (L3D)        |   Port_B      |     2      | UART2  | UART core 1 |
1162   | |                 |   Port_C      |     2      | UART3  | UART core 2 |
1163   | +-----------------+---------------+------------+--------+-------------+
1164   | |                 |   Port_A      |     2      | UART1  | UART core 0 |
1165   | |     L4          |   Port_B      |     2      | UART2  | UART core 1 |
1166   | |    (L4D)        |   Port_C      |     2      | UART3  | UART core 2 |
1167   | |                 |   Port_D      |     2      | UART4  | UART core 3 |
1168   | +-----------------+---------------+------------+--------+-------------+
1169   |
1170   |  Involved GPIOs
1171   |
1172   | +------------------------------------------------------------------------------+
1173   | |  GPIO   |   Aternate 1     | I/O |  Alternate 2    | I/O | Alternate 3 | I/O |
1174   | +---------+------------------+-----+-----------------+-----+-------------+-----+
1175   | | GPIO1_2 | UART0_DCD_N      |  I  | UART1_DSR_CTS_N |  I  | UART2_SOUT  |  O  |
1176   | | GPIO1_3 | UART0_8PIN_DSR_N |  I  | UART1_RTS_DTR_N |  O  | UART2_SIN   |  I  |
1177   | | GPIO1_4 | UART0_8PIN_CTS_N |  I  | NA              |  NA | UART3_SIN   |  I  |
1178   | | GPIO1_5 | UART0_RTS_N      |  O  | NA              |  NA | UART3_SOUT  |  O  |
1179   | | GPIO1_6 | UART0_DTR_N      |  O  | UART1_SOUT      |  O  | NA          |  NA |
1180   | | GPIO1_7 | UART0_RI_N       |  I  | UART1_SIN       |  I  | NA          |  NA |
1181   | +------------------------------------------------------------------------------+
1182   |
1183   |
1184   +----------------------------------------------------------------------------*/
1185
1186 void update_uart_ios(uart_config_nb_t uart_config, gpio_param_s (*gpio_tab)[GPIO_MAX])
1187 {
1188         switch (uart_config)
1189         {
1190         case L1:
1191                 /* ----------------------------------------------------------------------- */
1192                 /* L1 configuration:    UART0 = 8 pins */
1193                 /* ----------------------------------------------------------------------- */
1194                 /* Update GPIO Configuration Table */
1195                 gpio_tab[GPIO1][2].in_out = GPIO_IN;
1196                 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT1;
1197
1198                 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1199                 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT1;
1200
1201                 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1202                 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1203
1204                 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1205                 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1206
1207                 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1208                 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT1;
1209
1210                 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1211                 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT1;
1212
1213                 break;
1214
1215         case L2:
1216                 /* ----------------------------------------------------------------------- */
1217                 /* L2 configuration:    UART0 = 4 pins */
1218                 /*                      UART1 = 4 pins */
1219                 /* ----------------------------------------------------------------------- */
1220                 /* Update GPIO Configuration Table */
1221                 gpio_tab[GPIO1][2].in_out = GPIO_IN;
1222                 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT2;
1223
1224                 gpio_tab[GPIO1][3].in_out = GPIO_OUT;
1225                 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT2;
1226
1227                 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1228                 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1229
1230                 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1231                 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1232
1233                 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1234                 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1235
1236                 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1237                 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1238
1239                 break;
1240
1241         case L3:
1242                 /* ----------------------------------------------------------------------- */
1243                 /* L3 configuration:    UART0 = 4 pins */
1244                 /*                      UART1 = 2 pins */
1245                 /*                      UART2 = 2 pins */
1246                 /* ----------------------------------------------------------------------- */
1247                 /* Update GPIO Configuration Table */
1248                 gpio_tab[GPIO1][2].in_out = GPIO_OUT;
1249                 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT3;
1250
1251                 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1252                 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT3;
1253
1254                 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1255                 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT1;
1256
1257                 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1258                 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT1;
1259
1260                 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1261                 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1262
1263                 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1264                 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1265
1266                 break;
1267
1268         case L4:
1269                 /* ----------------------------------------------------------------------- */
1270                 /* L4 configuration:    UART0 = 2 pins */
1271                 /*                      UART1 = 2 pins */
1272                 /*                      UART2 = 2 pins */
1273                 /*                      UART3 = 2 pins */
1274                 /* ----------------------------------------------------------------------- */
1275                 /* Update GPIO Configuration Table */
1276                 gpio_tab[GPIO1][2].in_out = GPIO_OUT;
1277                 gpio_tab[GPIO1][2].alt_nb = GPIO_ALT3;
1278
1279                 gpio_tab[GPIO1][3].in_out = GPIO_IN;
1280                 gpio_tab[GPIO1][3].alt_nb = GPIO_ALT3;
1281
1282                 gpio_tab[GPIO1][4].in_out = GPIO_IN;
1283                 gpio_tab[GPIO1][4].alt_nb = GPIO_ALT3;
1284
1285                 gpio_tab[GPIO1][5].in_out = GPIO_OUT;
1286                 gpio_tab[GPIO1][5].alt_nb = GPIO_ALT3;
1287
1288                 gpio_tab[GPIO1][6].in_out = GPIO_OUT;
1289                 gpio_tab[GPIO1][6].alt_nb = GPIO_ALT2;
1290
1291                 gpio_tab[GPIO1][7].in_out = GPIO_IN;
1292                 gpio_tab[GPIO1][7].alt_nb = GPIO_ALT2;
1293
1294                 break;
1295
1296         default:
1297                 /* Unsupported UART configuration number */
1298                 printf("ERROR - Unsupported UART configuration number.\n\n");
1299                 for (;;)
1300                         ;
1301                 break;
1302
1303         }
1304
1305         /* Set input Selection Register on Alt_Receive for UART Input Core */
1306         out32(GPIO1_IS1L, (in32(GPIO1_IS1L) | 0x0FC30000));
1307         out32(GPIO1_IS2L, (in32(GPIO1_IS2L) | 0x0C030000));
1308         out32(GPIO1_IS3L, (in32(GPIO1_IS3L) | 0x03C00000));
1309 }
1310
1311 /*----------------------------------------------------------------------------+
1312   | update_ndfc_ios(void).
1313   +----------------------------------------------------------------------------*/
1314 void update_ndfc_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1315 {
1316         /* Update GPIO Configuration Table */
1317         gpio_tab[GPIO0][6].in_out = GPIO_OUT;       /* EBC_CS_N(1) */
1318         gpio_tab[GPIO0][6].alt_nb = GPIO_ALT1;
1319
1320         gpio_tab[GPIO0][7].in_out = GPIO_OUT;       /* EBC_CS_N(2) */
1321         gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
1322
1323 #if 0
1324         gpio_tab[GPIO0][7].in_out = GPIO_OUT;       /* EBC_CS_N(3) */
1325         gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
1326 #endif
1327 }
1328
1329 /*----------------------------------------------------------------------------+
1330   | update_zii_ios(void).
1331   +----------------------------------------------------------------------------*/
1332 void update_zii_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1333 {
1334         /* Update GPIO Configuration Table */
1335         gpio_tab[GPIO0][12].in_out = GPIO_IN;       /* ZII_p0Rxd(0) */
1336         gpio_tab[GPIO0][12].alt_nb = GPIO_ALT1;
1337
1338         gpio_tab[GPIO0][13].in_out = GPIO_IN;       /* ZII_p0Rxd(1) */
1339         gpio_tab[GPIO0][13].alt_nb = GPIO_ALT1;
1340
1341         gpio_tab[GPIO0][14].in_out = GPIO_IN;       /* ZII_p0Rxd(2) */
1342         gpio_tab[GPIO0][14].alt_nb = GPIO_ALT1;
1343
1344         gpio_tab[GPIO0][15].in_out = GPIO_IN;       /* ZII_p0Rxd(3) */
1345         gpio_tab[GPIO0][15].alt_nb = GPIO_ALT1;
1346
1347         gpio_tab[GPIO0][16].in_out = GPIO_OUT;      /* ZII_p0Txd(0) */
1348         gpio_tab[GPIO0][16].alt_nb = GPIO_ALT1;
1349
1350         gpio_tab[GPIO0][17].in_out = GPIO_OUT;      /* ZII_p0Txd(1) */
1351         gpio_tab[GPIO0][17].alt_nb = GPIO_ALT1;
1352
1353         gpio_tab[GPIO0][18].in_out = GPIO_OUT;      /* ZII_p0Txd(2) */
1354         gpio_tab[GPIO0][18].alt_nb = GPIO_ALT1;
1355
1356         gpio_tab[GPIO0][19].in_out = GPIO_OUT;      /* ZII_p0Txd(3) */
1357         gpio_tab[GPIO0][19].alt_nb = GPIO_ALT1;
1358
1359         gpio_tab[GPIO0][20].in_out = GPIO_IN;       /* ZII_p0Rx_er */
1360         gpio_tab[GPIO0][20].alt_nb = GPIO_ALT1;
1361
1362         gpio_tab[GPIO0][21].in_out = GPIO_IN;       /* ZII_p0Rx_dv */
1363         gpio_tab[GPIO0][21].alt_nb = GPIO_ALT1;
1364
1365         gpio_tab[GPIO0][22].in_out = GPIO_IN;       /* ZII_p0Crs */
1366         gpio_tab[GPIO0][22].alt_nb = GPIO_ALT1;
1367
1368         gpio_tab[GPIO0][23].in_out = GPIO_OUT;      /* ZII_p0Tx_er */
1369         gpio_tab[GPIO0][23].alt_nb = GPIO_ALT1;
1370
1371         gpio_tab[GPIO0][24].in_out = GPIO_OUT;      /* ZII_p0Tx_en */
1372         gpio_tab[GPIO0][24].alt_nb = GPIO_ALT1;
1373
1374         gpio_tab[GPIO0][25].in_out = GPIO_IN;       /* ZII_p0Col */
1375         gpio_tab[GPIO0][25].alt_nb = GPIO_ALT1;
1376
1377 }
1378
1379 /*----------------------------------------------------------------------------+
1380   | update_uic_0_3_irq_ios().
1381   +----------------------------------------------------------------------------*/
1382 void update_uic_0_3_irq_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1383 {
1384         gpio_tab[GPIO1][8].in_out = GPIO_IN;        /* UIC_IRQ(0) */
1385         gpio_tab[GPIO1][8].alt_nb = GPIO_ALT1;
1386
1387         gpio_tab[GPIO1][9].in_out = GPIO_IN;        /* UIC_IRQ(1) */
1388         gpio_tab[GPIO1][9].alt_nb = GPIO_ALT1;
1389
1390         gpio_tab[GPIO1][10].in_out = GPIO_IN;       /* UIC_IRQ(2) */
1391         gpio_tab[GPIO1][10].alt_nb = GPIO_ALT1;
1392
1393         gpio_tab[GPIO1][11].in_out = GPIO_IN;       /* UIC_IRQ(3) */
1394         gpio_tab[GPIO1][11].alt_nb = GPIO_ALT1;
1395 }
1396
1397 /*----------------------------------------------------------------------------+
1398   | update_uic_4_9_irq_ios().
1399   +----------------------------------------------------------------------------*/
1400 void update_uic_4_9_irq_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1401 {
1402         gpio_tab[GPIO1][12].in_out = GPIO_IN;       /* UIC_IRQ(4) */
1403         gpio_tab[GPIO1][12].alt_nb = GPIO_ALT1;
1404
1405         gpio_tab[GPIO1][13].in_out = GPIO_IN;       /* UIC_IRQ(6) */
1406         gpio_tab[GPIO1][13].alt_nb = GPIO_ALT1;
1407
1408         gpio_tab[GPIO1][14].in_out = GPIO_IN;       /* UIC_IRQ(7) */
1409         gpio_tab[GPIO1][14].alt_nb = GPIO_ALT1;
1410
1411         gpio_tab[GPIO1][15].in_out = GPIO_IN;       /* UIC_IRQ(8) */
1412         gpio_tab[GPIO1][15].alt_nb = GPIO_ALT1;
1413
1414         gpio_tab[GPIO1][16].in_out = GPIO_IN;       /* UIC_IRQ(9) */
1415         gpio_tab[GPIO1][16].alt_nb = GPIO_ALT1;
1416 }
1417
1418 /*----------------------------------------------------------------------------+
1419   | update_dma_a_b_ios().
1420   +----------------------------------------------------------------------------*/
1421 void update_dma_a_b_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1422 {
1423         gpio_tab[GPIO1][12].in_out = GPIO_OUT;      /* DMA_ACK(1) */
1424         gpio_tab[GPIO1][12].alt_nb = GPIO_ALT2;
1425
1426         gpio_tab[GPIO1][13].in_out = GPIO_BI;       /* DMA_EOT/TC(1) */
1427         gpio_tab[GPIO1][13].alt_nb = GPIO_ALT2;
1428
1429         gpio_tab[GPIO1][14].in_out = GPIO_IN;       /* DMA_REQ(0) */
1430         gpio_tab[GPIO1][14].alt_nb = GPIO_ALT2;
1431
1432         gpio_tab[GPIO1][15].in_out = GPIO_OUT;      /* DMA_ACK(0) */
1433         gpio_tab[GPIO1][15].alt_nb = GPIO_ALT2;
1434
1435         gpio_tab[GPIO1][16].in_out = GPIO_BI;       /* DMA_EOT/TC(0) */
1436         gpio_tab[GPIO1][16].alt_nb = GPIO_ALT2;
1437 }
1438
1439 /*----------------------------------------------------------------------------+
1440   | update_dma_c_d_ios().
1441   +----------------------------------------------------------------------------*/
1442 void update_dma_c_d_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1443 {
1444         gpio_tab[GPIO0][0].in_out = GPIO_IN;        /* DMA_REQ(2) */
1445         gpio_tab[GPIO0][0].alt_nb = GPIO_ALT2;
1446
1447         gpio_tab[GPIO0][1].in_out = GPIO_OUT;       /* DMA_ACK(2) */
1448         gpio_tab[GPIO0][1].alt_nb = GPIO_ALT2;
1449
1450         gpio_tab[GPIO0][2].in_out = GPIO_BI;        /* DMA_EOT/TC(2) */
1451         gpio_tab[GPIO0][2].alt_nb = GPIO_ALT2;
1452
1453         gpio_tab[GPIO0][3].in_out = GPIO_IN;        /* DMA_REQ(3) */
1454         gpio_tab[GPIO0][3].alt_nb = GPIO_ALT2;
1455
1456         gpio_tab[GPIO0][4].in_out = GPIO_OUT;       /* DMA_ACK(3) */
1457         gpio_tab[GPIO0][4].alt_nb = GPIO_ALT2;
1458
1459         gpio_tab[GPIO0][5].in_out = GPIO_BI;        /* DMA_EOT/TC(3) */
1460         gpio_tab[GPIO0][5].alt_nb = GPIO_ALT2;
1461
1462 }
1463
1464 /*----------------------------------------------------------------------------+
1465   | update_ebc_master_ios().
1466   +----------------------------------------------------------------------------*/
1467 void update_ebc_master_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1468 {
1469         gpio_tab[GPIO0][27].in_out = GPIO_IN;       /* EXT_EBC_REQ */
1470         gpio_tab[GPIO0][27].alt_nb = GPIO_ALT1;
1471
1472         gpio_tab[GPIO0][29].in_out = GPIO_OUT;      /* EBC_EXT_HDLA */
1473         gpio_tab[GPIO0][29].alt_nb = GPIO_ALT1;
1474
1475         gpio_tab[GPIO0][30].in_out = GPIO_OUT;      /* EBC_EXT_ACK */
1476         gpio_tab[GPIO0][30].alt_nb = GPIO_ALT1;
1477
1478         gpio_tab[GPIO0][31].in_out = GPIO_OUT;      /* EBC_EXR_BUSREQ */
1479         gpio_tab[GPIO0][31].alt_nb = GPIO_ALT1;
1480 }
1481
1482 /*----------------------------------------------------------------------------+
1483   | update_usb2_device_ios().
1484   +----------------------------------------------------------------------------*/
1485 void update_usb2_device_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1486 {
1487         gpio_tab[GPIO0][26].in_out = GPIO_IN;       /* USB2D_RXVALID */
1488         gpio_tab[GPIO0][26].alt_nb = GPIO_ALT2;
1489
1490         gpio_tab[GPIO0][27].in_out = GPIO_IN;       /* USB2D_RXERROR */
1491         gpio_tab[GPIO0][27].alt_nb = GPIO_ALT2;
1492
1493         gpio_tab[GPIO0][28].in_out = GPIO_OUT;      /* USB2D_TXVALID */
1494         gpio_tab[GPIO0][28].alt_nb = GPIO_ALT2;
1495
1496         gpio_tab[GPIO0][29].in_out = GPIO_OUT;      /* USB2D_PAD_SUSPNDM */
1497         gpio_tab[GPIO0][29].alt_nb = GPIO_ALT2;
1498
1499         gpio_tab[GPIO0][30].in_out = GPIO_OUT;      /* USB2D_XCVRSELECT */
1500         gpio_tab[GPIO0][30].alt_nb = GPIO_ALT2;
1501
1502         gpio_tab[GPIO0][31].in_out = GPIO_OUT;      /* USB2D_TERMSELECT */
1503         gpio_tab[GPIO0][31].alt_nb = GPIO_ALT2;
1504
1505         gpio_tab[GPIO1][0].in_out = GPIO_OUT;       /* USB2D_OPMODE0 */
1506         gpio_tab[GPIO1][0].alt_nb = GPIO_ALT1;
1507
1508         gpio_tab[GPIO1][1].in_out = GPIO_OUT;       /* USB2D_OPMODE1 */
1509         gpio_tab[GPIO1][1].alt_nb = GPIO_ALT1;
1510
1511 }
1512
1513 /*----------------------------------------------------------------------------+
1514   | update_pci_patch_ios().
1515   +----------------------------------------------------------------------------*/
1516 void update_pci_patch_ios(gpio_param_s (*gpio_tab)[GPIO_MAX])
1517 {
1518         gpio_tab[GPIO0][29].in_out = GPIO_OUT;      /* EBC_EXT_HDLA */
1519         gpio_tab[GPIO0][29].alt_nb = GPIO_ALT1;
1520 }
1521
1522 /*----------------------------------------------------------------------------+
1523   |   set_chip_gpio_configuration(unsigned char gpio_core,
1524   |                               gpio_param_s (*gpio_tab)[GPIO_MAX])
1525   |   Put the core impacted by clock modification and sharing in reset.
1526   |   Config the select registers to resolve the sharing depending of the config.
1527   |   Configure the GPIO registers.
1528   |
1529   +----------------------------------------------------------------------------*/
1530 void set_chip_gpio_configuration(unsigned char gpio_core, gpio_param_s (*gpio_tab)[GPIO_MAX])
1531 {
1532         unsigned char i=0, j=0, reg_offset = 0;
1533         unsigned long gpio_reg, gpio_core_add;
1534
1535         /* GPIO config of the GPIOs 0 to 31 */
1536         for (i=0; i<GPIO_MAX; i++, j++)
1537         {
1538                 if (i == GPIO_MAX/2)
1539                 {
1540                         reg_offset = 4;
1541                         j = i-16;
1542                 }
1543
1544                 gpio_core_add = gpio_tab[gpio_core][i].add;
1545
1546                 if ( (gpio_tab[gpio_core][i].in_out == GPIO_IN) ||
1547                      (gpio_tab[gpio_core][i].in_out == GPIO_BI ))
1548                 {
1549                         switch (gpio_tab[gpio_core][i].alt_nb)
1550                         {
1551                         case GPIO_SEL:
1552                                 break;
1553
1554                         case GPIO_ALT1:
1555                                 gpio_reg = in32(GPIO_IS1(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1556                                 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1557                                 out32(GPIO_IS1(gpio_core_add+reg_offset), gpio_reg);
1558                                 break;
1559
1560                         case GPIO_ALT2:
1561                                 gpio_reg = in32(GPIO_IS2(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1562                                 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1563                                 out32(GPIO_IS2(gpio_core_add+reg_offset), gpio_reg);
1564                                 break;
1565
1566                         case GPIO_ALT3:
1567                                 gpio_reg = in32(GPIO_IS3(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1568                                 gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
1569                                 out32(GPIO_IS3(gpio_core_add+reg_offset), gpio_reg);
1570                                 break;
1571                         }
1572                 }
1573                 if ( (gpio_tab[gpio_core][i].in_out == GPIO_OUT) ||
1574                      (gpio_tab[gpio_core][i].in_out == GPIO_BI ))
1575                 {
1576
1577                         switch (gpio_tab[gpio_core][i].alt_nb)
1578                         {
1579                         case GPIO_SEL:
1580                                 break;
1581                         case GPIO_ALT1:
1582                                 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1583                                 gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
1584                                 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1585                                 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1586                                 gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
1587                                 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1588                                 break;
1589                         case GPIO_ALT2:
1590                                 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1591                                 gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
1592                                 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1593                                 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1594                                 gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
1595                                 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1596                                 break;
1597                         case GPIO_ALT3:
1598                                 gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1599                                 gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
1600                                 out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
1601                                 gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset)) & ~(GPIO_MASK >> (j*2));
1602                                 gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
1603                                 out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
1604                                 break;
1605                         }
1606                 }
1607         }
1608 }
1609
1610 /*----------------------------------------------------------------------------+
1611   | force_bup_core_selection.
1612   +----------------------------------------------------------------------------*/
1613 void force_bup_core_selection(core_selection_t *core_select_P, config_validity_t *config_val_P)
1614 {
1615         /* Pointer invalid */
1616         if (core_select_P == NULL)
1617         {
1618                 printf("Configuration invalid pointer 1\n");
1619                 for (;;)
1620                         ;
1621         }
1622
1623         /* L4 Selection */
1624         *(core_select_P+UART_CORE0)            = CORE_SELECTED;
1625         *(core_select_P+UART_CORE1)            = CORE_SELECTED;
1626         *(core_select_P+UART_CORE2)            = CORE_SELECTED;
1627         *(core_select_P+UART_CORE3)            = CORE_SELECTED;
1628
1629         /* RMII Selection */
1630         *(core_select_P+RMII_SEL)               = CORE_SELECTED;
1631
1632         /* External Interrupt 0-9 selection */
1633         *(core_select_P+UIC_0_3)                = CORE_SELECTED;
1634         *(core_select_P+UIC_4_9)                = CORE_SELECTED;
1635
1636         *(core_select_P+SCP_CORE)               = CORE_SELECTED;
1637         *(core_select_P+DMA_CHANNEL_CD)         = CORE_SELECTED;
1638         *(core_select_P+PACKET_REJ_FUNC_AVAIL)  = CORE_SELECTED;
1639         *(core_select_P+USB1_DEVICE)            = CORE_SELECTED;
1640
1641         if (is_nand_selected()) {
1642                 *(core_select_P+NAND_FLASH)     = CORE_SELECTED;
1643         }
1644
1645         *config_val_P = CONFIG_IS_VALID;
1646
1647 }
1648
1649 /*----------------------------------------------------------------------------+
1650   | configure_ppc440ep_pins.
1651   +----------------------------------------------------------------------------*/
1652 void configure_ppc440ep_pins(void)
1653 {
1654         uart_config_nb_t uart_configuration;
1655         config_validity_t config_val = CONFIG_IS_INVALID;
1656
1657         /* Create Core Selection Table */
1658         core_selection_t ppc440ep_core_selection[MAX_CORE_SELECT_NB] =
1659                 {
1660                         CORE_NOT_SELECTED,      /* IIC_CORE, */
1661                         CORE_NOT_SELECTED,      /* SPC_CORE, */
1662                         CORE_NOT_SELECTED,      /* DMA_CHANNEL_AB, */
1663                         CORE_NOT_SELECTED,      /* UIC_4_9, */
1664                         CORE_NOT_SELECTED,      /* USB2_HOST, */
1665                         CORE_NOT_SELECTED,      /* DMA_CHANNEL_CD, */
1666                         CORE_NOT_SELECTED,      /* USB2_DEVICE, */
1667                         CORE_NOT_SELECTED,      /* PACKET_REJ_FUNC_AVAIL, */
1668                         CORE_NOT_SELECTED,      /* USB1_DEVICE, */
1669                         CORE_NOT_SELECTED,      /* EBC_MASTER, */
1670                         CORE_NOT_SELECTED,      /* NAND_FLASH, */
1671                         CORE_NOT_SELECTED,      /* UART_CORE0, */
1672                         CORE_NOT_SELECTED,      /* UART_CORE1, */
1673                         CORE_NOT_SELECTED,      /* UART_CORE2, */
1674                         CORE_NOT_SELECTED,      /* UART_CORE3, */
1675                         CORE_NOT_SELECTED,      /* MII_SEL, */
1676                         CORE_NOT_SELECTED,      /* RMII_SEL, */
1677                         CORE_NOT_SELECTED,      /* SMII_SEL, */
1678                         CORE_NOT_SELECTED,      /* PACKET_REJ_FUNC_EN */
1679                         CORE_NOT_SELECTED,      /* UIC_0_3 */
1680                         CORE_NOT_SELECTED,      /* USB1_HOST */
1681                         CORE_NOT_SELECTED       /* PCI_PATCH */
1682                 };
1683
1684         gpio_param_s gpio_tab[GPIO_GROUP_MAX][GPIO_MAX];
1685
1686         /* Table Default Initialisation + FPGA Access */
1687         init_default_gpio(gpio_tab);
1688         set_chip_gpio_configuration(GPIO0, gpio_tab);
1689         set_chip_gpio_configuration(GPIO1, gpio_tab);
1690
1691         /* Update Table */
1692         force_bup_core_selection(ppc440ep_core_selection, &config_val);
1693 #if 0 /* test-only */
1694         /* If we are running PIBS 1, force known configuration */
1695         update_core_selection_table(ppc440ep_core_selection, &config_val);
1696 #endif
1697
1698         /*----------------------------------------------------------------------------+
1699           | SDR + ios table update + fpga initialization
1700           +----------------------------------------------------------------------------*/
1701         unsigned long sdr0_pfc1     = 0;
1702         unsigned long sdr0_usb0     = 0;
1703         unsigned long sdr0_mfr      = 0;
1704
1705         /* PCI Always selected */
1706
1707         /* I2C Selection */
1708         if (ppc440ep_core_selection[IIC_CORE] == CORE_SELECTED)
1709         {
1710                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SIS_MASK) | SDR0_PFC1_SIS_IIC1_SEL;
1711                 iic1_selection_in_fpga();
1712         }
1713
1714         /* SCP Selection */
1715         if (ppc440ep_core_selection[SCP_CORE] == CORE_SELECTED)
1716         {
1717                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SIS_MASK) | SDR0_PFC1_SIS_SCP_SEL;
1718                 scp_selection_in_fpga();
1719         }
1720
1721         /* UIC 0:3 Selection */
1722         if (ppc440ep_core_selection[UIC_0_3] == CORE_SELECTED)
1723         {
1724                 update_uic_0_3_irq_ios(gpio_tab);
1725                 dma_a_b_unselect_in_fpga();
1726         }
1727
1728         /* UIC 4:9 Selection */
1729         if (ppc440ep_core_selection[UIC_4_9] == CORE_SELECTED)
1730         {
1731                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_DIS_MASK) | SDR0_PFC1_DIS_UICIRQ5_SEL;
1732                 update_uic_4_9_irq_ios(gpio_tab);
1733         }
1734
1735         /* DMA AB Selection */
1736         if (ppc440ep_core_selection[DMA_CHANNEL_AB] == CORE_SELECTED)
1737         {
1738                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_DIS_MASK) | SDR0_PFC1_DIS_DMAR_SEL;
1739                 update_dma_a_b_ios(gpio_tab);
1740                 dma_a_b_selection_in_fpga();
1741         }
1742
1743         /* DMA CD Selection */
1744         if (ppc440ep_core_selection[DMA_CHANNEL_CD] == CORE_SELECTED)
1745         {
1746                 update_dma_c_d_ios(gpio_tab);
1747                 dma_c_d_selection_in_fpga();
1748         }
1749
1750         /* EBC Master Selection */
1751         if (ppc440ep_core_selection[EBC_MASTER] == CORE_SELECTED)
1752         {
1753                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_ERE_MASK) | SDR0_PFC1_ERE_EXTR_SEL;
1754                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_EBCHR_SEL;
1755                 update_ebc_master_ios(gpio_tab);
1756         }
1757
1758         /* PCI Patch Enable */
1759         if (ppc440ep_core_selection[PCI_PATCH] == CORE_SELECTED)
1760         {
1761                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_EBCHR_SEL;
1762                 update_pci_patch_ios(gpio_tab);
1763         }
1764
1765         /* USB2 Host Selection - Not Implemented in PowerPC 440EP Pass1 */
1766         if (ppc440ep_core_selection[USB2_HOST] == CORE_SELECTED)
1767         {
1768                 /* Not Implemented in PowerPC 440EP Pass1-Pass2 */
1769                 printf("Invalid configuration => USB2 Host selected\n");
1770                 for (;;)
1771                         ;
1772                 /*usb2_host_selection_in_fpga(); */
1773         }
1774
1775         /* USB2.0 Device Selection */
1776         if (ppc440ep_core_selection[USB2_DEVICE] == CORE_SELECTED)
1777         {
1778                 update_usb2_device_ios(gpio_tab);
1779                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UES_MASK) | SDR0_PFC1_UES_USB2D_SEL;
1780                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UPR_MASK) | SDR0_PFC1_UPR_DISABLE;
1781
1782                 mfsdr(SDR0_USB0, sdr0_usb0);
1783                 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_USB_DEVSEL_MASK;
1784                 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_USB20D_DEVSEL;
1785                 mtsdr(SDR0_USB0, sdr0_usb0);
1786
1787                 usb2_device_selection_in_fpga();
1788         }
1789
1790         /* USB1.1 Device Selection */
1791         if (ppc440ep_core_selection[USB1_DEVICE] == CORE_SELECTED)
1792         {
1793                 mfsdr(SDR0_USB0, sdr0_usb0);
1794                 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_USB_DEVSEL_MASK;
1795                 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_USB11D_DEVSEL;
1796                 mtsdr(SDR0_USB0, sdr0_usb0);
1797         }
1798
1799         /* USB1.1 Host Selection */
1800         if (ppc440ep_core_selection[USB1_HOST] == CORE_SELECTED)
1801         {
1802                 mfsdr(SDR0_USB0, sdr0_usb0);
1803                 sdr0_usb0 = sdr0_usb0 &~SDR0_USB0_LEEN_MASK;
1804                 sdr0_usb0 = sdr0_usb0 | SDR0_USB0_LEEN_ENABLE;
1805                 mtsdr(SDR0_USB0, sdr0_usb0);
1806         }
1807
1808         /* NAND Flash Selection */
1809         if (ppc440ep_core_selection[NAND_FLASH] == CORE_SELECTED)
1810         {
1811                 update_ndfc_ios(gpio_tab);
1812
1813 #if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
1814                 mtsdr(SDR0_CUST0, SDR0_CUST0_MUX_NDFC_SEL   |
1815                       SDR0_CUST0_NDFC_ENABLE    |
1816                       SDR0_CUST0_NDFC_BW_8_BIT  |
1817                       SDR0_CUST0_NDFC_ARE_MASK  |
1818                       SDR0_CUST0_CHIPSELGAT_EN1 |
1819                       SDR0_CUST0_CHIPSELGAT_EN2);
1820 #else
1821                 mtsdr(SDR0_CUST0, SDR0_CUST0_MUX_NDFC_SEL   |
1822                       SDR0_CUST0_NDFC_ENABLE    |
1823                       SDR0_CUST0_NDFC_BW_8_BIT  |
1824                       SDR0_CUST0_NDFC_ARE_MASK  |
1825                       SDR0_CUST0_CHIPSELGAT_EN0 |
1826                       SDR0_CUST0_CHIPSELGAT_EN2);
1827 #endif
1828
1829                 ndfc_selection_in_fpga();
1830         }
1831         else
1832         {
1833                 /* Set Mux on EMAC */
1834                 mtsdr(SDR0_CUST0, SDR0_CUST0_MUX_EMAC_SEL);
1835         }
1836
1837         /* MII Selection */
1838         if (ppc440ep_core_selection[MII_SEL] == CORE_SELECTED)
1839         {
1840                 update_zii_ios(gpio_tab);
1841                 mfsdr(SDR0_MFR, sdr0_mfr);
1842                 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_MII;
1843                 mtsdr(SDR0_MFR, sdr0_mfr);
1844
1845                 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_MII);
1846         }
1847
1848         /* RMII Selection */
1849         if (ppc440ep_core_selection[RMII_SEL] == CORE_SELECTED)
1850         {
1851                 update_zii_ios(gpio_tab);
1852                 mfsdr(SDR0_MFR, sdr0_mfr);
1853                 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_RMII_10M;
1854                 mtsdr(SDR0_MFR, sdr0_mfr);
1855
1856                 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_RMII);
1857         }
1858
1859         /* SMII Selection */
1860         if (ppc440ep_core_selection[SMII_SEL] == CORE_SELECTED)
1861         {
1862                 update_zii_ios(gpio_tab);
1863                 mfsdr(SDR0_MFR, sdr0_mfr);
1864                 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_ZMII_MODE_MASK) | SDR0_MFR_ZMII_MODE_SMII;
1865                 mtsdr(SDR0_MFR, sdr0_mfr);
1866
1867                 set_phy_configuration_through_fpga(ZMII_CONFIGURATION_IS_SMII);
1868         }
1869
1870         /* UART Selection */
1871         uart_configuration = get_uart_configuration();
1872         switch (uart_configuration)
1873         {
1874         case L1:         /* L1 Selection */
1875                 /* UART0 8 pins Only */
1876                 /*sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U0ME_DSR_DTR; */
1877                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) |SDR0_PFC1_U0ME_CTS_RTS;   /* Chip Pb */
1878                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_8PINS;
1879                 break;
1880         case L2:         /* L2 Selection */
1881                 /* UART0 and UART1 4 pins */
1882                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
1883                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
1884                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
1885                 break;
1886         case L3:         /* L3 Selection */
1887                 /* UART0 4 pins, UART1 and UART2 2 pins */
1888                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
1889                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
1890                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
1891                 break;
1892         case L4:         /* L4 Selection */
1893                 /* UART0, UART1, UART2 and UART3 2 pins */
1894                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0ME_MASK) | SDR0_PFC1_U0ME_DSR_DTR;
1895                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U0IM_MASK) | SDR0_PFC1_U0IM_4PINS;
1896                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_U1ME_MASK) | SDR0_PFC1_U1ME_DSR_DTR;
1897                 break;
1898         }
1899         update_uart_ios(uart_configuration, gpio_tab);
1900
1901         /* UART Selection in all cases */
1902         uart_selection_in_fpga(uart_configuration);
1903
1904         /* Packet Reject Function Available */
1905         if (ppc440ep_core_selection[PACKET_REJ_FUNC_AVAIL] == CORE_SELECTED)
1906         {
1907                 /* Set UPR Bit in SDR0_PFC1 Register */
1908                 sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_UPR_MASK) | SDR0_PFC1_UPR_ENABLE;
1909         }
1910
1911         /* Packet Reject Function Enable */
1912         if (ppc440ep_core_selection[PACKET_REJ_FUNC_EN] == CORE_SELECTED)
1913         {
1914                 mfsdr(SDR0_MFR, sdr0_mfr);
1915                 sdr0_mfr = (sdr0_mfr & ~SDR0_MFR_PKT_REJ_MASK) | SDR0_MFR_PKT_REJ_EN;;
1916                 mtsdr(SDR0_MFR, sdr0_mfr);
1917         }
1918
1919         /* Perform effective access to hardware */
1920         mtsdr(SDR0_PFC1, sdr0_pfc1);
1921         set_chip_gpio_configuration(GPIO0, gpio_tab);
1922         set_chip_gpio_configuration(GPIO1, gpio_tab);
1923
1924         /* USB2.0 Device Reset must be done after GPIO setting */
1925         if (ppc440ep_core_selection[USB2_DEVICE] == CORE_SELECTED)
1926                 usb2_device_reset_through_fpga();
1927
1928 }