1
2
3
4
5
6#include <common.h>
7#include <asm/arch/at91_common.h>
8#include <asm/arch/clk.h>
9#include <asm/arch/gpio.h>
10#include <asm/io.h>
11
12unsigned int get_chip_id(void)
13{
14
15 return readl(ATMEL_BASE_DBGU + 0x40) & ~ARCH_ID_VERSION_MASK;
16}
17
18unsigned int get_extension_chip_id(void)
19{
20
21 return readl(ATMEL_BASE_DBGU + 0x44);
22}
23
24unsigned int has_emac1()
25{
26 return cpu_is_at91sam9x25();
27}
28
29unsigned int has_emac0()
30{
31 return !(cpu_is_at91sam9g15());
32}
33
34unsigned int has_lcdc()
35{
36 return cpu_is_at91sam9g15() || cpu_is_at91sam9g35()
37 || cpu_is_at91sam9x35();
38}
39
40char *get_cpu_name()
41{
42 unsigned int extension_id = get_extension_chip_id();
43
44 if (cpu_is_at91sam9x5()) {
45 switch (extension_id) {
46 case ARCH_EXID_AT91SAM9G15:
47 return "AT91SAM9G15";
48 case ARCH_EXID_AT91SAM9G25:
49 return "AT91SAM9G25";
50 case ARCH_EXID_AT91SAM9G35:
51 return "AT91SAM9G35";
52 case ARCH_EXID_AT91SAM9X25:
53 return "AT91SAM9X25";
54 case ARCH_EXID_AT91SAM9X35:
55 return "AT91SAM9X35";
56 default:
57 return "Unknown CPU type";
58 }
59 } else {
60 return "Unknown CPU type";
61 }
62}
63
64void at91_seriald_hw_init(void)
65{
66 at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0);
67 at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 1);
68
69 at91_periph_clk_enable(ATMEL_ID_SYS);
70}
71
72void at91_serial0_hw_init(void)
73{
74 at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 1);
75 at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0);
76
77 at91_periph_clk_enable(ATMEL_ID_USART0);
78}
79
80void at91_serial1_hw_init(void)
81{
82 at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 1);
83 at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0);
84
85 at91_periph_clk_enable(ATMEL_ID_USART1);
86}
87
88void at91_serial2_hw_init(void)
89{
90 at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 1);
91 at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0);
92
93 at91_periph_clk_enable(ATMEL_ID_USART2);
94}
95
96void at91_mci_hw_init(void)
97{
98
99 at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 1);
100 at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 1);
101 at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 1);
102 at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 1);
103 at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 1);
104 at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 1);
105
106 at91_periph_clk_enable(ATMEL_ID_HSMCI0);
107}
108
109#ifdef CONFIG_ATMEL_SPI
110void at91_spi0_hw_init(unsigned long cs_mask)
111{
112 at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);
113 at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);
114 at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);
115
116 at91_periph_clk_enable(ATMEL_ID_SPI0);
117
118 if (cs_mask & (1 << 0))
119 at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);
120 if (cs_mask & (1 << 1))
121 at91_pio3_set_b_periph(AT91_PIO_PORTA, 7, 0);
122 if (cs_mask & (1 << 2))
123 at91_pio3_set_b_periph(AT91_PIO_PORTA, 1, 0);
124 if (cs_mask & (1 << 3))
125 at91_pio3_set_b_periph(AT91_PIO_PORTB, 3, 0);
126 if (cs_mask & (1 << 4))
127 at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
128 if (cs_mask & (1 << 5))
129 at91_set_pio_output(AT91_PIO_PORTA, 7, 0);
130 if (cs_mask & (1 << 6))
131 at91_set_pio_output(AT91_PIO_PORTA, 1, 0);
132 if (cs_mask & (1 << 7))
133 at91_set_pio_output(AT91_PIO_PORTB, 3, 0);
134}
135
136void at91_spi1_hw_init(unsigned long cs_mask)
137{
138 at91_pio3_set_b_periph(AT91_PIO_PORTA, 21, 0);
139 at91_pio3_set_b_periph(AT91_PIO_PORTA, 22, 0);
140 at91_pio3_set_b_periph(AT91_PIO_PORTA, 23, 0);
141
142 at91_periph_clk_enable(ATMEL_ID_SPI1);
143
144 if (cs_mask & (1 << 0))
145 at91_pio3_set_b_periph(AT91_PIO_PORTA, 8, 0);
146 if (cs_mask & (1 << 1))
147 at91_pio3_set_b_periph(AT91_PIO_PORTA, 0, 0);
148 if (cs_mask & (1 << 2))
149 at91_pio3_set_b_periph(AT91_PIO_PORTA, 31, 0);
150 if (cs_mask & (1 << 3))
151 at91_pio3_set_b_periph(AT91_PIO_PORTA, 30, 0);
152 if (cs_mask & (1 << 4))
153 at91_set_pio_output(AT91_PIO_PORTA, 8, 0);
154 if (cs_mask & (1 << 5))
155 at91_set_pio_output(AT91_PIO_PORTA, 0, 0);
156 if (cs_mask & (1 << 6))
157 at91_set_pio_output(AT91_PIO_PORTA, 31, 0);
158 if (cs_mask & (1 << 7))
159 at91_set_pio_output(AT91_PIO_PORTA, 30, 0);
160}
161#endif
162
163#if defined(CONFIG_USB_OHCI_NEW) || defined(CONFIG_USB_EHCI_HCD)
164void at91_uhp_hw_init(void)
165{
166
167 at91_set_pio_output(AT91_PIO_PORTD, 18, 0);
168 at91_set_pio_output(AT91_PIO_PORTD, 19, 0);
169#if defined(CONFIG_USB_OHCI_NEW)
170
171 at91_set_pio_output(AT91_PIO_PORTD, 20, 0);
172#endif
173}
174#endif
175
176#ifdef CONFIG_MACB
177void at91_macb_hw_init(void)
178{
179 if (has_emac0()) {
180
181 at91_periph_clk_enable(ATMEL_ID_EMAC0);
182
183 at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0);
184 at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0);
185 at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);
186 at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0);
187 at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);
188 at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);
189 at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);
190 at91_pio3_set_a_periph(AT91_PIO_PORTB, 10, 0);
191 at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0);
192 at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);
193 }
194
195 if (has_emac1()) {
196
197 at91_periph_clk_enable(ATMEL_ID_EMAC1);
198
199 at91_pio3_set_b_periph(AT91_PIO_PORTC, 29, 0);
200 at91_pio3_set_b_periph(AT91_PIO_PORTC, 28, 0);
201 at91_pio3_set_b_periph(AT91_PIO_PORTC, 20, 0);
202 at91_pio3_set_b_periph(AT91_PIO_PORTC, 21, 0);
203 at91_pio3_set_b_periph(AT91_PIO_PORTC, 16, 0);
204 at91_pio3_set_b_periph(AT91_PIO_PORTC, 27, 0);
205 at91_pio3_set_b_periph(AT91_PIO_PORTC, 18, 0);
206 at91_pio3_set_b_periph(AT91_PIO_PORTC, 19, 0);
207 at91_pio3_set_b_periph(AT91_PIO_PORTC, 31, 0);
208 at91_pio3_set_b_periph(AT91_PIO_PORTC, 30, 0);
209 }
210
211#ifndef CONFIG_RMII
212
213 if (has_emac0()) {
214 at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);
215 at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);
216 at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);
217 at91_pio3_set_a_periph(AT91_PIO_PORTB, 14, 0);
218 at91_pio3_set_a_periph(AT91_PIO_PORTB, 15, 0);
219 at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);
220 at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);
221 at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);
222 }
223#endif
224}
225#endif
226