1 /* 2 * Copyright (C) 2012-2013 Atmel Corporation 3 * Bo Shen <voice.shen@atmel.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <asm/arch/sama5d3.h> 10 #include <asm/arch/at91_common.h> 11 #include <asm/arch/clk.h> 12 #include <asm/arch/gpio.h> 13 #include <asm/io.h> 14 15 unsigned int has_emac() 16 { 17 return cpu_is_sama5d31() || cpu_is_sama5d35() || cpu_is_sama5d36(); 18 } 19 20 unsigned int has_gmac() 21 { 22 return !cpu_is_sama5d31(); 23 } 24 25 unsigned int has_lcdc() 26 { 27 return !cpu_is_sama5d35(); 28 } 29 30 char *get_cpu_name() 31 { 32 unsigned int extension_id = get_extension_chip_id(); 33 34 if (cpu_is_sama5d3()) 35 switch (extension_id) { 36 case ARCH_EXID_SAMA5D31: 37 return "SAMA5D31"; 38 case ARCH_EXID_SAMA5D33: 39 return "SAMA5D33"; 40 case ARCH_EXID_SAMA5D34: 41 return "SAMA5D34"; 42 case ARCH_EXID_SAMA5D35: 43 return "SAMA5D35"; 44 case ARCH_EXID_SAMA5D36: 45 return "SAMA5D36"; 46 default: 47 return "Unknown CPU type"; 48 } 49 else 50 return "Unknown CPU type"; 51 } 52 53 void at91_serial0_hw_init(void) 54 { 55 at91_pio3_set_a_periph(AT91_PIO_PORTD, 18, 1); /* TXD0 */ 56 at91_pio3_set_a_periph(AT91_PIO_PORTD, 17, 0); /* RXD0 */ 57 58 /* Enable clock */ 59 at91_periph_clk_enable(ATMEL_ID_USART0); 60 } 61 62 void at91_serial1_hw_init(void) 63 { 64 at91_pio3_set_a_periph(AT91_PIO_PORTB, 29, 1); /* TXD1 */ 65 at91_pio3_set_a_periph(AT91_PIO_PORTB, 28, 0); /* RXD1 */ 66 67 /* Enable clock */ 68 at91_periph_clk_enable(ATMEL_ID_USART1); 69 } 70 71 void at91_serial2_hw_init(void) 72 { 73 at91_pio3_set_b_periph(AT91_PIO_PORTE, 26, 1); /* TXD2 */ 74 at91_pio3_set_b_periph(AT91_PIO_PORTE, 25, 0); /* RXD2 */ 75 76 /* Enable clock */ 77 at91_periph_clk_enable(ATMEL_ID_USART2); 78 } 79 80 void at91_seriald_hw_init(void) 81 { 82 at91_pio3_set_a_periph(AT91_PIO_PORTB, 31, 1); /* DTXD */ 83 at91_pio3_set_a_periph(AT91_PIO_PORTB, 30, 0); /* DRXD */ 84 85 /* Enable clock */ 86 at91_periph_clk_enable(ATMEL_ID_DBGU); 87 } 88 89 #if defined(CONFIG_ATMEL_SPI) 90 void at91_spi0_hw_init(unsigned long cs_mask) 91 { 92 at91_pio3_set_a_periph(AT91_PIO_PORTD, 10, 0); /* SPI0_MISO */ 93 at91_pio3_set_a_periph(AT91_PIO_PORTD, 11, 0); /* SPI0_MOSI */ 94 at91_pio3_set_a_periph(AT91_PIO_PORTD, 12, 0); /* SPI0_SPCK */ 95 96 if (cs_mask & (1 << 0)) 97 at91_set_pio_output(AT91_PIO_PORTD, 13, 1); 98 if (cs_mask & (1 << 1)) 99 at91_set_pio_output(AT91_PIO_PORTD, 14, 1); 100 if (cs_mask & (1 << 2)) 101 at91_set_pio_output(AT91_PIO_PORTD, 15, 1); 102 if (cs_mask & (1 << 3)) 103 at91_set_pio_output(AT91_PIO_PORTD, 16, 1); 104 105 /* Enable clock */ 106 at91_periph_clk_enable(ATMEL_ID_SPI0); 107 } 108 #endif 109 110 #ifdef CONFIG_GENERIC_ATMEL_MCI 111 void at91_mci_hw_init(void) 112 { 113 at91_pio3_set_a_periph(AT91_PIO_PORTD, 0, 0); /* MCI0 CMD */ 114 at91_pio3_set_a_periph(AT91_PIO_PORTD, 1, 0); /* MCI0 DA0 */ 115 at91_pio3_set_a_periph(AT91_PIO_PORTD, 2, 0); /* MCI0 DA1 */ 116 at91_pio3_set_a_periph(AT91_PIO_PORTD, 3, 0); /* MCI0 DA2 */ 117 at91_pio3_set_a_periph(AT91_PIO_PORTD, 4, 0); /* MCI0 DA3 */ 118 #ifdef CONFIG_ATMEL_MCI_8BIT 119 at91_pio3_set_a_periph(AT91_PIO_PORTD, 5, 0); /* MCI0 DA4 */ 120 at91_pio3_set_a_periph(AT91_PIO_PORTD, 6, 0); /* MCI0 DA5 */ 121 at91_pio3_set_a_periph(AT91_PIO_PORTD, 7, 0); /* MCI0 DA6 */ 122 at91_pio3_set_a_periph(AT91_PIO_PORTD, 8, 0); /* MCI0 DA7 */ 123 #endif 124 at91_pio3_set_a_periph(AT91_PIO_PORTD, 9, 0); /* MCI0 CLK */ 125 126 /* Enable clock */ 127 at91_periph_clk_enable(ATMEL_ID_MCI0); 128 } 129 #endif 130 131 #ifdef CONFIG_MACB 132 void at91_macb_hw_init(void) 133 { 134 at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0); /* ETXCK_EREFCK */ 135 at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0); /* ERXDV */ 136 at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0); /* ERX0 */ 137 at91_pio3_set_a_periph(AT91_PIO_PORTC, 3, 0); /* ERX1 */ 138 at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0); /* ERXER */ 139 at91_pio3_set_a_periph(AT91_PIO_PORTC, 4, 0); /* ETXEN */ 140 at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0); /* ETX0 */ 141 at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0); /* ETX1 */ 142 at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0); /* EMDIO */ 143 at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0); /* EMDC */ 144 145 /* Enable clock */ 146 at91_periph_clk_enable(ATMEL_ID_EMAC); 147 } 148 149 void at91_gmac_hw_init(void) 150 { 151 at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0); /* GTX0 */ 152 at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0); /* GTX1 */ 153 at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0); /* GTX2 */ 154 at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0); /* GTX3 */ 155 at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0); /* GRX0 */ 156 at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0); /* GRX1 */ 157 at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0); /* GRX2 */ 158 at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0); /* GRX3 */ 159 at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0); /* GTXCK */ 160 at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0); /* GTXEN */ 161 162 at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0); /* GRXCK */ 163 at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0); /* GRXER */ 164 165 at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0); /* GMDC */ 166 at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0); /* GMDIO */ 167 at91_pio3_set_a_periph(AT91_PIO_PORTB, 18, 0); /* G125CK */ 168 169 /* Enable clock */ 170 at91_periph_clk_enable(ATMEL_ID_GMAC); 171 } 172 #endif 173 174 #ifdef CONFIG_LCD 175 void at91_lcd_hw_init(void) 176 { 177 at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 0); /* LCDPWM */ 178 at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0); /* LCDDISP */ 179 at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0); /* LCDVSYNC */ 180 at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0); /* LCDHSYNC */ 181 at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0); /* LCDDOTCK */ 182 at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 0); /* LCDDEN */ 183 184 /* The lower 16-bit of LCD only available on Port A */ 185 at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 0); /* LCDD0 */ 186 at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0); /* LCDD1 */ 187 at91_pio3_set_a_periph(AT91_PIO_PORTA, 2, 0); /* LCDD2 */ 188 at91_pio3_set_a_periph(AT91_PIO_PORTA, 3, 0); /* LCDD3 */ 189 at91_pio3_set_a_periph(AT91_PIO_PORTA, 4, 0); /* LCDD4 */ 190 at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 0); /* LCDD5 */ 191 at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0); /* LCDD6 */ 192 at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 0); /* LCDD7 */ 193 at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0); /* LCDD8 */ 194 at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0); /* LCDD9 */ 195 at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0); /* LCDD10 */ 196 at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0); /* LCDD11 */ 197 at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0); /* LCDD12 */ 198 at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0); /* LCDD13 */ 199 at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0); /* LCDD14 */ 200 at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0); /* LCDD15 */ 201 202 /* Enable clock */ 203 at91_periph_clk_enable(ATMEL_ID_LCDC); 204 } 205 #endif 206 207 #ifdef CONFIG_USB_GADGET_ATMEL_USBA 208 void at91_udp_hw_init(void) 209 { 210 /* Enable UPLL clock */ 211 at91_upll_clk_enable(); 212 /* Enable UDPHS clock */ 213 at91_periph_clk_enable(ATMEL_ID_UDPHS); 214 } 215 #endif 216