• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ek_map_io(void)52 static void __init ek_map_io(void)
53 {
54 	/* Initialize processor: 18.432 MHz crystal */
55 	at91sam9260_initialize(18432000);
56 
57 	/* DGBU 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 
ek_init_irq(void)72 static void __init ek_init_irq(void)
73 {
74 	at91sam9260_init_interrupts(NULL);
75 }
76 
77 
78 /*
79  * USB Host port
80  */
81 static struct at91_usbh_data __initdata ek_usbh_data = {
82 	.ports		= 2,
83 };
84 
85 /*
86  * USB Device port
87  */
88 static 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  */
97 static 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)
at73c213_set_clk(struct at73c213_board_info * info)103 static 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
at73c213_set_clk(struct at73c213_board_info * info)120 static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
121 #endif
122 
123 /*
124  * SPI devices.
125  */
126 static 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  */
159 static 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  */
168 static 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 
nand_partitions(int size,int * num_partitions)181 static 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 
187 static 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 
201 static 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 
ek_add_device_nand(void)219 static 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  */
237 static 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  */
249 static 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  */
266 static struct at24_platform_data at24c512 = {
267 	.byte_len	= SZ_512K / 8,
268 	.page_size	= 128,
269 	.flags		= AT24_FLAG_ADDR16,
270 };
271 
272 static 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)
285 static 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 
302 static struct gpio_keys_platform_data ek_button_data = {
303 	.buttons	= ek_buttons,
304 	.nbuttons	= ARRAY_SIZE(ek_buttons),
305 };
306 
307 static 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 
ek_add_device_buttons(void)316 static 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
ek_add_device_buttons(void)326 static void __init ek_add_device_buttons(void) {}
327 #endif
328 
329 
ek_board_init(void)330 static 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 
357 MACHINE_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,
366 MACHINE_END
367