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