diff options
Diffstat (limited to 'arch/arm/mach-at91')
26 files changed, 4193 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c new file mode 100644 index 00000000000..bfc684441ef --- /dev/null +++ b/arch/arm/mach-at91/at91cap9.c | |||
@@ -0,0 +1,397 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/at91cap9.c | ||
3 | * | ||
4 | * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> | ||
5 | * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> | ||
6 | * Copyright (C) 2007 Atmel Corporation. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/pm.h> | ||
17 | |||
18 | #include <asm/irq.h> | ||
19 | #include <asm/mach/arch.h> | ||
20 | #include <asm/mach/map.h> | ||
21 | |||
22 | #include <mach/cpu.h> | ||
23 | #include <mach/at91cap9.h> | ||
24 | #include <mach/at91_pmc.h> | ||
25 | #include <mach/at91_rstc.h> | ||
26 | #include <mach/at91_shdwc.h> | ||
27 | |||
28 | #include "soc.h" | ||
29 | #include "generic.h" | ||
30 | #include "clock.h" | ||
31 | |||
32 | /* -------------------------------------------------------------------- | ||
33 | * Clocks | ||
34 | * -------------------------------------------------------------------- */ | ||
35 | |||
36 | /* | ||
37 | * The peripheral clocks. | ||
38 | */ | ||
39 | static struct clk pioABCD_clk = { | ||
40 | .name = "pioABCD_clk", | ||
41 | .pmc_mask = 1 << AT91CAP9_ID_PIOABCD, | ||
42 | .type = CLK_TYPE_PERIPHERAL, | ||
43 | }; | ||
44 | static struct clk mpb0_clk = { | ||
45 | .name = "mpb0_clk", | ||
46 | .pmc_mask = 1 << AT91CAP9_ID_MPB0, | ||
47 | .type = CLK_TYPE_PERIPHERAL, | ||
48 | }; | ||
49 | static struct clk mpb1_clk = { | ||
50 | .name = "mpb1_clk", | ||
51 | .pmc_mask = 1 << AT91CAP9_ID_MPB1, | ||
52 | .type = CLK_TYPE_PERIPHERAL, | ||
53 | }; | ||
54 | static struct clk mpb2_clk = { | ||
55 | .name = "mpb2_clk", | ||
56 | .pmc_mask = 1 << AT91CAP9_ID_MPB2, | ||
57 | .type = CLK_TYPE_PERIPHERAL, | ||
58 | }; | ||
59 | static struct clk mpb3_clk = { | ||
60 | .name = "mpb3_clk", | ||
61 | .pmc_mask = 1 << AT91CAP9_ID_MPB3, | ||
62 | .type = CLK_TYPE_PERIPHERAL, | ||
63 | }; | ||
64 | static struct clk mpb4_clk = { | ||
65 | .name = "mpb4_clk", | ||
66 | .pmc_mask = 1 << AT91CAP9_ID_MPB4, | ||
67 | .type = CLK_TYPE_PERIPHERAL, | ||
68 | }; | ||
69 | static struct clk usart0_clk = { | ||
70 | .name = "usart0_clk", | ||
71 | .pmc_mask = 1 << AT91CAP9_ID_US0, | ||
72 | .type = CLK_TYPE_PERIPHERAL, | ||
73 | }; | ||
74 | static struct clk usart1_clk = { | ||
75 | .name = "usart1_clk", | ||
76 | .pmc_mask = 1 << AT91CAP9_ID_US1, | ||
77 | .type = CLK_TYPE_PERIPHERAL, | ||
78 | }; | ||
79 | static struct clk usart2_clk = { | ||
80 | .name = "usart2_clk", | ||
81 | .pmc_mask = 1 << AT91CAP9_ID_US2, | ||
82 | .type = CLK_TYPE_PERIPHERAL, | ||
83 | }; | ||
84 | static struct clk mmc0_clk = { | ||
85 | .name = "mci0_clk", | ||
86 | .pmc_mask = 1 << AT91CAP9_ID_MCI0, | ||
87 | .type = CLK_TYPE_PERIPHERAL, | ||
88 | }; | ||
89 | static struct clk mmc1_clk = { | ||
90 | .name = "mci1_clk", | ||
91 | .pmc_mask = 1 << AT91CAP9_ID_MCI1, | ||
92 | .type = CLK_TYPE_PERIPHERAL, | ||
93 | }; | ||
94 | static struct clk can_clk = { | ||
95 | .name = "can_clk", | ||
96 | .pmc_mask = 1 << AT91CAP9_ID_CAN, | ||
97 | .type = CLK_TYPE_PERIPHERAL, | ||
98 | }; | ||
99 | static struct clk twi_clk = { | ||
100 | .name = "twi_clk", | ||
101 | .pmc_mask = 1 << AT91CAP9_ID_TWI, | ||
102 | .type = CLK_TYPE_PERIPHERAL, | ||
103 | }; | ||
104 | static struct clk spi0_clk = { | ||
105 | .name = "spi0_clk", | ||
106 | .pmc_mask = 1 << AT91CAP9_ID_SPI0, | ||
107 | .type = CLK_TYPE_PERIPHERAL, | ||
108 | }; | ||
109 | static struct clk spi1_clk = { | ||
110 | .name = "spi1_clk", | ||
111 | .pmc_mask = 1 << AT91CAP9_ID_SPI1, | ||
112 | .type = CLK_TYPE_PERIPHERAL, | ||
113 | }; | ||
114 | static struct clk ssc0_clk = { | ||
115 | .name = "ssc0_clk", | ||
116 | .pmc_mask = 1 << AT91CAP9_ID_SSC0, | ||
117 | .type = CLK_TYPE_PERIPHERAL, | ||
118 | }; | ||
119 | static struct clk ssc1_clk = { | ||
120 | .name = "ssc1_clk", | ||
121 | .pmc_mask = 1 << AT91CAP9_ID_SSC1, | ||
122 | .type = CLK_TYPE_PERIPHERAL, | ||
123 | }; | ||
124 | static struct clk ac97_clk = { | ||
125 | .name = "ac97_clk", | ||
126 | .pmc_mask = 1 << AT91CAP9_ID_AC97C, | ||
127 | .type = CLK_TYPE_PERIPHERAL, | ||
128 | }; | ||
129 | static struct clk tcb_clk = { | ||
130 | .name = "tcb_clk", | ||
131 | .pmc_mask = 1 << AT91CAP9_ID_TCB, | ||
132 | .type = CLK_TYPE_PERIPHERAL, | ||
133 | }; | ||
134 | static struct clk pwm_clk = { | ||
135 | .name = "pwm_clk", | ||
136 | .pmc_mask = 1 << AT91CAP9_ID_PWMC, | ||
137 | .type = CLK_TYPE_PERIPHERAL, | ||
138 | }; | ||
139 | static struct clk macb_clk = { | ||
140 | .name = "macb_clk", | ||
141 | .pmc_mask = 1 << AT91CAP9_ID_EMAC, | ||
142 | .type = CLK_TYPE_PERIPHERAL, | ||
143 | }; | ||
144 | static struct clk aestdes_clk = { | ||
145 | .name = "aestdes_clk", | ||
146 | .pmc_mask = 1 << AT91CAP9_ID_AESTDES, | ||
147 | .type = CLK_TYPE_PERIPHERAL, | ||
148 | }; | ||
149 | static struct clk adc_clk = { | ||
150 | .name = "adc_clk", | ||
151 | .pmc_mask = 1 << AT91CAP9_ID_ADC, | ||
152 | .type = CLK_TYPE_PERIPHERAL, | ||
153 | }; | ||
154 | static struct clk isi_clk = { | ||
155 | .name = "isi_clk", | ||
156 | .pmc_mask = 1 << AT91CAP9_ID_ISI, | ||
157 | .type = CLK_TYPE_PERIPHERAL, | ||
158 | }; | ||
159 | static struct clk lcdc_clk = { | ||
160 | .name = "lcdc_clk", | ||
161 | .pmc_mask = 1 << AT91CAP9_ID_LCDC, | ||
162 | .type = CLK_TYPE_PERIPHERAL, | ||
163 | }; | ||
164 | static struct clk dma_clk = { | ||
165 | .name = "dma_clk", | ||
166 | .pmc_mask = 1 << AT91CAP9_ID_DMA, | ||
167 | .type = CLK_TYPE_PERIPHERAL, | ||
168 | }; | ||
169 | static struct clk udphs_clk = { | ||
170 | .name = "udphs_clk", | ||
171 | .pmc_mask = 1 << AT91CAP9_ID_UDPHS, | ||
172 | .type = CLK_TYPE_PERIPHERAL, | ||
173 | }; | ||
174 | static struct clk ohci_clk = { | ||
175 | .name = "ohci_clk", | ||
176 | .pmc_mask = 1 << AT91CAP9_ID_UHP, | ||
177 | .type = CLK_TYPE_PERIPHERAL, | ||
178 | }; | ||
179 | |||
180 | static struct clk *periph_clocks[] __initdata = { | ||
181 | &pioABCD_clk, | ||
182 | &mpb0_clk, | ||
183 | &mpb1_clk, | ||
184 | &mpb2_clk, | ||
185 | &mpb3_clk, | ||
186 | &mpb4_clk, | ||
187 | &usart0_clk, | ||
188 | &usart1_clk, | ||
189 | &usart2_clk, | ||
190 | &mmc0_clk, | ||
191 | &mmc1_clk, | ||
192 | &can_clk, | ||
193 | &twi_clk, | ||
194 | &spi0_clk, | ||
195 | &spi1_clk, | ||
196 | &ssc0_clk, | ||
197 | &ssc1_clk, | ||
198 | &ac97_clk, | ||
199 | &tcb_clk, | ||
200 | &pwm_clk, | ||
201 | &macb_clk, | ||
202 | &aestdes_clk, | ||
203 | &adc_clk, | ||
204 | &isi_clk, | ||
205 | &lcdc_clk, | ||
206 | &dma_clk, | ||
207 | &udphs_clk, | ||
208 | &ohci_clk, | ||
209 | // irq0 .. irq1 | ||
210 | }; | ||
211 | |||
212 | static struct clk_lookup periph_clocks_lookups[] = { | ||
213 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk), | ||
214 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk), | ||
215 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
216 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
217 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
218 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
219 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | ||
220 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
221 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
222 | }; | ||
223 | |||
224 | static struct clk_lookup usart_clocks_lookups[] = { | ||
225 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
226 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
227 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
228 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
229 | }; | ||
230 | |||
231 | /* | ||
232 | * The four programmable clocks. | ||
233 | * You must configure pin multiplexing to bring these signals out. | ||
234 | */ | ||
235 | static struct clk pck0 = { | ||
236 | .name = "pck0", | ||
237 | .pmc_mask = AT91_PMC_PCK0, | ||
238 | .type = CLK_TYPE_PROGRAMMABLE, | ||
239 | .id = 0, | ||
240 | }; | ||
241 | static struct clk pck1 = { | ||
242 | .name = "pck1", | ||
243 | .pmc_mask = AT91_PMC_PCK1, | ||
244 | .type = CLK_TYPE_PROGRAMMABLE, | ||
245 | .id = 1, | ||
246 | }; | ||
247 | static struct clk pck2 = { | ||
248 | .name = "pck2", | ||
249 | .pmc_mask = AT91_PMC_PCK2, | ||
250 | .type = CLK_TYPE_PROGRAMMABLE, | ||
251 | .id = 2, | ||
252 | }; | ||
253 | static struct clk pck3 = { | ||
254 | .name = "pck3", | ||
255 | .pmc_mask = AT91_PMC_PCK3, | ||
256 | .type = CLK_TYPE_PROGRAMMABLE, | ||
257 | .id = 3, | ||
258 | }; | ||
259 | |||
260 | static void __init at91cap9_register_clocks(void) | ||
261 | { | ||
262 | int i; | ||
263 | |||
264 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | ||
265 | clk_register(periph_clocks[i]); | ||
266 | |||
267 | clkdev_add_table(periph_clocks_lookups, | ||
268 | ARRAY_SIZE(periph_clocks_lookups)); | ||
269 | clkdev_add_table(usart_clocks_lookups, | ||
270 | ARRAY_SIZE(usart_clocks_lookups)); | ||
271 | |||
272 | clk_register(&pck0); | ||
273 | clk_register(&pck1); | ||
274 | clk_register(&pck2); | ||
275 | clk_register(&pck3); | ||
276 | } | ||
277 | |||
278 | static struct clk_lookup console_clock_lookup; | ||
279 | |||
280 | void __init at91cap9_set_console_clock(int id) | ||
281 | { | ||
282 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
283 | return; | ||
284 | |||
285 | console_clock_lookup.con_id = "usart"; | ||
286 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
287 | clkdev_add(&console_clock_lookup); | ||
288 | } | ||
289 | |||
290 | /* -------------------------------------------------------------------- | ||
291 | * GPIO | ||
292 | * -------------------------------------------------------------------- */ | ||
293 | |||
294 | static struct at91_gpio_bank at91cap9_gpio[] = { | ||
295 | { | ||
296 | .id = AT91CAP9_ID_PIOABCD, | ||
297 | .offset = AT91_PIOA, | ||
298 | .clock = &pioABCD_clk, | ||
299 | }, { | ||
300 | .id = AT91CAP9_ID_PIOABCD, | ||
301 | .offset = AT91_PIOB, | ||
302 | .clock = &pioABCD_clk, | ||
303 | }, { | ||
304 | .id = AT91CAP9_ID_PIOABCD, | ||
305 | .offset = AT91_PIOC, | ||
306 | .clock = &pioABCD_clk, | ||
307 | }, { | ||
308 | .id = AT91CAP9_ID_PIOABCD, | ||
309 | .offset = AT91_PIOD, | ||
310 | .clock = &pioABCD_clk, | ||
311 | } | ||
312 | }; | ||
313 | |||
314 | static void at91cap9_reset(void) | ||
315 | { | ||
316 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | ||
317 | } | ||
318 | |||
319 | static void at91cap9_poweroff(void) | ||
320 | { | ||
321 | at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); | ||
322 | } | ||
323 | |||
324 | |||
325 | /* -------------------------------------------------------------------- | ||
326 | * AT91CAP9 processor initialization | ||
327 | * -------------------------------------------------------------------- */ | ||
328 | |||
329 | static void __init at91cap9_map_io(void) | ||
330 | { | ||
331 | at91_init_sram(0, AT91CAP9_SRAM_BASE, AT91CAP9_SRAM_SIZE); | ||
332 | } | ||
333 | |||
334 | static void __init at91cap9_initialize(void) | ||
335 | { | ||
336 | at91_arch_reset = at91cap9_reset; | ||
337 | pm_power_off = at91cap9_poweroff; | ||
338 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); | ||
339 | |||
340 | /* Register GPIO subsystem */ | ||
341 | at91_gpio_init(at91cap9_gpio, 4); | ||
342 | |||
343 | /* Remember the silicon revision */ | ||
344 | if (cpu_is_at91cap9_revB()) | ||
345 | system_rev = 0xB; | ||
346 | else if (cpu_is_at91cap9_revC()) | ||
347 | system_rev = 0xC; | ||
348 | } | ||
349 | |||
350 | /* -------------------------------------------------------------------- | ||
351 | * Interrupt initialization | ||
352 | * -------------------------------------------------------------------- */ | ||
353 | |||
354 | /* | ||
355 | * The default interrupt priority levels (0 = lowest, 7 = highest). | ||
356 | */ | ||
357 | static unsigned int at91cap9_default_irq_priority[NR_AIC_IRQS] __initdata = { | ||
358 | 7, /* Advanced Interrupt Controller (FIQ) */ | ||
359 | 7, /* System Peripherals */ | ||
360 | 1, /* Parallel IO Controller A, B, C and D */ | ||
361 | 0, /* MP Block Peripheral 0 */ | ||
362 | 0, /* MP Block Peripheral 1 */ | ||
363 | 0, /* MP Block Peripheral 2 */ | ||
364 | 0, /* MP Block Peripheral 3 */ | ||
365 | 0, /* MP Block Peripheral 4 */ | ||
366 | 5, /* USART 0 */ | ||
367 | 5, /* USART 1 */ | ||
368 | 5, /* USART 2 */ | ||
369 | 0, /* Multimedia Card Interface 0 */ | ||
370 | 0, /* Multimedia Card Interface 1 */ | ||
371 | 3, /* CAN */ | ||
372 | 6, /* Two-Wire Interface */ | ||
373 | 5, /* Serial Peripheral Interface 0 */ | ||
374 | 5, /* Serial Peripheral Interface 1 */ | ||
375 | 4, /* Serial Synchronous Controller 0 */ | ||
376 | 4, /* Serial Synchronous Controller 1 */ | ||
377 | 5, /* AC97 Controller */ | ||
378 | 0, /* Timer Counter 0, 1 and 2 */ | ||
379 | 0, /* Pulse Width Modulation Controller */ | ||
380 | 3, /* Ethernet */ | ||
381 | 0, /* Advanced Encryption Standard, Triple DES*/ | ||
382 | 0, /* Analog-to-Digital Converter */ | ||
383 | 0, /* Image Sensor Interface */ | ||
384 | 3, /* LCD Controller */ | ||
385 | 0, /* DMA Controller */ | ||
386 | 2, /* USB Device Port */ | ||
387 | 2, /* USB Host port */ | ||
388 | 0, /* Advanced Interrupt Controller (IRQ0) */ | ||
389 | 0, /* Advanced Interrupt Controller (IRQ1) */ | ||
390 | }; | ||
391 | |||
392 | struct at91_init_soc __initdata at91cap9_soc = { | ||
393 | .map_io = at91cap9_map_io, | ||
394 | .default_irq_priority = at91cap9_default_irq_priority, | ||
395 | .register_clocks = at91cap9_register_clocks, | ||
396 | .init = at91cap9_initialize, | ||
397 | }; | ||
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c new file mode 100644 index 00000000000..0512baf0a21 --- /dev/null +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -0,0 +1,1259 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/at91cap9_devices.c | ||
3 | * | ||
4 | * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> | ||
5 | * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> | ||
6 | * Copyright (C) 2007 Atmel Corporation. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | #include <asm/mach/arch.h> | ||
15 | #include <asm/mach/map.h> | ||
16 | #include <asm/mach/irq.h> | ||
17 | |||
18 | #include <linux/dma-mapping.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/i2c-gpio.h> | ||
21 | |||
22 | #include <video/atmel_lcdc.h> | ||
23 | |||
24 | #include <mach/board.h> | ||
25 | #include <mach/cpu.h> | ||
26 | #include <mach/gpio.h> | ||
27 | #include <mach/at91cap9.h> | ||
28 | #include <mach/at91cap9_matrix.h> | ||
29 | #include <mach/at91sam9_smc.h> | ||
30 | |||
31 | #include "generic.h" | ||
32 | |||
33 | |||
34 | /* -------------------------------------------------------------------- | ||
35 | * USB Host | ||
36 | * -------------------------------------------------------------------- */ | ||
37 | |||
38 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
39 | static u64 ohci_dmamask = DMA_BIT_MASK(32); | ||
40 | static struct at91_usbh_data usbh_data; | ||
41 | |||
42 | static struct resource usbh_resources[] = { | ||
43 | [0] = { | ||
44 | .start = AT91CAP9_UHP_BASE, | ||
45 | .end = AT91CAP9_UHP_BASE + SZ_1M - 1, | ||
46 | .flags = IORESOURCE_MEM, | ||
47 | }, | ||
48 | [1] = { | ||
49 | .start = AT91CAP9_ID_UHP, | ||
50 | .end = AT91CAP9_ID_UHP, | ||
51 | .flags = IORESOURCE_IRQ, | ||
52 | }, | ||
53 | }; | ||
54 | |||
55 | static struct platform_device at91_usbh_device = { | ||
56 | .name = "at91_ohci", | ||
57 | .id = -1, | ||
58 | .dev = { | ||
59 | .dma_mask = &ohci_dmamask, | ||
60 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
61 | .platform_data = &usbh_data, | ||
62 | }, | ||
63 | .resource = usbh_resources, | ||
64 | .num_resources = ARRAY_SIZE(usbh_resources), | ||
65 | }; | ||
66 | |||
67 | void __init at91_add_device_usbh(struct at91_usbh_data *data) | ||
68 | { | ||
69 | int i; | ||
70 | |||
71 | if (!data) | ||
72 | return; | ||
73 | |||
74 | if (cpu_is_at91cap9_revB()) | ||
75 | irq_set_irq_type(AT91CAP9_ID_UHP, IRQ_TYPE_LEVEL_HIGH); | ||
76 | |||
77 | /* Enable VBus control for UHP ports */ | ||
78 | for (i = 0; i < data->ports; i++) { | ||
79 | if (data->vbus_pin[i]) | ||
80 | at91_set_gpio_output(data->vbus_pin[i], 0); | ||
81 | } | ||
82 | |||
83 | usbh_data = *data; | ||
84 | platform_device_register(&at91_usbh_device); | ||
85 | } | ||
86 | #else | ||
87 | void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | ||
88 | #endif | ||
89 | |||
90 | |||
91 | /* -------------------------------------------------------------------- | ||
92 | * USB HS Device (Gadget) | ||
93 | * -------------------------------------------------------------------- */ | ||
94 | |||
95 | #if defined(CONFIG_USB_ATMEL_USBA) || defined(CONFIG_USB_ATMEL_USBA_MODULE) | ||
96 | |||
97 | static struct resource usba_udc_resources[] = { | ||
98 | [0] = { | ||
99 | .start = AT91CAP9_UDPHS_FIFO, | ||
100 | .end = AT91CAP9_UDPHS_FIFO + SZ_512K - 1, | ||
101 | .flags = IORESOURCE_MEM, | ||
102 | }, | ||
103 | [1] = { | ||
104 | .start = AT91CAP9_BASE_UDPHS, | ||
105 | .end = AT91CAP9_BASE_UDPHS + SZ_1K - 1, | ||
106 | .flags = IORESOURCE_MEM, | ||
107 | }, | ||
108 | [2] = { | ||
109 | .start = AT91CAP9_ID_UDPHS, | ||
110 | .end = AT91CAP9_ID_UDPHS, | ||
111 | .flags = IORESOURCE_IRQ, | ||
112 | }, | ||
113 | }; | ||
114 | |||
115 | #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ | ||
116 | [idx] = { \ | ||
117 | .name = nam, \ | ||
118 | .index = idx, \ | ||
119 | .fifo_size = maxpkt, \ | ||
120 | .nr_banks = maxbk, \ | ||
121 | .can_dma = dma, \ | ||
122 | .can_isoc = isoc, \ | ||
123 | } | ||
124 | |||
125 | static struct usba_ep_data usba_udc_ep[] = { | ||
126 | EP("ep0", 0, 64, 1, 0, 0), | ||
127 | EP("ep1", 1, 1024, 3, 1, 1), | ||
128 | EP("ep2", 2, 1024, 3, 1, 1), | ||
129 | EP("ep3", 3, 1024, 2, 1, 1), | ||
130 | EP("ep4", 4, 1024, 2, 1, 1), | ||
131 | EP("ep5", 5, 1024, 2, 1, 0), | ||
132 | EP("ep6", 6, 1024, 2, 1, 0), | ||
133 | EP("ep7", 7, 1024, 2, 0, 0), | ||
134 | }; | ||
135 | |||
136 | #undef EP | ||
137 | |||
138 | /* | ||
139 | * pdata doesn't have room for any endpoints, so we need to | ||
140 | * append room for the ones we need right after it. | ||
141 | */ | ||
142 | static struct { | ||
143 | struct usba_platform_data pdata; | ||
144 | struct usba_ep_data ep[8]; | ||
145 | } usba_udc_data; | ||
146 | |||
147 | static struct platform_device at91_usba_udc_device = { | ||
148 | .name = "atmel_usba_udc", | ||
149 | .id = -1, | ||
150 | .dev = { | ||
151 | .platform_data = &usba_udc_data.pdata, | ||
152 | }, | ||
153 | .resource = usba_udc_resources, | ||
154 | .num_resources = ARRAY_SIZE(usba_udc_resources), | ||
155 | }; | ||
156 | |||
157 | void __init at91_add_device_usba(struct usba_platform_data *data) | ||
158 | { | ||
159 | if (cpu_is_at91cap9_revB()) { | ||
160 | irq_set_irq_type(AT91CAP9_ID_UDPHS, IRQ_TYPE_LEVEL_HIGH); | ||
161 | at91_sys_write(AT91_MATRIX_UDPHS, AT91_MATRIX_SELECT_UDPHS | | ||
162 | AT91_MATRIX_UDPHS_BYPASS_LOCK); | ||
163 | } | ||
164 | else | ||
165 | at91_sys_write(AT91_MATRIX_UDPHS, AT91_MATRIX_SELECT_UDPHS); | ||
166 | |||
167 | /* | ||
168 | * Invalid pins are 0 on AT91, but the usba driver is shared | ||
169 | * with AVR32, which use negative values instead. Once/if | ||
170 | * gpio_is_valid() is ported to AT91, revisit this code. | ||
171 | */ | ||
172 | usba_udc_data.pdata.vbus_pin = -EINVAL; | ||
173 | usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); | ||
174 | memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep)); | ||
175 | |||
176 | if (data && data->vbus_pin > 0) { | ||
177 | at91_set_gpio_input(data->vbus_pin, 0); | ||
178 | at91_set_deglitch(data->vbus_pin, 1); | ||
179 | usba_udc_data.pdata.vbus_pin = data->vbus_pin; | ||
180 | } | ||
181 | |||
182 | /* Pullup pin is handled internally by USB device peripheral */ | ||
183 | |||
184 | platform_device_register(&at91_usba_udc_device); | ||
185 | } | ||
186 | #else | ||
187 | void __init at91_add_device_usba(struct usba_platform_data *data) {} | ||
188 | #endif | ||
189 | |||
190 | |||
191 | /* -------------------------------------------------------------------- | ||
192 | * Ethernet | ||
193 | * -------------------------------------------------------------------- */ | ||
194 | |||
195 | #if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE) | ||
196 | static u64 eth_dmamask = DMA_BIT_MASK(32); | ||
197 | static struct at91_eth_data eth_data; | ||
198 | |||
199 | static struct resource eth_resources[] = { | ||
200 | [0] = { | ||
201 | .start = AT91CAP9_BASE_EMAC, | ||
202 | .end = AT91CAP9_BASE_EMAC + SZ_16K - 1, | ||
203 | .flags = IORESOURCE_MEM, | ||
204 | }, | ||
205 | [1] = { | ||
206 | .start = AT91CAP9_ID_EMAC, | ||
207 | .end = AT91CAP9_ID_EMAC, | ||
208 | .flags = IORESOURCE_IRQ, | ||
209 | }, | ||
210 | }; | ||
211 | |||
212 | static struct platform_device at91cap9_eth_device = { | ||
213 | .name = "macb", | ||
214 | .id = -1, | ||
215 | .dev = { | ||
216 | .dma_mask = ð_dmamask, | ||
217 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
218 | .platform_data = ð_data, | ||
219 | }, | ||
220 | .resource = eth_resources, | ||
221 | .num_resources = ARRAY_SIZE(eth_resources), | ||
222 | }; | ||
223 | |||
224 | void __init at91_add_device_eth(struct at91_eth_data *data) | ||
225 | { | ||
226 | if (!data) | ||
227 | return; | ||
228 | |||
229 | if (data->phy_irq_pin) { | ||
230 | at91_set_gpio_input(data->phy_irq_pin, 0); | ||
231 | at91_set_deglitch(data->phy_irq_pin, 1); | ||
232 | } | ||
233 | |||
234 | /* Pins used for MII and RMII */ | ||
235 | at91_set_A_periph(AT91_PIN_PB21, 0); /* ETXCK_EREFCK */ | ||
236 | at91_set_A_periph(AT91_PIN_PB22, 0); /* ERXDV */ | ||
237 | at91_set_A_periph(AT91_PIN_PB25, 0); /* ERX0 */ | ||
238 | at91_set_A_periph(AT91_PIN_PB26, 0); /* ERX1 */ | ||
239 | at91_set_A_periph(AT91_PIN_PB27, 0); /* ERXER */ | ||
240 | at91_set_A_periph(AT91_PIN_PB28, 0); /* ETXEN */ | ||
241 | at91_set_A_periph(AT91_PIN_PB23, 0); /* ETX0 */ | ||
242 | at91_set_A_periph(AT91_PIN_PB24, 0); /* ETX1 */ | ||
243 | at91_set_A_periph(AT91_PIN_PB30, 0); /* EMDIO */ | ||
244 | at91_set_A_periph(AT91_PIN_PB29, 0); /* EMDC */ | ||
245 | |||
246 | if (!data->is_rmii) { | ||
247 | at91_set_B_periph(AT91_PIN_PC25, 0); /* ECRS */ | ||
248 | at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */ | ||
249 | at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */ | ||
250 | at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */ | ||
251 | at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */ | ||
252 | at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */ | ||
253 | at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */ | ||
254 | at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */ | ||
255 | } | ||
256 | |||
257 | eth_data = *data; | ||
258 | platform_device_register(&at91cap9_eth_device); | ||
259 | } | ||
260 | #else | ||
261 | void __init at91_add_device_eth(struct at91_eth_data *data) {} | ||
262 | #endif | ||
263 | |||
264 | |||
265 | /* -------------------------------------------------------------------- | ||
266 | * MMC / SD | ||
267 | * -------------------------------------------------------------------- */ | ||
268 | |||
269 | #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) | ||
270 | static u64 mmc_dmamask = DMA_BIT_MASK(32); | ||
271 | static struct at91_mmc_data mmc0_data, mmc1_data; | ||
272 | |||
273 | static struct resource mmc0_resources[] = { | ||
274 | [0] = { | ||
275 | .start = AT91CAP9_BASE_MCI0, | ||
276 | .end = AT91CAP9_BASE_MCI0 + SZ_16K - 1, | ||
277 | .flags = IORESOURCE_MEM, | ||
278 | }, | ||
279 | [1] = { | ||
280 | .start = AT91CAP9_ID_MCI0, | ||
281 | .end = AT91CAP9_ID_MCI0, | ||
282 | .flags = IORESOURCE_IRQ, | ||
283 | }, | ||
284 | }; | ||
285 | |||
286 | static struct platform_device at91cap9_mmc0_device = { | ||
287 | .name = "at91_mci", | ||
288 | .id = 0, | ||
289 | .dev = { | ||
290 | .dma_mask = &mmc_dmamask, | ||
291 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
292 | .platform_data = &mmc0_data, | ||
293 | }, | ||
294 | .resource = mmc0_resources, | ||
295 | .num_resources = ARRAY_SIZE(mmc0_resources), | ||
296 | }; | ||
297 | |||
298 | static struct resource mmc1_resources[] = { | ||
299 | [0] = { | ||
300 | .start = AT91CAP9_BASE_MCI1, | ||
301 | .end = AT91CAP9_BASE_MCI1 + SZ_16K - 1, | ||
302 | .flags = IORESOURCE_MEM, | ||
303 | }, | ||
304 | [1] = { | ||
305 | .start = AT91CAP9_ID_MCI1, | ||
306 | .end = AT91CAP9_ID_MCI1, | ||
307 | .flags = IORESOURCE_IRQ, | ||
308 | }, | ||
309 | }; | ||
310 | |||
311 | static struct platform_device at91cap9_mmc1_device = { | ||
312 | .name = "at91_mci", | ||
313 | .id = 1, | ||
314 | .dev = { | ||
315 | .dma_mask = &mmc_dmamask, | ||
316 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
317 | .platform_data = &mmc1_data, | ||
318 | }, | ||
319 | .resource = mmc1_resources, | ||
320 | .num_resources = ARRAY_SIZE(mmc1_resources), | ||
321 | }; | ||
322 | |||
323 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | ||
324 | { | ||
325 | if (!data) | ||
326 | return; | ||
327 | |||
328 | /* input/irq */ | ||
329 | if (data->det_pin) { | ||
330 | at91_set_gpio_input(data->det_pin, 1); | ||
331 | at91_set_deglitch(data->det_pin, 1); | ||
332 | } | ||
333 | if (data->wp_pin) | ||
334 | at91_set_gpio_input(data->wp_pin, 1); | ||
335 | if (data->vcc_pin) | ||
336 | at91_set_gpio_output(data->vcc_pin, 0); | ||
337 | |||
338 | if (mmc_id == 0) { /* MCI0 */ | ||
339 | /* CLK */ | ||
340 | at91_set_A_periph(AT91_PIN_PA2, 0); | ||
341 | |||
342 | /* CMD */ | ||
343 | at91_set_A_periph(AT91_PIN_PA1, 1); | ||
344 | |||
345 | /* DAT0, maybe DAT1..DAT3 */ | ||
346 | at91_set_A_periph(AT91_PIN_PA0, 1); | ||
347 | if (data->wire4) { | ||
348 | at91_set_A_periph(AT91_PIN_PA3, 1); | ||
349 | at91_set_A_periph(AT91_PIN_PA4, 1); | ||
350 | at91_set_A_periph(AT91_PIN_PA5, 1); | ||
351 | } | ||
352 | |||
353 | mmc0_data = *data; | ||
354 | platform_device_register(&at91cap9_mmc0_device); | ||
355 | } else { /* MCI1 */ | ||
356 | /* CLK */ | ||
357 | at91_set_A_periph(AT91_PIN_PA16, 0); | ||
358 | |||
359 | /* CMD */ | ||
360 | at91_set_A_periph(AT91_PIN_PA17, 1); | ||
361 | |||
362 | /* DAT0, maybe DAT1..DAT3 */ | ||
363 | at91_set_A_periph(AT91_PIN_PA18, 1); | ||
364 | if (data->wire4) { | ||
365 | at91_set_A_periph(AT91_PIN_PA19, 1); | ||
366 | at91_set_A_periph(AT91_PIN_PA20, 1); | ||
367 | at91_set_A_periph(AT91_PIN_PA21, 1); | ||
368 | } | ||
369 | |||
370 | mmc1_data = *data; | ||
371 | platform_device_register(&at91cap9_mmc1_device); | ||
372 | } | ||
373 | } | ||
374 | #else | ||
375 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | ||
376 | #endif | ||
377 | |||
378 | |||
379 | /* -------------------------------------------------------------------- | ||
380 | * NAND / SmartMedia | ||
381 | * -------------------------------------------------------------------- */ | ||
382 | |||
383 | #if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE) | ||
384 | static struct atmel_nand_data nand_data; | ||
385 | |||
386 | #define NAND_BASE AT91_CHIPSELECT_3 | ||
387 | |||
388 | static struct resource nand_resources[] = { | ||
389 | [0] = { | ||
390 | .start = NAND_BASE, | ||
391 | .end = NAND_BASE + SZ_256M - 1, | ||
392 | .flags = IORESOURCE_MEM, | ||
393 | }, | ||
394 | [1] = { | ||
395 | .start = AT91_BASE_SYS + AT91_ECC, | ||
396 | .end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1, | ||
397 | .flags = IORESOURCE_MEM, | ||
398 | } | ||
399 | }; | ||
400 | |||
401 | static struct platform_device at91cap9_nand_device = { | ||
402 | .name = "atmel_nand", | ||
403 | .id = -1, | ||
404 | .dev = { | ||
405 | .platform_data = &nand_data, | ||
406 | }, | ||
407 | .resource = nand_resources, | ||
408 | .num_resources = ARRAY_SIZE(nand_resources), | ||
409 | }; | ||
410 | |||
411 | void __init at91_add_device_nand(struct atmel_nand_data *data) | ||
412 | { | ||
413 | unsigned long csa; | ||
414 | |||
415 | if (!data) | ||
416 | return; | ||
417 | |||
418 | csa = at91_sys_read(AT91_MATRIX_EBICSA); | ||
419 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA); | ||
420 | |||
421 | /* enable pin */ | ||
422 | if (data->enable_pin) | ||
423 | at91_set_gpio_output(data->enable_pin, 1); | ||
424 | |||
425 | /* ready/busy pin */ | ||
426 | if (data->rdy_pin) | ||
427 | at91_set_gpio_input(data->rdy_pin, 1); | ||
428 | |||
429 | /* card detect pin */ | ||
430 | if (data->det_pin) | ||
431 | at91_set_gpio_input(data->det_pin, 1); | ||
432 | |||
433 | nand_data = *data; | ||
434 | platform_device_register(&at91cap9_nand_device); | ||
435 | } | ||
436 | #else | ||
437 | void __init at91_add_device_nand(struct atmel_nand_data *data) {} | ||
438 | #endif | ||
439 | |||
440 | |||
441 | /* -------------------------------------------------------------------- | ||
442 | * TWI (i2c) | ||
443 | * -------------------------------------------------------------------- */ | ||
444 | |||
445 | /* | ||
446 | * Prefer the GPIO code since the TWI controller isn't robust | ||
447 | * (gets overruns and underruns under load) and can only issue | ||
448 | * repeated STARTs in one scenario (the driver doesn't yet handle them). | ||
449 | */ | ||
450 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
451 | |||
452 | static struct i2c_gpio_platform_data pdata = { | ||
453 | .sda_pin = AT91_PIN_PB4, | ||
454 | .sda_is_open_drain = 1, | ||
455 | .scl_pin = AT91_PIN_PB5, | ||
456 | .scl_is_open_drain = 1, | ||
457 | .udelay = 2, /* ~100 kHz */ | ||
458 | }; | ||
459 | |||
460 | static struct platform_device at91cap9_twi_device = { | ||
461 | .name = "i2c-gpio", | ||
462 | .id = -1, | ||
463 | .dev.platform_data = &pdata, | ||
464 | }; | ||
465 | |||
466 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | ||
467 | { | ||
468 | at91_set_GPIO_periph(AT91_PIN_PB4, 1); /* TWD (SDA) */ | ||
469 | at91_set_multi_drive(AT91_PIN_PB4, 1); | ||
470 | |||
471 | at91_set_GPIO_periph(AT91_PIN_PB5, 1); /* TWCK (SCL) */ | ||
472 | at91_set_multi_drive(AT91_PIN_PB5, 1); | ||
473 | |||
474 | i2c_register_board_info(0, devices, nr_devices); | ||
475 | platform_device_register(&at91cap9_twi_device); | ||
476 | } | ||
477 | |||
478 | #elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) | ||
479 | |||
480 | static struct resource twi_resources[] = { | ||
481 | [0] = { | ||
482 | .start = AT91CAP9_BASE_TWI, | ||
483 | .end = AT91CAP9_BASE_TWI + SZ_16K - 1, | ||
484 | .flags = IORESOURCE_MEM, | ||
485 | }, | ||
486 | [1] = { | ||
487 | .start = AT91CAP9_ID_TWI, | ||
488 | .end = AT91CAP9_ID_TWI, | ||
489 | .flags = IORESOURCE_IRQ, | ||
490 | }, | ||
491 | }; | ||
492 | |||
493 | static struct platform_device at91cap9_twi_device = { | ||
494 | .name = "at91_i2c", | ||
495 | .id = -1, | ||
496 | .resource = twi_resources, | ||
497 | .num_resources = ARRAY_SIZE(twi_resources), | ||
498 | }; | ||
499 | |||
500 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | ||
501 | { | ||
502 | /* pins used for TWI interface */ | ||
503 | at91_set_B_periph(AT91_PIN_PB4, 0); /* TWD */ | ||
504 | at91_set_multi_drive(AT91_PIN_PB4, 1); | ||
505 | |||
506 | at91_set_B_periph(AT91_PIN_PB5, 0); /* TWCK */ | ||
507 | at91_set_multi_drive(AT91_PIN_PB5, 1); | ||
508 | |||
509 | i2c_register_board_info(0, devices, nr_devices); | ||
510 | platform_device_register(&at91cap9_twi_device); | ||
511 | } | ||
512 | #else | ||
513 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {} | ||
514 | #endif | ||
515 | |||
516 | /* -------------------------------------------------------------------- | ||
517 | * SPI | ||
518 | * -------------------------------------------------------------------- */ | ||
519 | |||
520 | #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) | ||
521 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
522 | |||
523 | static struct resource spi0_resources[] = { | ||
524 | [0] = { | ||
525 | .start = AT91CAP9_BASE_SPI0, | ||
526 | .end = AT91CAP9_BASE_SPI0 + SZ_16K - 1, | ||
527 | .flags = IORESOURCE_MEM, | ||
528 | }, | ||
529 | [1] = { | ||
530 | .start = AT91CAP9_ID_SPI0, | ||
531 | .end = AT91CAP9_ID_SPI0, | ||
532 | .flags = IORESOURCE_IRQ, | ||
533 | }, | ||
534 | }; | ||
535 | |||
536 | static struct platform_device at91cap9_spi0_device = { | ||
537 | .name = "atmel_spi", | ||
538 | .id = 0, | ||
539 | .dev = { | ||
540 | .dma_mask = &spi_dmamask, | ||
541 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
542 | }, | ||
543 | .resource = spi0_resources, | ||
544 | .num_resources = ARRAY_SIZE(spi0_resources), | ||
545 | }; | ||
546 | |||
547 | static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA5, AT91_PIN_PA3, AT91_PIN_PD0, AT91_PIN_PD1 }; | ||
548 | |||
549 | static struct resource spi1_resources[] = { | ||
550 | [0] = { | ||
551 | .start = AT91CAP9_BASE_SPI1, | ||
552 | .end = AT91CAP9_BASE_SPI1 + SZ_16K - 1, | ||
553 | .flags = IORESOURCE_MEM, | ||
554 | }, | ||
555 | [1] = { | ||
556 | .start = AT91CAP9_ID_SPI1, | ||
557 | .end = AT91CAP9_ID_SPI1, | ||
558 | .flags = IORESOURCE_IRQ, | ||
559 | }, | ||
560 | }; | ||
561 | |||
562 | static struct platform_device at91cap9_spi1_device = { | ||
563 | .name = "atmel_spi", | ||
564 | .id = 1, | ||
565 | .dev = { | ||
566 | .dma_mask = &spi_dmamask, | ||
567 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
568 | }, | ||
569 | .resource = spi1_resources, | ||
570 | .num_resources = ARRAY_SIZE(spi1_resources), | ||
571 | }; | ||
572 | |||
573 | static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB15, AT91_PIN_PB16, AT91_PIN_PB17, AT91_PIN_PB18 }; | ||
574 | |||
575 | void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | ||
576 | { | ||
577 | int i; | ||
578 | unsigned long cs_pin; | ||
579 | short enable_spi0 = 0; | ||
580 | short enable_spi1 = 0; | ||
581 | |||
582 | /* Choose SPI chip-selects */ | ||
583 | for (i = 0; i < nr_devices; i++) { | ||
584 | if (devices[i].controller_data) | ||
585 | cs_pin = (unsigned long) devices[i].controller_data; | ||
586 | else if (devices[i].bus_num == 0) | ||
587 | cs_pin = spi0_standard_cs[devices[i].chip_select]; | ||
588 | else | ||
589 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | ||
590 | |||
591 | if (devices[i].bus_num == 0) | ||
592 | enable_spi0 = 1; | ||
593 | else | ||
594 | enable_spi1 = 1; | ||
595 | |||
596 | /* enable chip-select pin */ | ||
597 | at91_set_gpio_output(cs_pin, 1); | ||
598 | |||
599 | /* pass chip-select pin to driver */ | ||
600 | devices[i].controller_data = (void *) cs_pin; | ||
601 | } | ||
602 | |||
603 | spi_register_board_info(devices, nr_devices); | ||
604 | |||
605 | /* Configure SPI bus(es) */ | ||
606 | if (enable_spi0) { | ||
607 | at91_set_B_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */ | ||
608 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | ||
609 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | ||
610 | |||
611 | platform_device_register(&at91cap9_spi0_device); | ||
612 | } | ||
613 | if (enable_spi1) { | ||
614 | at91_set_A_periph(AT91_PIN_PB12, 0); /* SPI1_MISO */ | ||
615 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ | ||
616 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ | ||
617 | |||
618 | platform_device_register(&at91cap9_spi1_device); | ||
619 | } | ||
620 | } | ||
621 | #else | ||
622 | void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {} | ||
623 | #endif | ||
624 | |||
625 | |||
626 | /* -------------------------------------------------------------------- | ||
627 | * Timer/Counter block | ||
628 | * -------------------------------------------------------------------- */ | ||
629 | |||
630 | #ifdef CONFIG_ATMEL_TCLIB | ||
631 | |||
632 | static struct resource tcb_resources[] = { | ||
633 | [0] = { | ||
634 | .start = AT91CAP9_BASE_TCB0, | ||
635 | .end = AT91CAP9_BASE_TCB0 + SZ_16K - 1, | ||
636 | .flags = IORESOURCE_MEM, | ||
637 | }, | ||
638 | [1] = { | ||
639 | .start = AT91CAP9_ID_TCB, | ||
640 | .end = AT91CAP9_ID_TCB, | ||
641 | .flags = IORESOURCE_IRQ, | ||
642 | }, | ||
643 | }; | ||
644 | |||
645 | static struct platform_device at91cap9_tcb_device = { | ||
646 | .name = "atmel_tcb", | ||
647 | .id = 0, | ||
648 | .resource = tcb_resources, | ||
649 | .num_resources = ARRAY_SIZE(tcb_resources), | ||
650 | }; | ||
651 | |||
652 | static void __init at91_add_device_tc(void) | ||
653 | { | ||
654 | platform_device_register(&at91cap9_tcb_device); | ||
655 | } | ||
656 | #else | ||
657 | static void __init at91_add_device_tc(void) { } | ||
658 | #endif | ||
659 | |||
660 | |||
661 | /* -------------------------------------------------------------------- | ||
662 | * RTT | ||
663 | * -------------------------------------------------------------------- */ | ||
664 | |||
665 | static struct resource rtt_resources[] = { | ||
666 | { | ||
667 | .start = AT91_BASE_SYS + AT91_RTT, | ||
668 | .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, | ||
669 | .flags = IORESOURCE_MEM, | ||
670 | } | ||
671 | }; | ||
672 | |||
673 | static struct platform_device at91cap9_rtt_device = { | ||
674 | .name = "at91_rtt", | ||
675 | .id = 0, | ||
676 | .resource = rtt_resources, | ||
677 | .num_resources = ARRAY_SIZE(rtt_resources), | ||
678 | }; | ||
679 | |||
680 | static void __init at91_add_device_rtt(void) | ||
681 | { | ||
682 | platform_device_register(&at91cap9_rtt_device); | ||
683 | } | ||
684 | |||
685 | |||
686 | /* -------------------------------------------------------------------- | ||
687 | * Watchdog | ||
688 | * -------------------------------------------------------------------- */ | ||
689 | |||
690 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) | ||
691 | static struct platform_device at91cap9_wdt_device = { | ||
692 | .name = "at91_wdt", | ||
693 | .id = -1, | ||
694 | .num_resources = 0, | ||
695 | }; | ||
696 | |||
697 | static void __init at91_add_device_watchdog(void) | ||
698 | { | ||
699 | platform_device_register(&at91cap9_wdt_device); | ||
700 | } | ||
701 | #else | ||
702 | static void __init at91_add_device_watchdog(void) {} | ||
703 | #endif | ||
704 | |||
705 | |||
706 | /* -------------------------------------------------------------------- | ||
707 | * PWM | ||
708 | * --------------------------------------------------------------------*/ | ||
709 | |||
710 | #if defined(CONFIG_ATMEL_PWM) | ||
711 | static u32 pwm_mask; | ||
712 | |||
713 | static struct resource pwm_resources[] = { | ||
714 | [0] = { | ||
715 | .start = AT91CAP9_BASE_PWMC, | ||
716 | .end = AT91CAP9_BASE_PWMC + SZ_16K - 1, | ||
717 | .flags = IORESOURCE_MEM, | ||
718 | }, | ||
719 | [1] = { | ||
720 | .start = AT91CAP9_ID_PWMC, | ||
721 | .end = AT91CAP9_ID_PWMC, | ||
722 | .flags = IORESOURCE_IRQ, | ||
723 | }, | ||
724 | }; | ||
725 | |||
726 | static struct platform_device at91cap9_pwm0_device = { | ||
727 | .name = "atmel_pwm", | ||
728 | .id = -1, | ||
729 | .dev = { | ||
730 | .platform_data = &pwm_mask, | ||
731 | }, | ||
732 | .resource = pwm_resources, | ||
733 | .num_resources = ARRAY_SIZE(pwm_resources), | ||
734 | }; | ||
735 | |||
736 | void __init at91_add_device_pwm(u32 mask) | ||
737 | { | ||
738 | if (mask & (1 << AT91_PWM0)) | ||
739 | at91_set_A_periph(AT91_PIN_PB19, 1); /* enable PWM0 */ | ||
740 | |||
741 | if (mask & (1 << AT91_PWM1)) | ||
742 | at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */ | ||
743 | |||
744 | if (mask & (1 << AT91_PWM2)) | ||
745 | at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */ | ||
746 | |||
747 | if (mask & (1 << AT91_PWM3)) | ||
748 | at91_set_B_periph(AT91_PIN_PA11, 1); /* enable PWM3 */ | ||
749 | |||
750 | pwm_mask = mask; | ||
751 | |||
752 | platform_device_register(&at91cap9_pwm0_device); | ||
753 | } | ||
754 | #else | ||
755 | void __init at91_add_device_pwm(u32 mask) {} | ||
756 | #endif | ||
757 | |||
758 | |||
759 | |||
760 | /* -------------------------------------------------------------------- | ||
761 | * AC97 | ||
762 | * -------------------------------------------------------------------- */ | ||
763 | |||
764 | #if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE) | ||
765 | static u64 ac97_dmamask = DMA_BIT_MASK(32); | ||
766 | static struct ac97c_platform_data ac97_data; | ||
767 | |||
768 | static struct resource ac97_resources[] = { | ||
769 | [0] = { | ||
770 | .start = AT91CAP9_BASE_AC97C, | ||
771 | .end = AT91CAP9_BASE_AC97C + SZ_16K - 1, | ||
772 | .flags = IORESOURCE_MEM, | ||
773 | }, | ||
774 | [1] = { | ||
775 | .start = AT91CAP9_ID_AC97C, | ||
776 | .end = AT91CAP9_ID_AC97C, | ||
777 | .flags = IORESOURCE_IRQ, | ||
778 | }, | ||
779 | }; | ||
780 | |||
781 | static struct platform_device at91cap9_ac97_device = { | ||
782 | .name = "atmel_ac97c", | ||
783 | .id = 1, | ||
784 | .dev = { | ||
785 | .dma_mask = &ac97_dmamask, | ||
786 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
787 | .platform_data = &ac97_data, | ||
788 | }, | ||
789 | .resource = ac97_resources, | ||
790 | .num_resources = ARRAY_SIZE(ac97_resources), | ||
791 | }; | ||
792 | |||
793 | void __init at91_add_device_ac97(struct ac97c_platform_data *data) | ||
794 | { | ||
795 | if (!data) | ||
796 | return; | ||
797 | |||
798 | at91_set_A_periph(AT91_PIN_PA6, 0); /* AC97FS */ | ||
799 | at91_set_A_periph(AT91_PIN_PA7, 0); /* AC97CK */ | ||
800 | at91_set_A_periph(AT91_PIN_PA8, 0); /* AC97TX */ | ||
801 | at91_set_A_periph(AT91_PIN_PA9, 0); /* AC97RX */ | ||
802 | |||
803 | /* reset */ | ||
804 | if (data->reset_pin) | ||
805 | at91_set_gpio_output(data->reset_pin, 0); | ||
806 | |||
807 | ac97_data = *data; | ||
808 | platform_device_register(&at91cap9_ac97_device); | ||
809 | } | ||
810 | #else | ||
811 | void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} | ||
812 | #endif | ||
813 | |||
814 | |||
815 | /* -------------------------------------------------------------------- | ||
816 | * LCD Controller | ||
817 | * -------------------------------------------------------------------- */ | ||
818 | |||
819 | #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) | ||
820 | static u64 lcdc_dmamask = DMA_BIT_MASK(32); | ||
821 | static struct atmel_lcdfb_info lcdc_data; | ||
822 | |||
823 | static struct resource lcdc_resources[] = { | ||
824 | [0] = { | ||
825 | .start = AT91CAP9_LCDC_BASE, | ||
826 | .end = AT91CAP9_LCDC_BASE + SZ_4K - 1, | ||
827 | .flags = IORESOURCE_MEM, | ||
828 | }, | ||
829 | [1] = { | ||
830 | .start = AT91CAP9_ID_LCDC, | ||
831 | .end = AT91CAP9_ID_LCDC, | ||
832 | .flags = IORESOURCE_IRQ, | ||
833 | }, | ||
834 | }; | ||
835 | |||
836 | static struct platform_device at91_lcdc_device = { | ||
837 | .name = "atmel_lcdfb", | ||
838 | .id = 0, | ||
839 | .dev = { | ||
840 | .dma_mask = &lcdc_dmamask, | ||
841 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
842 | .platform_data = &lcdc_data, | ||
843 | }, | ||
844 | .resource = lcdc_resources, | ||
845 | .num_resources = ARRAY_SIZE(lcdc_resources), | ||
846 | }; | ||
847 | |||
848 | void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) | ||
849 | { | ||
850 | if (!data) | ||
851 | return; | ||
852 | |||
853 | if (cpu_is_at91cap9_revB()) | ||
854 | irq_set_irq_type(AT91CAP9_ID_LCDC, IRQ_TYPE_LEVEL_HIGH); | ||
855 | |||
856 | at91_set_A_periph(AT91_PIN_PC1, 0); /* LCDHSYNC */ | ||
857 | at91_set_A_periph(AT91_PIN_PC2, 0); /* LCDDOTCK */ | ||
858 | at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDDEN */ | ||
859 | at91_set_B_periph(AT91_PIN_PB9, 0); /* LCDCC */ | ||
860 | at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDD2 */ | ||
861 | at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDD3 */ | ||
862 | at91_set_A_periph(AT91_PIN_PC8, 0); /* LCDD4 */ | ||
863 | at91_set_A_periph(AT91_PIN_PC9, 0); /* LCDD5 */ | ||
864 | at91_set_A_periph(AT91_PIN_PC10, 0); /* LCDD6 */ | ||
865 | at91_set_A_periph(AT91_PIN_PC11, 0); /* LCDD7 */ | ||
866 | at91_set_A_periph(AT91_PIN_PC14, 0); /* LCDD10 */ | ||
867 | at91_set_A_periph(AT91_PIN_PC15, 0); /* LCDD11 */ | ||
868 | at91_set_A_periph(AT91_PIN_PC16, 0); /* LCDD12 */ | ||
869 | at91_set_A_periph(AT91_PIN_PC17, 0); /* LCDD13 */ | ||
870 | at91_set_A_periph(AT91_PIN_PC18, 0); /* LCDD14 */ | ||
871 | at91_set_A_periph(AT91_PIN_PC19, 0); /* LCDD15 */ | ||
872 | at91_set_A_periph(AT91_PIN_PC22, 0); /* LCDD18 */ | ||
873 | at91_set_A_periph(AT91_PIN_PC23, 0); /* LCDD19 */ | ||
874 | at91_set_A_periph(AT91_PIN_PC24, 0); /* LCDD20 */ | ||
875 | at91_set_A_periph(AT91_PIN_PC25, 0); /* LCDD21 */ | ||
876 | at91_set_A_periph(AT91_PIN_PC26, 0); /* LCDD22 */ | ||
877 | at91_set_A_periph(AT91_PIN_PC27, 0); /* LCDD23 */ | ||
878 | |||
879 | lcdc_data = *data; | ||
880 | platform_device_register(&at91_lcdc_device); | ||
881 | } | ||
882 | #else | ||
883 | void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {} | ||
884 | #endif | ||
885 | |||
886 | |||
887 | /* -------------------------------------------------------------------- | ||
888 | * SSC -- Synchronous Serial Controller | ||
889 | * -------------------------------------------------------------------- */ | ||
890 | |||
891 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
892 | static u64 ssc0_dmamask = DMA_BIT_MASK(32); | ||
893 | |||
894 | static struct resource ssc0_resources[] = { | ||
895 | [0] = { | ||
896 | .start = AT91CAP9_BASE_SSC0, | ||
897 | .end = AT91CAP9_BASE_SSC0 + SZ_16K - 1, | ||
898 | .flags = IORESOURCE_MEM, | ||
899 | }, | ||
900 | [1] = { | ||
901 | .start = AT91CAP9_ID_SSC0, | ||
902 | .end = AT91CAP9_ID_SSC0, | ||
903 | .flags = IORESOURCE_IRQ, | ||
904 | }, | ||
905 | }; | ||
906 | |||
907 | static struct platform_device at91cap9_ssc0_device = { | ||
908 | .name = "ssc", | ||
909 | .id = 0, | ||
910 | .dev = { | ||
911 | .dma_mask = &ssc0_dmamask, | ||
912 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
913 | }, | ||
914 | .resource = ssc0_resources, | ||
915 | .num_resources = ARRAY_SIZE(ssc0_resources), | ||
916 | }; | ||
917 | |||
918 | static inline void configure_ssc0_pins(unsigned pins) | ||
919 | { | ||
920 | if (pins & ATMEL_SSC_TF) | ||
921 | at91_set_A_periph(AT91_PIN_PB0, 1); | ||
922 | if (pins & ATMEL_SSC_TK) | ||
923 | at91_set_A_periph(AT91_PIN_PB1, 1); | ||
924 | if (pins & ATMEL_SSC_TD) | ||
925 | at91_set_A_periph(AT91_PIN_PB2, 1); | ||
926 | if (pins & ATMEL_SSC_RD) | ||
927 | at91_set_A_periph(AT91_PIN_PB3, 1); | ||
928 | if (pins & ATMEL_SSC_RK) | ||
929 | at91_set_A_periph(AT91_PIN_PB4, 1); | ||
930 | if (pins & ATMEL_SSC_RF) | ||
931 | at91_set_A_periph(AT91_PIN_PB5, 1); | ||
932 | } | ||
933 | |||
934 | static u64 ssc1_dmamask = DMA_BIT_MASK(32); | ||
935 | |||
936 | static struct resource ssc1_resources[] = { | ||
937 | [0] = { | ||
938 | .start = AT91CAP9_BASE_SSC1, | ||
939 | .end = AT91CAP9_BASE_SSC1 + SZ_16K - 1, | ||
940 | .flags = IORESOURCE_MEM, | ||
941 | }, | ||
942 | [1] = { | ||
943 | .start = AT91CAP9_ID_SSC1, | ||
944 | .end = AT91CAP9_ID_SSC1, | ||
945 | .flags = IORESOURCE_IRQ, | ||
946 | }, | ||
947 | }; | ||
948 | |||
949 | static struct platform_device at91cap9_ssc1_device = { | ||
950 | .name = "ssc", | ||
951 | .id = 1, | ||
952 | .dev = { | ||
953 | .dma_mask = &ssc1_dmamask, | ||
954 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
955 | }, | ||
956 | .resource = ssc1_resources, | ||
957 | .num_resources = ARRAY_SIZE(ssc1_resources), | ||
958 | }; | ||
959 | |||
960 | static inline void configure_ssc1_pins(unsigned pins) | ||
961 | { | ||
962 | if (pins & ATMEL_SSC_TF) | ||
963 | at91_set_A_periph(AT91_PIN_PB6, 1); | ||
964 | if (pins & ATMEL_SSC_TK) | ||
965 | at91_set_A_periph(AT91_PIN_PB7, 1); | ||
966 | if (pins & ATMEL_SSC_TD) | ||
967 | at91_set_A_periph(AT91_PIN_PB8, 1); | ||
968 | if (pins & ATMEL_SSC_RD) | ||
969 | at91_set_A_periph(AT91_PIN_PB9, 1); | ||
970 | if (pins & ATMEL_SSC_RK) | ||
971 | at91_set_A_periph(AT91_PIN_PB10, 1); | ||
972 | if (pins & ATMEL_SSC_RF) | ||
973 | at91_set_A_periph(AT91_PIN_PB11, 1); | ||
974 | } | ||
975 | |||
976 | /* | ||
977 | * SSC controllers are accessed through library code, instead of any | ||
978 | * kind of all-singing/all-dancing driver. For example one could be | ||
979 | * used by a particular I2S audio codec's driver, while another one | ||
980 | * on the same system might be used by a custom data capture driver. | ||
981 | */ | ||
982 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
983 | { | ||
984 | struct platform_device *pdev; | ||
985 | |||
986 | /* | ||
987 | * NOTE: caller is responsible for passing information matching | ||
988 | * "pins" to whatever will be using each particular controller. | ||
989 | */ | ||
990 | switch (id) { | ||
991 | case AT91CAP9_ID_SSC0: | ||
992 | pdev = &at91cap9_ssc0_device; | ||
993 | configure_ssc0_pins(pins); | ||
994 | break; | ||
995 | case AT91CAP9_ID_SSC1: | ||
996 | pdev = &at91cap9_ssc1_device; | ||
997 | configure_ssc1_pins(pins); | ||
998 | break; | ||
999 | default: | ||
1000 | return; | ||
1001 | } | ||
1002 | |||
1003 | platform_device_register(pdev); | ||
1004 | } | ||
1005 | |||
1006 | #else | ||
1007 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
1008 | #endif | ||
1009 | |||
1010 | |||
1011 | /* -------------------------------------------------------------------- | ||
1012 | * UART | ||
1013 | * -------------------------------------------------------------------- */ | ||
1014 | |||
1015 | #if defined(CONFIG_SERIAL_ATMEL) | ||
1016 | static struct resource dbgu_resources[] = { | ||
1017 | [0] = { | ||
1018 | .start = AT91_VA_BASE_SYS + AT91_DBGU, | ||
1019 | .end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1, | ||
1020 | .flags = IORESOURCE_MEM, | ||
1021 | }, | ||
1022 | [1] = { | ||
1023 | .start = AT91_ID_SYS, | ||
1024 | .end = AT91_ID_SYS, | ||
1025 | .flags = IORESOURCE_IRQ, | ||
1026 | }, | ||
1027 | }; | ||
1028 | |||
1029 | static struct atmel_uart_data dbgu_data = { | ||
1030 | .use_dma_tx = 0, | ||
1031 | .use_dma_rx = 0, /* DBGU not capable of receive DMA */ | ||
1032 | .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), | ||
1033 | }; | ||
1034 | |||
1035 | static u64 dbgu_dmamask = DMA_BIT_MASK(32); | ||
1036 | |||
1037 | static struct platform_device at91cap9_dbgu_device = { | ||
1038 | .name = "atmel_usart", | ||
1039 | .id = 0, | ||
1040 | .dev = { | ||
1041 | .dma_mask = &dbgu_dmamask, | ||
1042 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1043 | .platform_data = &dbgu_data, | ||
1044 | }, | ||
1045 | .resource = dbgu_resources, | ||
1046 | .num_resources = ARRAY_SIZE(dbgu_resources), | ||
1047 | }; | ||
1048 | |||
1049 | static inline void configure_dbgu_pins(void) | ||
1050 | { | ||
1051 | at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */ | ||
1052 | at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */ | ||
1053 | } | ||
1054 | |||
1055 | static struct resource uart0_resources[] = { | ||
1056 | [0] = { | ||
1057 | .start = AT91CAP9_BASE_US0, | ||
1058 | .end = AT91CAP9_BASE_US0 + SZ_16K - 1, | ||
1059 | .flags = IORESOURCE_MEM, | ||
1060 | }, | ||
1061 | [1] = { | ||
1062 | .start = AT91CAP9_ID_US0, | ||
1063 | .end = AT91CAP9_ID_US0, | ||
1064 | .flags = IORESOURCE_IRQ, | ||
1065 | }, | ||
1066 | }; | ||
1067 | |||
1068 | static struct atmel_uart_data uart0_data = { | ||
1069 | .use_dma_tx = 1, | ||
1070 | .use_dma_rx = 1, | ||
1071 | }; | ||
1072 | |||
1073 | static u64 uart0_dmamask = DMA_BIT_MASK(32); | ||
1074 | |||
1075 | static struct platform_device at91cap9_uart0_device = { | ||
1076 | .name = "atmel_usart", | ||
1077 | .id = 1, | ||
1078 | .dev = { | ||
1079 | .dma_mask = &uart0_dmamask, | ||
1080 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1081 | .platform_data = &uart0_data, | ||
1082 | }, | ||
1083 | .resource = uart0_resources, | ||
1084 | .num_resources = ARRAY_SIZE(uart0_resources), | ||
1085 | }; | ||
1086 | |||
1087 | static inline void configure_usart0_pins(unsigned pins) | ||
1088 | { | ||
1089 | at91_set_A_periph(AT91_PIN_PA22, 1); /* TXD0 */ | ||
1090 | at91_set_A_periph(AT91_PIN_PA23, 0); /* RXD0 */ | ||
1091 | |||
1092 | if (pins & ATMEL_UART_RTS) | ||
1093 | at91_set_A_periph(AT91_PIN_PA24, 0); /* RTS0 */ | ||
1094 | if (pins & ATMEL_UART_CTS) | ||
1095 | at91_set_A_periph(AT91_PIN_PA25, 0); /* CTS0 */ | ||
1096 | } | ||
1097 | |||
1098 | static struct resource uart1_resources[] = { | ||
1099 | [0] = { | ||
1100 | .start = AT91CAP9_BASE_US1, | ||
1101 | .end = AT91CAP9_BASE_US1 + SZ_16K - 1, | ||
1102 | .flags = IORESOURCE_MEM, | ||
1103 | }, | ||
1104 | [1] = { | ||
1105 | .start = AT91CAP9_ID_US1, | ||
1106 | .end = AT91CAP9_ID_US1, | ||
1107 | .flags = IORESOURCE_IRQ, | ||
1108 | }, | ||
1109 | }; | ||
1110 | |||
1111 | static struct atmel_uart_data uart1_data = { | ||
1112 | .use_dma_tx = 1, | ||
1113 | .use_dma_rx = 1, | ||
1114 | }; | ||
1115 | |||
1116 | static u64 uart1_dmamask = DMA_BIT_MASK(32); | ||
1117 | |||
1118 | static struct platform_device at91cap9_uart1_device = { | ||
1119 | .name = "atmel_usart", | ||
1120 | .id = 2, | ||
1121 | .dev = { | ||
1122 | .dma_mask = &uart1_dmamask, | ||
1123 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1124 | .platform_data = &uart1_data, | ||
1125 | }, | ||
1126 | .resource = uart1_resources, | ||
1127 | .num_resources = ARRAY_SIZE(uart1_resources), | ||
1128 | }; | ||
1129 | |||
1130 | static inline void configure_usart1_pins(unsigned pins) | ||
1131 | { | ||
1132 | at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */ | ||
1133 | at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */ | ||
1134 | |||
1135 | if (pins & ATMEL_UART_RTS) | ||
1136 | at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */ | ||
1137 | if (pins & ATMEL_UART_CTS) | ||
1138 | at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */ | ||
1139 | } | ||
1140 | |||
1141 | static struct resource uart2_resources[] = { | ||
1142 | [0] = { | ||
1143 | .start = AT91CAP9_BASE_US2, | ||
1144 | .end = AT91CAP9_BASE_US2 + SZ_16K - 1, | ||
1145 | .flags = IORESOURCE_MEM, | ||
1146 | }, | ||
1147 | [1] = { | ||
1148 | .start = AT91CAP9_ID_US2, | ||
1149 | .end = AT91CAP9_ID_US2, | ||
1150 | .flags = IORESOURCE_IRQ, | ||
1151 | }, | ||
1152 | }; | ||
1153 | |||
1154 | static struct atmel_uart_data uart2_data = { | ||
1155 | .use_dma_tx = 1, | ||
1156 | .use_dma_rx = 1, | ||
1157 | }; | ||
1158 | |||
1159 | static u64 uart2_dmamask = DMA_BIT_MASK(32); | ||
1160 | |||
1161 | static struct platform_device at91cap9_uart2_device = { | ||
1162 | .name = "atmel_usart", | ||
1163 | .id = 3, | ||
1164 | .dev = { | ||
1165 | .dma_mask = &uart2_dmamask, | ||
1166 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1167 | .platform_data = &uart2_data, | ||
1168 | }, | ||
1169 | .resource = uart2_resources, | ||
1170 | .num_resources = ARRAY_SIZE(uart2_resources), | ||
1171 | }; | ||
1172 | |||
1173 | static inline void configure_usart2_pins(unsigned pins) | ||
1174 | { | ||
1175 | at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */ | ||
1176 | at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */ | ||
1177 | |||
1178 | if (pins & ATMEL_UART_RTS) | ||
1179 | at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */ | ||
1180 | if (pins & ATMEL_UART_CTS) | ||
1181 | at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */ | ||
1182 | } | ||
1183 | |||
1184 | static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ | ||
1185 | struct platform_device *atmel_default_console_device; /* the serial console device */ | ||
1186 | |||
1187 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | ||
1188 | { | ||
1189 | struct platform_device *pdev; | ||
1190 | struct atmel_uart_data *pdata; | ||
1191 | |||
1192 | switch (id) { | ||
1193 | case 0: /* DBGU */ | ||
1194 | pdev = &at91cap9_dbgu_device; | ||
1195 | configure_dbgu_pins(); | ||
1196 | break; | ||
1197 | case AT91CAP9_ID_US0: | ||
1198 | pdev = &at91cap9_uart0_device; | ||
1199 | configure_usart0_pins(pins); | ||
1200 | break; | ||
1201 | case AT91CAP9_ID_US1: | ||
1202 | pdev = &at91cap9_uart1_device; | ||
1203 | configure_usart1_pins(pins); | ||
1204 | break; | ||
1205 | case AT91CAP9_ID_US2: | ||
1206 | pdev = &at91cap9_uart2_device; | ||
1207 | configure_usart2_pins(pins); | ||
1208 | break; | ||
1209 | default: | ||
1210 | return; | ||
1211 | } | ||
1212 | pdata = pdev->dev.platform_data; | ||
1213 | pdata->num = portnr; /* update to mapped ID */ | ||
1214 | |||
1215 | if (portnr < ATMEL_MAX_UART) | ||
1216 | at91_uarts[portnr] = pdev; | ||
1217 | } | ||
1218 | |||
1219 | void __init at91_set_serial_console(unsigned portnr) | ||
1220 | { | ||
1221 | if (portnr < ATMEL_MAX_UART) { | ||
1222 | atmel_default_console_device = at91_uarts[portnr]; | ||
1223 | at91cap9_set_console_clock(at91_uarts[portnr]->id); | ||
1224 | } | ||
1225 | } | ||
1226 | |||
1227 | void __init at91_add_device_serial(void) | ||
1228 | { | ||
1229 | int i; | ||
1230 | |||
1231 | for (i = 0; i < ATMEL_MAX_UART; i++) { | ||
1232 | if (at91_uarts[i]) | ||
1233 | platform_device_register(at91_uarts[i]); | ||
1234 | } | ||
1235 | |||
1236 | if (!atmel_default_console_device) | ||
1237 | printk(KERN_INFO "AT91: No default serial console defined.\n"); | ||
1238 | } | ||
1239 | #else | ||
1240 | void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} | ||
1241 | void __init at91_set_serial_console(unsigned portnr) {} | ||
1242 | void __init at91_add_device_serial(void) {} | ||
1243 | #endif | ||
1244 | |||
1245 | |||
1246 | /* -------------------------------------------------------------------- */ | ||
1247 | /* | ||
1248 | * These devices are always present and don't need any board-specific | ||
1249 | * setup. | ||
1250 | */ | ||
1251 | static int __init at91_add_standard_devices(void) | ||
1252 | { | ||
1253 | at91_add_device_rtt(); | ||
1254 | at91_add_device_watchdog(); | ||
1255 | at91_add_device_tc(); | ||
1256 | return 0; | ||
1257 | } | ||
1258 | |||
1259 | arch_initcall(at91_add_standard_devices); | ||
diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c new file mode 100644 index 00000000000..679b0b743e9 --- /dev/null +++ b/arch/arm/mach-at91/board-cap9adk.c | |||
@@ -0,0 +1,398 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-at91/board-cap9adk.c | ||
3 | * | ||
4 | * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> | ||
5 | * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> | ||
6 | * Copyright (C) 2005 SAN People | ||
7 | * Copyright (C) 2007 Atmel Corporation. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | #include <linux/types.h> | ||
25 | #include <linux/init.h> | ||
26 | #include <linux/mm.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/platform_device.h> | ||
29 | #include <linux/spi/spi.h> | ||
30 | #include <linux/spi/ads7846.h> | ||
31 | #include <linux/fb.h> | ||
32 | #include <linux/mtd/physmap.h> | ||
33 | |||
34 | #include <video/atmel_lcdc.h> | ||
35 | |||
36 | #include <mach/hardware.h> | ||
37 | #include <asm/setup.h> | ||
38 | #include <asm/mach-types.h> | ||
39 | |||
40 | #include <asm/mach/arch.h> | ||
41 | #include <asm/mach/map.h> | ||
42 | |||
43 | #include <mach/board.h> | ||
44 | #include <mach/gpio.h> | ||
45 | #include <mach/at91cap9_matrix.h> | ||
46 | #include <mach/at91sam9_smc.h> | ||
47 | #include <mach/system_rev.h> | ||
48 | |||
49 | #include "sam9_smc.h" | ||
50 | #include "generic.h" | ||
51 | |||
52 | |||
53 | static void __init cap9adk_init_early(void) | ||
54 | { | ||
55 | /* Initialize processor: 12 MHz crystal */ | ||
56 | at91_initialize(12000000); | ||
57 | |||
58 | /* Setup the LEDs: USER1 and USER2 LED for cpu/timer... */ | ||
59 | at91_init_leds(AT91_PIN_PA10, AT91_PIN_PA11); | ||
60 | /* ... POWER LED always on */ | ||
61 | at91_set_gpio_output(AT91_PIN_PC29, 1); | ||
62 | |||
63 | /* Setup the serial ports and console */ | ||
64 | at91_register_uart(0, 0, 0); /* DBGU = ttyS0 */ | ||
65 | at91_set_serial_console(0); | ||
66 | } | ||
67 | |||
68 | /* | ||
69 | * USB Host port | ||
70 | */ | ||
71 | static struct at91_usbh_data __initdata cap9adk_usbh_data = { | ||
72 | .ports = 2, | ||
73 | }; | ||
74 | |||
75 | /* | ||
76 | * USB HS Device port | ||
77 | */ | ||
78 | static struct usba_platform_data __initdata cap9adk_usba_udc_data = { | ||
79 | .vbus_pin = AT91_PIN_PB31, | ||
80 | }; | ||
81 | |||
82 | /* | ||
83 | * ADS7846 Touchscreen | ||
84 | */ | ||
85 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
86 | static int ads7843_pendown_state(void) | ||
87 | { | ||
88 | return !at91_get_gpio_value(AT91_PIN_PC4); /* Touchscreen PENIRQ */ | ||
89 | } | ||
90 | |||
91 | static struct ads7846_platform_data ads_info = { | ||
92 | .model = 7843, | ||
93 | .x_min = 150, | ||
94 | .x_max = 3830, | ||
95 | .y_min = 190, | ||
96 | .y_max = 3830, | ||
97 | .vref_delay_usecs = 100, | ||
98 | .x_plate_ohms = 450, | ||
99 | .y_plate_ohms = 250, | ||
100 | .pressure_max = 15000, | ||
101 | .debounce_max = 1, | ||
102 | .debounce_rep = 0, | ||
103 | .debounce_tol = (~0), | ||
104 | .get_pendown_state = ads7843_pendown_state, | ||
105 | }; | ||
106 | |||
107 | static void __init cap9adk_add_device_ts(void) | ||
108 | { | ||
109 | at91_set_gpio_input(AT91_PIN_PC4, 1); /* Touchscreen PENIRQ */ | ||
110 | at91_set_gpio_input(AT91_PIN_PC5, 1); /* Touchscreen BUSY */ | ||
111 | } | ||
112 | #else | ||
113 | static void __init cap9adk_add_device_ts(void) {} | ||
114 | #endif | ||
115 | |||
116 | |||
117 | /* | ||
118 | * SPI devices. | ||
119 | */ | ||
120 | static struct spi_board_info cap9adk_spi_devices[] = { | ||
121 | #if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) | ||
122 | { /* DataFlash card */ | ||
123 | .modalias = "mtd_dataflash", | ||
124 | .chip_select = 0, | ||
125 | .max_speed_hz = 15 * 1000 * 1000, | ||
126 | .bus_num = 0, | ||
127 | }, | ||
128 | #endif | ||
129 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
130 | { | ||
131 | .modalias = "ads7846", | ||
132 | .chip_select = 3, /* can be 2 or 3, depending on J2 jumper */ | ||
133 | .max_speed_hz = 125000 * 26, /* (max sample rate @ 3V) * (cmd + data + overhead) */ | ||
134 | .bus_num = 0, | ||
135 | .platform_data = &ads_info, | ||
136 | .irq = AT91_PIN_PC4, | ||
137 | }, | ||
138 | #endif | ||
139 | }; | ||
140 | |||
141 | |||
142 | /* | ||
143 | * MCI (SD/MMC) | ||
144 | */ | ||
145 | static struct at91_mmc_data __initdata cap9adk_mmc_data = { | ||
146 | .wire4 = 1, | ||
147 | // .det_pin = ... not connected | ||
148 | // .wp_pin = ... not connected | ||
149 | // .vcc_pin = ... not connected | ||
150 | }; | ||
151 | |||
152 | |||
153 | /* | ||
154 | * MACB Ethernet device | ||
155 | */ | ||
156 | static struct at91_eth_data __initdata cap9adk_macb_data = { | ||
157 | .is_rmii = 1, | ||
158 | }; | ||
159 | |||
160 | |||
161 | /* | ||
162 | * NAND flash | ||
163 | */ | ||
164 | static struct mtd_partition __initdata cap9adk_nand_partitions[] = { | ||
165 | { | ||
166 | .name = "NAND partition", | ||
167 | .offset = 0, | ||
168 | .size = MTDPART_SIZ_FULL, | ||
169 | }, | ||
170 | }; | ||
171 | |||
172 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) | ||
173 | { | ||
174 | *num_partitions = ARRAY_SIZE(cap9adk_nand_partitions); | ||
175 | return cap9adk_nand_partitions; | ||
176 | } | ||
177 | |||
178 | static struct atmel_nand_data __initdata cap9adk_nand_data = { | ||
179 | .ale = 21, | ||
180 | .cle = 22, | ||
181 | // .det_pin = ... not connected | ||
182 | // .rdy_pin = ... not connected | ||
183 | .enable_pin = AT91_PIN_PD15, | ||
184 | .partition_info = nand_partitions, | ||
185 | }; | ||
186 | |||
187 | static struct sam9_smc_config __initdata cap9adk_nand_smc_config = { | ||
188 | .ncs_read_setup = 1, | ||
189 | .nrd_setup = 2, | ||
190 | .ncs_write_setup = 1, | ||
191 | .nwe_setup = 2, | ||
192 | |||
193 | .ncs_read_pulse = 6, | ||
194 | .nrd_pulse = 4, | ||
195 | .ncs_write_pulse = 6, | ||
196 | .nwe_pulse = 4, | ||
197 | |||
198 | .read_cycle = 8, | ||
199 | .write_cycle = 8, | ||
200 | |||
201 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, | ||
202 | .tdf_cycles = 1, | ||
203 | }; | ||
204 | |||
205 | static void __init cap9adk_add_device_nand(void) | ||
206 | { | ||
207 | unsigned long csa; | ||
208 | |||
209 | csa = at91_sys_read(AT91_MATRIX_EBICSA); | ||
210 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); | ||
211 | |||
212 | cap9adk_nand_data.bus_width_16 = board_have_nand_16bit(); | ||
213 | /* setup bus-width (8 or 16) */ | ||
214 | if (cap9adk_nand_data.bus_width_16) | ||
215 | cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16; | ||
216 | else | ||
217 | cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_8; | ||
218 | |||
219 | /* configure chip-select 3 (NAND) */ | ||
220 | sam9_smc_configure(3, &cap9adk_nand_smc_config); | ||
221 | |||
222 | at91_add_device_nand(&cap9adk_nand_data); | ||
223 | } | ||
224 | |||
225 | |||
226 | /* | ||
227 | * NOR flash | ||
228 | */ | ||
229 | static struct mtd_partition cap9adk_nor_partitions[] = { | ||
230 | { | ||
231 | .name = "NOR partition", | ||
232 | .offset = 0, | ||
233 | .size = MTDPART_SIZ_FULL, | ||
234 | }, | ||
235 | }; | ||
236 | |||
237 | static struct physmap_flash_data cap9adk_nor_data = { | ||
238 | .width = 2, | ||
239 | .parts = cap9adk_nor_partitions, | ||
240 | .nr_parts = ARRAY_SIZE(cap9adk_nor_partitions), | ||
241 | }; | ||
242 | |||
243 | #define NOR_BASE AT91_CHIPSELECT_0 | ||
244 | #define NOR_SIZE SZ_8M | ||
245 | |||
246 | static struct resource nor_flash_resources[] = { | ||
247 | { | ||
248 | .start = NOR_BASE, | ||
249 | .end = NOR_BASE + NOR_SIZE - 1, | ||
250 | .flags = IORESOURCE_MEM, | ||
251 | } | ||
252 | }; | ||
253 | |||
254 | static struct platform_device cap9adk_nor_flash = { | ||
255 | .name = "physmap-flash", | ||
256 | .id = 0, | ||
257 | .dev = { | ||
258 | .platform_data = &cap9adk_nor_data, | ||
259 | }, | ||
260 | .resource = nor_flash_resources, | ||
261 | .num_resources = ARRAY_SIZE(nor_flash_resources), | ||
262 | }; | ||
263 | |||
264 | static struct sam9_smc_config __initdata cap9adk_nor_smc_config = { | ||
265 | .ncs_read_setup = 2, | ||
266 | .nrd_setup = 4, | ||
267 | .ncs_write_setup = 2, | ||
268 | .nwe_setup = 4, | ||
269 | |||
270 | .ncs_read_pulse = 10, | ||
271 | .nrd_pulse = 8, | ||
272 | .ncs_write_pulse = 10, | ||
273 | .nwe_pulse = 8, | ||
274 | |||
275 | .read_cycle = 16, | ||
276 | .write_cycle = 16, | ||
277 | |||
278 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16, | ||
279 | .tdf_cycles = 1, | ||
280 | }; | ||
281 | |||
282 | static __init void cap9adk_add_device_nor(void) | ||
283 | { | ||
284 | unsigned long csa; | ||
285 | |||
286 | csa = at91_sys_read(AT91_MATRIX_EBICSA); | ||
287 | at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); | ||
288 | |||
289 | /* configure chip-select 0 (NOR) */ | ||
290 | sam9_smc_configure(0, &cap9adk_nor_smc_config); | ||
291 | |||
292 | platform_device_register(&cap9adk_nor_flash); | ||
293 | } | ||
294 | |||
295 | |||
296 | /* | ||
297 | * LCD Controller | ||
298 | */ | ||
299 | #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) | ||
300 | static struct fb_videomode at91_tft_vga_modes[] = { | ||
301 | { | ||
302 | .name = "TX09D50VM1CCA @ 60", | ||
303 | .refresh = 60, | ||
304 | .xres = 240, .yres = 320, | ||
305 | .pixclock = KHZ2PICOS(4965), | ||
306 | |||
307 | .left_margin = 1, .right_margin = 33, | ||
308 | .upper_margin = 1, .lower_margin = 0, | ||
309 | .hsync_len = 5, .vsync_len = 1, | ||
310 | |||
311 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
312 | .vmode = FB_VMODE_NONINTERLACED, | ||
313 | }, | ||
314 | }; | ||
315 | |||
316 | static struct fb_monspecs at91fb_default_monspecs = { | ||
317 | .manufacturer = "HIT", | ||
318 | .monitor = "TX09D70VM1CCA", | ||
319 | |||
320 | .modedb = at91_tft_vga_modes, | ||
321 | .modedb_len = ARRAY_SIZE(at91_tft_vga_modes), | ||
322 | .hfmin = 15000, | ||
323 | .hfmax = 64000, | ||
324 | .vfmin = 50, | ||
325 | .vfmax = 150, | ||
326 | }; | ||
327 | |||
328 | #define AT91CAP9_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ | ||
329 | | ATMEL_LCDC_DISTYPE_TFT \ | ||
330 | | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE) | ||
331 | |||
332 | static void at91_lcdc_power_control(int on) | ||
333 | { | ||
334 | if (on) | ||
335 | at91_set_gpio_value(AT91_PIN_PC0, 0); /* power up */ | ||
336 | else | ||
337 | at91_set_gpio_value(AT91_PIN_PC0, 1); /* power down */ | ||
338 | } | ||
339 | |||
340 | /* Driver datas */ | ||
341 | static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data = { | ||
342 | .default_bpp = 16, | ||
343 | .default_dmacon = ATMEL_LCDC_DMAEN, | ||
344 | .default_lcdcon2 = AT91CAP9_DEFAULT_LCDCON2, | ||
345 | .default_monspecs = &at91fb_default_monspecs, | ||
346 | .atmel_lcdfb_power_control = at91_lcdc_power_control, | ||
347 | .guard_time = 1, | ||
348 | }; | ||
349 | |||
350 | #else | ||
351 | static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data; | ||
352 | #endif | ||
353 | |||
354 | |||
355 | /* | ||
356 | * AC97 | ||
357 | */ | ||
358 | static struct ac97c_platform_data cap9adk_ac97_data = { | ||
359 | // .reset_pin = ... not connected | ||
360 | }; | ||
361 | |||
362 | |||
363 | static void __init cap9adk_board_init(void) | ||
364 | { | ||
365 | /* Serial */ | ||
366 | at91_add_device_serial(); | ||
367 | /* USB Host */ | ||
368 | at91_add_device_usbh(&cap9adk_usbh_data); | ||
369 | /* USB HS */ | ||
370 | at91_add_device_usba(&cap9adk_usba_udc_data); | ||
371 | /* SPI */ | ||
372 | at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); | ||
373 | /* Touchscreen */ | ||
374 | cap9adk_add_device_ts(); | ||
375 | /* MMC */ | ||
376 | at91_add_device_mmc(1, &cap9adk_mmc_data); | ||
377 | /* Ethernet */ | ||
378 | at91_add_device_eth(&cap9adk_macb_data); | ||
379 | /* NAND */ | ||
380 | cap9adk_add_device_nand(); | ||
381 | /* NOR Flash */ | ||
382 | cap9adk_add_device_nor(); | ||
383 | /* I2C */ | ||
384 | at91_add_device_i2c(NULL, 0); | ||
385 | /* LCD Controller */ | ||
386 | at91_add_device_lcdc(&cap9adk_lcdc_data); | ||
387 | /* AC97 */ | ||
388 | at91_add_device_ac97(&cap9adk_ac97_data); | ||
389 | } | ||
390 | |||
391 | MACHINE_START(AT91CAP9ADK, "Atmel AT91CAP9A-DK") | ||
392 | /* Maintainer: Stelian Pop <stelian.pop@leadtechdesign.com> */ | ||
393 | .timer = &at91sam926x_timer, | ||
394 | .map_io = at91_map_io, | ||
395 | .init_early = cap9adk_init_early, | ||
396 | .init_irq = at91_init_irq_default, | ||
397 | .init_machine = cap9adk_board_init, | ||
398 | MACHINE_END | ||
diff --git a/arch/arm/mach-at91/board-usb-a9260.c b/arch/arm/mach-at91/board-usb-a9260.c new file mode 100644 index 00000000000..8c4c1a02c4b --- /dev/null +++ b/arch/arm/mach-at91/board-usb-a9260.c | |||
@@ -0,0 +1,230 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-at91/board-usb-a9260.c | ||
3 | * | ||
4 | * Copyright (C) 2005 SAN People | ||
5 | * Copyright (C) 2006 Atmel | ||
6 | * Copyright (C) 2007 Calao-systems | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/mm.h> | ||
26 | #include <linux/module.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/spi/spi.h> | ||
29 | #include <linux/gpio_keys.h> | ||
30 | #include <linux/input.h> | ||
31 | #include <linux/clk.h> | ||
32 | |||
33 | #include <asm/setup.h> | ||
34 | #include <asm/mach-types.h> | ||
35 | #include <asm/irq.h> | ||
36 | |||
37 | #include <asm/mach/arch.h> | ||
38 | #include <asm/mach/map.h> | ||
39 | #include <asm/mach/irq.h> | ||
40 | |||
41 | #include <mach/hardware.h> | ||
42 | #include <mach/board.h> | ||
43 | #include <mach/gpio.h> | ||
44 | #include <mach/at91sam9_smc.h> | ||
45 | #include <mach/at91_shdwc.h> | ||
46 | |||
47 | #include "sam9_smc.h" | ||
48 | #include "generic.h" | ||
49 | |||
50 | |||
51 | static void __init ek_init_early(void) | ||
52 | { | ||
53 | /* Initialize processor: 12.000 MHz crystal */ | ||
54 | at91_initialize(12000000); | ||
55 | |||
56 | /* DBGU on ttyS0. (Rx & Tx only) */ | ||
57 | at91_register_uart(0, 0, 0); | ||
58 | |||
59 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
60 | at91_set_serial_console(0); | ||
61 | } | ||
62 | |||
63 | /* | ||
64 | * USB Host port | ||
65 | */ | ||
66 | static struct at91_usbh_data __initdata ek_usbh_data = { | ||
67 | .ports = 2, | ||
68 | }; | ||
69 | |||
70 | /* | ||
71 | * USB Device port | ||
72 | */ | ||
73 | static struct at91_udc_data __initdata ek_udc_data = { | ||
74 | .vbus_pin = AT91_PIN_PC5, | ||
75 | .pullup_pin = 0, /* pull-up driven by UDC */ | ||
76 | }; | ||
77 | |||
78 | /* | ||
79 | * MACB Ethernet device | ||
80 | */ | ||
81 | static struct at91_eth_data __initdata ek_macb_data = { | ||
82 | .phy_irq_pin = AT91_PIN_PA31, | ||
83 | .is_rmii = 1, | ||
84 | }; | ||
85 | |||
86 | /* | ||
87 | * NAND flash | ||
88 | */ | ||
89 | static struct mtd_partition __initdata ek_nand_partition[] = { | ||
90 | { | ||
91 | .name = "Uboot & Kernel", | ||
92 | .offset = 0, | ||
93 | .size = SZ_16M, | ||
94 | }, | ||
95 | { | ||
96 | .name = "Root FS", | ||
97 | .offset = MTDPART_OFS_NXTBLK, | ||
98 | .size = 120 * SZ_1M, | ||
99 | }, | ||
100 | { | ||
101 | .name = "FS", | ||
102 | .offset = MTDPART_OFS_NXTBLK, | ||
103 | .size = 120 * SZ_1M, | ||
104 | } | ||
105 | }; | ||
106 | |||
107 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) | ||
108 | { | ||
109 | *num_partitions = ARRAY_SIZE(ek_nand_partition); | ||
110 | return ek_nand_partition; | ||
111 | } | ||
112 | |||
113 | static struct atmel_nand_data __initdata ek_nand_data = { | ||
114 | .ale = 21, | ||
115 | .cle = 22, | ||
116 | // .det_pin = ... not connected | ||
117 | .rdy_pin = AT91_PIN_PC13, | ||
118 | .enable_pin = AT91_PIN_PC14, | ||
119 | .partition_info = nand_partitions, | ||
120 | }; | ||
121 | |||
122 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | ||
123 | .ncs_read_setup = 0, | ||
124 | .nrd_setup = 1, | ||
125 | .ncs_write_setup = 0, | ||
126 | .nwe_setup = 1, | ||
127 | |||
128 | .ncs_read_pulse = 3, | ||
129 | .nrd_pulse = 3, | ||
130 | .ncs_write_pulse = 3, | ||
131 | .nwe_pulse = 3, | ||
132 | |||
133 | .read_cycle = 5, | ||
134 | .write_cycle = 5, | ||
135 | |||
136 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, | ||
137 | .tdf_cycles = 2, | ||
138 | }; | ||
139 | |||
140 | static void __init ek_add_device_nand(void) | ||
141 | { | ||
142 | /* configure chip-select 3 (NAND) */ | ||
143 | sam9_smc_configure(3, &ek_nand_smc_config); | ||
144 | |||
145 | at91_add_device_nand(&ek_nand_data); | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * GPIO Buttons | ||
150 | */ | ||
151 | |||
152 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
153 | static struct gpio_keys_button ek_buttons[] = { | ||
154 | { /* USER PUSH BUTTON */ | ||
155 | .code = KEY_ENTER, | ||
156 | .gpio = AT91_PIN_PB10, | ||
157 | .active_low = 1, | ||
158 | .desc = "user_pb", | ||
159 | .wakeup = 1, | ||
160 | } | ||
161 | }; | ||
162 | |||
163 | static struct gpio_keys_platform_data ek_button_data = { | ||
164 | .buttons = ek_buttons, | ||
165 | .nbuttons = ARRAY_SIZE(ek_buttons), | ||
166 | }; | ||
167 | |||
168 | static struct platform_device ek_button_device = { | ||
169 | .name = "gpio-keys", | ||
170 | .id = -1, | ||
171 | .num_resources = 0, | ||
172 | .dev = { | ||
173 | .platform_data = &ek_button_data, | ||
174 | } | ||
175 | }; | ||
176 | |||
177 | static void __init ek_add_device_buttons(void) | ||
178 | { | ||
179 | at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* user push button, pull up enabled */ | ||
180 | at91_set_deglitch(AT91_PIN_PB10, 1); | ||
181 | |||
182 | platform_device_register(&ek_button_device); | ||
183 | } | ||
184 | #else | ||
185 | static void __init ek_add_device_buttons(void) {} | ||
186 | #endif | ||
187 | |||
188 | /* | ||
189 | * LEDs | ||
190 | */ | ||
191 | static struct gpio_led ek_leds[] = { | ||
192 | { /* user_led (green) */ | ||
193 | .name = "user_led", | ||
194 | .gpio = AT91_PIN_PB21, | ||
195 | .active_low = 0, | ||
196 | .default_trigger = "heartbeat", | ||
197 | } | ||
198 | }; | ||
199 | |||
200 | static void __init ek_board_init(void) | ||
201 | { | ||
202 | /* Serial */ | ||
203 | at91_add_device_serial(); | ||
204 | /* USB Host */ | ||
205 | at91_add_device_usbh(&ek_usbh_data); | ||
206 | /* USB Device */ | ||
207 | at91_add_device_udc(&ek_udc_data); | ||
208 | /* NAND */ | ||
209 | ek_add_device_nand(); | ||
210 | /* I2C */ | ||
211 | at91_add_device_i2c(NULL, 0); | ||
212 | /* Ethernet */ | ||
213 | at91_add_device_eth(&ek_macb_data); | ||
214 | /* Push Buttons */ | ||
215 | ek_add_device_buttons(); | ||
216 | /* LEDs */ | ||
217 | at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); | ||
218 | /* shutdown controller, wakeup button (5 msec low) */ | ||
219 | at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW | ||
220 | | AT91_SHDW_RTTWKEN); | ||
221 | } | ||
222 | |||
223 | MACHINE_START(USB_A9260, "CALAO USB_A9260") | ||
224 | /* Maintainer: calao-systems */ | ||
225 | .timer = &at91sam926x_timer, | ||
226 | .map_io = at91_map_io, | ||
227 | .init_early = ek_init_early, | ||
228 | .init_irq = at91_init_irq_default, | ||
229 | .init_machine = ek_board_init, | ||
230 | MACHINE_END | ||
diff --git a/arch/arm/mach-at91/board-usb-a9263.c b/arch/arm/mach-at91/board-usb-a9263.c new file mode 100644 index 00000000000..25e793782a4 --- /dev/null +++ b/arch/arm/mach-at91/board-usb-a9263.c | |||
@@ -0,0 +1,246 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-at91/board-usb-a9263.c | ||
3 | * | ||
4 | * Copyright (C) 2005 SAN People | ||
5 | * Copyright (C) 2007 Atmel Corporation. | ||
6 | * Copyright (C) 2007 Calao-systems | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/mm.h> | ||
26 | #include <linux/module.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/spi/spi.h> | ||
29 | #include <linux/gpio_keys.h> | ||
30 | #include <linux/input.h> | ||
31 | |||
32 | #include <asm/setup.h> | ||
33 | #include <asm/mach-types.h> | ||
34 | #include <asm/irq.h> | ||
35 | |||
36 | #include <asm/mach/arch.h> | ||
37 | #include <asm/mach/map.h> | ||
38 | #include <asm/mach/irq.h> | ||
39 | |||
40 | #include <mach/hardware.h> | ||
41 | #include <mach/board.h> | ||
42 | #include <mach/gpio.h> | ||
43 | #include <mach/at91sam9_smc.h> | ||
44 | #include <mach/at91_shdwc.h> | ||
45 | |||
46 | #include "sam9_smc.h" | ||
47 | #include "generic.h" | ||
48 | |||
49 | |||
50 | static void __init ek_init_early(void) | ||
51 | { | ||
52 | /* Initialize processor: 12.00 MHz crystal */ | ||
53 | at91_initialize(12000000); | ||
54 | |||
55 | /* DBGU on ttyS0. (Rx & Tx only) */ | ||
56 | at91_register_uart(0, 0, 0); | ||
57 | |||
58 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
59 | at91_set_serial_console(0); | ||
60 | } | ||
61 | |||
62 | /* | ||
63 | * USB Host port | ||
64 | */ | ||
65 | static struct at91_usbh_data __initdata ek_usbh_data = { | ||
66 | .ports = 2, | ||
67 | }; | ||
68 | |||
69 | /* | ||
70 | * USB Device port | ||
71 | */ | ||
72 | static struct at91_udc_data __initdata ek_udc_data = { | ||
73 | .vbus_pin = AT91_PIN_PB11, | ||
74 | .pullup_pin = 0, /* pull-up driven by UDC */ | ||
75 | }; | ||
76 | |||
77 | /* | ||
78 | * SPI devices. | ||
79 | */ | ||
80 | static struct spi_board_info ek_spi_devices[] = { | ||
81 | #if !defined(CONFIG_MMC_AT91) | ||
82 | { /* DataFlash chip */ | ||
83 | .modalias = "mtd_dataflash", | ||
84 | .chip_select = 0, | ||
85 | .max_speed_hz = 15 * 1000 * 1000, | ||
86 | .bus_num = 0, | ||
87 | } | ||
88 | #endif | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * MACB Ethernet device | ||
93 | */ | ||
94 | static struct at91_eth_data __initdata ek_macb_data = { | ||
95 | .phy_irq_pin = AT91_PIN_PE31, | ||
96 | .is_rmii = 1, | ||
97 | }; | ||
98 | |||
99 | /* | ||
100 | * NAND flash | ||
101 | */ | ||
102 | static struct mtd_partition __initdata ek_nand_partition[] = { | ||
103 | { | ||
104 | .name = "Linux Kernel", | ||
105 | .offset = 0, | ||
106 | .size = SZ_16M, | ||
107 | }, | ||
108 | { | ||
109 | .name = "Root FS", | ||
110 | .offset = MTDPART_OFS_NXTBLK, | ||
111 | .size = 120 * SZ_1M, | ||
112 | }, | ||
113 | { | ||
114 | .name = "FS", | ||
115 | .offset = MTDPART_OFS_NXTBLK, | ||
116 | .size = 120 * SZ_1M, | ||
117 | } | ||
118 | }; | ||
119 | |||
120 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) | ||
121 | { | ||
122 | *num_partitions = ARRAY_SIZE(ek_nand_partition); | ||
123 | return ek_nand_partition; | ||
124 | } | ||
125 | |||
126 | static struct atmel_nand_data __initdata ek_nand_data = { | ||
127 | .ale = 21, | ||
128 | .cle = 22, | ||
129 | // .det_pin = ... not connected | ||
130 | .rdy_pin = AT91_PIN_PA22, | ||
131 | .enable_pin = AT91_PIN_PD15, | ||
132 | .partition_info = nand_partitions, | ||
133 | }; | ||
134 | |||
135 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | ||
136 | .ncs_read_setup = 0, | ||
137 | .nrd_setup = 1, | ||
138 | .ncs_write_setup = 0, | ||
139 | .nwe_setup = 1, | ||
140 | |||
141 | .ncs_read_pulse = 3, | ||
142 | .nrd_pulse = 3, | ||
143 | .ncs_write_pulse = 3, | ||
144 | .nwe_pulse = 3, | ||
145 | |||
146 | .read_cycle = 5, | ||
147 | .write_cycle = 5, | ||
148 | |||
149 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, | ||
150 | .tdf_cycles = 2, | ||
151 | }; | ||
152 | |||
153 | static void __init ek_add_device_nand(void) | ||
154 | { | ||
155 | /* configure chip-select 3 (NAND) */ | ||
156 | sam9_smc_configure(3, &ek_nand_smc_config); | ||
157 | |||
158 | at91_add_device_nand(&ek_nand_data); | ||
159 | } | ||
160 | |||
161 | |||
162 | /* | ||
163 | * GPIO Buttons | ||
164 | */ | ||
165 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
166 | static struct gpio_keys_button ek_buttons[] = { | ||
167 | { /* USER PUSH BUTTON */ | ||
168 | .code = KEY_ENTER, | ||
169 | .gpio = AT91_PIN_PB10, | ||
170 | .active_low = 1, | ||
171 | .desc = "user_pb", | ||
172 | .wakeup = 1, | ||
173 | } | ||
174 | }; | ||
175 | |||
176 | static struct gpio_keys_platform_data ek_button_data = { | ||
177 | .buttons = ek_buttons, | ||
178 | .nbuttons = ARRAY_SIZE(ek_buttons), | ||
179 | }; | ||
180 | |||
181 | static struct platform_device ek_button_device = { | ||
182 | .name = "gpio-keys", | ||
183 | .id = -1, | ||
184 | .num_resources = 0, | ||
185 | .dev = { | ||
186 | .platform_data = &ek_button_data, | ||
187 | } | ||
188 | }; | ||
189 | |||
190 | static void __init ek_add_device_buttons(void) | ||
191 | { | ||
192 | at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* user push button, pull up enabled */ | ||
193 | at91_set_deglitch(AT91_PIN_PB10, 1); | ||
194 | |||
195 | platform_device_register(&ek_button_device); | ||
196 | } | ||
197 | #else | ||
198 | static void __init ek_add_device_buttons(void) {} | ||
199 | #endif | ||
200 | |||
201 | /* | ||
202 | * LEDs | ||
203 | */ | ||
204 | static struct gpio_led ek_leds[] = { | ||
205 | { /* user_led (green) */ | ||
206 | .name = "user_led", | ||
207 | .gpio = AT91_PIN_PB21, | ||
208 | .active_low = 1, | ||
209 | .default_trigger = "heartbeat", | ||
210 | } | ||
211 | }; | ||
212 | |||
213 | |||
214 | static void __init ek_board_init(void) | ||
215 | { | ||
216 | /* Serial */ | ||
217 | at91_add_device_serial(); | ||
218 | /* USB Host */ | ||
219 | at91_add_device_usbh(&ek_usbh_data); | ||
220 | /* USB Device */ | ||
221 | at91_add_device_udc(&ek_udc_data); | ||
222 | /* SPI */ | ||
223 | at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); | ||
224 | /* Ethernet */ | ||
225 | at91_add_device_eth(&ek_macb_data); | ||
226 | /* NAND */ | ||
227 | ek_add_device_nand(); | ||
228 | /* I2C */ | ||
229 | at91_add_device_i2c(NULL, 0); | ||
230 | /* Push Buttons */ | ||
231 | ek_add_device_buttons(); | ||
232 | /* LEDs */ | ||
233 | at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); | ||
234 | /* shutdown controller, wakeup button (5 msec low) */ | ||
235 | at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW | ||
236 | | AT91_SHDW_RTTWKEN); | ||
237 | } | ||
238 | |||
239 | MACHINE_START(USB_A9263, "CALAO USB_A9263") | ||
240 | /* Maintainer: calao-systems */ | ||
241 | .timer = &at91sam926x_timer, | ||
242 | .map_io = at91_map_io, | ||
243 | .init_early = ek_init_early, | ||
244 | .init_irq = at91_init_irq_default, | ||
245 | .init_machine = ek_board_init, | ||
246 | MACHINE_END | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/include/mach/at91_aic.h new file mode 100644 index 00000000000..03566799d3b --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_aic.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_aic.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Advanced Interrupt Controller (AIC) - System peripherals registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_AIC_H | ||
17 | #define AT91_AIC_H | ||
18 | |||
19 | #define AT91_AIC_SMR(n) (AT91_AIC + ((n) * 4)) /* Source Mode Registers 0-31 */ | ||
20 | #define AT91_AIC_PRIOR (7 << 0) /* Priority Level */ | ||
21 | #define AT91_AIC_SRCTYPE (3 << 5) /* Interrupt Source Type */ | ||
22 | #define AT91_AIC_SRCTYPE_LOW (0 << 5) | ||
23 | #define AT91_AIC_SRCTYPE_FALLING (1 << 5) | ||
24 | #define AT91_AIC_SRCTYPE_HIGH (2 << 5) | ||
25 | #define AT91_AIC_SRCTYPE_RISING (3 << 5) | ||
26 | |||
27 | #define AT91_AIC_SVR(n) (AT91_AIC + 0x80 + ((n) * 4)) /* Source Vector Registers 0-31 */ | ||
28 | #define AT91_AIC_IVR (AT91_AIC + 0x100) /* Interrupt Vector Register */ | ||
29 | #define AT91_AIC_FVR (AT91_AIC + 0x104) /* Fast Interrupt Vector Register */ | ||
30 | #define AT91_AIC_ISR (AT91_AIC + 0x108) /* Interrupt Status Register */ | ||
31 | #define AT91_AIC_IRQID (0x1f << 0) /* Current Interrupt Identifier */ | ||
32 | |||
33 | #define AT91_AIC_IPR (AT91_AIC + 0x10c) /* Interrupt Pending Register */ | ||
34 | #define AT91_AIC_IMR (AT91_AIC + 0x110) /* Interrupt Mask Register */ | ||
35 | #define AT91_AIC_CISR (AT91_AIC + 0x114) /* Core Interrupt Status Register */ | ||
36 | #define AT91_AIC_NFIQ (1 << 0) /* nFIQ Status */ | ||
37 | #define AT91_AIC_NIRQ (1 << 1) /* nIRQ Status */ | ||
38 | |||
39 | #define AT91_AIC_IECR (AT91_AIC + 0x120) /* Interrupt Enable Command Register */ | ||
40 | #define AT91_AIC_IDCR (AT91_AIC + 0x124) /* Interrupt Disable Command Register */ | ||
41 | #define AT91_AIC_ICCR (AT91_AIC + 0x128) /* Interrupt Clear Command Register */ | ||
42 | #define AT91_AIC_ISCR (AT91_AIC + 0x12c) /* Interrupt Set Command Register */ | ||
43 | #define AT91_AIC_EOICR (AT91_AIC + 0x130) /* End of Interrupt Command Register */ | ||
44 | #define AT91_AIC_SPU (AT91_AIC + 0x134) /* Spurious Interrupt Vector Register */ | ||
45 | #define AT91_AIC_DCR (AT91_AIC + 0x138) /* Debug Control Register */ | ||
46 | #define AT91_AIC_DCR_PROT (1 << 0) /* Protection Mode */ | ||
47 | #define AT91_AIC_DCR_GMSK (1 << 1) /* General Mask */ | ||
48 | |||
49 | #define AT91_AIC_FFER (AT91_AIC + 0x140) /* Fast Forcing Enable Register [SAM9 only] */ | ||
50 | #define AT91_AIC_FFDR (AT91_AIC + 0x144) /* Fast Forcing Disable Register [SAM9 only] */ | ||
51 | #define AT91_AIC_FFSR (AT91_AIC + 0x148) /* Fast Forcing Status Register [SAM9 only] */ | ||
52 | |||
53 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_pit.h b/arch/arm/mach-at91/include/mach/at91_pit.h new file mode 100644 index 00000000000..974d0bd05b5 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_pit.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_pit.h | ||
3 | * | ||
4 | * Copyright (C) 2007 Andrew Victor | ||
5 | * Copyright (C) 2007 Atmel Corporation. | ||
6 | * | ||
7 | * Periodic Interval Timer (PIT) - System peripherals regsters. | ||
8 | * Based on AT91SAM9261 datasheet revision D. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_PIT_H | ||
17 | #define AT91_PIT_H | ||
18 | |||
19 | #define AT91_PIT_MR (AT91_PIT + 0x00) /* Mode Register */ | ||
20 | #define AT91_PIT_PITIEN (1 << 25) /* Timer Interrupt Enable */ | ||
21 | #define AT91_PIT_PITEN (1 << 24) /* Timer Enabled */ | ||
22 | #define AT91_PIT_PIV (0xfffff) /* Periodic Interval Value */ | ||
23 | |||
24 | #define AT91_PIT_SR (AT91_PIT + 0x04) /* Status Register */ | ||
25 | #define AT91_PIT_PITS (1 << 0) /* Timer Status */ | ||
26 | |||
27 | #define AT91_PIT_PIVR (AT91_PIT + 0x08) /* Periodic Interval Value Register */ | ||
28 | #define AT91_PIT_PIIR (AT91_PIT + 0x0c) /* Periodic Interval Image Register */ | ||
29 | #define AT91_PIT_PICNT (0xfff << 20) /* Interval Counter */ | ||
30 | #define AT91_PIT_CPIV (0xfffff) /* Inverval Value */ | ||
31 | |||
32 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_rstc.h b/arch/arm/mach-at91/include/mach/at91_rstc.h new file mode 100644 index 00000000000..cbd2bf052c1 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_rstc.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_rstc.h | ||
3 | * | ||
4 | * Copyright (C) 2007 Andrew Victor | ||
5 | * Copyright (C) 2007 Atmel Corporation. | ||
6 | * | ||
7 | * Reset Controller (RSTC) - System peripherals regsters. | ||
8 | * Based on AT91SAM9261 datasheet revision D. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_RSTC_H | ||
17 | #define AT91_RSTC_H | ||
18 | |||
19 | #define AT91_RSTC_CR (AT91_RSTC + 0x00) /* Reset Controller Control Register */ | ||
20 | #define AT91_RSTC_PROCRST (1 << 0) /* Processor Reset */ | ||
21 | #define AT91_RSTC_PERRST (1 << 2) /* Peripheral Reset */ | ||
22 | #define AT91_RSTC_EXTRST (1 << 3) /* External Reset */ | ||
23 | #define AT91_RSTC_KEY (0xa5 << 24) /* KEY Password */ | ||
24 | |||
25 | #define AT91_RSTC_SR (AT91_RSTC + 0x04) /* Reset Controller Status Register */ | ||
26 | #define AT91_RSTC_URSTS (1 << 0) /* User Reset Status */ | ||
27 | #define AT91_RSTC_RSTTYP (7 << 8) /* Reset Type */ | ||
28 | #define AT91_RSTC_RSTTYP_GENERAL (0 << 8) | ||
29 | #define AT91_RSTC_RSTTYP_WAKEUP (1 << 8) | ||
30 | #define AT91_RSTC_RSTTYP_WATCHDOG (2 << 8) | ||
31 | #define AT91_RSTC_RSTTYP_SOFTWARE (3 << 8) | ||
32 | #define AT91_RSTC_RSTTYP_USER (4 << 8) | ||
33 | #define AT91_RSTC_NRSTL (1 << 16) /* NRST Pin Level */ | ||
34 | #define AT91_RSTC_SRCMP (1 << 17) /* Software Reset Command in Progress */ | ||
35 | |||
36 | #define AT91_RSTC_MR (AT91_RSTC + 0x08) /* Reset Controller Mode Register */ | ||
37 | #define AT91_RSTC_URSTEN (1 << 0) /* User Reset Enable */ | ||
38 | #define AT91_RSTC_URSTIEN (1 << 4) /* User Reset Interrupt Enable */ | ||
39 | #define AT91_RSTC_ERSTL (0xf << 8) /* External Reset Length */ | ||
40 | |||
41 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_rtc.h b/arch/arm/mach-at91/include/mach/at91_rtc.h new file mode 100644 index 00000000000..e56f4701a3e --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_rtc.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_rtc.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Real Time Clock (RTC) - System peripheral registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_RTC_H | ||
17 | #define AT91_RTC_H | ||
18 | |||
19 | #define AT91_RTC_CR (AT91_RTC + 0x00) /* Control Register */ | ||
20 | #define AT91_RTC_UPDTIM (1 << 0) /* Update Request Time Register */ | ||
21 | #define AT91_RTC_UPDCAL (1 << 1) /* Update Request Calendar Register */ | ||
22 | #define AT91_RTC_TIMEVSEL (3 << 8) /* Time Event Selection */ | ||
23 | #define AT91_RTC_TIMEVSEL_MINUTE (0 << 8) | ||
24 | #define AT91_RTC_TIMEVSEL_HOUR (1 << 8) | ||
25 | #define AT91_RTC_TIMEVSEL_DAY24 (2 << 8) | ||
26 | #define AT91_RTC_TIMEVSEL_DAY12 (3 << 8) | ||
27 | #define AT91_RTC_CALEVSEL (3 << 16) /* Calendar Event Selection */ | ||
28 | #define AT91_RTC_CALEVSEL_WEEK (0 << 16) | ||
29 | #define AT91_RTC_CALEVSEL_MONTH (1 << 16) | ||
30 | #define AT91_RTC_CALEVSEL_YEAR (2 << 16) | ||
31 | |||
32 | #define AT91_RTC_MR (AT91_RTC + 0x04) /* Mode Register */ | ||
33 | #define AT91_RTC_HRMOD (1 << 0) /* 12/24 Hour Mode */ | ||
34 | |||
35 | #define AT91_RTC_TIMR (AT91_RTC + 0x08) /* Time Register */ | ||
36 | #define AT91_RTC_SEC (0x7f << 0) /* Current Second */ | ||
37 | #define AT91_RTC_MIN (0x7f << 8) /* Current Minute */ | ||
38 | #define AT91_RTC_HOUR (0x3f << 16) /* Current Hour */ | ||
39 | #define AT91_RTC_AMPM (1 << 22) /* Ante Meridiem Post Meridiem Indicator */ | ||
40 | |||
41 | #define AT91_RTC_CALR (AT91_RTC + 0x0c) /* Calendar Register */ | ||
42 | #define AT91_RTC_CENT (0x7f << 0) /* Current Century */ | ||
43 | #define AT91_RTC_YEAR (0xff << 8) /* Current Year */ | ||
44 | #define AT91_RTC_MONTH (0x1f << 16) /* Current Month */ | ||
45 | #define AT91_RTC_DAY (7 << 21) /* Current Day */ | ||
46 | #define AT91_RTC_DATE (0x3f << 24) /* Current Date */ | ||
47 | |||
48 | #define AT91_RTC_TIMALR (AT91_RTC + 0x10) /* Time Alarm Register */ | ||
49 | #define AT91_RTC_SECEN (1 << 7) /* Second Alarm Enable */ | ||
50 | #define AT91_RTC_MINEN (1 << 15) /* Minute Alarm Enable */ | ||
51 | #define AT91_RTC_HOUREN (1 << 23) /* Hour Alarm Enable */ | ||
52 | |||
53 | #define AT91_RTC_CALALR (AT91_RTC + 0x14) /* Calendar Alarm Register */ | ||
54 | #define AT91_RTC_MTHEN (1 << 23) /* Month Alarm Enable */ | ||
55 | #define AT91_RTC_DATEEN (1 << 31) /* Date Alarm Enable */ | ||
56 | |||
57 | #define AT91_RTC_SR (AT91_RTC + 0x18) /* Status Register */ | ||
58 | #define AT91_RTC_ACKUPD (1 << 0) /* Acknowledge for Update */ | ||
59 | #define AT91_RTC_ALARM (1 << 1) /* Alarm Flag */ | ||
60 | #define AT91_RTC_SECEV (1 << 2) /* Second Event */ | ||
61 | #define AT91_RTC_TIMEV (1 << 3) /* Time Event */ | ||
62 | #define AT91_RTC_CALEV (1 << 4) /* Calendar Event */ | ||
63 | |||
64 | #define AT91_RTC_SCCR (AT91_RTC + 0x1c) /* Status Clear Command Register */ | ||
65 | #define AT91_RTC_IER (AT91_RTC + 0x20) /* Interrupt Enable Register */ | ||
66 | #define AT91_RTC_IDR (AT91_RTC + 0x24) /* Interrupt Disable Register */ | ||
67 | #define AT91_RTC_IMR (AT91_RTC + 0x28) /* Interrupt Mask Register */ | ||
68 | |||
69 | #define AT91_RTC_VER (AT91_RTC + 0x2c) /* Valid Entry Register */ | ||
70 | #define AT91_RTC_NVTIM (1 << 0) /* Non valid Time */ | ||
71 | #define AT91_RTC_NVCAL (1 << 1) /* Non valid Calendar */ | ||
72 | #define AT91_RTC_NVTIMALR (1 << 2) /* Non valid Time Alarm */ | ||
73 | #define AT91_RTC_NVCALALR (1 << 3) /* Non valid Calendar Alarm */ | ||
74 | |||
75 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_shdwc.h b/arch/arm/mach-at91/include/mach/at91_shdwc.h new file mode 100644 index 00000000000..c4ce07e8a8f --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_shdwc.h | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_shdwc.h | ||
3 | * | ||
4 | * Copyright (C) 2007 Andrew Victor | ||
5 | * Copyright (C) 2007 Atmel Corporation. | ||
6 | * | ||
7 | * Shutdown Controller (SHDWC) - System peripherals regsters. | ||
8 | * Based on AT91SAM9261 datasheet revision D. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_SHDWC_H | ||
17 | #define AT91_SHDWC_H | ||
18 | |||
19 | #define AT91_SHDW_CR (AT91_SHDWC + 0x00) /* Shut Down Control Register */ | ||
20 | #define AT91_SHDW_SHDW (1 << 0) /* Shut Down command */ | ||
21 | #define AT91_SHDW_KEY (0xa5 << 24) /* KEY Password */ | ||
22 | |||
23 | #define AT91_SHDW_MR (AT91_SHDWC + 0x04) /* Shut Down Mode Register */ | ||
24 | #define AT91_SHDW_WKMODE0 (3 << 0) /* Wake-up 0 Mode Selection */ | ||
25 | #define AT91_SHDW_WKMODE0_NONE 0 | ||
26 | #define AT91_SHDW_WKMODE0_HIGH 1 | ||
27 | #define AT91_SHDW_WKMODE0_LOW 2 | ||
28 | #define AT91_SHDW_WKMODE0_ANYLEVEL 3 | ||
29 | #define AT91_SHDW_CPTWK0 (0xf << 4) /* Counter On Wake Up 0 */ | ||
30 | #define AT91_SHDW_CPTWK0_(x) ((x) << 4) | ||
31 | #define AT91_SHDW_RTTWKEN (1 << 16) /* Real Time Timer Wake-up Enable */ | ||
32 | |||
33 | #define AT91_SHDW_SR (AT91_SHDWC + 0x08) /* Shut Down Status Register */ | ||
34 | #define AT91_SHDW_WAKEUP0 (1 << 0) /* Wake-up 0 Status */ | ||
35 | #define AT91_SHDW_RTTWK (1 << 16) /* Real-time Timer Wake-up */ | ||
36 | #define AT91_SHDW_RTCWK (1 << 17) /* Real-time Clock Wake-up [SAM9RL] */ | ||
37 | |||
38 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_spi.h b/arch/arm/mach-at91/include/mach/at91_spi.h new file mode 100644 index 00000000000..2f6ba0c5636 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_spi.h | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_spi.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Serial Peripheral Interface (SPI) registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_SPI_H | ||
17 | #define AT91_SPI_H | ||
18 | |||
19 | #define AT91_SPI_CR 0x00 /* Control Register */ | ||
20 | #define AT91_SPI_SPIEN (1 << 0) /* SPI Enable */ | ||
21 | #define AT91_SPI_SPIDIS (1 << 1) /* SPI Disable */ | ||
22 | #define AT91_SPI_SWRST (1 << 7) /* SPI Software Reset */ | ||
23 | #define AT91_SPI_LASTXFER (1 << 24) /* Last Transfer [SAM9261 only] */ | ||
24 | |||
25 | #define AT91_SPI_MR 0x04 /* Mode Register */ | ||
26 | #define AT91_SPI_MSTR (1 << 0) /* Master/Slave Mode */ | ||
27 | #define AT91_SPI_PS (1 << 1) /* Peripheral Select */ | ||
28 | #define AT91_SPI_PS_FIXED (0 << 1) | ||
29 | #define AT91_SPI_PS_VARIABLE (1 << 1) | ||
30 | #define AT91_SPI_PCSDEC (1 << 2) /* Chip Select Decode */ | ||
31 | #define AT91_SPI_DIV32 (1 << 3) /* Clock Selection [AT91RM9200 only] */ | ||
32 | #define AT91_SPI_MODFDIS (1 << 4) /* Mode Fault Detection */ | ||
33 | #define AT91_SPI_LLB (1 << 7) /* Local Loopback Enable */ | ||
34 | #define AT91_SPI_PCS (0xf << 16) /* Peripheral Chip Select */ | ||
35 | #define AT91_SPI_DLYBCS (0xff << 24) /* Delay Between Chip Selects */ | ||
36 | |||
37 | #define AT91_SPI_RDR 0x08 /* Receive Data Register */ | ||
38 | #define AT91_SPI_RD (0xffff << 0) /* Receive Data */ | ||
39 | #define AT91_SPI_PCS (0xf << 16) /* Peripheral Chip Select */ | ||
40 | |||
41 | #define AT91_SPI_TDR 0x0c /* Transmit Data Register */ | ||
42 | #define AT91_SPI_TD (0xffff << 0) /* Transmit Data */ | ||
43 | #define AT91_SPI_PCS (0xf << 16) /* Peripheral Chip Select */ | ||
44 | #define AT91_SPI_LASTXFER (1 << 24) /* Last Transfer [SAM9261 only] */ | ||
45 | |||
46 | #define AT91_SPI_SR 0x10 /* Status Register */ | ||
47 | #define AT91_SPI_RDRF (1 << 0) /* Receive Data Register Full */ | ||
48 | #define AT91_SPI_TDRE (1 << 1) /* Transmit Data Register Full */ | ||
49 | #define AT91_SPI_MODF (1 << 2) /* Mode Fault Error */ | ||
50 | #define AT91_SPI_OVRES (1 << 3) /* Overrun Error Status */ | ||
51 | #define AT91_SPI_ENDRX (1 << 4) /* End of RX buffer */ | ||
52 | #define AT91_SPI_ENDTX (1 << 5) /* End of TX buffer */ | ||
53 | #define AT91_SPI_RXBUFF (1 << 6) /* RX Buffer Full */ | ||
54 | #define AT91_SPI_TXBUFE (1 << 7) /* TX Buffer Empty */ | ||
55 | #define AT91_SPI_NSSR (1 << 8) /* NSS Rising [SAM9261 only] */ | ||
56 | #define AT91_SPI_TXEMPTY (1 << 9) /* Transmission Register Empty [SAM9261 only] */ | ||
57 | #define AT91_SPI_SPIENS (1 << 16) /* SPI Enable Status */ | ||
58 | |||
59 | #define AT91_SPI_IER 0x14 /* Interrupt Enable Register */ | ||
60 | #define AT91_SPI_IDR 0x18 /* Interrupt Disable Register */ | ||
61 | #define AT91_SPI_IMR 0x1c /* Interrupt Mask Register */ | ||
62 | |||
63 | #define AT91_SPI_CSR(n) (0x30 + ((n) * 4)) /* Chip Select Registers 0-3 */ | ||
64 | #define AT91_SPI_CPOL (1 << 0) /* Clock Polarity */ | ||
65 | #define AT91_SPI_NCPHA (1 << 1) /* Clock Phase */ | ||
66 | #define AT91_SPI_CSAAT (1 << 3) /* Chip Select Active After Transfer [SAM9261 only] */ | ||
67 | #define AT91_SPI_BITS (0xf << 4) /* Bits Per Transfer */ | ||
68 | #define AT91_SPI_BITS_8 (0 << 4) | ||
69 | #define AT91_SPI_BITS_9 (1 << 4) | ||
70 | #define AT91_SPI_BITS_10 (2 << 4) | ||
71 | #define AT91_SPI_BITS_11 (3 << 4) | ||
72 | #define AT91_SPI_BITS_12 (4 << 4) | ||
73 | #define AT91_SPI_BITS_13 (5 << 4) | ||
74 | #define AT91_SPI_BITS_14 (6 << 4) | ||
75 | #define AT91_SPI_BITS_15 (7 << 4) | ||
76 | #define AT91_SPI_BITS_16 (8 << 4) | ||
77 | #define AT91_SPI_SCBR (0xff << 8) /* Serial Clock Baud Rate */ | ||
78 | #define AT91_SPI_DLYBS (0xff << 16) /* Delay before SPCK */ | ||
79 | #define AT91_SPI_DLYBCT (0xff << 24) /* Delay between Consecutive Transfers */ | ||
80 | |||
81 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_ssc.h b/arch/arm/mach-at91/include/mach/at91_ssc.h new file mode 100644 index 00000000000..a81114c11c7 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_ssc.h | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_ssc.h | ||
3 | * | ||
4 | * Copyright (C) SAN People | ||
5 | * | ||
6 | * Serial Synchronous Controller (SSC) registers. | ||
7 | * Based on AT91RM9200 datasheet revision E. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef AT91_SSC_H | ||
16 | #define AT91_SSC_H | ||
17 | |||
18 | #define AT91_SSC_CR 0x00 /* Control Register */ | ||
19 | #define AT91_SSC_RXEN (1 << 0) /* Receive Enable */ | ||
20 | #define AT91_SSC_RXDIS (1 << 1) /* Receive Disable */ | ||
21 | #define AT91_SSC_TXEN (1 << 8) /* Transmit Enable */ | ||
22 | #define AT91_SSC_TXDIS (1 << 9) /* Transmit Disable */ | ||
23 | #define AT91_SSC_SWRST (1 << 15) /* Software Reset */ | ||
24 | |||
25 | #define AT91_SSC_CMR 0x04 /* Clock Mode Register */ | ||
26 | #define AT91_SSC_CMR_DIV (0xfff << 0) /* Clock Divider */ | ||
27 | |||
28 | #define AT91_SSC_RCMR 0x10 /* Receive Clock Mode Register */ | ||
29 | #define AT91_SSC_CKS (3 << 0) /* Clock Selection */ | ||
30 | #define AT91_SSC_CKS_DIV (0 << 0) | ||
31 | #define AT91_SSC_CKS_CLOCK (1 << 0) | ||
32 | #define AT91_SSC_CKS_PIN (2 << 0) | ||
33 | #define AT91_SSC_CKO (7 << 2) /* Clock Output Mode Selection */ | ||
34 | #define AT91_SSC_CKO_NONE (0 << 2) | ||
35 | #define AT91_SSC_CKO_CONTINUOUS (1 << 2) | ||
36 | #define AT91_SSC_CKI (1 << 5) /* Clock Inversion */ | ||
37 | #define AT91_SSC_CKI_FALLING (0 << 5) | ||
38 | #define AT91_SSC_CK_RISING (1 << 5) | ||
39 | #define AT91_SSC_CKG (1 << 6) /* Receive Clock Gating Selection [AT91SAM9261 only] */ | ||
40 | #define AT91_SSC_CKG_NONE (0 << 6) | ||
41 | #define AT91_SSC_CKG_RFLOW (1 << 6) | ||
42 | #define AT91_SSC_CKG_RFHIGH (2 << 6) | ||
43 | #define AT91_SSC_START (0xf << 8) /* Start Selection */ | ||
44 | #define AT91_SSC_START_CONTINUOUS (0 << 8) | ||
45 | #define AT91_SSC_START_TX_RX (1 << 8) | ||
46 | #define AT91_SSC_START_LOW_RF (2 << 8) | ||
47 | #define AT91_SSC_START_HIGH_RF (3 << 8) | ||
48 | #define AT91_SSC_START_FALLING_RF (4 << 8) | ||
49 | #define AT91_SSC_START_RISING_RF (5 << 8) | ||
50 | #define AT91_SSC_START_LEVEL_RF (6 << 8) | ||
51 | #define AT91_SSC_START_EDGE_RF (7 << 8) | ||
52 | #define AT91_SSC_STOP (1 << 12) /* Receive Stop Selection [AT91SAM9261 only] */ | ||
53 | #define AT91_SSC_STTDLY (0xff << 16) /* Start Delay */ | ||
54 | #define AT91_SSC_PERIOD (0xff << 24) /* Period Divider Selection */ | ||
55 | |||
56 | #define AT91_SSC_RFMR 0x14 /* Receive Frame Mode Register */ | ||
57 | #define AT91_SSC_DATALEN (0x1f << 0) /* Data Length */ | ||
58 | #define AT91_SSC_LOOP (1 << 5) /* Loop Mode */ | ||
59 | #define AT91_SSC_MSBF (1 << 7) /* Most Significant Bit First */ | ||
60 | #define AT91_SSC_DATNB (0xf << 8) /* Data Number per Frame */ | ||
61 | #define AT91_SSC_FSLEN (0xf << 16) /* Frame Sync Length */ | ||
62 | #define AT91_SSC_FSOS (7 << 20) /* Frame Sync Output Selection */ | ||
63 | #define AT91_SSC_FSOS_NONE (0 << 20) | ||
64 | #define AT91_SSC_FSOS_NEGATIVE (1 << 20) | ||
65 | #define AT91_SSC_FSOS_POSITIVE (2 << 20) | ||
66 | #define AT91_SSC_FSOS_LOW (3 << 20) | ||
67 | #define AT91_SSC_FSOS_HIGH (4 << 20) | ||
68 | #define AT91_SSC_FSOS_TOGGLE (5 << 20) | ||
69 | #define AT91_SSC_FSEDGE (1 << 24) /* Frame Sync Edge Detection */ | ||
70 | #define AT91_SSC_FSEDGE_POSITIVE (0 << 24) | ||
71 | #define AT91_SSC_FSEDGE_NEGATIVE (1 << 24) | ||
72 | |||
73 | #define AT91_SSC_TCMR 0x18 /* Transmit Clock Mode Register */ | ||
74 | #define AT91_SSC_TFMR 0x1c /* Transmit Fram Mode Register */ | ||
75 | #define AT91_SSC_DATDEF (1 << 5) /* Data Default Value */ | ||
76 | #define AT91_SSC_FSDEN (1 << 23) /* Frame Sync Data Enable */ | ||
77 | |||
78 | #define AT91_SSC_RHR 0x20 /* Receive Holding Register */ | ||
79 | #define AT91_SSC_THR 0x24 /* Transmit Holding Register */ | ||
80 | #define AT91_SSC_RSHR 0x30 /* Receive Sync Holding Register */ | ||
81 | #define AT91_SSC_TSHR 0x34 /* Transmit Sync Holding Register */ | ||
82 | |||
83 | #define AT91_SSC_RC0R 0x38 /* Receive Compare 0 Register [AT91SAM9261 only] */ | ||
84 | #define AT91_SSC_RC1R 0x3c /* Receive Compare 1 Register [AT91SAM9261 only] */ | ||
85 | |||
86 | #define AT91_SSC_SR 0x40 /* Status Register */ | ||
87 | #define AT91_SSC_TXRDY (1 << 0) /* Transmit Ready */ | ||
88 | #define AT91_SSC_TXEMPTY (1 << 1) /* Transmit Empty */ | ||
89 | #define AT91_SSC_ENDTX (1 << 2) /* End of Transmission */ | ||
90 | #define AT91_SSC_TXBUFE (1 << 3) /* Transmit Buffer Empty */ | ||
91 | #define AT91_SSC_RXRDY (1 << 4) /* Receive Ready */ | ||
92 | #define AT91_SSC_OVRUN (1 << 5) /* Receive Overrun */ | ||
93 | #define AT91_SSC_ENDRX (1 << 6) /* End of Reception */ | ||
94 | #define AT91_SSC_RXBUFF (1 << 7) /* Receive Buffer Full */ | ||
95 | #define AT91_SSC_CP0 (1 << 8) /* Compare 0 [AT91SAM9261 only] */ | ||
96 | #define AT91_SSC_CP1 (1 << 9) /* Compare 1 [AT91SAM9261 only] */ | ||
97 | #define AT91_SSC_TXSYN (1 << 10) /* Transmit Sync */ | ||
98 | #define AT91_SSC_RXSYN (1 << 11) /* Receive Sync */ | ||
99 | #define AT91_SSC_TXENA (1 << 16) /* Transmit Enable */ | ||
100 | #define AT91_SSC_RXENA (1 << 17) /* Receive Enable */ | ||
101 | |||
102 | #define AT91_SSC_IER 0x44 /* Interrupt Enable Register */ | ||
103 | #define AT91_SSC_IDR 0x48 /* Interrupt Disable Register */ | ||
104 | #define AT91_SSC_IMR 0x4c /* Interrupt Mask Register */ | ||
105 | |||
106 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_tc.h b/arch/arm/mach-at91/include/mach/at91_tc.h new file mode 100644 index 00000000000..46a317fd716 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_tc.h | |||
@@ -0,0 +1,146 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_tc.h | ||
3 | * | ||
4 | * Copyright (C) SAN People | ||
5 | * | ||
6 | * Timer/Counter Unit (TC) registers. | ||
7 | * Based on AT91RM9200 datasheet revision E. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef AT91_TC_H | ||
16 | #define AT91_TC_H | ||
17 | |||
18 | #define AT91_TC_BCR 0xc0 /* TC Block Control Register */ | ||
19 | #define AT91_TC_SYNC (1 << 0) /* Synchro Command */ | ||
20 | |||
21 | #define AT91_TC_BMR 0xc4 /* TC Block Mode Register */ | ||
22 | #define AT91_TC_TC0XC0S (3 << 0) /* External Clock Signal 0 Selection */ | ||
23 | #define AT91_TC_TC0XC0S_TCLK0 (0 << 0) | ||
24 | #define AT91_TC_TC0XC0S_NONE (1 << 0) | ||
25 | #define AT91_TC_TC0XC0S_TIOA1 (2 << 0) | ||
26 | #define AT91_TC_TC0XC0S_TIOA2 (3 << 0) | ||
27 | #define AT91_TC_TC1XC1S (3 << 2) /* External Clock Signal 1 Selection */ | ||
28 | #define AT91_TC_TC1XC1S_TCLK1 (0 << 2) | ||
29 | #define AT91_TC_TC1XC1S_NONE (1 << 2) | ||
30 | #define AT91_TC_TC1XC1S_TIOA0 (2 << 2) | ||
31 | #define AT91_TC_TC1XC1S_TIOA2 (3 << 2) | ||
32 | #define AT91_TC_TC2XC2S (3 << 4) /* External Clock Signal 2 Selection */ | ||
33 | #define AT91_TC_TC2XC2S_TCLK2 (0 << 4) | ||
34 | #define AT91_TC_TC2XC2S_NONE (1 << 4) | ||
35 | #define AT91_TC_TC2XC2S_TIOA0 (2 << 4) | ||
36 | #define AT91_TC_TC2XC2S_TIOA1 (3 << 4) | ||
37 | |||
38 | |||
39 | #define AT91_TC_CCR 0x00 /* Channel Control Register */ | ||
40 | #define AT91_TC_CLKEN (1 << 0) /* Counter Clock Enable Command */ | ||
41 | #define AT91_TC_CLKDIS (1 << 1) /* Counter CLock Disable Command */ | ||
42 | #define AT91_TC_SWTRG (1 << 2) /* Software Trigger Command */ | ||
43 | |||
44 | #define AT91_TC_CMR 0x04 /* Channel Mode Register */ | ||
45 | #define AT91_TC_TCCLKS (7 << 0) /* Capture/Waveform Mode: Clock Selection */ | ||
46 | #define AT91_TC_TIMER_CLOCK1 (0 << 0) | ||
47 | #define AT91_TC_TIMER_CLOCK2 (1 << 0) | ||
48 | #define AT91_TC_TIMER_CLOCK3 (2 << 0) | ||
49 | #define AT91_TC_TIMER_CLOCK4 (3 << 0) | ||
50 | #define AT91_TC_TIMER_CLOCK5 (4 << 0) | ||
51 | #define AT91_TC_XC0 (5 << 0) | ||
52 | #define AT91_TC_XC1 (6 << 0) | ||
53 | #define AT91_TC_XC2 (7 << 0) | ||
54 | #define AT91_TC_CLKI (1 << 3) /* Capture/Waveform Mode: Clock Invert */ | ||
55 | #define AT91_TC_BURST (3 << 4) /* Capture/Waveform Mode: Burst Signal Selection */ | ||
56 | #define AT91_TC_LDBSTOP (1 << 6) /* Capture Mode: Counter Clock Stopped with TB Loading */ | ||
57 | #define AT91_TC_LDBDIS (1 << 7) /* Capture Mode: Counter Clock Disable with RB Loading */ | ||
58 | #define AT91_TC_ETRGEDG (3 << 8) /* Capture Mode: External Trigger Edge Selection */ | ||
59 | #define AT91_TC_ABETRG (1 << 10) /* Capture Mode: TIOA or TIOB External Trigger Selection */ | ||
60 | #define AT91_TC_CPCTRG (1 << 14) /* Capture Mode: RC Compare Trigger Enable */ | ||
61 | #define AT91_TC_WAVE (1 << 15) /* Capture/Waveform mode */ | ||
62 | #define AT91_TC_LDRA (3 << 16) /* Capture Mode: RA Loading Selection */ | ||
63 | #define AT91_TC_LDRB (3 << 18) /* Capture Mode: RB Loading Selection */ | ||
64 | |||
65 | #define AT91_TC_CPCSTOP (1 << 6) /* Waveform Mode: Counter Clock Stopped with RC Compare */ | ||
66 | #define AT91_TC_CPCDIS (1 << 7) /* Waveform Mode: Counter Clock Disable with RC Compare */ | ||
67 | #define AT91_TC_EEVTEDG (3 << 8) /* Waveform Mode: External Event Edge Selection */ | ||
68 | #define AT91_TC_EEVTEDG_NONE (0 << 8) | ||
69 | #define AT91_TC_EEVTEDG_RISING (1 << 8) | ||
70 | #define AT91_TC_EEVTEDG_FALLING (2 << 8) | ||
71 | #define AT91_TC_EEVTEDG_BOTH (3 << 8) | ||
72 | #define AT91_TC_EEVT (3 << 10) /* Waveform Mode: External Event Selection */ | ||
73 | #define AT91_TC_EEVT_TIOB (0 << 10) | ||
74 | #define AT91_TC_EEVT_XC0 (1 << 10) | ||
75 | #define AT91_TC_EEVT_XC1 (2 << 10) | ||
76 | #define AT91_TC_EEVT_XC2 (3 << 10) | ||
77 | #define AT91_TC_ENETRG (1 << 12) /* Waveform Mode: External Event Trigger Enable */ | ||
78 | #define AT91_TC_WAVESEL (3 << 13) /* Waveform Mode: Waveform Selection */ | ||
79 | #define AT91_TC_WAVESEL_UP (0 << 13) | ||
80 | #define AT91_TC_WAVESEL_UP_AUTO (2 << 13) | ||
81 | #define AT91_TC_WAVESEL_UPDOWN (1 << 13) | ||
82 | #define AT91_TC_WAVESEL_UPDOWN_AUTO (3 << 13) | ||
83 | #define AT91_TC_ACPA (3 << 16) /* Waveform Mode: RA Compare Effect on TIOA */ | ||
84 | #define AT91_TC_ACPA_NONE (0 << 16) | ||
85 | #define AT91_TC_ACPA_SET (1 << 16) | ||
86 | #define AT91_TC_ACPA_CLEAR (2 << 16) | ||
87 | #define AT91_TC_ACPA_TOGGLE (3 << 16) | ||
88 | #define AT91_TC_ACPC (3 << 18) /* Waveform Mode: RC Compre Effect on TIOA */ | ||
89 | #define AT91_TC_ACPC_NONE (0 << 18) | ||
90 | #define AT91_TC_ACPC_SET (1 << 18) | ||
91 | #define AT91_TC_ACPC_CLEAR (2 << 18) | ||
92 | #define AT91_TC_ACPC_TOGGLE (3 << 18) | ||
93 | #define AT91_TC_AEEVT (3 << 20) /* Waveform Mode: External Event Effect on TIOA */ | ||
94 | #define AT91_TC_AEEVT_NONE (0 << 20) | ||
95 | #define AT91_TC_AEEVT_SET (1 << 20) | ||
96 | #define AT91_TC_AEEVT_CLEAR (2 << 20) | ||
97 | #define AT91_TC_AEEVT_TOGGLE (3 << 20) | ||
98 | #define AT91_TC_ASWTRG (3 << 22) /* Waveform Mode: Software Trigger Effect on TIOA */ | ||
99 | #define AT91_TC_ASWTRG_NONE (0 << 22) | ||
100 | #define AT91_TC_ASWTRG_SET (1 << 22) | ||
101 | #define AT91_TC_ASWTRG_CLEAR (2 << 22) | ||
102 | #define AT91_TC_ASWTRG_TOGGLE (3 << 22) | ||
103 | #define AT91_TC_BCPB (3 << 24) /* Waveform Mode: RB Compare Effect on TIOB */ | ||
104 | #define AT91_TC_BCPB_NONE (0 << 24) | ||
105 | #define AT91_TC_BCPB_SET (1 << 24) | ||
106 | #define AT91_TC_BCPB_CLEAR (2 << 24) | ||
107 | #define AT91_TC_BCPB_TOGGLE (3 << 24) | ||
108 | #define AT91_TC_BCPC (3 << 26) /* Waveform Mode: RC Compare Effect on TIOB */ | ||
109 | #define AT91_TC_BCPC_NONE (0 << 26) | ||
110 | #define AT91_TC_BCPC_SET (1 << 26) | ||
111 | #define AT91_TC_BCPC_CLEAR (2 << 26) | ||
112 | #define AT91_TC_BCPC_TOGGLE (3 << 26) | ||
113 | #define AT91_TC_BEEVT (3 << 28) /* Waveform Mode: External Event Effect on TIOB */ | ||
114 | #define AT91_TC_BEEVT_NONE (0 << 28) | ||
115 | #define AT91_TC_BEEVT_SET (1 << 28) | ||
116 | #define AT91_TC_BEEVT_CLEAR (2 << 28) | ||
117 | #define AT91_TC_BEEVT_TOGGLE (3 << 28) | ||
118 | #define AT91_TC_BSWTRG (3 << 30) /* Waveform Mode: Software Trigger Effect on TIOB */ | ||
119 | #define AT91_TC_BSWTRG_NONE (0 << 30) | ||
120 | #define AT91_TC_BSWTRG_SET (1 << 30) | ||
121 | #define AT91_TC_BSWTRG_CLEAR (2 << 30) | ||
122 | #define AT91_TC_BSWTRG_TOGGLE (3 << 30) | ||
123 | |||
124 | #define AT91_TC_CV 0x10 /* Counter Value */ | ||
125 | #define AT91_TC_RA 0x14 /* Register A */ | ||
126 | #define AT91_TC_RB 0x18 /* Register B */ | ||
127 | #define AT91_TC_RC 0x1c /* Register C */ | ||
128 | |||
129 | #define AT91_TC_SR 0x20 /* Status Register */ | ||
130 | #define AT91_TC_COVFS (1 << 0) /* Counter Overflow Status */ | ||
131 | #define AT91_TC_LOVRS (1 << 1) /* Load Overrun Status */ | ||
132 | #define AT91_TC_CPAS (1 << 2) /* RA Compare Status */ | ||
133 | #define AT91_TC_CPBS (1 << 3) /* RB Compare Status */ | ||
134 | #define AT91_TC_CPCS (1 << 4) /* RC Compare Status */ | ||
135 | #define AT91_TC_LDRAS (1 << 5) /* RA Loading Status */ | ||
136 | #define AT91_TC_LDRBS (1 << 6) /* RB Loading Status */ | ||
137 | #define AT91_TC_ETRGS (1 << 7) /* External Trigger Status */ | ||
138 | #define AT91_TC_CLKSTA (1 << 16) /* Clock Enabling Status */ | ||
139 | #define AT91_TC_MTIOA (1 << 17) /* TIOA Mirror */ | ||
140 | #define AT91_TC_MTIOB (1 << 18) /* TIOB Mirror */ | ||
141 | |||
142 | #define AT91_TC_IER 0x24 /* Interrupt Enable Register */ | ||
143 | #define AT91_TC_IDR 0x28 /* Interrupt Disable Register */ | ||
144 | #define AT91_TC_IMR 0x2c /* Interrupt Mask Register */ | ||
145 | |||
146 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_twi.h b/arch/arm/mach-at91/include/mach/at91_twi.h new file mode 100644 index 00000000000..bb2880f6ba3 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_twi.h | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91_twi.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Two-wire Interface (TWI) registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91_TWI_H | ||
17 | #define AT91_TWI_H | ||
18 | |||
19 | #define AT91_TWI_CR 0x00 /* Control Register */ | ||
20 | #define AT91_TWI_START (1 << 0) /* Send a Start Condition */ | ||
21 | #define AT91_TWI_STOP (1 << 1) /* Send a Stop Condition */ | ||
22 | #define AT91_TWI_MSEN (1 << 2) /* Master Transfer Enable */ | ||
23 | #define AT91_TWI_MSDIS (1 << 3) /* Master Transfer Disable */ | ||
24 | #define AT91_TWI_SVEN (1 << 4) /* Slave Transfer Enable [SAM9260 only] */ | ||
25 | #define AT91_TWI_SVDIS (1 << 5) /* Slave Transfer Disable [SAM9260 only] */ | ||
26 | #define AT91_TWI_SWRST (1 << 7) /* Software Reset */ | ||
27 | |||
28 | #define AT91_TWI_MMR 0x04 /* Master Mode Register */ | ||
29 | #define AT91_TWI_IADRSZ (3 << 8) /* Internal Device Address Size */ | ||
30 | #define AT91_TWI_IADRSZ_NO (0 << 8) | ||
31 | #define AT91_TWI_IADRSZ_1 (1 << 8) | ||
32 | #define AT91_TWI_IADRSZ_2 (2 << 8) | ||
33 | #define AT91_TWI_IADRSZ_3 (3 << 8) | ||
34 | #define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */ | ||
35 | #define AT91_TWI_DADR (0x7f << 16) /* Device Address */ | ||
36 | |||
37 | #define AT91_TWI_SMR 0x08 /* Slave Mode Register [SAM9260 only] */ | ||
38 | #define AT91_TWI_SADR (0x7f << 16) /* Slave Address */ | ||
39 | |||
40 | #define AT91_TWI_IADR 0x0c /* Internal Address Register */ | ||
41 | |||
42 | #define AT91_TWI_CWGR 0x10 /* Clock Waveform Generator Register */ | ||
43 | #define AT91_TWI_CLDIV (0xff << 0) /* Clock Low Divisor */ | ||
44 | #define AT91_TWI_CHDIV (0xff << 8) /* Clock High Divisor */ | ||
45 | #define AT91_TWI_CKDIV (7 << 16) /* Clock Divider */ | ||
46 | |||
47 | #define AT91_TWI_SR 0x20 /* Status Register */ | ||
48 | #define AT91_TWI_TXCOMP (1 << 0) /* Transmission Complete */ | ||
49 | #define AT91_TWI_RXRDY (1 << 1) /* Receive Holding Register Ready */ | ||
50 | #define AT91_TWI_TXRDY (1 << 2) /* Transmit Holding Register Ready */ | ||
51 | #define AT91_TWI_SVREAD (1 << 3) /* Slave Read [SAM9260 only] */ | ||
52 | #define AT91_TWI_SVACC (1 << 4) /* Slave Access [SAM9260 only] */ | ||
53 | #define AT91_TWI_GACC (1 << 5) /* General Call Access [SAM9260 only] */ | ||
54 | #define AT91_TWI_OVRE (1 << 6) /* Overrun Error [AT91RM9200 only] */ | ||
55 | #define AT91_TWI_UNRE (1 << 7) /* Underrun Error [AT91RM9200 only] */ | ||
56 | #define AT91_TWI_NACK (1 << 8) /* Not Acknowledged */ | ||
57 | #define AT91_TWI_ARBLST (1 << 9) /* Arbitration Lost [SAM9260 only] */ | ||
58 | #define AT91_TWI_SCLWS (1 << 10) /* Clock Wait State [SAM9260 only] */ | ||
59 | #define AT91_TWI_EOSACC (1 << 11) /* End of Slave Address [SAM9260 only] */ | ||
60 | |||
61 | #define AT91_TWI_IER 0x24 /* Interrupt Enable Register */ | ||
62 | #define AT91_TWI_IDR 0x28 /* Interrupt Disable Register */ | ||
63 | #define AT91_TWI_IMR 0x2c /* Interrupt Mask Register */ | ||
64 | #define AT91_TWI_RHR 0x30 /* Receive Holding Register */ | ||
65 | #define AT91_TWI_THR 0x34 /* Transmit Holding Register */ | ||
66 | |||
67 | #endif | ||
68 | |||
diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h new file mode 100644 index 00000000000..c5df1e8f195 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91cap9.h | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91cap9.h | ||
3 | * | ||
4 | * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> | ||
5 | * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> | ||
6 | * Copyright (C) 2007 Atmel Corporation. | ||
7 | * | ||
8 | * Common definitions. | ||
9 | * Based on AT91CAP9 datasheet revision B (Preliminary). | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | */ | ||
16 | |||
17 | #ifndef AT91CAP9_H | ||
18 | #define AT91CAP9_H | ||
19 | |||
20 | /* | ||
21 | * Peripheral identifiers/interrupts. | ||
22 | */ | ||
23 | #define AT91CAP9_ID_PIOABCD 2 /* Parallel IO Controller A, B, C and D */ | ||
24 | #define AT91CAP9_ID_MPB0 3 /* MP Block Peripheral 0 */ | ||
25 | #define AT91CAP9_ID_MPB1 4 /* MP Block Peripheral 1 */ | ||
26 | #define AT91CAP9_ID_MPB2 5 /* MP Block Peripheral 2 */ | ||
27 | #define AT91CAP9_ID_MPB3 6 /* MP Block Peripheral 3 */ | ||
28 | #define AT91CAP9_ID_MPB4 7 /* MP Block Peripheral 4 */ | ||
29 | #define AT91CAP9_ID_US0 8 /* USART 0 */ | ||
30 | #define AT91CAP9_ID_US1 9 /* USART 1 */ | ||
31 | #define AT91CAP9_ID_US2 10 /* USART 2 */ | ||
32 | #define AT91CAP9_ID_MCI0 11 /* Multimedia Card Interface 0 */ | ||
33 | #define AT91CAP9_ID_MCI1 12 /* Multimedia Card Interface 1 */ | ||
34 | #define AT91CAP9_ID_CAN 13 /* CAN */ | ||
35 | #define AT91CAP9_ID_TWI 14 /* Two-Wire Interface */ | ||
36 | #define AT91CAP9_ID_SPI0 15 /* Serial Peripheral Interface 0 */ | ||
37 | #define AT91CAP9_ID_SPI1 16 /* Serial Peripheral Interface 0 */ | ||
38 | #define AT91CAP9_ID_SSC0 17 /* Serial Synchronous Controller 0 */ | ||
39 | #define AT91CAP9_ID_SSC1 18 /* Serial Synchronous Controller 1 */ | ||
40 | #define AT91CAP9_ID_AC97C 19 /* AC97 Controller */ | ||
41 | #define AT91CAP9_ID_TCB 20 /* Timer Counter 0, 1 and 2 */ | ||
42 | #define AT91CAP9_ID_PWMC 21 /* Pulse Width Modulation Controller */ | ||
43 | #define AT91CAP9_ID_EMAC 22 /* Ethernet */ | ||
44 | #define AT91CAP9_ID_AESTDES 23 /* Advanced Encryption Standard, Triple DES */ | ||
45 | #define AT91CAP9_ID_ADC 24 /* Analog-to-Digital Converter */ | ||
46 | #define AT91CAP9_ID_ISI 25 /* Image Sensor Interface */ | ||
47 | #define AT91CAP9_ID_LCDC 26 /* LCD Controller */ | ||
48 | #define AT91CAP9_ID_DMA 27 /* DMA Controller */ | ||
49 | #define AT91CAP9_ID_UDPHS 28 /* USB High Speed Device Port */ | ||
50 | #define AT91CAP9_ID_UHP 29 /* USB Host Port */ | ||
51 | #define AT91CAP9_ID_IRQ0 30 /* Advanced Interrupt Controller (IRQ0) */ | ||
52 | #define AT91CAP9_ID_IRQ1 31 /* Advanced Interrupt Controller (IRQ1) */ | ||
53 | |||
54 | /* | ||
55 | * User Peripheral physical base addresses. | ||
56 | */ | ||
57 | #define AT91CAP9_BASE_UDPHS 0xfff78000 | ||
58 | #define AT91CAP9_BASE_TCB0 0xfff7c000 | ||
59 | #define AT91CAP9_BASE_TC0 0xfff7c000 | ||
60 | #define AT91CAP9_BASE_TC1 0xfff7c040 | ||
61 | #define AT91CAP9_BASE_TC2 0xfff7c080 | ||
62 | #define AT91CAP9_BASE_MCI0 0xfff80000 | ||
63 | #define AT91CAP9_BASE_MCI1 0xfff84000 | ||
64 | #define AT91CAP9_BASE_TWI 0xfff88000 | ||
65 | #define AT91CAP9_BASE_US0 0xfff8c000 | ||
66 | #define AT91CAP9_BASE_US1 0xfff90000 | ||
67 | #define AT91CAP9_BASE_US2 0xfff94000 | ||
68 | #define AT91CAP9_BASE_SSC0 0xfff98000 | ||
69 | #define AT91CAP9_BASE_SSC1 0xfff9c000 | ||
70 | #define AT91CAP9_BASE_AC97C 0xfffa0000 | ||
71 | #define AT91CAP9_BASE_SPI0 0xfffa4000 | ||
72 | #define AT91CAP9_BASE_SPI1 0xfffa8000 | ||
73 | #define AT91CAP9_BASE_CAN 0xfffac000 | ||
74 | #define AT91CAP9_BASE_PWMC 0xfffb8000 | ||
75 | #define AT91CAP9_BASE_EMAC 0xfffbc000 | ||
76 | #define AT91CAP9_BASE_ADC 0xfffc0000 | ||
77 | #define AT91CAP9_BASE_ISI 0xfffc4000 | ||
78 | |||
79 | /* | ||
80 | * System Peripherals (offset from AT91_BASE_SYS) | ||
81 | */ | ||
82 | #define AT91_ECC (0xffffe200 - AT91_BASE_SYS) | ||
83 | #define AT91_BCRAMC (0xffffe400 - AT91_BASE_SYS) | ||
84 | #define AT91_DDRSDRC0 (0xffffe600 - AT91_BASE_SYS) | ||
85 | #define AT91_SMC (0xffffe800 - AT91_BASE_SYS) | ||
86 | #define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) | ||
87 | #define AT91_CCFG (0xffffeb10 - AT91_BASE_SYS) | ||
88 | #define AT91_DMA (0xffffec00 - AT91_BASE_SYS) | ||
89 | #define AT91_DBGU (0xffffee00 - AT91_BASE_SYS) | ||
90 | #define AT91_AIC (0xfffff000 - AT91_BASE_SYS) | ||
91 | #define AT91_PIOA (0xfffff200 - AT91_BASE_SYS) | ||
92 | #define AT91_PIOB (0xfffff400 - AT91_BASE_SYS) | ||
93 | #define AT91_PIOC (0xfffff600 - AT91_BASE_SYS) | ||
94 | #define AT91_PIOD (0xfffff800 - AT91_BASE_SYS) | ||
95 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | ||
96 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
97 | #define AT91_SHDWC (0xfffffd10 - AT91_BASE_SYS) | ||
98 | #define AT91_RTT (0xfffffd20 - AT91_BASE_SYS) | ||
99 | #define AT91_PIT (0xfffffd30 - AT91_BASE_SYS) | ||
100 | #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) | ||
101 | #define AT91_GPBR (cpu_is_at91cap9_revB() ? \ | ||
102 | (0xfffffd50 - AT91_BASE_SYS) : \ | ||
103 | (0xfffffd60 - AT91_BASE_SYS)) | ||
104 | |||
105 | #define AT91_USART0 AT91CAP9_BASE_US0 | ||
106 | #define AT91_USART1 AT91CAP9_BASE_US1 | ||
107 | #define AT91_USART2 AT91CAP9_BASE_US2 | ||
108 | |||
109 | |||
110 | /* | ||
111 | * Internal Memory. | ||
112 | */ | ||
113 | #define AT91CAP9_SRAM_BASE 0x00100000 /* Internal SRAM base address */ | ||
114 | #define AT91CAP9_SRAM_SIZE (32 * SZ_1K) /* Internal SRAM size (32Kb) */ | ||
115 | |||
116 | #define AT91CAP9_ROM_BASE 0x00400000 /* Internal ROM base address */ | ||
117 | #define AT91CAP9_ROM_SIZE (32 * SZ_1K) /* Internal ROM size (32Kb) */ | ||
118 | |||
119 | #define AT91CAP9_LCDC_BASE 0x00500000 /* LCD Controller */ | ||
120 | #define AT91CAP9_UDPHS_FIFO 0x00600000 /* USB High Speed Device Port */ | ||
121 | #define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ | ||
122 | |||
123 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h new file mode 100644 index 00000000000..976f4a6c335 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h | ||
3 | * | ||
4 | * (C) 2008 Andrew Victor | ||
5 | * | ||
6 | * DDR/SDR Controller (DDRSDRC) - System peripherals registers. | ||
7 | * Based on AT91CAP9 datasheet revision B. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef AT91CAP9_DDRSDR_H | ||
16 | #define AT91CAP9_DDRSDR_H | ||
17 | |||
18 | #define AT91_DDRSDRC_MR 0x00 /* Mode Register */ | ||
19 | #define AT91_DDRSDRC_MODE (0xf << 0) /* Command Mode */ | ||
20 | #define AT91_DDRSDRC_MODE_NORMAL 0 | ||
21 | #define AT91_DDRSDRC_MODE_NOP 1 | ||
22 | #define AT91_DDRSDRC_MODE_PRECHARGE 2 | ||
23 | #define AT91_DDRSDRC_MODE_LMR 3 | ||
24 | #define AT91_DDRSDRC_MODE_REFRESH 4 | ||
25 | #define AT91_DDRSDRC_MODE_EXT_LMR 5 | ||
26 | #define AT91_DDRSDRC_MODE_DEEP 6 | ||
27 | |||
28 | #define AT91_DDRSDRC_RTR 0x04 /* Refresh Timer Register */ | ||
29 | #define AT91_DDRSDRC_COUNT (0xfff << 0) /* Refresh Timer Counter */ | ||
30 | |||
31 | #define AT91_DDRSDRC_CR 0x08 /* Configuration Register */ | ||
32 | #define AT91_DDRSDRC_NC (3 << 0) /* Number of Column Bits */ | ||
33 | #define AT91_DDRSDRC_NC_SDR8 (0 << 0) | ||
34 | #define AT91_DDRSDRC_NC_SDR9 (1 << 0) | ||
35 | #define AT91_DDRSDRC_NC_SDR10 (2 << 0) | ||
36 | #define AT91_DDRSDRC_NC_SDR11 (3 << 0) | ||
37 | #define AT91_DDRSDRC_NC_DDR9 (0 << 0) | ||
38 | #define AT91_DDRSDRC_NC_DDR10 (1 << 0) | ||
39 | #define AT91_DDRSDRC_NC_DDR11 (2 << 0) | ||
40 | #define AT91_DDRSDRC_NC_DDR12 (3 << 0) | ||
41 | #define AT91_DDRSDRC_NR (3 << 2) /* Number of Row Bits */ | ||
42 | #define AT91_DDRSDRC_NR_11 (0 << 2) | ||
43 | #define AT91_DDRSDRC_NR_12 (1 << 2) | ||
44 | #define AT91_DDRSDRC_NR_13 (2 << 2) | ||
45 | #define AT91_DDRSDRC_CAS (7 << 4) /* CAS Latency */ | ||
46 | #define AT91_DDRSDRC_CAS_2 (2 << 4) | ||
47 | #define AT91_DDRSDRC_CAS_3 (3 << 4) | ||
48 | #define AT91_DDRSDRC_CAS_25 (6 << 4) | ||
49 | #define AT91_DDRSDRC_DLL (1 << 7) /* Reset DLL */ | ||
50 | #define AT91_DDRSDRC_DICDS (1 << 8) /* Output impedance control */ | ||
51 | |||
52 | #define AT91_DDRSDRC_T0PR 0x0C /* Timing 0 Register */ | ||
53 | #define AT91_DDRSDRC_TRAS (0xf << 0) /* Active to Precharge delay */ | ||
54 | #define AT91_DDRSDRC_TRCD (0xf << 4) /* Row to Column delay */ | ||
55 | #define AT91_DDRSDRC_TWR (0xf << 8) /* Write recovery delay */ | ||
56 | #define AT91_DDRSDRC_TRC (0xf << 12) /* Row cycle delay */ | ||
57 | #define AT91_DDRSDRC_TRP (0xf << 16) /* Row precharge delay */ | ||
58 | #define AT91_DDRSDRC_TRRD (0xf << 20) /* Active BankA to BankB */ | ||
59 | #define AT91_DDRSDRC_TWTR (1 << 24) /* Internal Write to Read delay */ | ||
60 | #define AT91_DDRSDRC_TMRD (0xf << 28) /* Load mode to active/refresh delay */ | ||
61 | |||
62 | #define AT91_DDRSDRC_T1PR 0x10 /* Timing 1 Register */ | ||
63 | #define AT91_DDRSDRC_TRFC (0x1f << 0) /* Row Cycle Delay */ | ||
64 | #define AT91_DDRSDRC_TXSNR (0xff << 8) /* Exit self-refresh to non-read */ | ||
65 | #define AT91_DDRSDRC_TXSRD (0xff << 16) /* Exit self-refresh to read */ | ||
66 | #define AT91_DDRSDRC_TXP (0xf << 24) /* Exit power-down delay */ | ||
67 | |||
68 | #define AT91_DDRSDRC_LPR 0x18 /* Low Power Register */ | ||
69 | #define AT91_DDRSDRC_LPCB (3 << 0) /* Low-power Configurations */ | ||
70 | #define AT91_DDRSDRC_LPCB_DISABLE 0 | ||
71 | #define AT91_DDRSDRC_LPCB_SELF_REFRESH 1 | ||
72 | #define AT91_DDRSDRC_LPCB_POWER_DOWN 2 | ||
73 | #define AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN 3 | ||
74 | #define AT91_DDRSDRC_CLKFR (1 << 2) /* Clock Frozen */ | ||
75 | #define AT91_DDRSDRC_PASR (7 << 4) /* Partial Array Self Refresh */ | ||
76 | #define AT91_DDRSDRC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */ | ||
77 | #define AT91_DDRSDRC_DS (3 << 10) /* Drive Strength */ | ||
78 | #define AT91_DDRSDRC_TIMEOUT (3 << 12) /* Time to define when Low Power Mode is enabled */ | ||
79 | #define AT91_DDRSDRC_TIMEOUT_0_CLK_CYCLES (0 << 12) | ||
80 | #define AT91_DDRSDRC_TIMEOUT_64_CLK_CYCLES (1 << 12) | ||
81 | #define AT91_DDRSDRC_TIMEOUT_128_CLK_CYCLES (2 << 12) | ||
82 | |||
83 | #define AT91_DDRSDRC_MDR 0x1C /* Memory Device Register */ | ||
84 | #define AT91_DDRSDRC_MD (3 << 0) /* Memory Device Type */ | ||
85 | #define AT91_DDRSDRC_MD_SDR 0 | ||
86 | #define AT91_DDRSDRC_MD_LOW_POWER_SDR 1 | ||
87 | #define AT91_DDRSDRC_MD_DDR 2 | ||
88 | #define AT91_DDRSDRC_MD_LOW_POWER_DDR 3 | ||
89 | |||
90 | #define AT91_DDRSDRC_DLLR 0x20 /* DLL Information Register */ | ||
91 | #define AT91_DDRSDRC_MDINC (1 << 0) /* Master Delay increment */ | ||
92 | #define AT91_DDRSDRC_MDDEC (1 << 1) /* Master Delay decrement */ | ||
93 | #define AT91_DDRSDRC_MDOVF (1 << 2) /* Master Delay Overflow */ | ||
94 | #define AT91_DDRSDRC_SDCOVF (1 << 3) /* Slave Delay Correction Overflow */ | ||
95 | #define AT91_DDRSDRC_SDCUDF (1 << 4) /* Slave Delay Correction Underflow */ | ||
96 | #define AT91_DDRSDRC_SDERF (1 << 5) /* Slave Delay Correction error */ | ||
97 | #define AT91_DDRSDRC_MDVAL (0xff << 8) /* Master Delay value */ | ||
98 | #define AT91_DDRSDRC_SDVAL (0xff << 16) /* Slave Delay value */ | ||
99 | #define AT91_DDRSDRC_SDCVAL (0xff << 24) /* Slave Delay Correction value */ | ||
100 | |||
101 | /* Register access macros */ | ||
102 | #define at91_ramc_read(num, reg) \ | ||
103 | at91_sys_read(AT91_DDRSDRC##num + reg) | ||
104 | #define at91_ramc_write(num, reg, value) \ | ||
105 | at91_sys_write(AT91_DDRSDRC##num + reg, value) | ||
106 | |||
107 | |||
108 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91cap9_matrix.h b/arch/arm/mach-at91/include/mach/at91cap9_matrix.h new file mode 100644 index 00000000000..4b9d4aff4b4 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91cap9_matrix.h | |||
@@ -0,0 +1,137 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91cap9_matrix.h | ||
3 | * | ||
4 | * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> | ||
5 | * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> | ||
6 | * Copyright (C) 2006 Atmel Corporation. | ||
7 | * | ||
8 | * Memory Controllers (MATRIX, EBI) - System peripherals registers. | ||
9 | * Based on AT91CAP9 datasheet revision B (Preliminary). | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | */ | ||
16 | |||
17 | #ifndef AT91CAP9_MATRIX_H | ||
18 | #define AT91CAP9_MATRIX_H | ||
19 | |||
20 | #define AT91_MATRIX_MCFG0 (AT91_MATRIX + 0x00) /* Master Configuration Register 0 */ | ||
21 | #define AT91_MATRIX_MCFG1 (AT91_MATRIX + 0x04) /* Master Configuration Register 1 */ | ||
22 | #define AT91_MATRIX_MCFG2 (AT91_MATRIX + 0x08) /* Master Configuration Register 2 */ | ||
23 | #define AT91_MATRIX_MCFG3 (AT91_MATRIX + 0x0C) /* Master Configuration Register 3 */ | ||
24 | #define AT91_MATRIX_MCFG4 (AT91_MATRIX + 0x10) /* Master Configuration Register 4 */ | ||
25 | #define AT91_MATRIX_MCFG5 (AT91_MATRIX + 0x14) /* Master Configuration Register 5 */ | ||
26 | #define AT91_MATRIX_MCFG6 (AT91_MATRIX + 0x18) /* Master Configuration Register 6 */ | ||
27 | #define AT91_MATRIX_MCFG7 (AT91_MATRIX + 0x1C) /* Master Configuration Register 7 */ | ||
28 | #define AT91_MATRIX_MCFG8 (AT91_MATRIX + 0x20) /* Master Configuration Register 8 */ | ||
29 | #define AT91_MATRIX_MCFG9 (AT91_MATRIX + 0x24) /* Master Configuration Register 9 */ | ||
30 | #define AT91_MATRIX_MCFG10 (AT91_MATRIX + 0x28) /* Master Configuration Register 10 */ | ||
31 | #define AT91_MATRIX_MCFG11 (AT91_MATRIX + 0x2C) /* Master Configuration Register 11 */ | ||
32 | #define AT91_MATRIX_ULBT (7 << 0) /* Undefined Length Burst Type */ | ||
33 | #define AT91_MATRIX_ULBT_INFINITE (0 << 0) | ||
34 | #define AT91_MATRIX_ULBT_SINGLE (1 << 0) | ||
35 | #define AT91_MATRIX_ULBT_FOUR (2 << 0) | ||
36 | #define AT91_MATRIX_ULBT_EIGHT (3 << 0) | ||
37 | #define AT91_MATRIX_ULBT_SIXTEEN (4 << 0) | ||
38 | |||
39 | #define AT91_MATRIX_SCFG0 (AT91_MATRIX + 0x40) /* Slave Configuration Register 0 */ | ||
40 | #define AT91_MATRIX_SCFG1 (AT91_MATRIX + 0x44) /* Slave Configuration Register 1 */ | ||
41 | #define AT91_MATRIX_SCFG2 (AT91_MATRIX + 0x48) /* Slave Configuration Register 2 */ | ||
42 | #define AT91_MATRIX_SCFG3 (AT91_MATRIX + 0x4C) /* Slave Configuration Register 3 */ | ||
43 | #define AT91_MATRIX_SCFG4 (AT91_MATRIX + 0x50) /* Slave Configuration Register 4 */ | ||
44 | #define AT91_MATRIX_SCFG5 (AT91_MATRIX + 0x54) /* Slave Configuration Register 5 */ | ||
45 | #define AT91_MATRIX_SCFG6 (AT91_MATRIX + 0x58) /* Slave Configuration Register 6 */ | ||
46 | #define AT91_MATRIX_SCFG7 (AT91_MATRIX + 0x5C) /* Slave Configuration Register 7 */ | ||
47 | #define AT91_MATRIX_SCFG8 (AT91_MATRIX + 0x60) /* Slave Configuration Register 8 */ | ||
48 | #define AT91_MATRIX_SCFG9 (AT91_MATRIX + 0x64) /* Slave Configuration Register 9 */ | ||
49 | #define AT91_MATRIX_SLOT_CYCLE (0xff << 0) /* Maximum Number of Allowed Cycles for a Burst */ | ||
50 | #define AT91_MATRIX_DEFMSTR_TYPE (3 << 16) /* Default Master Type */ | ||
51 | #define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) | ||
52 | #define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) | ||
53 | #define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) | ||
54 | #define AT91_MATRIX_FIXED_DEFMSTR (0xf << 18) /* Fixed Index of Default Master */ | ||
55 | #define AT91_MATRIX_ARBT (3 << 24) /* Arbitration Type */ | ||
56 | #define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) | ||
57 | #define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) | ||
58 | |||
59 | #define AT91_MATRIX_PRAS0 (AT91_MATRIX + 0x80) /* Priority Register A for Slave 0 */ | ||
60 | #define AT91_MATRIX_PRBS0 (AT91_MATRIX + 0x84) /* Priority Register B for Slave 0 */ | ||
61 | #define AT91_MATRIX_PRAS1 (AT91_MATRIX + 0x88) /* Priority Register A for Slave 1 */ | ||
62 | #define AT91_MATRIX_PRBS1 (AT91_MATRIX + 0x8C) /* Priority Register B for Slave 1 */ | ||
63 | #define AT91_MATRIX_PRAS2 (AT91_MATRIX + 0x90) /* Priority Register A for Slave 2 */ | ||
64 | #define AT91_MATRIX_PRBS2 (AT91_MATRIX + 0x94) /* Priority Register B for Slave 2 */ | ||
65 | #define AT91_MATRIX_PRAS3 (AT91_MATRIX + 0x98) /* Priority Register A for Slave 3 */ | ||
66 | #define AT91_MATRIX_PRBS3 (AT91_MATRIX + 0x9C) /* Priority Register B for Slave 3 */ | ||
67 | #define AT91_MATRIX_PRAS4 (AT91_MATRIX + 0xA0) /* Priority Register A for Slave 4 */ | ||
68 | #define AT91_MATRIX_PRBS4 (AT91_MATRIX + 0xA4) /* Priority Register B for Slave 4 */ | ||
69 | #define AT91_MATRIX_PRAS5 (AT91_MATRIX + 0xA8) /* Priority Register A for Slave 5 */ | ||
70 | #define AT91_MATRIX_PRBS5 (AT91_MATRIX + 0xAC) /* Priority Register B for Slave 5 */ | ||
71 | #define AT91_MATRIX_PRAS6 (AT91_MATRIX + 0xB0) /* Priority Register A for Slave 6 */ | ||
72 | #define AT91_MATRIX_PRBS6 (AT91_MATRIX + 0xB4) /* Priority Register B for Slave 6 */ | ||
73 | #define AT91_MATRIX_PRAS7 (AT91_MATRIX + 0xB8) /* Priority Register A for Slave 7 */ | ||
74 | #define AT91_MATRIX_PRBS7 (AT91_MATRIX + 0xBC) /* Priority Register B for Slave 7 */ | ||
75 | #define AT91_MATRIX_PRAS8 (AT91_MATRIX + 0xC0) /* Priority Register A for Slave 8 */ | ||
76 | #define AT91_MATRIX_PRBS8 (AT91_MATRIX + 0xC4) /* Priority Register B for Slave 8 */ | ||
77 | #define AT91_MATRIX_PRAS9 (AT91_MATRIX + 0xC8) /* Priority Register A for Slave 9 */ | ||
78 | #define AT91_MATRIX_PRBS9 (AT91_MATRIX + 0xCC) /* Priority Register B for Slave 9 */ | ||
79 | #define AT91_MATRIX_M0PR (3 << 0) /* Master 0 Priority */ | ||
80 | #define AT91_MATRIX_M1PR (3 << 4) /* Master 1 Priority */ | ||
81 | #define AT91_MATRIX_M2PR (3 << 8) /* Master 2 Priority */ | ||
82 | #define AT91_MATRIX_M3PR (3 << 12) /* Master 3 Priority */ | ||
83 | #define AT91_MATRIX_M4PR (3 << 16) /* Master 4 Priority */ | ||
84 | #define AT91_MATRIX_M5PR (3 << 20) /* Master 5 Priority */ | ||
85 | #define AT91_MATRIX_M6PR (3 << 24) /* Master 6 Priority */ | ||
86 | #define AT91_MATRIX_M7PR (3 << 28) /* Master 7 Priority */ | ||
87 | #define AT91_MATRIX_M8PR (3 << 0) /* Master 8 Priority (in Register B) */ | ||
88 | #define AT91_MATRIX_M9PR (3 << 4) /* Master 9 Priority (in Register B) */ | ||
89 | #define AT91_MATRIX_M10PR (3 << 8) /* Master 10 Priority (in Register B) */ | ||
90 | #define AT91_MATRIX_M11PR (3 << 12) /* Master 11 Priority (in Register B) */ | ||
91 | |||
92 | #define AT91_MATRIX_MRCR (AT91_MATRIX + 0x100) /* Master Remap Control Register */ | ||
93 | #define AT91_MATRIX_RCB0 (1 << 0) /* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ | ||
94 | #define AT91_MATRIX_RCB1 (1 << 1) /* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ | ||
95 | #define AT91_MATRIX_RCB2 (1 << 2) | ||
96 | #define AT91_MATRIX_RCB3 (1 << 3) | ||
97 | #define AT91_MATRIX_RCB4 (1 << 4) | ||
98 | #define AT91_MATRIX_RCB5 (1 << 5) | ||
99 | #define AT91_MATRIX_RCB6 (1 << 6) | ||
100 | #define AT91_MATRIX_RCB7 (1 << 7) | ||
101 | #define AT91_MATRIX_RCB8 (1 << 8) | ||
102 | #define AT91_MATRIX_RCB9 (1 << 9) | ||
103 | #define AT91_MATRIX_RCB10 (1 << 10) | ||
104 | #define AT91_MATRIX_RCB11 (1 << 11) | ||
105 | |||
106 | #define AT91_MPBS0_SFR (AT91_MATRIX + 0x114) /* MPBlock Slave 0 Special Function Register */ | ||
107 | #define AT91_MPBS1_SFR (AT91_MATRIX + 0x11C) /* MPBlock Slave 1 Special Function Register */ | ||
108 | |||
109 | #define AT91_MATRIX_UDPHS (AT91_MATRIX + 0x118) /* USBHS Special Function Register [AT91CAP9 only] */ | ||
110 | #define AT91_MATRIX_SELECT_UDPHS (0 << 31) /* select High Speed UDP */ | ||
111 | #define AT91_MATRIX_SELECT_UDP (1 << 31) /* select standard UDP */ | ||
112 | #define AT91_MATRIX_UDPHS_BYPASS_LOCK (1 << 30) /* bypass lock bit */ | ||
113 | |||
114 | #define AT91_MATRIX_EBICSA (AT91_MATRIX + 0x120) /* EBI Chip Select Assignment Register */ | ||
115 | #define AT91_MATRIX_EBI_CS1A (1 << 1) /* Chip Select 1 Assignment */ | ||
116 | #define AT91_MATRIX_EBI_CS1A_SMC (0 << 1) | ||
117 | #define AT91_MATRIX_EBI_CS1A_BCRAMC (1 << 1) | ||
118 | #define AT91_MATRIX_EBI_CS3A (1 << 3) /* Chip Select 3 Assignment */ | ||
119 | #define AT91_MATRIX_EBI_CS3A_SMC (0 << 3) | ||
120 | #define AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA (1 << 3) | ||
121 | #define AT91_MATRIX_EBI_CS4A (1 << 4) /* Chip Select 4 Assignment */ | ||
122 | #define AT91_MATRIX_EBI_CS4A_SMC (0 << 4) | ||
123 | #define AT91_MATRIX_EBI_CS4A_SMC_CF1 (1 << 4) | ||
124 | #define AT91_MATRIX_EBI_CS5A (1 << 5) /* Chip Select 5 Assignment */ | ||
125 | #define AT91_MATRIX_EBI_CS5A_SMC (0 << 5) | ||
126 | #define AT91_MATRIX_EBI_CS5A_SMC_CF2 (1 << 5) | ||
127 | #define AT91_MATRIX_EBI_DBPUC (1 << 8) /* Data Bus Pull-up Configuration */ | ||
128 | #define AT91_MATRIX_EBI_DQSPDC (1 << 9) /* Data Qualifier Strobe Pull-Down Configuration */ | ||
129 | #define AT91_MATRIX_EBI_VDDIOMSEL (1 << 16) /* Memory voltage selection */ | ||
130 | #define AT91_MATRIX_EBI_VDDIOMSEL_1_8V (0 << 16) | ||
131 | #define AT91_MATRIX_EBI_VDDIOMSEL_3_3V (1 << 16) | ||
132 | |||
133 | #define AT91_MPBS2_SFR (AT91_MATRIX + 0x12C) /* MPBlock Slave 2 Special Function Register */ | ||
134 | #define AT91_MPBS3_SFR (AT91_MATRIX + 0x130) /* MPBlock Slave 3 Special Function Register */ | ||
135 | #define AT91_APB_SFR (AT91_MATRIX + 0x134) /* APB Bridge Special Function Register */ | ||
136 | |||
137 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91rm9200_emac.h b/arch/arm/mach-at91/include/mach/at91rm9200_emac.h new file mode 100644 index 00000000000..b8260cd8041 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91rm9200_emac.h | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91rm9200_emac.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Ethernet MAC registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91RM9200_EMAC_H | ||
17 | #define AT91RM9200_EMAC_H | ||
18 | |||
19 | #define AT91_EMAC_CTL 0x00 /* Control Register */ | ||
20 | #define AT91_EMAC_LB (1 << 0) /* Loopback */ | ||
21 | #define AT91_EMAC_LBL (1 << 1) /* Loopback Local */ | ||
22 | #define AT91_EMAC_RE (1 << 2) /* Receive Enable */ | ||
23 | #define AT91_EMAC_TE (1 << 3) /* Transmit Enable */ | ||
24 | #define AT91_EMAC_MPE (1 << 4) /* Management Port Enable */ | ||
25 | #define AT91_EMAC_CSR (1 << 5) /* Clear Statistics Registers */ | ||
26 | #define AT91_EMAC_INCSTAT (1 << 6) /* Increment Statistics Registers */ | ||
27 | #define AT91_EMAC_WES (1 << 7) /* Write Enable for Statistics Registers */ | ||
28 | #define AT91_EMAC_BP (1 << 8) /* Back Pressure */ | ||
29 | |||
30 | #define AT91_EMAC_CFG 0x04 /* Configuration Register */ | ||
31 | #define AT91_EMAC_SPD (1 << 0) /* Speed */ | ||
32 | #define AT91_EMAC_FD (1 << 1) /* Full Duplex */ | ||
33 | #define AT91_EMAC_BR (1 << 2) /* Bit Rate */ | ||
34 | #define AT91_EMAC_CAF (1 << 4) /* Copy All Frames */ | ||
35 | #define AT91_EMAC_NBC (1 << 5) /* No Broadcast */ | ||
36 | #define AT91_EMAC_MTI (1 << 6) /* Multicast Hash Enable */ | ||
37 | #define AT91_EMAC_UNI (1 << 7) /* Unicast Hash Enable */ | ||
38 | #define AT91_EMAC_BIG (1 << 8) /* Receive 1522 Bytes */ | ||
39 | #define AT91_EMAC_EAE (1 << 9) /* External Address Match Enable */ | ||
40 | #define AT91_EMAC_CLK (3 << 10) /* MDC Clock Divisor */ | ||
41 | #define AT91_EMAC_CLK_DIV8 (0 << 10) | ||
42 | #define AT91_EMAC_CLK_DIV16 (1 << 10) | ||
43 | #define AT91_EMAC_CLK_DIV32 (2 << 10) | ||
44 | #define AT91_EMAC_CLK_DIV64 (3 << 10) | ||
45 | #define AT91_EMAC_RTY (1 << 12) /* Retry Test */ | ||
46 | #define AT91_EMAC_RMII (1 << 13) /* Reduce MII (RMII) */ | ||
47 | |||
48 | #define AT91_EMAC_SR 0x08 /* Status Register */ | ||
49 | #define AT91_EMAC_SR_LINK (1 << 0) /* Link */ | ||
50 | #define AT91_EMAC_SR_MDIO (1 << 1) /* MDIO pin */ | ||
51 | #define AT91_EMAC_SR_IDLE (1 << 2) /* PHY idle */ | ||
52 | |||
53 | #define AT91_EMAC_TAR 0x0c /* Transmit Address Register */ | ||
54 | |||
55 | #define AT91_EMAC_TCR 0x10 /* Transmit Control Register */ | ||
56 | #define AT91_EMAC_LEN (0x7ff << 0) /* Transmit Frame Length */ | ||
57 | #define AT91_EMAC_NCRC (1 << 15) /* No CRC */ | ||
58 | |||
59 | #define AT91_EMAC_TSR 0x14 /* Transmit Status Register */ | ||
60 | #define AT91_EMAC_TSR_OVR (1 << 0) /* Transmit Buffer Overrun */ | ||
61 | #define AT91_EMAC_TSR_COL (1 << 1) /* Collision Occurred */ | ||
62 | #define AT91_EMAC_TSR_RLE (1 << 2) /* Retry Limit Exceeded */ | ||
63 | #define AT91_EMAC_TSR_IDLE (1 << 3) /* Transmitter Idle */ | ||
64 | #define AT91_EMAC_TSR_BNQ (1 << 4) /* Transmit Buffer not Queued */ | ||
65 | #define AT91_EMAC_TSR_COMP (1 << 5) /* Transmit Complete */ | ||
66 | #define AT91_EMAC_TSR_UND (1 << 6) /* Transmit Underrun */ | ||
67 | |||
68 | #define AT91_EMAC_RBQP 0x18 /* Receive Buffer Queue Pointer */ | ||
69 | |||
70 | #define AT91_EMAC_RSR 0x20 /* Receive Status Register */ | ||
71 | #define AT91_EMAC_RSR_BNA (1 << 0) /* Buffer Not Available */ | ||
72 | #define AT91_EMAC_RSR_REC (1 << 1) /* Frame Received */ | ||
73 | #define AT91_EMAC_RSR_OVR (1 << 2) /* RX Overrun */ | ||
74 | |||
75 | #define AT91_EMAC_ISR 0x24 /* Interrupt Status Register */ | ||
76 | #define AT91_EMAC_DONE (1 << 0) /* Management Done */ | ||
77 | #define AT91_EMAC_RCOM (1 << 1) /* Receive Complete */ | ||
78 | #define AT91_EMAC_RBNA (1 << 2) /* Receive Buffer Not Available */ | ||
79 | #define AT91_EMAC_TOVR (1 << 3) /* Transmit Buffer Overrun */ | ||
80 | #define AT91_EMAC_TUND (1 << 4) /* Transmit Buffer Underrun */ | ||
81 | #define AT91_EMAC_RTRY (1 << 5) /* Retry Limit */ | ||
82 | #define AT91_EMAC_TBRE (1 << 6) /* Transmit Buffer Register Empty */ | ||
83 | #define AT91_EMAC_TCOM (1 << 7) /* Transmit Complete */ | ||
84 | #define AT91_EMAC_TIDLE (1 << 8) /* Transmit Idle */ | ||
85 | #define AT91_EMAC_LINK (1 << 9) /* Link */ | ||
86 | #define AT91_EMAC_ROVR (1 << 10) /* RX Overrun */ | ||
87 | #define AT91_EMAC_ABT (1 << 11) /* Abort */ | ||
88 | |||
89 | #define AT91_EMAC_IER 0x28 /* Interrupt Enable Register */ | ||
90 | #define AT91_EMAC_IDR 0x2c /* Interrupt Disable Register */ | ||
91 | #define AT91_EMAC_IMR 0x30 /* Interrupt Mask Register */ | ||
92 | |||
93 | #define AT91_EMAC_MAN 0x34 /* PHY Maintenance Register */ | ||
94 | #define AT91_EMAC_DATA (0xffff << 0) /* MDIO Data */ | ||
95 | #define AT91_EMAC_REGA (0x1f << 18) /* MDIO Register */ | ||
96 | #define AT91_EMAC_PHYA (0x1f << 23) /* MDIO PHY Address */ | ||
97 | #define AT91_EMAC_RW (3 << 28) /* Read/Write operation */ | ||
98 | #define AT91_EMAC_RW_W (1 << 28) | ||
99 | #define AT91_EMAC_RW_R (2 << 28) | ||
100 | #define AT91_EMAC_MAN_802_3 0x40020000 /* IEEE 802.3 value */ | ||
101 | |||
102 | /* | ||
103 | * Statistics Registers. | ||
104 | */ | ||
105 | #define AT91_EMAC_FRA 0x40 /* Frames Transmitted OK */ | ||
106 | #define AT91_EMAC_SCOL 0x44 /* Single Collision Frame */ | ||
107 | #define AT91_EMAC_MCOL 0x48 /* Multiple Collision Frame */ | ||
108 | #define AT91_EMAC_OK 0x4c /* Frames Received OK */ | ||
109 | #define AT91_EMAC_SEQE 0x50 /* Frame Check Sequence Error */ | ||
110 | #define AT91_EMAC_ALE 0x54 /* Alignmemt Error */ | ||
111 | #define AT91_EMAC_DTE 0x58 /* Deffered Transmission Frame */ | ||
112 | #define AT91_EMAC_LCOL 0x5c /* Late Collision */ | ||
113 | #define AT91_EMAC_ECOL 0x60 /* Excessive Collision */ | ||
114 | #define AT91_EMAC_TUE 0x64 /* Transmit Underrun Error */ | ||
115 | #define AT91_EMAC_CSE 0x68 /* Carrier Sense Error */ | ||
116 | #define AT91_EMAC_DRFC 0x6c /* Discard RX Frame */ | ||
117 | #define AT91_EMAC_ROV 0x70 /* Receive Overrun */ | ||
118 | #define AT91_EMAC_CDE 0x74 /* Code Error */ | ||
119 | #define AT91_EMAC_ELR 0x78 /* Excessive Length Error */ | ||
120 | #define AT91_EMAC_RJB 0x7c /* Receive Jabber */ | ||
121 | #define AT91_EMAC_USF 0x80 /* Undersize Frame */ | ||
122 | #define AT91_EMAC_SQEE 0x84 /* SQE Test Error */ | ||
123 | |||
124 | /* | ||
125 | * Address Registers. | ||
126 | */ | ||
127 | #define AT91_EMAC_HSL 0x90 /* Hash Address Low [31:0] */ | ||
128 | #define AT91_EMAC_HSH 0x94 /* Hash Address High [63:32] */ | ||
129 | #define AT91_EMAC_SA1L 0x98 /* Specific Address 1 Low, bytes 0-3 */ | ||
130 | #define AT91_EMAC_SA1H 0x9c /* Specific Address 1 High, bytes 4-5 */ | ||
131 | #define AT91_EMAC_SA2L 0xa0 /* Specific Address 2 Low, bytes 0-3 */ | ||
132 | #define AT91_EMAC_SA2H 0xa4 /* Specific Address 2 High, bytes 4-5 */ | ||
133 | #define AT91_EMAC_SA3L 0xa8 /* Specific Address 3 Low, bytes 0-3 */ | ||
134 | #define AT91_EMAC_SA3H 0xac /* Specific Address 3 High, bytes 4-5 */ | ||
135 | #define AT91_EMAC_SA4L 0xb0 /* Specific Address 4 Low, bytes 0-3 */ | ||
136 | #define AT91_EMAC_SA4H 0xb4 /* Specific Address 4 High, bytes 4-5 */ | ||
137 | |||
138 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at_hdmac.h b/arch/arm/mach-at91/include/mach/at_hdmac.h new file mode 100644 index 00000000000..187cb58345c --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at_hdmac.h | |||
@@ -0,0 +1,102 @@ | |||
1 | /* | ||
2 | * Header file for the Atmel AHB DMA Controller driver | ||
3 | * | ||
4 | * Copyright (C) 2008 Atmel Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef AT_HDMAC_H | ||
12 | #define AT_HDMAC_H | ||
13 | |||
14 | #include <linux/dmaengine.h> | ||
15 | |||
16 | /** | ||
17 | * struct at_dma_platform_data - Controller configuration parameters | ||
18 | * @nr_channels: Number of channels supported by hardware (max 8) | ||
19 | * @cap_mask: dma_capability flags supported by the platform | ||
20 | */ | ||
21 | struct at_dma_platform_data { | ||
22 | unsigned int nr_channels; | ||
23 | dma_cap_mask_t cap_mask; | ||
24 | }; | ||
25 | |||
26 | /** | ||
27 | * enum at_dma_slave_width - DMA slave register access width. | ||
28 | * @AT_DMA_SLAVE_WIDTH_8BIT: Do 8-bit slave register accesses | ||
29 | * @AT_DMA_SLAVE_WIDTH_16BIT: Do 16-bit slave register accesses | ||
30 | * @AT_DMA_SLAVE_WIDTH_32BIT: Do 32-bit slave register accesses | ||
31 | */ | ||
32 | enum at_dma_slave_width { | ||
33 | AT_DMA_SLAVE_WIDTH_8BIT = 0, | ||
34 | AT_DMA_SLAVE_WIDTH_16BIT, | ||
35 | AT_DMA_SLAVE_WIDTH_32BIT, | ||
36 | }; | ||
37 | |||
38 | /** | ||
39 | * struct at_dma_slave - Controller-specific information about a slave | ||
40 | * @dma_dev: required DMA master device | ||
41 | * @tx_reg: physical address of data register used for | ||
42 | * memory-to-peripheral transfers | ||
43 | * @rx_reg: physical address of data register used for | ||
44 | * peripheral-to-memory transfers | ||
45 | * @reg_width: peripheral register width | ||
46 | * @cfg: Platform-specific initializer for the CFG register | ||
47 | * @ctrla: Platform-specific initializer for the CTRLA register | ||
48 | */ | ||
49 | struct at_dma_slave { | ||
50 | struct device *dma_dev; | ||
51 | dma_addr_t tx_reg; | ||
52 | dma_addr_t rx_reg; | ||
53 | enum at_dma_slave_width reg_width; | ||
54 | u32 cfg; | ||
55 | u32 ctrla; | ||
56 | }; | ||
57 | |||
58 | |||
59 | /* Platform-configurable bits in CFG */ | ||
60 | #define ATC_SRC_PER(h) (0xFU & (h)) /* Channel src rq associated with periph handshaking ifc h */ | ||
61 | #define ATC_DST_PER(h) ((0xFU & (h)) << 4) /* Channel dst rq associated with periph handshaking ifc h */ | ||
62 | #define ATC_SRC_REP (0x1 << 8) /* Source Replay Mod */ | ||
63 | #define ATC_SRC_H2SEL (0x1 << 9) /* Source Handshaking Mod */ | ||
64 | #define ATC_SRC_H2SEL_SW (0x0 << 9) | ||
65 | #define ATC_SRC_H2SEL_HW (0x1 << 9) | ||
66 | #define ATC_DST_REP (0x1 << 12) /* Destination Replay Mod */ | ||
67 | #define ATC_DST_H2SEL (0x1 << 13) /* Destination Handshaking Mod */ | ||
68 | #define ATC_DST_H2SEL_SW (0x0 << 13) | ||
69 | #define ATC_DST_H2SEL_HW (0x1 << 13) | ||
70 | #define ATC_SOD (0x1 << 16) /* Stop On Done */ | ||
71 | #define ATC_LOCK_IF (0x1 << 20) /* Interface Lock */ | ||
72 | #define ATC_LOCK_B (0x1 << 21) /* AHB Bus Lock */ | ||
73 | #define ATC_LOCK_IF_L (0x1 << 22) /* Master Interface Arbiter Lock */ | ||
74 | #define ATC_LOCK_IF_L_CHUNK (0x0 << 22) | ||
75 | #define ATC_LOCK_IF_L_BUFFER (0x1 << 22) | ||
76 | #define ATC_AHB_PROT_MASK (0x7 << 24) /* AHB Protection */ | ||
77 | #define ATC_FIFOCFG_MASK (0x3 << 28) /* FIFO Request Configuration */ | ||
78 | #define ATC_FIFOCFG_LARGESTBURST (0x0 << 28) | ||
79 | #define ATC_FIFOCFG_HALFFIFO (0x1 << 28) | ||
80 | #define ATC_FIFOCFG_ENOUGHSPACE (0x2 << 28) | ||
81 | |||
82 | /* Platform-configurable bits in CTRLA */ | ||
83 | #define ATC_SCSIZE_MASK (0x7 << 16) /* Source Chunk Transfer Size */ | ||
84 | #define ATC_SCSIZE_1 (0x0 << 16) | ||
85 | #define ATC_SCSIZE_4 (0x1 << 16) | ||
86 | #define ATC_SCSIZE_8 (0x2 << 16) | ||
87 | #define ATC_SCSIZE_16 (0x3 << 16) | ||
88 | #define ATC_SCSIZE_32 (0x4 << 16) | ||
89 | #define ATC_SCSIZE_64 (0x5 << 16) | ||
90 | #define ATC_SCSIZE_128 (0x6 << 16) | ||
91 | #define ATC_SCSIZE_256 (0x7 << 16) | ||
92 | #define ATC_DCSIZE_MASK (0x7 << 20) /* Destination Chunk Transfer Size */ | ||
93 | #define ATC_DCSIZE_1 (0x0 << 20) | ||
94 | #define ATC_DCSIZE_4 (0x1 << 20) | ||
95 | #define ATC_DCSIZE_8 (0x2 << 20) | ||
96 | #define ATC_DCSIZE_16 (0x3 << 20) | ||
97 | #define ATC_DCSIZE_32 (0x4 << 20) | ||
98 | #define ATC_DCSIZE_64 (0x5 << 20) | ||
99 | #define ATC_DCSIZE_128 (0x6 << 20) | ||
100 | #define ATC_DCSIZE_256 (0x7 << 20) | ||
101 | |||
102 | #endif /* AT_HDMAC_H */ | ||
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h new file mode 100644 index 00000000000..ed544a0d5a1 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/board.h | |||
@@ -0,0 +1,210 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/board.h | ||
3 | * | ||
4 | * Copyright (C) 2005 HP Labs | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | /* | ||
22 | * These are data structures found in platform_device.dev.platform_data, | ||
23 | * and describing board-specific data needed by drivers. For example, | ||
24 | * which pin is used for a given GPIO role. | ||
25 | * | ||
26 | * In 2.6, drivers should strongly avoid board-specific knowledge so | ||
27 | * that supporting new boards normally won't require driver patches. | ||
28 | * Most board-specific knowledge should be in arch/.../board-*.c files. | ||
29 | */ | ||
30 | |||
31 | #ifndef __ASM_ARCH_BOARD_H | ||
32 | #define __ASM_ARCH_BOARD_H | ||
33 | |||
34 | #include <linux/mtd/partitions.h> | ||
35 | #include <linux/device.h> | ||
36 | #include <linux/i2c.h> | ||
37 | #include <linux/leds.h> | ||
38 | #include <linux/spi/spi.h> | ||
39 | #include <linux/usb/atmel_usba_udc.h> | ||
40 | #include <linux/atmel-mci.h> | ||
41 | #include <sound/atmel-ac97c.h> | ||
42 | #include <linux/serial.h> | ||
43 | |||
44 | /* USB Device */ | ||
45 | struct at91_udc_data { | ||
46 | u8 vbus_pin; /* high == host powering us */ | ||
47 | u8 vbus_active_low; /* vbus polarity */ | ||
48 | u8 vbus_polled; /* Use polling, not interrupt */ | ||
49 | u8 pullup_pin; /* active == D+ pulled up */ | ||
50 | u8 pullup_active_low; /* true == pullup_pin is active low */ | ||
51 | }; | ||
52 | extern void __init at91_add_device_udc(struct at91_udc_data *data); | ||
53 | |||
54 | /* USB High Speed Device */ | ||
55 | extern void __init at91_add_device_usba(struct usba_platform_data *data); | ||
56 | |||
57 | /* Compact Flash */ | ||
58 | struct at91_cf_data { | ||
59 | u8 irq_pin; /* I/O IRQ */ | ||
60 | u8 det_pin; /* Card detect */ | ||
61 | u8 vcc_pin; /* power switching */ | ||
62 | u8 rst_pin; /* card reset */ | ||
63 | u8 chipselect; /* EBI Chip Select number */ | ||
64 | u8 flags; | ||
65 | #define AT91_CF_TRUE_IDE 0x01 | ||
66 | #define AT91_IDE_SWAP_A0_A2 0x02 | ||
67 | }; | ||
68 | extern void __init at91_add_device_cf(struct at91_cf_data *data); | ||
69 | |||
70 | /* MMC / SD */ | ||
71 | /* at91_mci platform config */ | ||
72 | struct at91_mmc_data { | ||
73 | u8 det_pin; /* card detect IRQ */ | ||
74 | unsigned slot_b:1; /* uses Slot B */ | ||
75 | unsigned wire4:1; /* (SD) supports DAT0..DAT3 */ | ||
76 | u8 wp_pin; /* (SD) writeprotect detect */ | ||
77 | u8 vcc_pin; /* power switching (high == on) */ | ||
78 | }; | ||
79 | extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data); | ||
80 | |||
81 | /* atmel-mci platform config */ | ||
82 | extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data); | ||
83 | |||
84 | /* Ethernet (EMAC & MACB) */ | ||
85 | struct at91_eth_data { | ||
86 | u32 phy_mask; | ||
87 | u8 phy_irq_pin; /* PHY IRQ */ | ||
88 | u8 is_rmii; /* using RMII interface? */ | ||
89 | }; | ||
90 | extern void __init at91_add_device_eth(struct at91_eth_data *data); | ||
91 | |||
92 | #if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9) \ | ||
93 | || defined(CONFIG_ARCH_AT91SAM9G45) | ||
94 | #define eth_platform_data at91_eth_data | ||
95 | #endif | ||
96 | |||
97 | /* USB Host */ | ||
98 | struct at91_usbh_data { | ||
99 | u8 ports; /* number of ports on root hub */ | ||
100 | u8 vbus_pin[2]; /* port power-control pin */ | ||
101 | }; | ||
102 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); | ||
103 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); | ||
104 | extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data); | ||
105 | |||
106 | /* NAND / SmartMedia */ | ||
107 | struct atmel_nand_data { | ||
108 | u8 enable_pin; /* chip enable */ | ||
109 | u8 det_pin; /* card detect */ | ||
110 | u8 rdy_pin; /* ready/busy */ | ||
111 | u8 rdy_pin_active_low; /* rdy_pin value is inverted */ | ||
112 | u8 ale; /* address line number connected to ALE */ | ||
113 | u8 cle; /* address line number connected to CLE */ | ||
114 | u8 bus_width_16; /* buswidth is 16 bit */ | ||
115 | struct mtd_partition* (*partition_info)(int, int*); | ||
116 | }; | ||
117 | extern void __init at91_add_device_nand(struct atmel_nand_data *data); | ||
118 | |||
119 | /* I2C*/ | ||
120 | #if defined(CONFIG_ARCH_AT91SAM9G45) | ||
121 | extern void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices); | ||
122 | #else | ||
123 | extern void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices); | ||
124 | #endif | ||
125 | |||
126 | /* SPI */ | ||
127 | extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices); | ||
128 | |||
129 | /* Serial */ | ||
130 | #define ATMEL_UART_CTS 0x01 | ||
131 | #define ATMEL_UART_RTS 0x02 | ||
132 | #define ATMEL_UART_DSR 0x04 | ||
133 | #define ATMEL_UART_DTR 0x08 | ||
134 | #define ATMEL_UART_DCD 0x10 | ||
135 | #define ATMEL_UART_RI 0x20 | ||
136 | |||
137 | extern void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins); | ||
138 | extern void __init at91_set_serial_console(unsigned portnr); | ||
139 | |||
140 | extern struct platform_device *atmel_default_console_device; | ||
141 | |||
142 | struct atmel_uart_data { | ||
143 | int num; /* port num */ | ||
144 | short use_dma_tx; /* use transmit DMA? */ | ||
145 | short use_dma_rx; /* use receive DMA? */ | ||
146 | void __iomem *regs; /* virt. base address, if any */ | ||
147 | struct serial_rs485 rs485; /* rs485 settings */ | ||
148 | }; | ||
149 | extern void __init at91_add_device_serial(void); | ||
150 | |||
151 | /* | ||
152 | * PWM | ||
153 | */ | ||
154 | #define AT91_PWM0 0 | ||
155 | #define AT91_PWM1 1 | ||
156 | #define AT91_PWM2 2 | ||
157 | #define AT91_PWM3 3 | ||
158 | |||
159 | extern void __init at91_add_device_pwm(u32 mask); | ||
160 | |||
161 | /* | ||
162 | * SSC -- accessed through ssc_request(id). Drivers don't bind to SSC | ||
163 | * platform devices. Their SSC ID is part of their configuration data, | ||
164 | * along with information about which SSC signals they should use. | ||
165 | */ | ||
166 | #define ATMEL_SSC_TK 0x01 | ||
167 | #define ATMEL_SSC_TF 0x02 | ||
168 | #define ATMEL_SSC_TD 0x04 | ||
169 | #define ATMEL_SSC_TX (ATMEL_SSC_TK | ATMEL_SSC_TF | ATMEL_SSC_TD) | ||
170 | |||
171 | #define ATMEL_SSC_RK 0x10 | ||
172 | #define ATMEL_SSC_RF 0x20 | ||
173 | #define ATMEL_SSC_RD 0x40 | ||
174 | #define ATMEL_SSC_RX (ATMEL_SSC_RK | ATMEL_SSC_RF | ATMEL_SSC_RD) | ||
175 | |||
176 | extern void __init at91_add_device_ssc(unsigned id, unsigned pins); | ||
177 | |||
178 | /* LCD Controller */ | ||
179 | struct atmel_lcdfb_info; | ||
180 | extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data); | ||
181 | |||
182 | /* AC97 */ | ||
183 | extern void __init at91_add_device_ac97(struct ac97c_platform_data *data); | ||
184 | |||
185 | /* ISI */ | ||
186 | extern void __init at91_add_device_isi(void); | ||
187 | |||
188 | /* Touchscreen Controller */ | ||
189 | struct at91_tsadcc_data { | ||
190 | unsigned int adc_clock; | ||
191 | u8 pendet_debounce; | ||
192 | u8 ts_sample_hold_time; | ||
193 | }; | ||
194 | extern void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data); | ||
195 | |||
196 | /* CAN */ | ||
197 | struct at91_can_data { | ||
198 | void (*transceiver_switch)(int on); | ||
199 | }; | ||
200 | extern void __init at91_add_device_can(struct at91_can_data *data); | ||
201 | |||
202 | /* LEDs */ | ||
203 | extern void __init at91_init_leds(u8 cpu_led, u8 timer_led); | ||
204 | extern void __init at91_gpio_leds(struct gpio_led *leds, int nr); | ||
205 | extern void __init at91_pwm_leds(struct gpio_led *leds, int nr); | ||
206 | |||
207 | /* FIXME: this needs a better location, but gets stuff building again */ | ||
208 | extern int at91_suspend_entering_slow_clock(void); | ||
209 | |||
210 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/entry-macro.S b/arch/arm/mach-at91/include/mach/entry-macro.S new file mode 100644 index 00000000000..7ab68f97222 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/entry-macro.S | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/entry-macro.S | ||
3 | * | ||
4 | * Copyright (C) 2003-2005 SAN People | ||
5 | * | ||
6 | * Low-level IRQ helper macros for AT91RM9200 platforms | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <mach/hardware.h> | ||
14 | #include <mach/at91_aic.h> | ||
15 | |||
16 | .macro disable_fiq | ||
17 | .endm | ||
18 | |||
19 | .macro get_irqnr_preamble, base, tmp | ||
20 | ldr \base, =(AT91_VA_BASE_SYS + AT91_AIC) @ base virtual address of AIC peripheral | ||
21 | .endm | ||
22 | |||
23 | .macro arch_ret_to_user, tmp1, tmp2 | ||
24 | .endm | ||
25 | |||
26 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
27 | ldr \irqnr, [\base, #(AT91_AIC_IVR - AT91_AIC)] @ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt) | ||
28 | ldr \irqstat, [\base, #(AT91_AIC_ISR - AT91_AIC)] @ read interrupt source number | ||
29 | teq \irqstat, #0 @ ISR is 0 when no current interrupt, or spurious interrupt | ||
30 | streq \tmp, [\base, #(AT91_AIC_EOICR - AT91_AIC)] @ not going to be handled further, then ACK it now. | ||
31 | .endm | ||
32 | |||
diff --git a/arch/arm/mach-at91/include/mach/gsia18s.h b/arch/arm/mach-at91/include/mach/gsia18s.h new file mode 100644 index 00000000000..307c194926f --- /dev/null +++ b/arch/arm/mach-at91/include/mach/gsia18s.h | |||
@@ -0,0 +1,33 @@ | |||
1 | /* Buttons */ | ||
2 | #define GPIO_TRIG_NET_IN AT91_PIN_PB21 | ||
3 | #define GPIO_CARD_UNMOUNT_0 AT91_PIN_PB13 | ||
4 | #define GPIO_CARD_UNMOUNT_1 AT91_PIN_PB12 | ||
5 | #define GPIO_KEY_POWER AT91_PIN_PA25 | ||
6 | |||
7 | /* PCF8574 0x20 GPIO - U1 on the GS_IA18-CB_V3 board */ | ||
8 | #define GS_IA18_S_PCF_GPIO_BASE0 NR_BUILTIN_GPIO | ||
9 | #define PCF_GPIO_HDC_POWER (GS_IA18_S_PCF_GPIO_BASE0 + 0) | ||
10 | #define PCF_GPIO_WIFI_SETUP (GS_IA18_S_PCF_GPIO_BASE0 + 1) | ||
11 | #define PCF_GPIO_WIFI_ENABLE (GS_IA18_S_PCF_GPIO_BASE0 + 2) | ||
12 | #define PCF_GPIO_WIFI_RESET (GS_IA18_S_PCF_GPIO_BASE0 + 3) | ||
13 | #define PCF_GPIO_ETH_DETECT 4 /* this is a GPI */ | ||
14 | #define PCF_GPIO_GPS_SETUP (GS_IA18_S_PCF_GPIO_BASE0 + 5) | ||
15 | #define PCF_GPIO_GPS_STANDBY (GS_IA18_S_PCF_GPIO_BASE0 + 6) | ||
16 | #define PCF_GPIO_GPS_POWER (GS_IA18_S_PCF_GPIO_BASE0 + 7) | ||
17 | |||
18 | /* PCF8574 0x22 GPIO - U1 on the GS_2G_OPT1-A_V0 board (Alarm) */ | ||
19 | #define GS_IA18_S_PCF_GPIO_BASE1 (GS_IA18_S_PCF_GPIO_BASE0 + 8) | ||
20 | #define PCF_GPIO_ALARM1 (GS_IA18_S_PCF_GPIO_BASE1 + 0) | ||
21 | #define PCF_GPIO_ALARM2 (GS_IA18_S_PCF_GPIO_BASE1 + 1) | ||
22 | #define PCF_GPIO_ALARM3 (GS_IA18_S_PCF_GPIO_BASE1 + 2) | ||
23 | #define PCF_GPIO_ALARM4 (GS_IA18_S_PCF_GPIO_BASE1 + 3) | ||
24 | /* bits 4, 5, 6 not used */ | ||
25 | #define PCF_GPIO_ALARM_V_RELAY_ON (GS_IA18_S_PCF_GPIO_BASE1 + 7) | ||
26 | |||
27 | /* PCF8574 0x24 GPIO U1 on the GS_2G-OPT23-A_V0 board (Modem) */ | ||
28 | #define GS_IA18_S_PCF_GPIO_BASE2 (GS_IA18_S_PCF_GPIO_BASE1 + 8) | ||
29 | #define PCF_GPIO_MODEM_POWER (GS_IA18_S_PCF_GPIO_BASE2 + 0) | ||
30 | #define PCF_GPIO_MODEM_RESET (GS_IA18_S_PCF_GPIO_BASE2 + 3) | ||
31 | /* bits 1, 2, 4, 5 not used */ | ||
32 | #define PCF_GPIO_TRX_RESET (GS_IA18_S_PCF_GPIO_BASE2 + 6) | ||
33 | /* bit 7 not used */ | ||
diff --git a/arch/arm/mach-at91/include/mach/irqs.h b/arch/arm/mach-at91/include/mach/irqs.h new file mode 100644 index 00000000000..36bd55f3fc6 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/irqs.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/irqs.h | ||
3 | * | ||
4 | * Copyright (C) 2004 SAN People | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __ASM_ARCH_IRQS_H | ||
22 | #define __ASM_ARCH_IRQS_H | ||
23 | |||
24 | #include <linux/io.h> | ||
25 | #include <mach/at91_aic.h> | ||
26 | |||
27 | #define NR_AIC_IRQS 32 | ||
28 | |||
29 | |||
30 | /* | ||
31 | * Acknowledge interrupt with AIC after interrupt has been handled. | ||
32 | * (by kernel/irq.c) | ||
33 | */ | ||
34 | #define irq_finish(irq) do { at91_sys_write(AT91_AIC_EOICR, 0); } while (0) | ||
35 | |||
36 | |||
37 | /* | ||
38 | * IRQ interrupt symbols are the AT91xxx_ID_* symbols | ||
39 | * for IRQs handled directly through the AIC, or else the AT91_PIN_* | ||
40 | * symbols in gpio.h for ones handled indirectly as GPIOs. | ||
41 | * We make provision for 5 banks of GPIO. | ||
42 | */ | ||
43 | #define NR_IRQS (NR_AIC_IRQS + (5 * 32)) | ||
44 | |||
45 | /* FIQ is AIC source 0. */ | ||
46 | #define FIQ_START AT91_ID_FIQ | ||
47 | |||
48 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/stamp9g20.h b/arch/arm/mach-at91/include/mach/stamp9g20.h new file mode 100644 index 00000000000..f62c0abca4b --- /dev/null +++ b/arch/arm/mach-at91/include/mach/stamp9g20.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __MACH_STAMP9G20_H | ||
2 | #define __MACH_STAMP9G20_H | ||
3 | |||
4 | void stamp9g20_init_early(void); | ||
5 | void stamp9g20_board_init(void); | ||
6 | |||
7 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/system.h b/arch/arm/mach-at91/include/mach/system.h new file mode 100644 index 00000000000..36af14bc13b --- /dev/null +++ b/arch/arm/mach-at91/include/mach/system.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/system.h | ||
3 | * | ||
4 | * Copyright (C) 2003 SAN People | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __ASM_ARCH_SYSTEM_H | ||
22 | #define __ASM_ARCH_SYSTEM_H | ||
23 | |||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/at91_st.h> | ||
26 | #include <mach/at91_dbgu.h> | ||
27 | #include <mach/at91_pmc.h> | ||
28 | |||
29 | static inline void arch_idle(void) | ||
30 | { | ||
31 | /* | ||
32 | * Disable the processor clock. The processor will be automatically | ||
33 | * re-enabled by an interrupt or by a reset. | ||
34 | */ | ||
35 | #ifdef AT91_PS | ||
36 | at91_sys_write(AT91_PS_CR, AT91_PS_CR_CPU); | ||
37 | #else | ||
38 | at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); | ||
39 | #endif | ||
40 | #ifndef CONFIG_CPU_ARM920T | ||
41 | /* | ||
42 | * Set the processor (CP15) into 'Wait for Interrupt' mode. | ||
43 | * Post-RM9200 processors need this in conjunction with the above | ||
44 | * to save power when idle. | ||
45 | */ | ||
46 | cpu_do_idle(); | ||
47 | #endif | ||
48 | } | ||
49 | |||
50 | void (*at91_arch_reset)(void); | ||
51 | |||
52 | static inline void arch_reset(char mode, const char *cmd) | ||
53 | { | ||
54 | /* call the CPU-specific reset function */ | ||
55 | if (at91_arch_reset) | ||
56 | (at91_arch_reset)(); | ||
57 | } | ||
58 | |||
59 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/vmalloc.h b/arch/arm/mach-at91/include/mach/vmalloc.h new file mode 100644 index 00000000000..8eb459f3f5b --- /dev/null +++ b/arch/arm/mach-at91/include/mach/vmalloc.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 SAN People | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __ASM_ARCH_VMALLOC_H | ||
22 | #define __ASM_ARCH_VMALLOC_H | ||
23 | |||
24 | #define VMALLOC_END (AT91_VIRT_BASE & PGDIR_MASK) | ||
25 | |||
26 | #endif | ||