Linux Audio

Check our new training course

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