1 /*
2  * (C) Copyright 2007-2008
3  * Stelian Pop <stelian@popies.net>
4  * Lead Tech Design <www.leadtechdesign.com>
5  *
6  * SPDX-License-Identifier:	GPL-2.0+
7  */
8 
9 #include <common.h>
10 #include <dm.h>
11 #include <asm/io.h>
12 #include <asm/arch/at91sam9260_matrix.h>
13 #include <asm/arch/at91_common.h>
14 #include <asm/arch/at91_pmc.h>
15 #include <asm/arch/at91sam9_sdramc.h>
16 #include <asm/arch/gpio.h>
17 
18 /*
19  * if CONFIG_AT91_GPIO_PULLUP ist set, keep pullups on on all
20  * peripheral pins. Good to have if hardware is soldered optionally
21  * or in case of SPI no slave is selected. Avoid lines to float
22  * needlessly. Use a short local PUP define.
23  *
24  * Due to errata "TXD floats when CTS is inactive" pullups are always
25  * on for TXD pins.
26  */
27 #ifdef CONFIG_AT91_GPIO_PULLUP
28 # define PUP CONFIG_AT91_GPIO_PULLUP
29 #else
30 # define PUP 0
31 #endif
32 
33 void at91_serial0_hw_init(void)
34 {
35 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
36 
37 	at91_set_a_periph(AT91_PIO_PORTB, 4, 1);		/* TXD0 */
38 	at91_set_a_periph(AT91_PIO_PORTB, 5, PUP);		/* RXD0 */
39 	writel(1 << ATMEL_ID_USART0, &pmc->pcer);
40 }
41 
42 void at91_serial1_hw_init(void)
43 {
44 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
45 
46 	at91_set_a_periph(AT91_PIO_PORTB, 6, 1);		/* TXD1 */
47 	at91_set_a_periph(AT91_PIO_PORTB, 7, PUP);		/* RXD1 */
48 	writel(1 << ATMEL_ID_USART1, &pmc->pcer);
49 }
50 
51 void at91_serial2_hw_init(void)
52 {
53 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
54 
55 	at91_set_a_periph(AT91_PIO_PORTB, 8, 1);		/* TXD2 */
56 	at91_set_a_periph(AT91_PIO_PORTB, 9, PUP);		/* RXD2 */
57 	writel(1 << ATMEL_ID_USART2, &pmc->pcer);
58 }
59 
60 void at91_seriald_hw_init(void)
61 {
62 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
63 
64 	at91_set_a_periph(AT91_PIO_PORTB, 14, PUP);		/* DRXD */
65 	at91_set_a_periph(AT91_PIO_PORTB, 15, 1);		/* DTXD */
66 	writel(1 << ATMEL_ID_SYS, &pmc->pcer);
67 }
68 
69 #if defined(CONFIG_HAS_DATAFLASH) || defined(CONFIG_ATMEL_SPI)
70 void at91_spi0_hw_init(unsigned long cs_mask)
71 {
72 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
73 
74 	at91_set_a_periph(AT91_PIO_PORTA, 0, PUP);	/* SPI0_MISO */
75 	at91_set_a_periph(AT91_PIO_PORTA, 1, PUP);	/* SPI0_MOSI */
76 	at91_set_a_periph(AT91_PIO_PORTA, 2, PUP);	/* SPI0_SPCK */
77 
78 	/* Enable clock */
79 	writel(1 << ATMEL_ID_SPI0, &pmc->pcer);
80 
81 	if (cs_mask & (1 << 0)) {
82 		at91_set_a_periph(AT91_PIO_PORTA, 3, 1);
83 	}
84 	if (cs_mask & (1 << 1)) {
85 		at91_set_b_periph(AT91_PIO_PORTC, 11, 1);
86 	}
87 	if (cs_mask & (1 << 2)) {
88 		at91_set_b_periph(AT91_PIO_PORTC, 16, 1);
89 	}
90 	if (cs_mask & (1 << 3)) {
91 		at91_set_b_periph(AT91_PIO_PORTC, 17, 1);
92 	}
93 	if (cs_mask & (1 << 4)) {
94 		at91_set_pio_output(AT91_PIO_PORTA, 3, 1);
95 	}
96 	if (cs_mask & (1 << 5)) {
97 		at91_set_pio_output(AT91_PIO_PORTC, 11, 1);
98 	}
99 	if (cs_mask & (1 << 6)) {
100 		at91_set_pio_output(AT91_PIO_PORTC, 16, 1);
101 	}
102 	if (cs_mask & (1 << 7)) {
103 		at91_set_pio_output(AT91_PIO_PORTC, 17, 1);
104 	}
105 }
106 
107 void at91_spi1_hw_init(unsigned long cs_mask)
108 {
109 	at91_pmc_t	*pmc	= (at91_pmc_t *) ATMEL_BASE_PMC;
110 
111 	at91_set_a_periph(AT91_PIO_PORTB, 0, PUP);	/* SPI1_MISO */
112 	at91_set_a_periph(AT91_PIO_PORTB, 1, PUP);	/* SPI1_MOSI */
113 	at91_set_a_periph(AT91_PIO_PORTB, 2, PUP);	/* SPI1_SPCK */
114 
115 	/* Enable clock */
116 	writel(1 << ATMEL_ID_SPI1, &pmc->pcer);
117 
118 	if (cs_mask & (1 << 0)) {
119 		at91_set_a_periph(AT91_PIO_PORTB, 3, 1);
120 	}
121 	if (cs_mask & (1 << 1)) {
122 		at91_set_b_periph(AT91_PIO_PORTC, 5, 1);
123 	}
124 	if (cs_mask & (1 << 2)) {
125 		at91_set_b_periph(AT91_PIO_PORTC, 4, 1);
126 	}
127 	if (cs_mask & (1 << 3)) {
128 		at91_set_b_periph(AT91_PIO_PORTC, 3, 1);
129 	}
130 	if (cs_mask & (1 << 4)) {
131 		at91_set_pio_output(AT91_PIO_PORTB, 3, 1);
132 	}
133 	if (cs_mask & (1 << 5)) {
134 		at91_set_pio_output(AT91_PIO_PORTC, 5, 1);
135 	}
136 	if (cs_mask & (1 << 6)) {
137 		at91_set_pio_output(AT91_PIO_PORTC, 4, 1);
138 	}
139 	if (cs_mask & (1 << 7)) {
140 		at91_set_pio_output(AT91_PIO_PORTC, 3, 1);
141 	}
142 }
143 #endif
144 
145 #ifdef CONFIG_MACB
146 void at91_macb_hw_init(void)
147 {
148 	/* Enable EMAC clock */
149 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
150 	writel(1 << ATMEL_ID_EMAC0, &pmc->pcer);
151 
152 	at91_set_a_periph(AT91_PIO_PORTA, 19, 0);	/* ETXCK_EREFCK */
153 	at91_set_a_periph(AT91_PIO_PORTA, 17, 0);	/* ERXDV */
154 	at91_set_a_periph(AT91_PIO_PORTA, 14, 0);	/* ERX0 */
155 	at91_set_a_periph(AT91_PIO_PORTA, 15, 0);	/* ERX1 */
156 	at91_set_a_periph(AT91_PIO_PORTA, 18, 0);	/* ERXER */
157 	at91_set_a_periph(AT91_PIO_PORTA, 16, 0);	/* ETXEN */
158 	at91_set_a_periph(AT91_PIO_PORTA, 12, 0);	/* ETX0 */
159 	at91_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* ETX1 */
160 	at91_set_a_periph(AT91_PIO_PORTA, 21, 0);	/* EMDIO */
161 	at91_set_a_periph(AT91_PIO_PORTA, 20, 0);	/* EMDC */
162 
163 #ifndef CONFIG_RMII
164 	at91_set_b_periph(AT91_PIO_PORTA, 28, 0);	/* ECRS */
165 	at91_set_b_periph(AT91_PIO_PORTA, 29, 0);	/* ECOL */
166 	at91_set_b_periph(AT91_PIO_PORTA, 25, 0);	/* ERX2 */
167 	at91_set_b_periph(AT91_PIO_PORTA, 26, 0);	/* ERX3 */
168 	at91_set_b_periph(AT91_PIO_PORTA, 27, 0);	/* ERXCK */
169 #if defined(CONFIG_AT91SAM9260EK)
170 	/*
171 	 * use PA10, PA11 for ETX2, ETX3.
172 	 * PA23 and PA24 are for TWI EEPROM
173 	 */
174 	at91_set_b_periph(AT91_PIO_PORTA, 10, 0);	/* ETX2 */
175 	at91_set_b_periph(AT91_PIO_PORTA, 11, 0);	/* ETX3 */
176 #else
177 	at91_set_b_periph(AT91_PIO_PORTA, 23, 0);	/* ETX2 */
178 	at91_set_b_periph(AT91_PIO_PORTA, 24, 0);	/* ETX3 */
179 #if defined(CONFIG_AT91SAM9G20)
180 	/* 9G20 BOOT ROM initializes those pins to multi-drive, undo that */
181 	at91_set_pio_multi_drive(AT91_PIO_PORTA, 23, 0);
182 	at91_set_pio_multi_drive(AT91_PIO_PORTA, 24, 0);
183 #endif
184 #endif
185 	at91_set_b_periph(AT91_PIO_PORTA, 22, 0);	/* ETXER */
186 #endif
187 }
188 #endif
189 
190 #if defined(CONFIG_GENERIC_ATMEL_MCI)
191 void at91_mci_hw_init(void)
192 {
193 	/* Enable mci clock */
194 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
195 	writel(1 << ATMEL_ID_MCI, &pmc->pcer);
196 
197 	at91_set_a_periph(AT91_PIO_PORTA, 8, 1);	/* MCCK */
198 #if defined(CONFIG_ATMEL_MCI_PORTB)
199 	at91_set_b_periph(AT91_PIO_PORTA, 1, 1);	/* MCCDB */
200 	at91_set_b_periph(AT91_PIO_PORTA, 0, 1);	/* MCDB0 */
201 	at91_set_b_periph(AT91_PIO_PORTA, 5, 1);	/* MCDB1 */
202 	at91_set_b_periph(AT91_PIO_PORTA, 4, 1);	/* MCDB2 */
203 	at91_set_b_periph(AT91_PIO_PORTA, 3, 1);	/* MCDB3 */
204 #else
205 	at91_set_a_periph(AT91_PIO_PORTA, 7, 1);	/* MCCDA */
206 	at91_set_a_periph(AT91_PIO_PORTA, 6, 1);	/* MCDA0 */
207 	at91_set_a_periph(AT91_PIO_PORTA, 9, 1);	/* MCDA1 */
208 	at91_set_a_periph(AT91_PIO_PORTA, 10, 1);	/* MCDA2 */
209 	at91_set_a_periph(AT91_PIO_PORTA, 11, 1);	/* MCDA3 */
210 #endif
211 }
212 #endif
213 
214 void at91_sdram_hw_init(void)
215 {
216 	at91_set_a_periph(AT91_PIO_PORTC, 16, 0);
217 	at91_set_a_periph(AT91_PIO_PORTC, 17, 0);
218 	at91_set_a_periph(AT91_PIO_PORTC, 18, 0);
219 	at91_set_a_periph(AT91_PIO_PORTC, 19, 0);
220 	at91_set_a_periph(AT91_PIO_PORTC, 20, 0);
221 	at91_set_a_periph(AT91_PIO_PORTC, 21, 0);
222 	at91_set_a_periph(AT91_PIO_PORTC, 22, 0);
223 	at91_set_a_periph(AT91_PIO_PORTC, 23, 0);
224 	at91_set_a_periph(AT91_PIO_PORTC, 24, 0);
225 	at91_set_a_periph(AT91_PIO_PORTC, 25, 0);
226 	at91_set_a_periph(AT91_PIO_PORTC, 26, 0);
227 	at91_set_a_periph(AT91_PIO_PORTC, 27, 0);
228 	at91_set_a_periph(AT91_PIO_PORTC, 28, 0);
229 	at91_set_a_periph(AT91_PIO_PORTC, 29, 0);
230 	at91_set_a_periph(AT91_PIO_PORTC, 30, 0);
231 	at91_set_a_periph(AT91_PIO_PORTC, 31, 0);
232 }
233 
234 /* Platform data for the GPIOs */
235 static const struct at91_port_platdata at91sam9260_plat[] = {
236 	{ ATMEL_BASE_PIOA, "PA" },
237 	{ ATMEL_BASE_PIOB, "PB" },
238 	{ ATMEL_BASE_PIOC, "PC" },
239 };
240 
241 U_BOOT_DEVICES(at91sam9260_gpios) = {
242 	{ "gpio_at91", &at91sam9260_plat[0] },
243 	{ "gpio_at91", &at91sam9260_plat[1] },
244 	{ "gpio_at91", &at91sam9260_plat[2] },
245 };
246