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