Merge branch 'fixes' of master.kernel.org:/home/rmk/linux-2.6-arm
[pandora-kernel.git] / arch / arm / mach-at91 / board-sam9m10g45ek.c
1 /*
2  *  Board-specific setup code for the AT91SAM9M10G45 Evaluation Kit family
3  *
4  *  Covers: * AT91SAM9G45-EKES  board
5  *          * AT91SAM9M10G45-EK board
6  *
7  *  Copyright (C) 2009 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  */
15
16 #include <linux/types.h>
17 #include <linux/init.h>
18 #include <linux/mm.h>
19 #include <linux/module.h>
20 #include <linux/platform_device.h>
21 #include <linux/spi/spi.h>
22 #include <linux/fb.h>
23 #include <linux/gpio_keys.h>
24 #include <linux/input.h>
25 #include <linux/leds.h>
26 #include <linux/clk.h>
27 #include <linux/atmel-mci.h>
28
29 #include <mach/hardware.h>
30 #include <video/atmel_lcdc.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_map_io(void)
51 {
52         /* Initialize processor: 12.000 MHz crystal */
53         at91sam9g45_initialize(12000000);
54
55         /* DGBU on ttyS0. (Rx & Tx only) */
56         at91_register_uart(0, 0, 0);
57
58         /* USART0 not connected on the -EK board */
59         /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
60         at91_register_uart(AT91SAM9G45_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
61
62         /* set serial console to ttyS0 (ie, DBGU) */
63         at91_set_serial_console(0);
64 }
65
66 static void __init ek_init_irq(void)
67 {
68         at91sam9g45_init_interrupts(NULL);
69 }
70
71
72 /*
73  * USB HS Host port (common to OHCI & EHCI)
74  */
75 static struct at91_usbh_data __initdata ek_usbh_hs_data = {
76         .ports          = 2,
77         .vbus_pin       = {AT91_PIN_PD1, AT91_PIN_PD3},
78 };
79
80
81 /*
82  * USB HS Device port
83  */
84 static struct usba_platform_data __initdata ek_usba_udc_data = {
85         .vbus_pin       = AT91_PIN_PB19,
86 };
87
88
89 /*
90  * SPI devices.
91  */
92 static struct spi_board_info ek_spi_devices[] = {
93         {       /* DataFlash chip */
94                 .modalias       = "mtd_dataflash",
95                 .chip_select    = 0,
96                 .max_speed_hz   = 15 * 1000 * 1000,
97                 .bus_num        = 0,
98         },
99 };
100
101
102 /*
103  * MCI (SD/MMC)
104  */
105 static struct mci_platform_data __initdata mci0_data = {
106         .slot[0] = {
107                 .bus_width      = 4,
108                 .detect_pin     = AT91_PIN_PD10,
109         },
110 };
111
112 static struct mci_platform_data __initdata mci1_data = {
113         .slot[0] = {
114                 .bus_width      = 4,
115                 .detect_pin     = AT91_PIN_PD11,
116                 .wp_pin         = AT91_PIN_PD29,
117         },
118 };
119
120
121 /*
122  * MACB Ethernet device
123  */
124 static struct at91_eth_data __initdata ek_macb_data = {
125         .phy_irq_pin    = AT91_PIN_PD5,
126         .is_rmii        = 1,
127 };
128
129
130 /*
131  * NAND flash
132  */
133 static struct mtd_partition __initdata ek_nand_partition[] = {
134         {
135                 .name   = "Partition 1",
136                 .offset = 0,
137                 .size   = SZ_64M,
138         },
139         {
140                 .name   = "Partition 2",
141                 .offset = MTDPART_OFS_NXTBLK,
142                 .size   = MTDPART_SIZ_FULL,
143         },
144 };
145
146 static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
147 {
148         *num_partitions = ARRAY_SIZE(ek_nand_partition);
149         return ek_nand_partition;
150 }
151
152 /* det_pin is not connected */
153 static struct atmel_nand_data __initdata ek_nand_data = {
154         .ale            = 21,
155         .cle            = 22,
156         .rdy_pin        = AT91_PIN_PC8,
157         .enable_pin     = AT91_PIN_PC14,
158         .partition_info = nand_partitions,
159 #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
160         .bus_width_16   = 1,
161 #else
162         .bus_width_16   = 0,
163 #endif
164 };
165
166 static struct sam9_smc_config __initdata ek_nand_smc_config = {
167         .ncs_read_setup         = 0,
168         .nrd_setup              = 2,
169         .ncs_write_setup        = 0,
170         .nwe_setup              = 2,
171
172         .ncs_read_pulse         = 4,
173         .nrd_pulse              = 4,
174         .ncs_write_pulse        = 4,
175         .nwe_pulse              = 4,
176
177         .read_cycle             = 7,
178         .write_cycle            = 7,
179
180         .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
181         .tdf_cycles             = 3,
182 };
183
184 static void __init ek_add_device_nand(void)
185 {
186         /* setup bus-width (8 or 16) */
187         if (ek_nand_data.bus_width_16)
188                 ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
189         else
190                 ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
191
192         /* configure chip-select 3 (NAND) */
193         sam9_smc_configure(3, &ek_nand_smc_config);
194
195         at91_add_device_nand(&ek_nand_data);
196 }
197
198
199 /*
200  * LCD Controller
201  */
202 #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
203 static struct fb_videomode at91_tft_vga_modes[] = {
204         {
205                 .name           = "LG",
206                 .refresh        = 60,
207                 .xres           = 480,          .yres           = 272,
208                 .pixclock       = KHZ2PICOS(9000),
209
210                 .left_margin    = 1,            .right_margin   = 1,
211                 .upper_margin   = 40,           .lower_margin   = 1,
212                 .hsync_len      = 45,           .vsync_len      = 1,
213
214                 .sync           = 0,
215                 .vmode          = FB_VMODE_NONINTERLACED,
216         },
217 };
218
219 static struct fb_monspecs at91fb_default_monspecs = {
220         .manufacturer   = "LG",
221         .monitor        = "LB043WQ1",
222
223         .modedb         = at91_tft_vga_modes,
224         .modedb_len     = ARRAY_SIZE(at91_tft_vga_modes),
225         .hfmin          = 15000,
226         .hfmax          = 17640,
227         .vfmin          = 57,
228         .vfmax          = 67,
229 };
230
231 #define AT91SAM9G45_DEFAULT_LCDCON2     (ATMEL_LCDC_MEMOR_LITTLE \
232                                         | ATMEL_LCDC_DISTYPE_TFT \
233                                         | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
234
235 /* Driver datas */
236 static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
237         .lcdcon_is_backlight            = true,
238         .default_bpp                    = 32,
239         .default_dmacon                 = ATMEL_LCDC_DMAEN,
240         .default_lcdcon2                = AT91SAM9G45_DEFAULT_LCDCON2,
241         .default_monspecs               = &at91fb_default_monspecs,
242         .guard_time                     = 9,
243         .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
244 };
245
246 #else
247 static struct atmel_lcdfb_info __initdata ek_lcdc_data;
248 #endif
249
250
251 /*
252  * Touchscreen
253  */
254 static struct at91_tsadcc_data ek_tsadcc_data = {
255         .adc_clock              = 300000,
256         .pendet_debounce        = 0x0d,
257         .ts_sample_hold_time    = 0x0a,
258 };
259
260
261 /*
262  * GPIO Buttons
263  */
264 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
265 static struct gpio_keys_button ek_buttons[] = {
266         {       /* BP1, "leftclic" */
267                 .code           = BTN_LEFT,
268                 .gpio           = AT91_PIN_PB6,
269                 .active_low     = 1,
270                 .desc           = "left_click",
271                 .wakeup         = 1,
272         },
273         {       /* BP2, "rightclic" */
274                 .code           = BTN_RIGHT,
275                 .gpio           = AT91_PIN_PB7,
276                 .active_low     = 1,
277                 .desc           = "right_click",
278                 .wakeup         = 1,
279         },
280                 /* BP3, "joystick" */
281         {
282                 .code           = KEY_LEFT,
283                 .gpio           = AT91_PIN_PB14,
284                 .active_low     = 1,
285                 .desc           = "Joystick Left",
286         },
287         {
288                 .code           = KEY_RIGHT,
289                 .gpio           = AT91_PIN_PB15,
290                 .active_low     = 1,
291                 .desc           = "Joystick Right",
292         },
293         {
294                 .code           = KEY_UP,
295                 .gpio           = AT91_PIN_PB16,
296                 .active_low     = 1,
297                 .desc           = "Joystick Up",
298         },
299         {
300                 .code           = KEY_DOWN,
301                 .gpio           = AT91_PIN_PB17,
302                 .active_low     = 1,
303                 .desc           = "Joystick Down",
304         },
305         {
306                 .code           = KEY_ENTER,
307                 .gpio           = AT91_PIN_PB18,
308                 .active_low     = 1,
309                 .desc           = "Joystick Press",
310         },
311 };
312
313 static struct gpio_keys_platform_data ek_button_data = {
314         .buttons        = ek_buttons,
315         .nbuttons       = ARRAY_SIZE(ek_buttons),
316 };
317
318 static struct platform_device ek_button_device = {
319         .name           = "gpio-keys",
320         .id             = -1,
321         .num_resources  = 0,
322         .dev            = {
323                 .platform_data  = &ek_button_data,
324         }
325 };
326
327 static void __init ek_add_device_buttons(void)
328 {
329         int i;
330
331         for (i = 0; i < ARRAY_SIZE(ek_buttons); i++) {
332                 at91_set_GPIO_periph(ek_buttons[i].gpio, 1);
333                 at91_set_deglitch(ek_buttons[i].gpio, 1);
334         }
335
336         platform_device_register(&ek_button_device);
337 }
338 #else
339 static void __init ek_add_device_buttons(void) {}
340 #endif
341
342
343 /*
344  * AC97
345  * reset_pin is not connected: NRST
346  */
347 static struct ac97c_platform_data ek_ac97_data = {
348 };
349
350
351 /*
352  * LEDs ... these could all be PWM-driven, for variable brightness
353  */
354 static struct gpio_led ek_leds[] = {
355         {       /* "top" led, red, powerled */
356                 .name                   = "d8",
357                 .gpio                   = AT91_PIN_PD30,
358                 .default_trigger        = "heartbeat",
359         },
360         {       /* "left" led, green, userled2, pwm3 */
361                 .name                   = "d6",
362                 .gpio                   = AT91_PIN_PD0,
363                 .active_low             = 1,
364                 .default_trigger        = "nand-disk",
365         },
366 #if !(defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE))
367         {       /* "right" led, green, userled1, pwm1 */
368                 .name                   = "d7",
369                 .gpio                   = AT91_PIN_PD31,
370                 .active_low             = 1,
371                 .default_trigger        = "mmc0",
372         },
373 #endif
374 };
375
376
377 /*
378  * PWM Leds
379  */
380 static struct gpio_led ek_pwm_led[] = {
381 #if defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
382         {       /* "right" led, green, userled1, pwm1 */
383                 .name                   = "d7",
384                 .gpio                   = 1,    /* is PWM channel number */
385                 .active_low             = 1,
386                 .default_trigger        = "none",
387         },
388 #endif
389 };
390
391
392
393 static void __init ek_board_init(void)
394 {
395         /* Serial */
396         at91_add_device_serial();
397         /* USB HS Host */
398         at91_add_device_usbh_ohci(&ek_usbh_hs_data);
399         at91_add_device_usbh_ehci(&ek_usbh_hs_data);
400         /* USB HS Device */
401         at91_add_device_usba(&ek_usba_udc_data);
402         /* SPI */
403         at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
404         /* MMC */
405         at91_add_device_mci(0, &mci0_data);
406         at91_add_device_mci(1, &mci1_data);
407         /* Ethernet */
408         at91_add_device_eth(&ek_macb_data);
409         /* NAND */
410         ek_add_device_nand();
411         /* I2C */
412         at91_add_device_i2c(0, NULL, 0);
413         /* LCD Controller */
414         at91_add_device_lcdc(&ek_lcdc_data);
415         /* Touch Screen */
416         at91_add_device_tsadcc(&ek_tsadcc_data);
417         /* Push Buttons */
418         ek_add_device_buttons();
419         /* AC97 */
420         at91_add_device_ac97(&ek_ac97_data);
421         /* LEDs */
422         at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
423         at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
424 }
425
426 MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
427         /* Maintainer: Atmel */
428         .boot_params    = AT91_SDRAM_BASE + 0x100,
429         .timer          = &at91sam926x_timer,
430         .map_io         = ek_map_io,
431         .init_irq       = ek_init_irq,
432         .init_machine   = ek_board_init,
433 MACHINE_END