1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Bluewater Systems Snapper 9260/9G20 modules
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * (C) Copyright 2011 Bluewater Systems
5*4882a593Smuzhiyun * Author: Andre Renaud <andre@bluewatersys.com>
6*4882a593Smuzhiyun * Author: Ryan Mallon <ryan@bluewatersys.com>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <common.h>
12*4882a593Smuzhiyun #include <atmel_lcd.h>
13*4882a593Smuzhiyun #include <atmel_lcdc.h>
14*4882a593Smuzhiyun #include <atmel_mci.h>
15*4882a593Smuzhiyun #include <dm.h>
16*4882a593Smuzhiyun #include <lcd.h>
17*4882a593Smuzhiyun #include <net.h>
18*4882a593Smuzhiyun #ifndef CONFIG_DM_ETH
19*4882a593Smuzhiyun #include <netdev.h>
20*4882a593Smuzhiyun #endif
21*4882a593Smuzhiyun #include <spi.h>
22*4882a593Smuzhiyun #include <asm/gpio.h>
23*4882a593Smuzhiyun #include <asm/io.h>
24*4882a593Smuzhiyun #include <asm/mach-types.h>
25*4882a593Smuzhiyun #include <asm/arch/at91sam9g45_matrix.h>
26*4882a593Smuzhiyun #include <asm/arch/at91sam9_smc.h>
27*4882a593Smuzhiyun #include <asm/arch/at91_common.h>
28*4882a593Smuzhiyun #include <asm/arch/at91_emac.h>
29*4882a593Smuzhiyun #include <asm/arch/at91_rstc.h>
30*4882a593Smuzhiyun #include <asm/arch/at91_rtc.h>
31*4882a593Smuzhiyun #include <asm/arch/at91_sck.h>
32*4882a593Smuzhiyun #include <asm/arch/atmel_serial.h>
33*4882a593Smuzhiyun #include <asm/arch/clk.h>
34*4882a593Smuzhiyun #include <asm/arch/gpio.h>
35*4882a593Smuzhiyun #include <dm/uclass-internal.h>
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #ifdef CONFIG_GURNARD_SPLASH
38*4882a593Smuzhiyun #include "splash_logo.h"
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /* IO Expander pins */
44*4882a593Smuzhiyun #define IO_EXP_ETH_RESET (0 << 1)
45*4882a593Smuzhiyun #define IO_EXP_ETH_POWER (1 << 1)
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #ifdef CONFIG_MACB
gurnard_macb_hw_init(void)48*4882a593Smuzhiyun static void gurnard_macb_hw_init(void)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun struct at91_port *pioa = (struct at91_port *)ATMEL_BASE_PIOA;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_EMAC);
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /*
55*4882a593Smuzhiyun * Enable pull-up on:
56*4882a593Smuzhiyun * RXDV (PA12) => MODE0 - PHY also has pull-up
57*4882a593Smuzhiyun * ERX0 (PA13) => MODE1 - PHY also has pull-up
58*4882a593Smuzhiyun * ERX1 (PA15) => MODE2 - PHY also has pull-up
59*4882a593Smuzhiyun */
60*4882a593Smuzhiyun writel(pin_to_mask(AT91_PIN_PA15) |
61*4882a593Smuzhiyun pin_to_mask(AT91_PIN_PA12) |
62*4882a593Smuzhiyun pin_to_mask(AT91_PIN_PA13),
63*4882a593Smuzhiyun &pioa->puer);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun at91_phy_reset();
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun at91_macb_hw_init();
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun #endif
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #ifdef CONFIG_CMD_NAND
gurnard_nand_hw_init(void)72*4882a593Smuzhiyun static int gurnard_nand_hw_init(void)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
75*4882a593Smuzhiyun struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
76*4882a593Smuzhiyun ulong flags;
77*4882a593Smuzhiyun int ret;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun /* Enable CS3 as NAND/SmartMedia */
80*4882a593Smuzhiyun setbits_le32(&matrix->ebicsa, AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* Configure SMC CS3 for NAND/SmartMedia */
83*4882a593Smuzhiyun writel(AT91_SMC_SETUP_NWE(2) | AT91_SMC_SETUP_NCS_WR(0) |
84*4882a593Smuzhiyun AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(0),
85*4882a593Smuzhiyun &smc->cs[3].setup);
86*4882a593Smuzhiyun writel(AT91_SMC_PULSE_NWE(4) | AT91_SMC_PULSE_NCS_WR(4) |
87*4882a593Smuzhiyun AT91_SMC_PULSE_NRD(4) | AT91_SMC_PULSE_NCS_RD(4),
88*4882a593Smuzhiyun &smc->cs[3].pulse);
89*4882a593Smuzhiyun writel(AT91_SMC_CYCLE_NWE(7) | AT91_SMC_CYCLE_NRD(7),
90*4882a593Smuzhiyun &smc->cs[3].cycle);
91*4882a593Smuzhiyun #ifdef CONFIG_SYS_NAND_DBW_16
92*4882a593Smuzhiyun flags = AT91_SMC_MODE_DBW_16;
93*4882a593Smuzhiyun #else
94*4882a593Smuzhiyun flags = AT91_SMC_MODE_DBW_8;
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
97*4882a593Smuzhiyun AT91_SMC_MODE_EXNW_DISABLE |
98*4882a593Smuzhiyun flags |
99*4882a593Smuzhiyun AT91_SMC_MODE_TDF_CYCLE(3),
100*4882a593Smuzhiyun &smc->cs[3].mode);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun ret = gpio_request(CONFIG_SYS_NAND_READY_PIN, "nand_rdy");
103*4882a593Smuzhiyun if (ret)
104*4882a593Smuzhiyun return ret;
105*4882a593Smuzhiyun gpio_direction_input(CONFIG_SYS_NAND_READY_PIN);
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* Enable NandFlash */
108*4882a593Smuzhiyun ret = gpio_request(CONFIG_SYS_NAND_ENABLE_PIN, "nand_ce");
109*4882a593Smuzhiyun if (ret)
110*4882a593Smuzhiyun return ret;
111*4882a593Smuzhiyun gpio_direction_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun return 0;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun #endif
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun #ifdef CONFIG_GURNARD_SPLASH
lcd_splash(int width,int height)118*4882a593Smuzhiyun static void lcd_splash(int width, int height)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun u16 colour;
121*4882a593Smuzhiyun int x, y;
122*4882a593Smuzhiyun u16 *base_addr = (u16 *)gd->video_bottom;
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun memset(base_addr, 0xff, width * height * 2);
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun * Blit the logo to the center of the screen
127*4882a593Smuzhiyun */
128*4882a593Smuzhiyun for (y = 0; y < BMP_LOGO_HEIGHT; y++) {
129*4882a593Smuzhiyun for (x = 0; x < BMP_LOGO_WIDTH; x++) {
130*4882a593Smuzhiyun int posx, posy;
131*4882a593Smuzhiyun colour = bmp_logo_palette[bmp_logo_bitmap[
132*4882a593Smuzhiyun y * BMP_LOGO_WIDTH + x]];
133*4882a593Smuzhiyun posx = x + (width - BMP_LOGO_WIDTH) / 2;
134*4882a593Smuzhiyun posy = y;
135*4882a593Smuzhiyun base_addr[posy * width + posx] = colour;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun #endif
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #ifdef CONFIG_DM_VIDEO
at91sam9g45_lcd_hw_init(void)142*4882a593Smuzhiyun static void at91sam9g45_lcd_hw_init(void)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE0, 0); /* LCDDPWR */
145*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE2, 0); /* LCDCC */
146*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE3, 0); /* LCDVSYNC */
147*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE4, 0); /* LCDHSYNC */
148*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE5, 0); /* LCDDOTCK */
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE7, 0); /* LCDD0 */
151*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE8, 0); /* LCDD1 */
152*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE9, 0); /* LCDD2 */
153*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE10, 0); /* LCDD3 */
154*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE11, 0); /* LCDD4 */
155*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE12, 0); /* LCDD5 */
156*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE13, 0); /* LCDD6 */
157*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE14, 0); /* LCDD7 */
158*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE15, 0); /* LCDD8 */
159*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE16, 0); /* LCDD9 */
160*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE17, 0); /* LCDD10 */
161*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE18, 0); /* LCDD11 */
162*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE19, 0); /* LCDD12 */
163*4882a593Smuzhiyun at91_set_B_periph(AT91_PIN_PE20, 0); /* LCDD13 */
164*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE21, 0); /* LCDD14 */
165*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE22, 0); /* LCDD15 */
166*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE23, 0); /* LCDD16 */
167*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE24, 0); /* LCDD17 */
168*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE25, 0); /* LCDD18 */
169*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE26, 0); /* LCDD19 */
170*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE27, 0); /* LCDD20 */
171*4882a593Smuzhiyun at91_set_B_periph(AT91_PIN_PE28, 0); /* LCDD21 */
172*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE29, 0); /* LCDD22 */
173*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE30, 0); /* LCDD23 */
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_LCDC);
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun #endif
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun #ifdef CONFIG_GURNARD_FPGA
180*4882a593Smuzhiyun /**
181*4882a593Smuzhiyun * Initialise the memory bus settings so that we can talk to the
182*4882a593Smuzhiyun * memory mapped FPGA
183*4882a593Smuzhiyun */
fpga_hw_init(void)184*4882a593Smuzhiyun static int fpga_hw_init(void)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
187*4882a593Smuzhiyun struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
188*4882a593Smuzhiyun int i;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun setbits_le32(&matrix->ebicsa, AT91_MATRIX_EBI_CS1A_SDRAMC);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun at91_set_a_periph(2, 4, 0); /* EBIA21 */
193*4882a593Smuzhiyun at91_set_a_periph(2, 5, 0); /* EBIA22 */
194*4882a593Smuzhiyun at91_set_a_periph(2, 6, 0); /* EBIA23 */
195*4882a593Smuzhiyun at91_set_a_periph(2, 7, 0); /* EBIA24 */
196*4882a593Smuzhiyun at91_set_a_periph(2, 12, 0); /* EBIA25 */
197*4882a593Smuzhiyun for (i = 15; i <= 31; i++) /* EBINWAIT & EBID16 - 31 */
198*4882a593Smuzhiyun at91_set_a_periph(2, i, 0);
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun /* configure SMC cs0 for FPGA access timing */
201*4882a593Smuzhiyun writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(2) |
202*4882a593Smuzhiyun AT91_SMC_SETUP_NRD(0) | AT91_SMC_SETUP_NCS_RD(2),
203*4882a593Smuzhiyun &smc->cs[0].setup);
204*4882a593Smuzhiyun writel(AT91_SMC_PULSE_NWE(5) | AT91_SMC_PULSE_NCS_WR(4) |
205*4882a593Smuzhiyun AT91_SMC_PULSE_NRD(6) | AT91_SMC_PULSE_NCS_RD(4),
206*4882a593Smuzhiyun &smc->cs[0].pulse);
207*4882a593Smuzhiyun writel(AT91_SMC_CYCLE_NWE(6) | AT91_SMC_CYCLE_NRD(6),
208*4882a593Smuzhiyun &smc->cs[0].cycle);
209*4882a593Smuzhiyun writel(AT91_SMC_MODE_BAT |
210*4882a593Smuzhiyun AT91_SMC_MODE_EXNW_DISABLE |
211*4882a593Smuzhiyun AT91_SMC_MODE_DBW_32 |
212*4882a593Smuzhiyun AT91_SMC_MODE_TDF |
213*4882a593Smuzhiyun AT91_SMC_MODE_TDF_CYCLE(2),
214*4882a593Smuzhiyun &smc->cs[0].mode);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun /* Do a write to within EBI_CS1 to enable the SDCK */
217*4882a593Smuzhiyun writel(0, ATMEL_BASE_CS1);
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun return 0;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun #endif
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #ifdef CONFIG_CMD_USB
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun #define USB0_ENABLE_PIN AT91_PIN_PB22
226*4882a593Smuzhiyun #define USB1_ENABLE_PIN AT91_PIN_PB23
227*4882a593Smuzhiyun
gurnard_usb_init(void)228*4882a593Smuzhiyun void gurnard_usb_init(void)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun at91_set_gpio_output(USB0_ENABLE_PIN, 1);
231*4882a593Smuzhiyun at91_set_gpio_value(USB0_ENABLE_PIN, 0);
232*4882a593Smuzhiyun at91_set_gpio_output(USB1_ENABLE_PIN, 1);
233*4882a593Smuzhiyun at91_set_gpio_value(USB1_ENABLE_PIN, 0);
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun #endif
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun #ifdef CONFIG_GENERIC_ATMEL_MCI
cpu_mmc_init(bd_t * bis)238*4882a593Smuzhiyun int cpu_mmc_init(bd_t *bis)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun return atmel_mci_init((void *)ATMEL_BASE_MCI0);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun #endif
243*4882a593Smuzhiyun
gurnard_enable_console(int enable)244*4882a593Smuzhiyun static void gurnard_enable_console(int enable)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun at91_set_gpio_output(AT91_PIN_PB14, 1);
247*4882a593Smuzhiyun at91_set_gpio_value(AT91_PIN_PB14, enable ? 0 : 1);
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
at91sam9g45_slowclock_init(void)250*4882a593Smuzhiyun void at91sam9g45_slowclock_init(void)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun /*
253*4882a593Smuzhiyun * On AT91SAM9G45 revC CPUs, the slow clock can be based on an
254*4882a593Smuzhiyun * internal impreciseRC oscillator or an external 32kHz oscillator.
255*4882a593Smuzhiyun * Switch to the latter.
256*4882a593Smuzhiyun */
257*4882a593Smuzhiyun unsigned i, tmp;
258*4882a593Smuzhiyun ulong *reg = (ulong *)ATMEL_BASE_SCKCR;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun tmp = readl(reg);
261*4882a593Smuzhiyun if ((tmp & AT91SAM9G45_SCKCR_OSCSEL) == AT91SAM9G45_SCKCR_OSCSEL_RC) {
262*4882a593Smuzhiyun timer_init();
263*4882a593Smuzhiyun tmp |= AT91SAM9G45_SCKCR_OSC32EN;
264*4882a593Smuzhiyun writel(tmp, reg);
265*4882a593Smuzhiyun for (i = 0; i < 1200; i++)
266*4882a593Smuzhiyun udelay(1000);
267*4882a593Smuzhiyun tmp |= AT91SAM9G45_SCKCR_OSCSEL_32;
268*4882a593Smuzhiyun writel(tmp, reg);
269*4882a593Smuzhiyun udelay(200);
270*4882a593Smuzhiyun tmp &= ~AT91SAM9G45_SCKCR_RCEN;
271*4882a593Smuzhiyun writel(tmp, reg);
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
board_early_init_f(void)275*4882a593Smuzhiyun int board_early_init_f(void)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun at91_seriald_hw_init();
278*4882a593Smuzhiyun gurnard_enable_console(1);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun return 0;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
board_init(void)283*4882a593Smuzhiyun int board_init(void)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun const char *rev_str;
286*4882a593Smuzhiyun #ifdef CONFIG_CMD_NAND
287*4882a593Smuzhiyun int ret;
288*4882a593Smuzhiyun #endif
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_PIOA);
291*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_PIOB);
292*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_PIOC);
293*4882a593Smuzhiyun at91_periph_clk_enable(ATMEL_ID_PIODE);
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun at91sam9g45_slowclock_init();
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun /*
298*4882a593Smuzhiyun * Clear the RTC IDR to disable all IRQs. Avoid issues when Linux
299*4882a593Smuzhiyun * boots with spurious IRQs.
300*4882a593Smuzhiyun */
301*4882a593Smuzhiyun writel(0xffffffff, AT91_RTC_IDR);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun /* Make sure that the reset signal is attached properly */
304*4882a593Smuzhiyun setbits_le32(AT91_ASM_RSTC_MR, AT91_RSTC_KEY | AT91_RSTC_MR_URSTEN);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun gd->bd->bi_arch_number = MACH_TYPE_SNAPPER_9260;
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun /* Address of boot parameters */
309*4882a593Smuzhiyun gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun #ifdef CONFIG_CMD_NAND
312*4882a593Smuzhiyun ret = gurnard_nand_hw_init();
313*4882a593Smuzhiyun if (ret)
314*4882a593Smuzhiyun return ret;
315*4882a593Smuzhiyun #endif
316*4882a593Smuzhiyun #ifdef CONFIG_ATMEL_SPI
317*4882a593Smuzhiyun at91_spi0_hw_init(1 << 4);
318*4882a593Smuzhiyun #endif
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun #ifdef CONFIG_MACB
321*4882a593Smuzhiyun gurnard_macb_hw_init();
322*4882a593Smuzhiyun #endif
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun #ifdef CONFIG_GURNARD_FPGA
325*4882a593Smuzhiyun fpga_hw_init();
326*4882a593Smuzhiyun #endif
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun #ifdef CONFIG_CMD_USB
329*4882a593Smuzhiyun gurnard_usb_init();
330*4882a593Smuzhiyun #endif
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun #ifdef CONFIG_CMD_MMC
333*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PA12, 0);
334*4882a593Smuzhiyun at91_set_gpio_output(AT91_PIN_PA8, 1);
335*4882a593Smuzhiyun at91_set_gpio_value(AT91_PIN_PA8, 0);
336*4882a593Smuzhiyun at91_mci_hw_init();
337*4882a593Smuzhiyun #endif
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun #ifdef CONFIG_DM_VIDEO
340*4882a593Smuzhiyun at91sam9g45_lcd_hw_init();
341*4882a593Smuzhiyun at91_set_A_periph(AT91_PIN_PE6, 1); /* power up */
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun /* Select the second timing index for board rev 2 */
344*4882a593Smuzhiyun rev_str = env_get("board_rev");
345*4882a593Smuzhiyun if (rev_str && !strncmp(rev_str, "2", 1)) {
346*4882a593Smuzhiyun struct udevice *dev;
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun uclass_find_first_device(UCLASS_VIDEO, &dev);
349*4882a593Smuzhiyun if (dev) {
350*4882a593Smuzhiyun struct atmel_lcd_platdata *plat = dev_get_platdata(dev);
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun plat->timing_index = 1;
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun #endif
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun return 0;
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
board_late_init(void)360*4882a593Smuzhiyun int board_late_init(void)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun u_int8_t env_enetaddr[8];
363*4882a593Smuzhiyun char *env_str;
364*4882a593Smuzhiyun char *end;
365*4882a593Smuzhiyun int i;
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun /*
368*4882a593Smuzhiyun * Set MAC address so we do not need to init Ethernet before Linux
369*4882a593Smuzhiyun * boot
370*4882a593Smuzhiyun */
371*4882a593Smuzhiyun env_str = env_get("ethaddr");
372*4882a593Smuzhiyun if (env_str) {
373*4882a593Smuzhiyun struct at91_emac *emac = (struct at91_emac *)ATMEL_BASE_EMAC;
374*4882a593Smuzhiyun /* Parse MAC address */
375*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
376*4882a593Smuzhiyun env_enetaddr[i] = env_str ?
377*4882a593Smuzhiyun simple_strtoul(env_str, &end, 16) : 0;
378*4882a593Smuzhiyun if (env_str)
379*4882a593Smuzhiyun env_str = (*end) ? end+1 : end;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun /* Set hardware address */
383*4882a593Smuzhiyun writel(env_enetaddr[0] | env_enetaddr[1] << 8 |
384*4882a593Smuzhiyun env_enetaddr[2] << 16 | env_enetaddr[3] << 24,
385*4882a593Smuzhiyun &emac->sa2l);
386*4882a593Smuzhiyun writel((env_enetaddr[4] | env_enetaddr[5] << 8), &emac->sa2h);
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun printf("MAC: %s\n", env_get("ethaddr"));
389*4882a593Smuzhiyun } else {
390*4882a593Smuzhiyun /* Not set in environment */
391*4882a593Smuzhiyun printf("MAC: not set\n");
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun #ifdef CONFIG_GURNARD_SPLASH
394*4882a593Smuzhiyun lcd_splash(480, 272);
395*4882a593Smuzhiyun #endif
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun return 0;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun #ifndef CONFIG_DM_ETH
board_eth_init(bd_t * bis)401*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun return macb_eth_initialize(0, (void *)ATMEL_BASE_EMAC, 0);
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun #endif
406*4882a593Smuzhiyun
dram_init(void)407*4882a593Smuzhiyun int dram_init(void)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
410*4882a593Smuzhiyun CONFIG_SYS_SDRAM_SIZE);
411*4882a593Smuzhiyun return 0;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
reset_phy(void)414*4882a593Smuzhiyun void reset_phy(void)
415*4882a593Smuzhiyun {
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun /* SPI chip select control - only used for FPGA programming */
419*4882a593Smuzhiyun #ifdef CONFIG_ATMEL_SPI
420*4882a593Smuzhiyun
spi_cs_is_valid(unsigned int bus,unsigned int cs)421*4882a593Smuzhiyun int spi_cs_is_valid(unsigned int bus, unsigned int cs)
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun return bus == 0 && cs == 0;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun
spi_cs_activate(struct spi_slave * slave)426*4882a593Smuzhiyun void spi_cs_activate(struct spi_slave *slave)
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun /* We don't use chipselects for FPGA programming */
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun
spi_cs_deactivate(struct spi_slave * slave)431*4882a593Smuzhiyun void spi_cs_deactivate(struct spi_slave *slave)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun /* We don't use chipselects for FPGA programming */
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun #endif /* CONFIG_ATMEL_SPI */
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun static struct atmel_serial_platdata at91sam9260_serial_plat = {
438*4882a593Smuzhiyun .base_addr = ATMEL_BASE_DBGU,
439*4882a593Smuzhiyun };
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun U_BOOT_DEVICE(at91sam9260_serial) = {
442*4882a593Smuzhiyun .name = "serial_atmel",
443*4882a593Smuzhiyun .platdata = &at91sam9260_serial_plat,
444*4882a593Smuzhiyun };
445