• 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 * linux/arch/arm/mach-at91/board-sam9260ek.c
3 *
4 *  Copyright (C) 2005 SAN People
5 *  Copyright (C) 2006 Atmel
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21
22#include <linux/types.h>
23#include <linux/init.h>
24#include <linux/mm.h>
25#include <linux/module.h>
26#include <linux/platform_device.h>
27#include <linux/spi/spi.h>
28#include <linux/spi/at73c213.h>
29#include <linux/clk.h>
30#include <linux/i2c/at24.h>
31#include <linux/gpio_keys.h>
32#include <linux/input.h>
33
34#include <asm/setup.h>
35#include <asm/mach-types.h>
36#include <asm/irq.h>
37
38#include <asm/mach/arch.h>
39#include <asm/mach/map.h>
40#include <asm/mach/irq.h>
41
42#include <mach/hardware.h>
43#include <mach/board.h>
44#include <mach/gpio.h>
45#include <mach/at91sam9_smc.h>
46#include <mach/at91_shdwc.h>
47
48#include "sam9_smc.h"
49#include "generic.h"
50
51
52static void __init ek_map_io(void)
53{
54	/* Initialize processor: 18.432 MHz crystal */
55	at91sam9260_initialize(18432000);
56
57	/* DBGU on ttyS0. (Rx & Tx only) */
58	at91_register_uart(0, 0, 0);
59
60	/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
61	at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
62			   | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
63			   | ATMEL_UART_RI);
64
65	/* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
66	at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
67
68	/* set serial console to ttyS0 (ie, DBGU) */
69	at91_set_serial_console(0);
70}
71
72static void __init ek_init_irq(void)
73{
74	at91sam9260_init_interrupts(NULL);
75}
76
77
78/*
79 * USB Host port
80 */
81static struct at91_usbh_data __initdata ek_usbh_data = {
82	.ports		= 2,
83};
84
85/*
86 * USB Device port
87 */
88static struct at91_udc_data __initdata ek_udc_data = {
89	.vbus_pin	= AT91_PIN_PC5,
90	.pullup_pin	= 0,		/* pull-up driven by UDC */
91};
92
93
94/*
95 * Audio
96 */
97static struct at73c213_board_info at73c213_data = {
98	.ssc_id		= 0,
99	.shortname	= "AT91SAM9260-EK external DAC",
100};
101
102#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
103static void __init at73c213_set_clk(struct at73c213_board_info *info)
104{
105	struct clk *pck0;
106	struct clk *plla;
107
108	pck0 = clk_get(NULL, "pck0");
109	plla = clk_get(NULL, "plla");
110
111	/* AT73C213 MCK Clock */
112	at91_set_B_periph(AT91_PIN_PC1, 0);	/* PCK0 */
113
114	clk_set_parent(pck0, plla);
115	clk_put(plla);
116
117	info->dac_clk = pck0;
118}
119#else
120static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
121#endif
122
123/*
124 * SPI devices.
125 */
126static struct spi_board_info ek_spi_devices[] = {
127#if !defined(CONFIG_MMC_AT91)
128	{	/* DataFlash chip */
129		.modalias	= "mtd_dataflash",
130		.chip_select	= 1,
131		.max_speed_hz	= 15 * 1000 * 1000,
132		.bus_num	= 0,
133	},
134#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
135	{	/* DataFlash card */
136		.modalias	= "mtd_dataflash",
137		.chip_select	= 0,
138		.max_speed_hz	= 15 * 1000 * 1000,
139		.bus_num	= 0,
140	},
141#endif
142#endif
143#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
144	{	/* AT73C213 DAC */
145		.modalias	= "at73c213",
146		.chip_select	= 0,
147		.max_speed_hz	= 10 * 1000 * 1000,
148		.bus_num	= 1,
149		.mode		= SPI_MODE_1,
150		.platform_data	= &at73c213_data,
151	},
152#endif
153};
154
155
156/*
157 * MACB Ethernet device
158 */
159static struct at91_eth_data __initdata ek_macb_data = {
160	.phy_irq_pin	= AT91_PIN_PA7,
161	.is_rmii	= 1,
162};
163
164
165/*
166 * NAND flash
167 */
168static struct mtd_partition __initdata ek_nand_partition[] = {
169	{
170		.name	= "Partition 1",
171		.offset	= 0,
172		.size	= SZ_256K,
173	},
174	{
175		.name	= "Partition 2",
176		.offset	= MTDPART_OFS_NXTBLK,
177		.size	= MTDPART_SIZ_FULL,
178	},
179};
180
181static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
182{
183	*num_partitions = ARRAY_SIZE(ek_nand_partition);
184	return ek_nand_partition;
185}
186
187static struct atmel_nand_data __initdata ek_nand_data = {
188	.ale		= 21,
189	.cle		= 22,
190//	.det_pin	= ... not connected
191	.rdy_pin	= AT91_PIN_PC13,
192	.enable_pin	= AT91_PIN_PC14,
193	.partition_info	= nand_partitions,
194#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
195	.bus_width_16	= 1,
196#else
197	.bus_width_16	= 0,
198#endif
199};
200
201static struct sam9_smc_config __initdata ek_nand_smc_config = {
202	.ncs_read_setup		= 0,
203	.nrd_setup		= 1,
204	.ncs_write_setup	= 0,
205	.nwe_setup		= 1,
206
207	.ncs_read_pulse		= 3,
208	.nrd_pulse		= 3,
209	.ncs_write_pulse	= 3,
210	.nwe_pulse		= 3,
211
212	.read_cycle		= 5,
213	.write_cycle		= 5,
214
215	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
216	.tdf_cycles		= 2,
217};
218
219static void __init ek_add_device_nand(void)
220{
221	/* setup bus-width (8 or 16) */
222	if (ek_nand_data.bus_width_16)
223		ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
224	else
225		ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
226
227	/* configure chip-select 3 (NAND) */
228	sam9_smc_configure(3, &ek_nand_smc_config);
229
230	at91_add_device_nand(&ek_nand_data);
231}
232
233
234/*
235 * MCI (SD/MMC)
236 */
237static struct at91_mmc_data __initdata ek_mmc_data = {
238	.slot_b		= 1,
239	.wire4		= 1,
240//	.det_pin	= ... not connected
241//	.wp_pin		= ... not connected
242//	.vcc_pin	= ... not connected
243};
244
245
246/*
247 * LEDs
248 */
249static struct gpio_led ek_leds[] = {
250	{	/* "bottom" led, green, userled1 to be defined */
251		.name			= "ds5",
252		.gpio			= AT91_PIN_PA6,
253		.active_low		= 1,
254		.default_trigger	= "none",
255	},
256	{	/* "power" led, yellow */
257		.name			= "ds1",
258		.gpio			= AT91_PIN_PA9,
259		.default_trigger	= "heartbeat",
260	}
261};
262
263/*
264 * I2C devices
265 */
266static struct at24_platform_data at24c512 = {
267	.byte_len	= SZ_512K / 8,
268	.page_size	= 128,
269	.flags		= AT24_FLAG_ADDR16,
270};
271
272static struct i2c_board_info __initdata ek_i2c_devices[] = {
273	{
274		I2C_BOARD_INFO("24c512", 0x50),
275		.platform_data = &at24c512,
276	},
277	/* more devices can be added using expansion connectors */
278};
279
280
281/*
282 * GPIO Buttons
283 */
284#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
285static struct gpio_keys_button ek_buttons[] = {
286	{
287		.gpio		= AT91_PIN_PA30,
288		.code		= BTN_3,
289		.desc		= "Button 3",
290		.active_low	= 1,
291		.wakeup		= 1,
292	},
293	{
294		.gpio		= AT91_PIN_PA31,
295		.code		= BTN_4,
296		.desc		= "Button 4",
297		.active_low	= 1,
298		.wakeup		= 1,
299	}
300};
301
302static struct gpio_keys_platform_data ek_button_data = {
303	.buttons	= ek_buttons,
304	.nbuttons	= ARRAY_SIZE(ek_buttons),
305};
306
307static struct platform_device ek_button_device = {
308	.name		= "gpio-keys",
309	.id		= -1,
310	.num_resources	= 0,
311	.dev		= {
312		.platform_data	= &ek_button_data,
313	}
314};
315
316static void __init ek_add_device_buttons(void)
317{
318	at91_set_gpio_input(AT91_PIN_PA30, 1);	/* btn3 */
319	at91_set_deglitch(AT91_PIN_PA30, 1);
320	at91_set_gpio_input(AT91_PIN_PA31, 1);	/* btn4 */
321	at91_set_deglitch(AT91_PIN_PA31, 1);
322
323	platform_device_register(&ek_button_device);
324}
325#else
326static void __init ek_add_device_buttons(void) {}
327#endif
328
329
330static void __init ek_board_init(void)
331{
332	/* Serial */
333	at91_add_device_serial();
334	/* USB Host */
335	at91_add_device_usbh(&ek_usbh_data);
336	/* USB Device */
337	at91_add_device_udc(&ek_udc_data);
338	/* SPI */
339	at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
340	/* NAND */
341	ek_add_device_nand();
342	/* Ethernet */
343	at91_add_device_eth(&ek_macb_data);
344	/* MMC */
345	at91_add_device_mmc(0, &ek_mmc_data);
346	/* I2C */
347	at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
348	/* SSC (to AT73C213) */
349	at73c213_set_clk(&at73c213_data);
350	at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
351	/* LEDs */
352	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
353	/* Push Buttons */
354	ek_add_device_buttons();
355}
356
357MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
358	/* Maintainer: Atmel */
359	.phys_io	= AT91_BASE_SYS,
360	.io_pg_offst	= (AT91_VA_BASE_SYS >> 18) & 0xfffc,
361	.boot_params	= AT91_SDRAM_BASE + 0x100,
362	.timer		= &at91sam926x_timer,
363	.map_io		= ek_map_io,
364	.init_irq	= ek_init_irq,
365	.init_machine	= ek_board_init,
366MACHINE_END
367