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