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