1 /* 2 * Board file for the VInCo platform 3 * Based on the the SAMA5-EK board file 4 * Configuration settings for the VInCo platform. 5 * Copyright (C) 2014 Atmel 6 * Bo Shen <voice.shen@atmel.com> 7 * Copyright (C) 2015 Free Electrons 8 * Gregory CLEMENT <gregory.clement@free-electrons.com> 9 * 10 * SPDX-License-Identifier: GPL-2.0+ 11 */ 12 13 #include <common.h> 14 #include <asm/io.h> 15 #include <asm/arch/at91_common.h> 16 #include <asm/arch/at91_pmc.h> 17 #include <asm/arch/at91_rstc.h> 18 #include <asm/arch/atmel_mpddrc.h> 19 #include <asm/arch/atmel_usba_udc.h> 20 #include <asm/arch/gpio.h> 21 #include <asm/arch/clk.h> 22 #include <asm/arch/sama5d3_smc.h> 23 #include <asm/arch/sama5d4.h> 24 #include <atmel_hlcdc.h> 25 #include <atmel_mci.h> 26 #include <lcd.h> 27 #include <mmc.h> 28 #include <net.h> 29 #include <netdev.h> 30 #include <nand.h> 31 #include <spi.h> 32 #include <version.h> 33 34 DECLARE_GLOBAL_DATA_PTR; 35 36 /* FIXME gpio code here need to handle through DM_GPIO */ 37 #ifndef CONFIG_DM_SPI 38 int spi_cs_is_valid(unsigned int bus, unsigned int cs) 39 { 40 return bus == 0 && cs == 0; 41 } 42 43 void spi_cs_activate(struct spi_slave *slave) 44 { 45 at91_set_pio_output(AT91_PIO_PORTC, 3, 0); 46 } 47 48 void spi_cs_deactivate(struct spi_slave *slave) 49 { 50 at91_set_pio_output(AT91_PIO_PORTC, 3, 1); 51 } 52 53 static void vinco_spi0_hw_init(void) 54 { 55 at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0); /* SPI0_MISO */ 56 at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0); /* SPI0_MOSI */ 57 at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0); /* SPI0_SPCK */ 58 59 at91_set_pio_output(AT91_PIO_PORTC, 3, 1); /* SPI0_CS0 */ 60 61 /* Enable clock */ 62 at91_periph_clk_enable(ATMEL_ID_SPI0); 63 } 64 #endif /* CONFIG_ATMEL_SPI */ 65 66 67 #ifdef CONFIG_CMD_USB 68 static void vinco_usb_hw_init(void) 69 { 70 at91_set_pio_output(AT91_PIO_PORTE, 11, 0); 71 at91_set_pio_output(AT91_PIO_PORTE, 12, 0); 72 at91_set_pio_output(AT91_PIO_PORTE, 10, 0); 73 } 74 #endif 75 76 77 #ifdef CONFIG_GENERIC_ATMEL_MCI 78 void vinco_mci0_hw_init(void) 79 { 80 at91_pio3_set_b_periph(AT91_PIO_PORTC, 5, 1); /* MCI0 CDA */ 81 at91_pio3_set_b_periph(AT91_PIO_PORTC, 6, 1); /* MCI0 DA0 */ 82 at91_pio3_set_b_periph(AT91_PIO_PORTC, 7, 1); /* MCI0 DA1 */ 83 at91_pio3_set_b_periph(AT91_PIO_PORTC, 8, 1); /* MCI0 DA2 */ 84 at91_pio3_set_b_periph(AT91_PIO_PORTC, 9, 1); /* MCI0 DA3 */ 85 at91_pio3_set_b_periph(AT91_PIO_PORTC, 10, 1); /* MCI0 DA4 */ 86 at91_pio3_set_b_periph(AT91_PIO_PORTC, 11, 1); /* MCI0 DA5 */ 87 at91_pio3_set_b_periph(AT91_PIO_PORTC, 12, 1); /* MCI0 DA6 */ 88 at91_pio3_set_b_periph(AT91_PIO_PORTC, 13, 1); /* MCI0 DA7 */ 89 at91_pio3_set_b_periph(AT91_PIO_PORTC, 4, 0); /* MCI0 CLK */ 90 91 /* 92 * As the mci io internal pull down is too strong, so if the io needs 93 * external pull up, the pull up resistor will be very small, if so 94 * the power consumption will increase, so disable the interanl pull 95 * down to save the power. 96 */ 97 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 4, 0); 98 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 5, 0); 99 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 6, 0); 100 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 7, 0); 101 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 8, 0); 102 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 9, 0); 103 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 10, 0); 104 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 11, 0); 105 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 12, 0); 106 at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 13, 0); 107 108 /* Enable clock */ 109 at91_periph_clk_enable(ATMEL_ID_MCI0); 110 } 111 112 int board_mmc_init(bd_t *bis) 113 { 114 /* Enable power for MCI0 interface */ 115 at91_set_pio_output(AT91_PIO_PORTE, 7, 1); 116 117 return atmel_mci_init((void *)ATMEL_BASE_MCI0); 118 } 119 #endif /* CONFIG_GENERIC_ATMEL_MCI */ 120 121 #ifdef CONFIG_MACB 122 void vinco_macb0_hw_init(void) 123 { 124 at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0); /* ETXCK_EREFCK */ 125 at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0); /* ERXDV */ 126 at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0); /* ERX0 */ 127 at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0); /* ERX1 */ 128 at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0); /* ERXER */ 129 at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0); /* ETXEN */ 130 at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0); /* ETX0 */ 131 at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0); /* ETX1 */ 132 at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0); /* EMDIO */ 133 at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0); /* EMDC */ 134 135 /* Enable clock */ 136 at91_periph_clk_enable(ATMEL_ID_GMAC0); 137 138 /* Enable Phy*/ 139 at91_set_pio_output(AT91_PIO_PORTE, 8, 1); 140 } 141 #endif 142 143 static void vinco_serial3_hw_init(void) 144 { 145 at91_pio3_set_b_periph(AT91_PIO_PORTE, 17, 1); /* TXD3 */ 146 at91_pio3_set_b_periph(AT91_PIO_PORTE, 16, 0); /* RXD3 */ 147 148 /* Enable clock */ 149 at91_periph_clk_enable(ATMEL_ID_USART3); 150 } 151 152 int board_early_init_f(void) 153 { 154 at91_periph_clk_enable(ATMEL_ID_PIOA); 155 at91_periph_clk_enable(ATMEL_ID_PIOB); 156 at91_periph_clk_enable(ATMEL_ID_PIOC); 157 at91_periph_clk_enable(ATMEL_ID_PIOD); 158 at91_periph_clk_enable(ATMEL_ID_PIOE); 159 160 vinco_serial3_hw_init(); 161 162 return 0; 163 } 164 165 int board_init(void) 166 { 167 /* adress of boot parameters */ 168 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 169 170 #ifndef CONFIG_DM_SPI 171 vinco_spi0_hw_init(); 172 #endif 173 174 #ifdef CONFIG_GENERIC_ATMEL_MCI 175 vinco_mci0_hw_init(); 176 #endif 177 #ifdef CONFIG_MACB 178 vinco_macb0_hw_init(); 179 #endif 180 #ifdef CONFIG_CMD_USB 181 vinco_usb_hw_init(); 182 #endif 183 #ifdef CONFIG_USB_GADGET_ATMEL_USBA 184 at91_udp_hw_init(); 185 #endif 186 187 return 0; 188 } 189 190 int dram_init(void) 191 { 192 gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, 193 CONFIG_SYS_SDRAM_SIZE); 194 return 0; 195 } 196 197 int board_eth_init(bd_t *bis) 198 { 199 int rc = 0; 200 201 #ifdef CONFIG_MACB 202 rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC0, 0x00); 203 #endif 204 205 #ifdef CONFIG_USB_GADGET_ATMEL_USBA 206 usba_udc_probe(&pdata); 207 #ifdef CONFIG_USB_ETH_RNDIS 208 usb_eth_initialize(bis); 209 #endif 210 #endif 211 212 return rc; 213 } 214