xref: /rk3399_rockchip-uboot/board/aries/ma5d4evk/ma5d4evk.c (revision f1d56dffd7f1a112482cdbe4e0ac2076e1eb3fe1)
1*f1d56dffSMarek Vasut /*
2*f1d56dffSMarek Vasut  * Copyright (C) 2015 Marek Vasut <marex@denx.de>
3*f1d56dffSMarek Vasut  *
4*f1d56dffSMarek Vasut  * SPDX-License-Identifier:	GPL-2.0+
5*f1d56dffSMarek Vasut  */
6*f1d56dffSMarek Vasut 
7*f1d56dffSMarek Vasut #include <common.h>
8*f1d56dffSMarek Vasut #include <asm/io.h>
9*f1d56dffSMarek Vasut #include <asm/arch/at91_common.h>
10*f1d56dffSMarek Vasut #include <asm/arch/at91_pmc.h>
11*f1d56dffSMarek Vasut #include <asm/arch/at91_rstc.h>
12*f1d56dffSMarek Vasut #include <asm/arch/atmel_mpddrc.h>
13*f1d56dffSMarek Vasut #include <asm/arch/atmel_usba_udc.h>
14*f1d56dffSMarek Vasut #include <asm/arch/gpio.h>
15*f1d56dffSMarek Vasut #include <asm/arch/clk.h>
16*f1d56dffSMarek Vasut #include <asm/arch/sama5d3_smc.h>
17*f1d56dffSMarek Vasut #include <asm/arch/sama5d4.h>
18*f1d56dffSMarek Vasut #include <atmel_hlcdc.h>
19*f1d56dffSMarek Vasut #include <atmel_mci.h>
20*f1d56dffSMarek Vasut #include <lcd.h>
21*f1d56dffSMarek Vasut #include <mmc.h>
22*f1d56dffSMarek Vasut #include <net.h>
23*f1d56dffSMarek Vasut #include <netdev.h>
24*f1d56dffSMarek Vasut #include <spi.h>
25*f1d56dffSMarek Vasut #include <version.h>
26*f1d56dffSMarek Vasut 
27*f1d56dffSMarek Vasut DECLARE_GLOBAL_DATA_PTR;
28*f1d56dffSMarek Vasut 
29*f1d56dffSMarek Vasut #ifdef CONFIG_ATMEL_SPI
30*f1d56dffSMarek Vasut int spi_cs_is_valid(unsigned int bus, unsigned int cs)
31*f1d56dffSMarek Vasut {
32*f1d56dffSMarek Vasut 	return bus == 0 && cs == 0;
33*f1d56dffSMarek Vasut }
34*f1d56dffSMarek Vasut 
35*f1d56dffSMarek Vasut void spi_cs_activate(struct spi_slave *slave)
36*f1d56dffSMarek Vasut {
37*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTC, 3, 0);
38*f1d56dffSMarek Vasut }
39*f1d56dffSMarek Vasut 
40*f1d56dffSMarek Vasut void spi_cs_deactivate(struct spi_slave *slave)
41*f1d56dffSMarek Vasut {
42*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTC, 3, 1);
43*f1d56dffSMarek Vasut }
44*f1d56dffSMarek Vasut 
45*f1d56dffSMarek Vasut static void ma5d4evk_spi0_hw_init(void)
46*f1d56dffSMarek Vasut {
47*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);	/* SPI0_MISO */
48*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);	/* SPI0_MOSI */
49*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);	/* SPI0_SPCK */
50*f1d56dffSMarek Vasut 
51*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTC, 3, 1);	/* SPI0_CS0 */
52*f1d56dffSMarek Vasut 
53*f1d56dffSMarek Vasut 	/* Enable clock */
54*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_SPI0);
55*f1d56dffSMarek Vasut }
56*f1d56dffSMarek Vasut #endif /* CONFIG_ATMEL_SPI */
57*f1d56dffSMarek Vasut 
58*f1d56dffSMarek Vasut #ifdef CONFIG_CMD_USB
59*f1d56dffSMarek Vasut static void ma5d4evk_usb_hw_init(void)
60*f1d56dffSMarek Vasut {
61*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTE, 11, 0);
62*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTE, 14, 0);
63*f1d56dffSMarek Vasut }
64*f1d56dffSMarek Vasut #endif
65*f1d56dffSMarek Vasut 
66*f1d56dffSMarek Vasut #ifdef CONFIG_LCD
67*f1d56dffSMarek Vasut vidinfo_t panel_info = {
68*f1d56dffSMarek Vasut 	.vl_col			= 800,
69*f1d56dffSMarek Vasut 	.vl_row			= 480,
70*f1d56dffSMarek Vasut 	.vl_clk			= 33500000,
71*f1d56dffSMarek Vasut 	.vl_bpix		= LCD_BPP,
72*f1d56dffSMarek Vasut 	.vl_tft			= 1,
73*f1d56dffSMarek Vasut 	.vl_hsync_len		= 10,
74*f1d56dffSMarek Vasut 	.vl_left_margin		= 89,
75*f1d56dffSMarek Vasut 	.vl_right_margin	= 164,
76*f1d56dffSMarek Vasut 	.vl_vsync_len		= 10,
77*f1d56dffSMarek Vasut 	.vl_upper_margin	= 23,
78*f1d56dffSMarek Vasut 	.vl_lower_margin	= 10,
79*f1d56dffSMarek Vasut 	.mmio			= ATMEL_BASE_LCDC,
80*f1d56dffSMarek Vasut };
81*f1d56dffSMarek Vasut 
82*f1d56dffSMarek Vasut /* No power up/down pin for the LCD pannel */
83*f1d56dffSMarek Vasut void lcd_enable(void)	{ /* Empty! */ }
84*f1d56dffSMarek Vasut void lcd_disable(void)	{ /* Empty! */ }
85*f1d56dffSMarek Vasut 
86*f1d56dffSMarek Vasut unsigned int has_lcdc(void)
87*f1d56dffSMarek Vasut {
88*f1d56dffSMarek Vasut 	return 1;
89*f1d56dffSMarek Vasut }
90*f1d56dffSMarek Vasut 
91*f1d56dffSMarek Vasut static void ma5d4evk_lcd_hw_init(void)
92*f1d56dffSMarek Vasut {
93*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 1);	/* LCDPWM */
94*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0);	/* LCDDISP */
95*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0);	/* LCDVSYNC */
96*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0);	/* LCDHSYNC */
97*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0);	/* LCDDOTCK */
98*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 1);	/* LCDDEN */
99*f1d56dffSMarek Vasut 
100*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  0, 0);	/* LCDD0 */
101*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  1, 0);	/* LCDD1 */
102*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  2, 0);	/* LCDD2 */
103*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  3, 0);	/* LCDD3 */
104*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  4, 0);	/* LCDD4 */
105*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  5, 0);	/* LCDD5 */
106*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  6, 0);	/* LCDD6 */
107*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  7, 0);	/* LCDD7 */
108*f1d56dffSMarek Vasut 
109*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  8, 0);	/* LCDD9 */
110*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA,  9, 0);	/* LCDD8 */
111*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0);	/* LCDD10 */
112*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);	/* LCDD11 */
113*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);	/* LCDD12 */
114*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* LCDD13 */
115*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);	/* LCDD14 */
116*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);	/* LCDD15 */
117*f1d56dffSMarek Vasut 
118*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 0);	/* LCDD16 */
119*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 0);	/* LCDD17 */
120*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 0);	/* LCDD18 */
121*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 0);	/* LCDD19 */
122*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 0);	/* LCDD20 */
123*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 21, 0);	/* LCDD21 */
124*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 22, 0);	/* LCDD22 */
125*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 23, 0);	/* LCDD23 */
126*f1d56dffSMarek Vasut 
127*f1d56dffSMarek Vasut 	/* Enable clock */
128*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_LCDC);
129*f1d56dffSMarek Vasut }
130*f1d56dffSMarek Vasut 
131*f1d56dffSMarek Vasut #endif /* CONFIG_LCD */
132*f1d56dffSMarek Vasut 
133*f1d56dffSMarek Vasut #ifdef CONFIG_GENERIC_ATMEL_MCI
134*f1d56dffSMarek Vasut /* On-SoM eMMC */
135*f1d56dffSMarek Vasut void ma5d4evk_mci0_hw_init(void)
136*f1d56dffSMarek Vasut {
137*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 5, 1);	/* MCI1 CDA */
138*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 6, 1);	/* MCI1 DA0 */
139*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 7, 1);	/* MCI1 DA1 */
140*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 8, 1);	/* MCI1 DA2 */
141*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 9, 1);	/* MCI1 DA3 */
142*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 10, 1);	/* MCI1 DA4 */
143*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 11, 1);	/* MCI1 DA5 */
144*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 12, 1);	/* MCI1 DA6 */
145*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 13, 1);	/* MCI1 DA7 */
146*f1d56dffSMarek Vasut 	at91_pio3_set_b_periph(AT91_PIO_PORTC, 4, 0);	/* MCI1 CLK */
147*f1d56dffSMarek Vasut 
148*f1d56dffSMarek Vasut 	/*
149*f1d56dffSMarek Vasut 	 * As the mci io internal pull down is too strong, so if the io needs
150*f1d56dffSMarek Vasut 	 * external pull up, the pull up resistor will be very small, if so
151*f1d56dffSMarek Vasut 	 * the power consumption will increase, so disable the internal pull
152*f1d56dffSMarek Vasut 	 * down to save the power.
153*f1d56dffSMarek Vasut 	 */
154*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 5, 0);
155*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 6, 0);
156*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 7, 0);
157*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 8, 0);
158*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 9, 0);
159*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 10, 0);
160*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 11, 0);
161*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 12, 0);
162*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 13, 0);
163*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 4, 0);
164*f1d56dffSMarek Vasut 
165*f1d56dffSMarek Vasut 	/* Enable clock */
166*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_MCI0);
167*f1d56dffSMarek Vasut }
168*f1d56dffSMarek Vasut 
169*f1d56dffSMarek Vasut /* On-board MicroSD slot */
170*f1d56dffSMarek Vasut void ma5d4evk_mci1_hw_init(void)
171*f1d56dffSMarek Vasut {
172*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 19, 1);	/* MCI1 CDA */
173*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 20, 1);	/* MCI1 DA0 */
174*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 21, 1);	/* MCI1 DA1 */
175*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 22, 1);	/* MCI1 DA2 */
176*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 23, 1);	/* MCI1 DA3 */
177*f1d56dffSMarek Vasut 	at91_pio3_set_c_periph(AT91_PIO_PORTE, 18, 0);	/* MCI1 CLK */
178*f1d56dffSMarek Vasut 
179*f1d56dffSMarek Vasut 	/*
180*f1d56dffSMarek Vasut 	 * As the mci io internal pull down is too strong, so if the io needs
181*f1d56dffSMarek Vasut 	 * external pull up, the pull up resistor will be very small, if so
182*f1d56dffSMarek Vasut 	 * the power consumption will increase, so disable the internal pull
183*f1d56dffSMarek Vasut 	 * down to save the power.
184*f1d56dffSMarek Vasut 	 */
185*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
186*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
187*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
188*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
189*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
190*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
191*f1d56dffSMarek Vasut 
192*f1d56dffSMarek Vasut 	/* Deal with WP pin on the microSD slot. */
193*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTE, 16, 0);
194*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 16, 1);
195*f1d56dffSMarek Vasut 
196*f1d56dffSMarek Vasut 	/* Enable clock */
197*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_MCI1);
198*f1d56dffSMarek Vasut }
199*f1d56dffSMarek Vasut 
200*f1d56dffSMarek Vasut int board_mmc_init(bd_t *bis)
201*f1d56dffSMarek Vasut {
202*f1d56dffSMarek Vasut 	int ret;
203*f1d56dffSMarek Vasut 
204*f1d56dffSMarek Vasut 	/* De-assert reset on On-SoM eMMC */
205*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTE, 15, 1);
206*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 15, 0);
207*f1d56dffSMarek Vasut 
208*f1d56dffSMarek Vasut 	ret = atmel_mci_init((void *)ATMEL_BASE_MCI0);
209*f1d56dffSMarek Vasut 	if (ret)	/* eMMC init failed, skip it. */
210*f1d56dffSMarek Vasut 		at91_set_pio_output(AT91_PIO_PORTE, 15, 0);
211*f1d56dffSMarek Vasut 
212*f1d56dffSMarek Vasut 	/* Enable the power supply to On-board MicroSD */
213*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTE, 17, 0);
214*f1d56dffSMarek Vasut 
215*f1d56dffSMarek Vasut 	ret = atmel_mci_init((void *)ATMEL_BASE_MCI1);
216*f1d56dffSMarek Vasut 	if (ret)	/* uSD init failed, power it down. */
217*f1d56dffSMarek Vasut 		at91_set_pio_output(AT91_PIO_PORTE, 17, 1);
218*f1d56dffSMarek Vasut 
219*f1d56dffSMarek Vasut 	return 0;
220*f1d56dffSMarek Vasut }
221*f1d56dffSMarek Vasut #endif /* CONFIG_GENERIC_ATMEL_MCI */
222*f1d56dffSMarek Vasut 
223*f1d56dffSMarek Vasut #ifdef CONFIG_MACB
224*f1d56dffSMarek Vasut void ma5d4evk_macb0_hw_init(void)
225*f1d56dffSMarek Vasut {
226*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);	/* ETXCK_EREFCK */
227*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);	/* ERXDV */
228*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);	/* ERX0 */
229*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);	/* ERX1 */
230*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);	/* ERXER */
231*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);	/* ETXEN */
232*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);	/* ETX0 */
233*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);	/* ETX1 */
234*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);	/* EMDIO */
235*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);	/* EMDC */
236*f1d56dffSMarek Vasut 
237*f1d56dffSMarek Vasut 	/* Enable clock */
238*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_GMAC0);
239*f1d56dffSMarek Vasut }
240*f1d56dffSMarek Vasut #endif
241*f1d56dffSMarek Vasut 
242*f1d56dffSMarek Vasut static void ma5d4evk_serial_hw_init(void)
243*f1d56dffSMarek Vasut {
244*f1d56dffSMarek Vasut 	/* USART0 */
245*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 13, 1);	/* TXD */
246*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 12, 0);	/* RXD */
247*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 11, 0);	/* RTS */
248*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 10, 0);	/* CTS */
249*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_USART0);
250*f1d56dffSMarek Vasut 
251*f1d56dffSMarek Vasut 	/* USART1 */
252*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 17, 1);	/* TXD */
253*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 16, 0);	/* RXD */
254*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 15, 0);	/* RTS */
255*f1d56dffSMarek Vasut 	at91_pio3_set_a_periph(AT91_PIO_PORTD, 14, 0);	/* CTS */
256*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_USART1);
257*f1d56dffSMarek Vasut }
258*f1d56dffSMarek Vasut 
259*f1d56dffSMarek Vasut int board_early_init_f(void)
260*f1d56dffSMarek Vasut {
261*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_PIOA);
262*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_PIOB);
263*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_PIOC);
264*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_PIOD);
265*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_PIOE);
266*f1d56dffSMarek Vasut 
267*f1d56dffSMarek Vasut 	/* Configure LEDs as OFF */
268*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTD, 28, 0);
269*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTD, 29, 0);
270*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTD, 30, 0);
271*f1d56dffSMarek Vasut 
272*f1d56dffSMarek Vasut 	/* Reset CAN controllers */
273*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTB, 21, 0);
274*f1d56dffSMarek Vasut 	udelay(100);
275*f1d56dffSMarek Vasut 	at91_set_pio_output(AT91_PIO_PORTB, 21, 1);
276*f1d56dffSMarek Vasut 	at91_pio3_set_pio_pulldown(AT91_PIO_PORTB, 21, 0);
277*f1d56dffSMarek Vasut 
278*f1d56dffSMarek Vasut 	ma5d4evk_serial_hw_init();
279*f1d56dffSMarek Vasut 
280*f1d56dffSMarek Vasut 	return 0;
281*f1d56dffSMarek Vasut }
282*f1d56dffSMarek Vasut 
283*f1d56dffSMarek Vasut int board_init(void)
284*f1d56dffSMarek Vasut {
285*f1d56dffSMarek Vasut 	/* adress of boot parameters */
286*f1d56dffSMarek Vasut 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
287*f1d56dffSMarek Vasut 
288*f1d56dffSMarek Vasut #ifdef CONFIG_ATMEL_SPI
289*f1d56dffSMarek Vasut 	ma5d4evk_spi0_hw_init();
290*f1d56dffSMarek Vasut #endif
291*f1d56dffSMarek Vasut #ifdef CONFIG_GENERIC_ATMEL_MCI
292*f1d56dffSMarek Vasut 	ma5d4evk_mci0_hw_init();
293*f1d56dffSMarek Vasut 	ma5d4evk_mci1_hw_init();
294*f1d56dffSMarek Vasut #endif
295*f1d56dffSMarek Vasut #ifdef CONFIG_MACB
296*f1d56dffSMarek Vasut 	ma5d4evk_macb0_hw_init();
297*f1d56dffSMarek Vasut #endif
298*f1d56dffSMarek Vasut #ifdef CONFIG_LCD
299*f1d56dffSMarek Vasut 	ma5d4evk_lcd_hw_init();
300*f1d56dffSMarek Vasut #endif
301*f1d56dffSMarek Vasut #ifdef CONFIG_CMD_USB
302*f1d56dffSMarek Vasut 	ma5d4evk_usb_hw_init();
303*f1d56dffSMarek Vasut #endif
304*f1d56dffSMarek Vasut #ifdef CONFIG_USB_GADGET_ATMEL_USBA
305*f1d56dffSMarek Vasut 	at91_udp_hw_init();
306*f1d56dffSMarek Vasut #endif
307*f1d56dffSMarek Vasut 
308*f1d56dffSMarek Vasut 	return 0;
309*f1d56dffSMarek Vasut }
310*f1d56dffSMarek Vasut 
311*f1d56dffSMarek Vasut int dram_init(void)
312*f1d56dffSMarek Vasut {
313*f1d56dffSMarek Vasut 	gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
314*f1d56dffSMarek Vasut 				    CONFIG_SYS_SDRAM_SIZE);
315*f1d56dffSMarek Vasut 	return 0;
316*f1d56dffSMarek Vasut }
317*f1d56dffSMarek Vasut 
318*f1d56dffSMarek Vasut int board_eth_init(bd_t *bis)
319*f1d56dffSMarek Vasut {
320*f1d56dffSMarek Vasut 	int rc = 0;
321*f1d56dffSMarek Vasut 
322*f1d56dffSMarek Vasut #ifdef CONFIG_MACB
323*f1d56dffSMarek Vasut 	rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC0, 0x00);
324*f1d56dffSMarek Vasut #endif
325*f1d56dffSMarek Vasut 
326*f1d56dffSMarek Vasut #ifdef CONFIG_USB_GADGET_ATMEL_USBA
327*f1d56dffSMarek Vasut 	usba_udc_probe(&pdata);
328*f1d56dffSMarek Vasut #ifdef CONFIG_USB_ETH_RNDIS
329*f1d56dffSMarek Vasut 	usb_eth_initialize(bis);
330*f1d56dffSMarek Vasut #endif
331*f1d56dffSMarek Vasut #endif
332*f1d56dffSMarek Vasut 
333*f1d56dffSMarek Vasut 	return rc;
334*f1d56dffSMarek Vasut }
335*f1d56dffSMarek Vasut 
336*f1d56dffSMarek Vasut /* SPL */
337*f1d56dffSMarek Vasut #ifdef CONFIG_SPL_BUILD
338*f1d56dffSMarek Vasut void spl_board_init(void)
339*f1d56dffSMarek Vasut {
340*f1d56dffSMarek Vasut 	ma5d4evk_spi0_hw_init();
341*f1d56dffSMarek Vasut }
342*f1d56dffSMarek Vasut 
343*f1d56dffSMarek Vasut static void ddr2_conf(struct atmel_mpddrc_config *ddr2)
344*f1d56dffSMarek Vasut {
345*f1d56dffSMarek Vasut 	ddr2->md = (ATMEL_MPDDRC_MD_DBW_32_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
346*f1d56dffSMarek Vasut 
347*f1d56dffSMarek Vasut 	ddr2->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
348*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_NR_ROW_13 |
349*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
350*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_NB_8BANKS |
351*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_NDQS_DISABLED |
352*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
353*f1d56dffSMarek Vasut 		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
354*f1d56dffSMarek Vasut 
355*f1d56dffSMarek Vasut 	ddr2->rtr = 0x2b0;
356*f1d56dffSMarek Vasut 
357*f1d56dffSMarek Vasut 	ddr2->tpr0 = (8 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET |
358*f1d56dffSMarek Vasut 		      3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET |
359*f1d56dffSMarek Vasut 		      3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET |
360*f1d56dffSMarek Vasut 		      10 << ATMEL_MPDDRC_TPR0_TRC_OFFSET |
361*f1d56dffSMarek Vasut 		      3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET |
362*f1d56dffSMarek Vasut 		      2 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET |
363*f1d56dffSMarek Vasut 		      2 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET |
364*f1d56dffSMarek Vasut 		      2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET);
365*f1d56dffSMarek Vasut 
366*f1d56dffSMarek Vasut 	ddr2->tpr1 = (2 << ATMEL_MPDDRC_TPR1_TXP_OFFSET |
367*f1d56dffSMarek Vasut 		      200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET |
368*f1d56dffSMarek Vasut 		      25 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET |
369*f1d56dffSMarek Vasut 		      23 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET);
370*f1d56dffSMarek Vasut 
371*f1d56dffSMarek Vasut 	ddr2->tpr2 = (7 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET |
372*f1d56dffSMarek Vasut 		      2 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET |
373*f1d56dffSMarek Vasut 		      3 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET |
374*f1d56dffSMarek Vasut 		      2 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET |
375*f1d56dffSMarek Vasut 		      8 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET);
376*f1d56dffSMarek Vasut }
377*f1d56dffSMarek Vasut 
378*f1d56dffSMarek Vasut void mem_init(void)
379*f1d56dffSMarek Vasut {
380*f1d56dffSMarek Vasut 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
381*f1d56dffSMarek Vasut 	struct atmel_mpddrc_config ddr2;
382*f1d56dffSMarek Vasut 
383*f1d56dffSMarek Vasut 	ddr2_conf(&ddr2);
384*f1d56dffSMarek Vasut 
385*f1d56dffSMarek Vasut 	/* enable MPDDR clock */
386*f1d56dffSMarek Vasut 	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
387*f1d56dffSMarek Vasut 	writel(AT91_PMC_DDR, &pmc->scer);
388*f1d56dffSMarek Vasut 
389*f1d56dffSMarek Vasut 	/* DDRAM2 Controller initialize */
390*f1d56dffSMarek Vasut 	ddr2_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddr2);
391*f1d56dffSMarek Vasut }
392*f1d56dffSMarek Vasut 
393*f1d56dffSMarek Vasut void at91_pmc_init(void)
394*f1d56dffSMarek Vasut {
395*f1d56dffSMarek Vasut 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
396*f1d56dffSMarek Vasut 	u32 tmp;
397*f1d56dffSMarek Vasut 
398*f1d56dffSMarek Vasut 	tmp = AT91_PMC_PLLAR_29 |
399*f1d56dffSMarek Vasut 	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
400*f1d56dffSMarek Vasut 	      AT91_PMC_PLLXR_MUL(87) |
401*f1d56dffSMarek Vasut 	      AT91_PMC_PLLXR_DIV(1);
402*f1d56dffSMarek Vasut 	at91_plla_init(tmp);
403*f1d56dffSMarek Vasut 
404*f1d56dffSMarek Vasut 	writel(0x0 << 8, &pmc->pllicpr);
405*f1d56dffSMarek Vasut 
406*f1d56dffSMarek Vasut 	tmp = AT91_PMC_MCKR_H32MXDIV |
407*f1d56dffSMarek Vasut 	      AT91_PMC_MCKR_PLLADIV_2 |
408*f1d56dffSMarek Vasut 	      AT91_PMC_MCKR_MDIV_3 |
409*f1d56dffSMarek Vasut 	      AT91_PMC_MCKR_CSS_PLLA;
410*f1d56dffSMarek Vasut 	at91_mck_init(tmp);
411*f1d56dffSMarek Vasut }
412*f1d56dffSMarek Vasut #endif
413