xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-at91/armv7/sama5d3_devices.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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