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