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