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