]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/arm/mach-at91/at91sam9rl_devices.c
e886cdfe919d6eb89e8cb14bd8bd3e031375b2de
[linux-2.6-omap-h63xx.git] / arch / arm / mach-at91 / at91sam9rl_devices.c
1 /*
2  *  Copyright (C) 2007 Atmel Corporation
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License.  See the file COPYING in the main directory of this archive for
6  * more details.
7  */
8
9 #include <asm/mach/arch.h>
10 #include <asm/mach/map.h>
11
12 #include <linux/dma-mapping.h>
13 #include <linux/platform_device.h>
14 #include <linux/i2c-gpio.h>
15
16 #include <linux/fb.h>
17 #include <video/atmel_lcdc.h>
18
19 #include <asm/arch/board.h>
20 #include <asm/arch/gpio.h>
21 #include <asm/arch/at91sam9rl.h>
22 #include <asm/arch/at91sam9rl_matrix.h>
23 #include <asm/arch/at91sam926x_mc.h>
24
25 #include "generic.h"
26
27
28 /* --------------------------------------------------------------------
29  *  MMC / SD
30  * -------------------------------------------------------------------- */
31
32 #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
33 static u64 mmc_dmamask = DMA_BIT_MASK(32);
34 static struct at91_mmc_data mmc_data;
35
36 static struct resource mmc_resources[] = {
37         [0] = {
38                 .start  = AT91SAM9RL_BASE_MCI,
39                 .end    = AT91SAM9RL_BASE_MCI + SZ_16K - 1,
40                 .flags  = IORESOURCE_MEM,
41         },
42         [1] = {
43                 .start  = AT91SAM9RL_ID_MCI,
44                 .end    = AT91SAM9RL_ID_MCI,
45                 .flags  = IORESOURCE_IRQ,
46         },
47 };
48
49 static struct platform_device at91sam9rl_mmc_device = {
50         .name           = "at91_mci",
51         .id             = -1,
52         .dev            = {
53                                 .dma_mask               = &mmc_dmamask,
54                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
55                                 .platform_data          = &mmc_data,
56         },
57         .resource       = mmc_resources,
58         .num_resources  = ARRAY_SIZE(mmc_resources),
59 };
60
61 void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
62 {
63         if (!data)
64                 return;
65
66         /* input/irq */
67         if (data->det_pin) {
68                 at91_set_gpio_input(data->det_pin, 1);
69                 at91_set_deglitch(data->det_pin, 1);
70         }
71         if (data->wp_pin)
72                 at91_set_gpio_input(data->wp_pin, 1);
73         if (data->vcc_pin)
74                 at91_set_gpio_output(data->vcc_pin, 0);
75
76         /* CLK */
77         at91_set_A_periph(AT91_PIN_PA2, 0);
78
79         /* CMD */
80         at91_set_A_periph(AT91_PIN_PA1, 1);
81
82         /* DAT0, maybe DAT1..DAT3 */
83         at91_set_A_periph(AT91_PIN_PA0, 1);
84         if (data->wire4) {
85                 at91_set_A_periph(AT91_PIN_PA3, 1);
86                 at91_set_A_periph(AT91_PIN_PA4, 1);
87                 at91_set_A_periph(AT91_PIN_PA5, 1);
88         }
89
90         mmc_data = *data;
91         platform_device_register(&at91sam9rl_mmc_device);
92 }
93 #else
94 void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
95 #endif
96
97
98 /* --------------------------------------------------------------------
99  *  NAND / SmartMedia
100  * -------------------------------------------------------------------- */
101
102 #if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
103 static struct at91_nand_data nand_data;
104
105 #define NAND_BASE       AT91_CHIPSELECT_3
106
107 static struct resource nand_resources[] = {
108         {
109                 .start  = NAND_BASE,
110                 .end    = NAND_BASE + SZ_256M - 1,
111                 .flags  = IORESOURCE_MEM,
112         }
113 };
114
115 static struct platform_device at91_nand_device = {
116         .name           = "at91_nand",
117         .id             = -1,
118         .dev            = {
119                                 .platform_data  = &nand_data,
120         },
121         .resource       = nand_resources,
122         .num_resources  = ARRAY_SIZE(nand_resources),
123 };
124
125 void __init at91_add_device_nand(struct at91_nand_data *data)
126 {
127         unsigned long csa;
128
129         if (!data)
130                 return;
131
132         csa = at91_sys_read(AT91_MATRIX_EBICSA);
133         at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
134
135         /* set the bus interface characteristics */
136         at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
137                         | AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
138
139         at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5)
140                         | AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5));
141
142         at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7));
143
144         at91_sys_write(AT91_SMC_MODE(3), AT91_SMC_DBW_8 | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(1));
145
146         /* enable pin */
147         if (data->enable_pin)
148                 at91_set_gpio_output(data->enable_pin, 1);
149
150         /* ready/busy pin */
151         if (data->rdy_pin)
152                 at91_set_gpio_input(data->rdy_pin, 1);
153
154         /* card detect pin */
155         if (data->det_pin)
156                 at91_set_gpio_input(data->det_pin, 1);
157
158         at91_set_A_periph(AT91_PIN_PB4, 0);             /* NANDOE */
159         at91_set_A_periph(AT91_PIN_PB5, 0);             /* NANDWE */
160
161         nand_data = *data;
162         platform_device_register(&at91_nand_device);
163 }
164
165 #else
166 void __init at91_add_device_nand(struct at91_nand_data *data) {}
167 #endif
168
169
170 /* --------------------------------------------------------------------
171  *  TWI (i2c)
172  * -------------------------------------------------------------------- */
173
174 /*
175  * Prefer the GPIO code since the TWI controller isn't robust
176  * (gets overruns and underruns under load) and can only issue
177  * repeated STARTs in one scenario (the driver doesn't yet handle them).
178  */
179 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
180
181 static struct i2c_gpio_platform_data pdata = {
182         .sda_pin                = AT91_PIN_PA23,
183         .sda_is_open_drain      = 1,
184         .scl_pin                = AT91_PIN_PA24,
185         .scl_is_open_drain      = 1,
186         .udelay                 = 2,            /* ~100 kHz */
187 };
188
189 static struct platform_device at91sam9rl_twi_device = {
190         .name                   = "i2c-gpio",
191         .id                     = -1,
192         .dev.platform_data      = &pdata,
193 };
194
195 void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
196 {
197         at91_set_GPIO_periph(AT91_PIN_PA23, 1);         /* TWD (SDA) */
198         at91_set_multi_drive(AT91_PIN_PA23, 1);
199
200         at91_set_GPIO_periph(AT91_PIN_PA24, 1);         /* TWCK (SCL) */
201         at91_set_multi_drive(AT91_PIN_PA24, 1);
202
203         i2c_register_board_info(0, devices, nr_devices);
204         platform_device_register(&at91sam9rl_twi_device);
205 }
206
207 #elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
208
209 static struct resource twi_resources[] = {
210         [0] = {
211                 .start  = AT91SAM9RL_BASE_TWI0,
212                 .end    = AT91SAM9RL_BASE_TWI0 + SZ_16K - 1,
213                 .flags  = IORESOURCE_MEM,
214         },
215         [1] = {
216                 .start  = AT91SAM9RL_ID_TWI0,
217                 .end    = AT91SAM9RL_ID_TWI0,
218                 .flags  = IORESOURCE_IRQ,
219         },
220 };
221
222 static struct platform_device at91sam9rl_twi_device = {
223         .name           = "at91_i2c",
224         .id             = -1,
225         .resource       = twi_resources,
226         .num_resources  = ARRAY_SIZE(twi_resources),
227 };
228
229 void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
230 {
231         /* pins used for TWI interface */
232         at91_set_A_periph(AT91_PIN_PA23, 0);            /* TWD */
233         at91_set_multi_drive(AT91_PIN_PA23, 1);
234
235         at91_set_A_periph(AT91_PIN_PA24, 0);            /* TWCK */
236         at91_set_multi_drive(AT91_PIN_PA24, 1);
237
238         i2c_register_board_info(0, devices, nr_devices);
239         platform_device_register(&at91sam9rl_twi_device);
240 }
241 #else
242 void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
243 #endif
244
245
246 /* --------------------------------------------------------------------
247  *  SPI
248  * -------------------------------------------------------------------- */
249
250 #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
251 static u64 spi_dmamask = DMA_BIT_MASK(32);
252
253 static struct resource spi_resources[] = {
254         [0] = {
255                 .start  = AT91SAM9RL_BASE_SPI,
256                 .end    = AT91SAM9RL_BASE_SPI + SZ_16K - 1,
257                 .flags  = IORESOURCE_MEM,
258         },
259         [1] = {
260                 .start  = AT91SAM9RL_ID_SPI,
261                 .end    = AT91SAM9RL_ID_SPI,
262                 .flags  = IORESOURCE_IRQ,
263         },
264 };
265
266 static struct platform_device at91sam9rl_spi_device = {
267         .name           = "atmel_spi",
268         .id             = 0,
269         .dev            = {
270                                 .dma_mask               = &spi_dmamask,
271                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
272         },
273         .resource       = spi_resources,
274         .num_resources  = ARRAY_SIZE(spi_resources),
275 };
276
277 static const unsigned spi_standard_cs[4] = { AT91_PIN_PA28, AT91_PIN_PB7, AT91_PIN_PD8, AT91_PIN_PD9 };
278
279
280 void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
281 {
282         int i;
283         unsigned long cs_pin;
284
285         at91_set_A_periph(AT91_PIN_PA25, 0);    /* MISO */
286         at91_set_A_periph(AT91_PIN_PA26, 0);    /* MOSI */
287         at91_set_A_periph(AT91_PIN_PA27, 0);    /* SPCK */
288
289         /* Enable SPI chip-selects */
290         for (i = 0; i < nr_devices; i++) {
291                 if (devices[i].controller_data)
292                         cs_pin = (unsigned long) devices[i].controller_data;
293                 else
294                         cs_pin = spi_standard_cs[devices[i].chip_select];
295
296                 /* enable chip-select pin */
297                 at91_set_gpio_output(cs_pin, 1);
298
299                 /* pass chip-select pin to driver */
300                 devices[i].controller_data = (void *) cs_pin;
301         }
302
303         spi_register_board_info(devices, nr_devices);
304         platform_device_register(&at91sam9rl_spi_device);
305 }
306 #else
307 void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}
308 #endif
309
310
311 /* --------------------------------------------------------------------
312  *  LCD Controller
313  * -------------------------------------------------------------------- */
314
315 #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
316 static u64 lcdc_dmamask = DMA_BIT_MASK(32);
317 static struct atmel_lcdfb_info lcdc_data;
318
319 static struct resource lcdc_resources[] = {
320         [0] = {
321                 .start  = AT91SAM9RL_LCDC_BASE,
322                 .end    = AT91SAM9RL_LCDC_BASE + SZ_4K - 1,
323                 .flags  = IORESOURCE_MEM,
324         },
325         [1] = {
326                 .start  = AT91SAM9RL_ID_LCDC,
327                 .end    = AT91SAM9RL_ID_LCDC,
328                 .flags  = IORESOURCE_IRQ,
329         },
330 #if defined(CONFIG_FB_INTSRAM)
331         [2] = {
332                 .start  = AT91SAM9RL_SRAM_BASE,
333                 .end    = AT91SAM9RL_SRAM_BASE + AT91SAM9RL_SRAM_SIZE - 1,
334                 .flags  = IORESOURCE_MEM,
335         },
336 #endif
337 };
338
339 static struct platform_device at91_lcdc_device = {
340         .name           = "atmel_lcdfb",
341         .id             = 0,
342         .dev            = {
343                                 .dma_mask               = &lcdc_dmamask,
344                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
345                                 .platform_data          = &lcdc_data,
346         },
347         .resource       = lcdc_resources,
348         .num_resources  = ARRAY_SIZE(lcdc_resources),
349 };
350
351 void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
352 {
353         if (!data) {
354                 return;
355         }
356
357         at91_set_B_periph(AT91_PIN_PC1, 0);     /* LCDPWR */
358         at91_set_A_periph(AT91_PIN_PC5, 0);     /* LCDHSYNC */
359         at91_set_A_periph(AT91_PIN_PC6, 0);     /* LCDDOTCK */
360         at91_set_A_periph(AT91_PIN_PC7, 0);     /* LCDDEN */
361         at91_set_A_periph(AT91_PIN_PC3, 0);     /* LCDCC */
362         at91_set_B_periph(AT91_PIN_PC9, 0);     /* LCDD3 */
363         at91_set_B_periph(AT91_PIN_PC10, 0);    /* LCDD4 */
364         at91_set_B_periph(AT91_PIN_PC11, 0);    /* LCDD5 */
365         at91_set_B_periph(AT91_PIN_PC12, 0);    /* LCDD6 */
366         at91_set_B_periph(AT91_PIN_PC13, 0);    /* LCDD7 */
367         at91_set_B_periph(AT91_PIN_PC15, 0);    /* LCDD11 */
368         at91_set_B_periph(AT91_PIN_PC16, 0);    /* LCDD12 */
369         at91_set_B_periph(AT91_PIN_PC17, 0);    /* LCDD13 */
370         at91_set_B_periph(AT91_PIN_PC18, 0);    /* LCDD14 */
371         at91_set_B_periph(AT91_PIN_PC19, 0);    /* LCDD15 */
372         at91_set_B_periph(AT91_PIN_PC20, 0);    /* LCDD18 */
373         at91_set_B_periph(AT91_PIN_PC21, 0);    /* LCDD19 */
374         at91_set_B_periph(AT91_PIN_PC22, 0);    /* LCDD20 */
375         at91_set_B_periph(AT91_PIN_PC23, 0);    /* LCDD21 */
376         at91_set_B_periph(AT91_PIN_PC24, 0);    /* LCDD22 */
377         at91_set_B_periph(AT91_PIN_PC25, 0);    /* LCDD23 */
378
379         lcdc_data = *data;
380         platform_device_register(&at91_lcdc_device);
381 }
382 #else
383 void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
384 #endif
385
386
387 /* --------------------------------------------------------------------
388  *  RTC
389  * -------------------------------------------------------------------- */
390
391 #if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)
392 static struct platform_device at91sam9rl_rtc_device = {
393         .name           = "at91_rtc",
394         .id             = -1,
395         .num_resources  = 0,
396 };
397
398 static void __init at91_add_device_rtc(void)
399 {
400         platform_device_register(&at91sam9rl_rtc_device);
401 }
402 #else
403 static void __init at91_add_device_rtc(void) {}
404 #endif
405
406
407 /* --------------------------------------------------------------------
408  *  RTT
409  * -------------------------------------------------------------------- */
410
411 static struct resource rtt_resources[] = {
412         {
413                 .start  = AT91_BASE_SYS + AT91_RTT,
414                 .end    = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
415                 .flags  = IORESOURCE_MEM,
416         }
417 };
418
419 static struct platform_device at91sam9rl_rtt_device = {
420         .name           = "at91_rtt",
421         .id             = -1,
422         .resource       = rtt_resources,
423         .num_resources  = ARRAY_SIZE(rtt_resources),
424 };
425
426 static void __init at91_add_device_rtt(void)
427 {
428         platform_device_register(&at91sam9rl_rtt_device);
429 }
430
431
432 /* --------------------------------------------------------------------
433  *  Watchdog
434  * -------------------------------------------------------------------- */
435
436 #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
437 static struct platform_device at91sam9rl_wdt_device = {
438         .name           = "at91_wdt",
439         .id             = -1,
440         .num_resources  = 0,
441 };
442
443 static void __init at91_add_device_watchdog(void)
444 {
445         platform_device_register(&at91sam9rl_wdt_device);
446 }
447 #else
448 static void __init at91_add_device_watchdog(void) {}
449 #endif
450
451
452 /* --------------------------------------------------------------------
453  *  LEDs
454  * -------------------------------------------------------------------- */
455
456 #if defined(CONFIG_LEDS)
457 u8 at91_leds_cpu;
458 u8 at91_leds_timer;
459
460 void __init at91_init_leds(u8 cpu_led, u8 timer_led)
461 {
462         /* Enable GPIO to access the LEDs */
463         at91_set_gpio_output(cpu_led, 1);
464         at91_set_gpio_output(timer_led, 1);
465
466         at91_leds_cpu   = cpu_led;
467         at91_leds_timer = timer_led;
468 }
469 #else
470 void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
471 #endif
472
473
474 /* --------------------------------------------------------------------
475  *  SSC -- Synchronous Serial Controller
476  * -------------------------------------------------------------------- */
477
478 #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
479 static u64 ssc0_dmamask = DMA_BIT_MASK(32);
480
481 static struct resource ssc0_resources[] = {
482         [0] = {
483                 .start  = AT91SAM9RL_BASE_SSC0,
484                 .end    = AT91SAM9RL_BASE_SSC0 + SZ_16K - 1,
485                 .flags  = IORESOURCE_MEM,
486         },
487         [1] = {
488                 .start  = AT91SAM9RL_ID_SSC0,
489                 .end    = AT91SAM9RL_ID_SSC0,
490                 .flags  = IORESOURCE_IRQ,
491         },
492 };
493
494 static struct platform_device at91sam9rl_ssc0_device = {
495         .name   = "ssc",
496         .id     = 0,
497         .dev    = {
498                 .dma_mask               = &ssc0_dmamask,
499                 .coherent_dma_mask      = DMA_BIT_MASK(32),
500         },
501         .resource       = ssc0_resources,
502         .num_resources  = ARRAY_SIZE(ssc0_resources),
503 };
504
505 static inline void configure_ssc0_pins(unsigned pins)
506 {
507         if (pins & ATMEL_SSC_TF)
508                 at91_set_A_periph(AT91_PIN_PC0, 1);
509         if (pins & ATMEL_SSC_TK)
510                 at91_set_A_periph(AT91_PIN_PC1, 1);
511         if (pins & ATMEL_SSC_TD)
512                 at91_set_A_periph(AT91_PIN_PA15, 1);
513         if (pins & ATMEL_SSC_RD)
514                 at91_set_A_periph(AT91_PIN_PA16, 1);
515         if (pins & ATMEL_SSC_RK)
516                 at91_set_B_periph(AT91_PIN_PA10, 1);
517         if (pins & ATMEL_SSC_RF)
518                 at91_set_B_periph(AT91_PIN_PA22, 1);
519 }
520
521 static u64 ssc1_dmamask = DMA_BIT_MASK(32);
522
523 static struct resource ssc1_resources[] = {
524         [0] = {
525                 .start  = AT91SAM9RL_BASE_SSC1,
526                 .end    = AT91SAM9RL_BASE_SSC1 + SZ_16K - 1,
527                 .flags  = IORESOURCE_MEM,
528         },
529         [1] = {
530                 .start  = AT91SAM9RL_ID_SSC1,
531                 .end    = AT91SAM9RL_ID_SSC1,
532                 .flags  = IORESOURCE_IRQ,
533         },
534 };
535
536 static struct platform_device at91sam9rl_ssc1_device = {
537         .name   = "ssc",
538         .id     = 1,
539         .dev    = {
540                 .dma_mask               = &ssc1_dmamask,
541                 .coherent_dma_mask      = DMA_BIT_MASK(32),
542         },
543         .resource       = ssc1_resources,
544         .num_resources  = ARRAY_SIZE(ssc1_resources),
545 };
546
547 static inline void configure_ssc1_pins(unsigned pins)
548 {
549         if (pins & ATMEL_SSC_TF)
550                 at91_set_B_periph(AT91_PIN_PA29, 1);
551         if (pins & ATMEL_SSC_TK)
552                 at91_set_B_periph(AT91_PIN_PA30, 1);
553         if (pins & ATMEL_SSC_TD)
554                 at91_set_B_periph(AT91_PIN_PA13, 1);
555         if (pins & ATMEL_SSC_RD)
556                 at91_set_B_periph(AT91_PIN_PA14, 1);
557         if (pins & ATMEL_SSC_RK)
558                 at91_set_B_periph(AT91_PIN_PA9, 1);
559         if (pins & ATMEL_SSC_RF)
560                 at91_set_B_periph(AT91_PIN_PA8, 1);
561 }
562
563 /*
564  * Return the device node so that board init code can use it as the
565  * parent for the device node reflecting how it's used on this board.
566  *
567  * SSC controllers are accessed through library code, instead of any
568  * kind of all-singing/all-dancing driver.  For example one could be
569  * used by a particular I2S audio codec's driver, while another one
570  * on the same system might be used by a custom data capture driver.
571  */
572 void __init at91_add_device_ssc(unsigned id, unsigned pins)
573 {
574         struct platform_device *pdev;
575
576         /*
577          * NOTE: caller is responsible for passing information matching
578          * "pins" to whatever will be using each particular controller.
579          */
580         switch (id) {
581         case AT91SAM9RL_ID_SSC0:
582                 pdev = &at91sam9rl_ssc0_device;
583                 configure_ssc0_pins(pins);
584                 at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
585                 break;
586         case AT91SAM9RL_ID_SSC1:
587                 pdev = &at91sam9rl_ssc1_device;
588                 configure_ssc1_pins(pins);
589                 at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
590                 break;
591         default:
592                 return;
593         }
594
595         platform_device_register(pdev);
596 }
597
598 #else
599 void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
600 #endif
601
602
603 /* --------------------------------------------------------------------
604  *  UART
605  * -------------------------------------------------------------------- */
606
607 #if defined(CONFIG_SERIAL_ATMEL)
608 static struct resource dbgu_resources[] = {
609         [0] = {
610                 .start  = AT91_VA_BASE_SYS + AT91_DBGU,
611                 .end    = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,
612                 .flags  = IORESOURCE_MEM,
613         },
614         [1] = {
615                 .start  = AT91_ID_SYS,
616                 .end    = AT91_ID_SYS,
617                 .flags  = IORESOURCE_IRQ,
618         },
619 };
620
621 static struct atmel_uart_data dbgu_data = {
622         .use_dma_tx     = 0,
623         .use_dma_rx     = 0,            /* DBGU not capable of receive DMA */
624         .regs           = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
625 };
626
627 static u64 dbgu_dmamask = DMA_BIT_MASK(32);
628
629 static struct platform_device at91sam9rl_dbgu_device = {
630         .name           = "atmel_usart",
631         .id             = 0,
632         .dev            = {
633                                 .dma_mask               = &dbgu_dmamask,
634                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
635                                 .platform_data          = &dbgu_data,
636         },
637         .resource       = dbgu_resources,
638         .num_resources  = ARRAY_SIZE(dbgu_resources),
639 };
640
641 static inline void configure_dbgu_pins(void)
642 {
643         at91_set_A_periph(AT91_PIN_PA21, 0);            /* DRXD */
644         at91_set_A_periph(AT91_PIN_PA22, 1);            /* DTXD */
645 }
646
647 static struct resource uart0_resources[] = {
648         [0] = {
649                 .start  = AT91SAM9RL_BASE_US0,
650                 .end    = AT91SAM9RL_BASE_US0 + SZ_16K - 1,
651                 .flags  = IORESOURCE_MEM,
652         },
653         [1] = {
654                 .start  = AT91SAM9RL_ID_US0,
655                 .end    = AT91SAM9RL_ID_US0,
656                 .flags  = IORESOURCE_IRQ,
657         },
658 };
659
660 static struct atmel_uart_data uart0_data = {
661         .use_dma_tx     = 1,
662         .use_dma_rx     = 1,
663 };
664
665 static u64 uart0_dmamask = DMA_BIT_MASK(32);
666
667 static struct platform_device at91sam9rl_uart0_device = {
668         .name           = "atmel_usart",
669         .id             = 1,
670         .dev            = {
671                                 .dma_mask               = &uart0_dmamask,
672                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
673                                 .platform_data          = &uart0_data,
674         },
675         .resource       = uart0_resources,
676         .num_resources  = ARRAY_SIZE(uart0_resources),
677 };
678
679 static inline void configure_usart0_pins(void)
680 {
681         at91_set_A_periph(AT91_PIN_PA6, 1);             /* TXD0 */
682         at91_set_A_periph(AT91_PIN_PA7, 0);             /* RXD0 */
683         at91_set_A_periph(AT91_PIN_PA9, 0);             /* RTS0 */
684         at91_set_A_periph(AT91_PIN_PA10, 0);            /* CTS0 */
685 }
686
687 static struct resource uart1_resources[] = {
688         [0] = {
689                 .start  = AT91SAM9RL_BASE_US1,
690                 .end    = AT91SAM9RL_BASE_US1 + SZ_16K - 1,
691                 .flags  = IORESOURCE_MEM,
692         },
693         [1] = {
694                 .start  = AT91SAM9RL_ID_US1,
695                 .end    = AT91SAM9RL_ID_US1,
696                 .flags  = IORESOURCE_IRQ,
697         },
698 };
699
700 static struct atmel_uart_data uart1_data = {
701         .use_dma_tx     = 1,
702         .use_dma_rx     = 1,
703 };
704
705 static u64 uart1_dmamask = DMA_BIT_MASK(32);
706
707 static struct platform_device at91sam9rl_uart1_device = {
708         .name           = "atmel_usart",
709         .id             = 2,
710         .dev            = {
711                                 .dma_mask               = &uart1_dmamask,
712                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
713                                 .platform_data          = &uart1_data,
714         },
715         .resource       = uart1_resources,
716         .num_resources  = ARRAY_SIZE(uart1_resources),
717 };
718
719 static inline void configure_usart1_pins(void)
720 {
721         at91_set_A_periph(AT91_PIN_PA11, 1);            /* TXD1 */
722         at91_set_A_periph(AT91_PIN_PA12, 0);            /* RXD1 */
723 }
724
725 static struct resource uart2_resources[] = {
726         [0] = {
727                 .start  = AT91SAM9RL_BASE_US2,
728                 .end    = AT91SAM9RL_BASE_US2 + SZ_16K - 1,
729                 .flags  = IORESOURCE_MEM,
730         },
731         [1] = {
732                 .start  = AT91SAM9RL_ID_US2,
733                 .end    = AT91SAM9RL_ID_US2,
734                 .flags  = IORESOURCE_IRQ,
735         },
736 };
737
738 static struct atmel_uart_data uart2_data = {
739         .use_dma_tx     = 1,
740         .use_dma_rx     = 1,
741 };
742
743 static u64 uart2_dmamask = DMA_BIT_MASK(32);
744
745 static struct platform_device at91sam9rl_uart2_device = {
746         .name           = "atmel_usart",
747         .id             = 3,
748         .dev            = {
749                                 .dma_mask               = &uart2_dmamask,
750                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
751                                 .platform_data          = &uart2_data,
752         },
753         .resource       = uart2_resources,
754         .num_resources  = ARRAY_SIZE(uart2_resources),
755 };
756
757 static inline void configure_usart2_pins(void)
758 {
759         at91_set_A_periph(AT91_PIN_PA13, 1);            /* TXD2 */
760         at91_set_A_periph(AT91_PIN_PA14, 0);            /* RXD2 */
761 }
762
763 static struct resource uart3_resources[] = {
764         [0] = {
765                 .start  = AT91SAM9RL_BASE_US3,
766                 .end    = AT91SAM9RL_BASE_US3 + SZ_16K - 1,
767                 .flags  = IORESOURCE_MEM,
768         },
769         [1] = {
770                 .start  = AT91SAM9RL_ID_US3,
771                 .end    = AT91SAM9RL_ID_US3,
772                 .flags  = IORESOURCE_IRQ,
773         },
774 };
775
776 static struct atmel_uart_data uart3_data = {
777         .use_dma_tx     = 1,
778         .use_dma_rx     = 1,
779 };
780
781 static u64 uart3_dmamask = DMA_BIT_MASK(32);
782
783 static struct platform_device at91sam9rl_uart3_device = {
784         .name           = "atmel_usart",
785         .id             = 4,
786         .dev            = {
787                                 .dma_mask               = &uart3_dmamask,
788                                 .coherent_dma_mask      = DMA_BIT_MASK(32),
789                                 .platform_data          = &uart3_data,
790         },
791         .resource       = uart3_resources,
792         .num_resources  = ARRAY_SIZE(uart3_resources),
793 };
794
795 static inline void configure_usart3_pins(void)
796 {
797         at91_set_A_periph(AT91_PIN_PB0, 1);             /* TXD3 */
798         at91_set_A_periph(AT91_PIN_PB1, 0);             /* RXD3 */
799 }
800
801 static struct platform_device *at91_uarts[ATMEL_MAX_UART];      /* the UARTs to use */
802 struct platform_device *atmel_default_console_device;   /* the serial console device */
803
804 void __init at91_init_serial(struct at91_uart_config *config)
805 {
806         int i;
807
808         /* Fill in list of supported UARTs */
809         for (i = 0; i < config->nr_tty; i++) {
810                 switch (config->tty_map[i]) {
811                         case 0:
812                                 configure_usart0_pins();
813                                 at91_uarts[i] = &at91sam9rl_uart0_device;
814                                 at91_clock_associate("usart0_clk", &at91sam9rl_uart0_device.dev, "usart");
815                                 break;
816                         case 1:
817                                 configure_usart1_pins();
818                                 at91_uarts[i] = &at91sam9rl_uart1_device;
819                                 at91_clock_associate("usart1_clk", &at91sam9rl_uart1_device.dev, "usart");
820                                 break;
821                         case 2:
822                                 configure_usart2_pins();
823                                 at91_uarts[i] = &at91sam9rl_uart2_device;
824                                 at91_clock_associate("usart2_clk", &at91sam9rl_uart2_device.dev, "usart");
825                                 break;
826                         case 3:
827                                 configure_usart3_pins();
828                                 at91_uarts[i] = &at91sam9rl_uart3_device;
829                                 at91_clock_associate("usart3_clk", &at91sam9rl_uart3_device.dev, "usart");
830                                 break;
831                         case 4:
832                                 configure_dbgu_pins();
833                                 at91_uarts[i] = &at91sam9rl_dbgu_device;
834                                 at91_clock_associate("mck", &at91sam9rl_dbgu_device.dev, "usart");
835                                 break;
836                         default:
837                                 continue;
838                 }
839                 at91_uarts[i]->id = i;          /* update ID number to mapped ID */
840         }
841
842         /* Set serial console device */
843         if (config->console_tty < ATMEL_MAX_UART)
844                 atmel_default_console_device = at91_uarts[config->console_tty];
845         if (!atmel_default_console_device)
846                 printk(KERN_INFO "AT91: No default serial console defined.\n");
847 }
848
849 void __init at91_add_device_serial(void)
850 {
851         int i;
852
853         for (i = 0; i < ATMEL_MAX_UART; i++) {
854                 if (at91_uarts[i])
855                         platform_device_register(at91_uarts[i]);
856         }
857 }
858 #else
859 void __init at91_init_serial(struct at91_uart_config *config) {}
860 void __init at91_add_device_serial(void) {}
861 #endif
862
863
864 /* -------------------------------------------------------------------- */
865
866 /*
867  * These devices are always present and don't need any board-specific
868  * setup.
869  */
870 static int __init at91_add_standard_devices(void)
871 {
872         at91_add_device_rtc();
873         at91_add_device_rtt();
874         at91_add_device_watchdog();
875         return 0;
876 }
877
878 arch_initcall(at91_add_standard_devices);