• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/arm/mach-at91/
1/*
2 * linux/arch/arm/mach-at91/board-sam9261ek.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/ads7846.h>
29#include <linux/spi/at73c213.h>
30#include <linux/clk.h>
31#include <linux/dm9000.h>
32#include <linux/fb.h>
33#include <linux/gpio_keys.h>
34#include <linux/input.h>
35
36#include <video/atmel_lcdc.h>
37
38#include <asm/setup.h>
39#include <asm/mach-types.h>
40#include <asm/irq.h>
41
42#include <asm/mach/arch.h>
43#include <asm/mach/map.h>
44#include <asm/mach/irq.h>
45
46#include <mach/hardware.h>
47#include <mach/board.h>
48#include <mach/gpio.h>
49#include <mach/at91sam9_smc.h>
50#include <mach/at91_shdwc.h>
51
52#include "sam9_smc.h"
53#include "generic.h"
54
55
56static void __init ek_map_io(void)
57{
58	/* Initialize processor: 18.432 MHz crystal */
59	at91sam9261_initialize(18432000);
60
61	/* Setup the LEDs */
62	at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14);
63
64	/* DBGU on ttyS0. (Rx & Tx only) */
65	at91_register_uart(0, 0, 0);
66
67	/* set serial console to ttyS0 (ie, DBGU) */
68	at91_set_serial_console(0);
69}
70
71static void __init ek_init_irq(void)
72{
73	at91sam9261_init_interrupts(NULL);
74}
75
76
77/*
78 * DM9000 ethernet device
79 */
80#if defined(CONFIG_DM9000)
81static struct resource dm9000_resource[] = {
82	[0] = {
83		.start	= AT91_CHIPSELECT_2,
84		.end	= AT91_CHIPSELECT_2 + 3,
85		.flags	= IORESOURCE_MEM
86	},
87	[1] = {
88		.start	= AT91_CHIPSELECT_2 + 0x44,
89		.end	= AT91_CHIPSELECT_2 + 0xFF,
90		.flags	= IORESOURCE_MEM
91	},
92	[2] = {
93		.start	= AT91_PIN_PC11,
94		.end	= AT91_PIN_PC11,
95		.flags	= IORESOURCE_IRQ
96			| IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
97	}
98};
99
100static struct dm9000_plat_data dm9000_platdata = {
101	.flags		= DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
102};
103
104static struct platform_device dm9000_device = {
105	.name		= "dm9000",
106	.id		= 0,
107	.num_resources	= ARRAY_SIZE(dm9000_resource),
108	.resource	= dm9000_resource,
109	.dev		= {
110		.platform_data	= &dm9000_platdata,
111	}
112};
113
114/*
115 * SMC timings for the DM9000.
116 * Note: These timings were calculated for MASTER_CLOCK = 100000000 according to the DM9000 timings.
117 */
118static struct sam9_smc_config __initdata dm9000_smc_config = {
119	.ncs_read_setup		= 0,
120	.nrd_setup		= 2,
121	.ncs_write_setup	= 0,
122	.nwe_setup		= 2,
123
124	.ncs_read_pulse		= 8,
125	.nrd_pulse		= 4,
126	.ncs_write_pulse	= 8,
127	.nwe_pulse		= 4,
128
129	.read_cycle		= 16,
130	.write_cycle		= 16,
131
132	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16,
133	.tdf_cycles		= 1,
134};
135
136static void __init ek_add_device_dm9000(void)
137{
138	/* Configure chip-select 2 (DM9000) */
139	sam9_smc_configure(2, &dm9000_smc_config);
140
141	/* Configure Reset signal as output */
142	at91_set_gpio_output(AT91_PIN_PC10, 0);
143
144	/* Configure Interrupt pin as input, no pull-up */
145	at91_set_gpio_input(AT91_PIN_PC11, 0);
146
147	platform_device_register(&dm9000_device);
148}
149#else
150static void __init ek_add_device_dm9000(void) {}
151#endif /* CONFIG_DM9000 */
152
153
154/*
155 * USB Host Port
156 */
157static struct at91_usbh_data __initdata ek_usbh_data = {
158	.ports		= 2,
159};
160
161
162/*
163 * USB Device Port
164 */
165static struct at91_udc_data __initdata ek_udc_data = {
166	.vbus_pin	= AT91_PIN_PB29,
167	.pullup_pin	= 0,		/* pull-up driven by UDC */
168};
169
170
171/*
172 * NAND flash
173 */
174static struct mtd_partition __initdata ek_nand_partition[] = {
175	{
176		.name	= "Partition 1",
177		.offset	= 0,
178		.size	= SZ_256K,
179	},
180	{
181		.name	= "Partition 2",
182		.offset	= MTDPART_OFS_NXTBLK,
183		.size	= MTDPART_SIZ_FULL,
184	},
185};
186
187static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
188{
189	*num_partitions = ARRAY_SIZE(ek_nand_partition);
190	return ek_nand_partition;
191}
192
193static struct atmel_nand_data __initdata ek_nand_data = {
194	.ale		= 22,
195	.cle		= 21,
196//	.det_pin	= ... not connected
197	.rdy_pin	= AT91_PIN_PC15,
198	.enable_pin	= AT91_PIN_PC14,
199	.partition_info	= nand_partitions,
200#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
201	.bus_width_16	= 1,
202#else
203	.bus_width_16	= 0,
204#endif
205};
206
207static struct sam9_smc_config __initdata ek_nand_smc_config = {
208	.ncs_read_setup		= 0,
209	.nrd_setup		= 1,
210	.ncs_write_setup	= 0,
211	.nwe_setup		= 1,
212
213	.ncs_read_pulse		= 3,
214	.nrd_pulse		= 3,
215	.ncs_write_pulse	= 3,
216	.nwe_pulse		= 3,
217
218	.read_cycle		= 5,
219	.write_cycle		= 5,
220
221	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
222	.tdf_cycles		= 2,
223};
224
225static void __init ek_add_device_nand(void)
226{
227	/* setup bus-width (8 or 16) */
228	if (ek_nand_data.bus_width_16)
229		ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
230	else
231		ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
232
233	/* configure chip-select 3 (NAND) */
234	sam9_smc_configure(3, &ek_nand_smc_config);
235
236	at91_add_device_nand(&ek_nand_data);
237}
238
239/*
240 * SPI related devices
241 */
242#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
243
244/*
245 * ADS7846 Touchscreen
246 */
247#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
248
249static int ads7843_pendown_state(void)
250{
251	return !at91_get_gpio_value(AT91_PIN_PC2);	/* Touchscreen PENIRQ */
252}
253
254static struct ads7846_platform_data ads_info = {
255	.model			= 7843,
256	.x_min			= 150,
257	.x_max			= 3830,
258	.y_min			= 190,
259	.y_max			= 3830,
260	.vref_delay_usecs	= 100,
261	.x_plate_ohms		= 450,
262	.y_plate_ohms		= 250,
263	.pressure_max		= 15000,
264	.debounce_max		= 1,
265	.debounce_rep		= 0,
266	.debounce_tol		= (~0),
267	.get_pendown_state	= ads7843_pendown_state,
268};
269
270static void __init ek_add_device_ts(void)
271{
272	at91_set_B_periph(AT91_PIN_PC2, 1);	/* External IRQ0, with pullup */
273	at91_set_gpio_input(AT91_PIN_PA11, 1);	/* Touchscreen BUSY signal */
274}
275#else
276static void __init ek_add_device_ts(void) {}
277#endif
278
279/*
280 * Audio
281 */
282static struct at73c213_board_info at73c213_data = {
283	.ssc_id		= 1,
284#if defined(CONFIG_MACH_AT91SAM9261EK)
285	.shortname	= "AT91SAM9261-EK external DAC",
286#else
287	.shortname	= "AT91SAM9G10-EK external DAC",
288#endif
289};
290
291#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
292static void __init at73c213_set_clk(struct at73c213_board_info *info)
293{
294	struct clk *pck2;
295	struct clk *plla;
296
297	pck2 = clk_get(NULL, "pck2");
298	plla = clk_get(NULL, "plla");
299
300	/* AT73C213 MCK Clock */
301	at91_set_B_periph(AT91_PIN_PB31, 0);	/* PCK2 */
302
303	clk_set_parent(pck2, plla);
304	clk_put(plla);
305
306	info->dac_clk = pck2;
307}
308#else
309static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
310#endif
311
312/*
313 * SPI devices
314 */
315static struct spi_board_info ek_spi_devices[] = {
316	{	/* DataFlash chip */
317		.modalias	= "mtd_dataflash",
318		.chip_select	= 0,
319		.max_speed_hz	= 15 * 1000 * 1000,
320		.bus_num	= 0,
321	},
322#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
323	{
324		.modalias	= "ads7846",
325		.chip_select	= 2,
326		.max_speed_hz	= 125000 * 26,	/* (max sample rate @ 3V) * (cmd + data + overhead) */
327		.bus_num	= 0,
328		.platform_data	= &ads_info,
329		.irq		= AT91SAM9261_ID_IRQ0,
330		.controller_data = (void *) AT91_PIN_PA28,	/* CS pin */
331	},
332#endif
333#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
334	{	/* DataFlash card - jumper (J12) configurable to CS3 or CS0 */
335		.modalias	= "mtd_dataflash",
336		.chip_select	= 3,
337		.max_speed_hz	= 15 * 1000 * 1000,
338		.bus_num	= 0,
339	},
340#elif defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
341	{	/* AT73C213 DAC */
342		.modalias	= "at73c213",
343		.chip_select	= 3,
344		.max_speed_hz	= 10 * 1000 * 1000,
345		.bus_num	= 0,
346		.mode		= SPI_MODE_1,
347		.platform_data	= &at73c213_data,
348		.controller_data = (void*) AT91_PIN_PA29,	/* default for CS3 is PA6, but it must be PA29 */
349	},
350#endif
351};
352
353#else /* CONFIG_SPI_ATMEL_* */
354/* spi0 and mmc/sd share the same PIO pins: cannot be used at the same time */
355
356/*
357 * MCI (SD/MMC)
358 * det_pin, wp_pin and vcc_pin are not connected
359 */
360static struct at91_mmc_data __initdata ek_mmc_data = {
361	.wire4		= 1,
362};
363
364#endif /* CONFIG_SPI_ATMEL_* */
365
366
367/*
368 * LCD Controller
369 */
370#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
371
372#if defined(CONFIG_FB_ATMEL_STN)
373
374/* STN */
375static struct fb_videomode at91_stn_modes[] = {
376        {
377		.name           = "SP06Q002 @ 75",
378		.refresh        = 75,
379		.xres           = 320,          .yres           = 240,
380		.pixclock       = KHZ2PICOS(1440),
381
382		.left_margin    = 1,            .right_margin   = 1,
383		.upper_margin   = 0,            .lower_margin   = 0,
384		.hsync_len      = 1,            .vsync_len      = 1,
385
386		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
387		.vmode          = FB_VMODE_NONINTERLACED,
388        },
389};
390
391static struct fb_monspecs at91fb_default_stn_monspecs = {
392        .manufacturer   = "HIT",
393        .monitor        = "SP06Q002",
394
395        .modedb         = at91_stn_modes,
396        .modedb_len     = ARRAY_SIZE(at91_stn_modes),
397        .hfmin          = 15000,
398        .hfmax          = 64000,
399        .vfmin          = 50,
400        .vfmax          = 150,
401};
402
403#define AT91SAM9261_DEFAULT_STN_LCDCON2	(ATMEL_LCDC_MEMOR_LITTLE \
404					| ATMEL_LCDC_DISTYPE_STNMONO \
405					| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE \
406					| ATMEL_LCDC_IFWIDTH_4 \
407					| ATMEL_LCDC_SCANMOD_SINGLE)
408
409static void at91_lcdc_stn_power_control(int on)
410{
411	/* backlight */
412	if (on) {	/* power up */
413		at91_set_gpio_value(AT91_PIN_PC14, 0);
414		at91_set_gpio_value(AT91_PIN_PC15, 0);
415	} else {	/* power down */
416		at91_set_gpio_value(AT91_PIN_PC14, 1);
417		at91_set_gpio_value(AT91_PIN_PC15, 1);
418	}
419}
420
421static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
422	.default_bpp			= 1,
423	.default_dmacon			= ATMEL_LCDC_DMAEN,
424	.default_lcdcon2		= AT91SAM9261_DEFAULT_STN_LCDCON2,
425	.default_monspecs		= &at91fb_default_stn_monspecs,
426	.atmel_lcdfb_power_control	= at91_lcdc_stn_power_control,
427	.guard_time			= 1,
428#if defined(CONFIG_MACH_AT91SAM9G10EK)
429	.lcd_wiring_mode		= ATMEL_LCDC_WIRING_RGB,
430#endif
431};
432
433#else
434
435/* TFT */
436static struct fb_videomode at91_tft_vga_modes[] = {
437	{
438	        .name           = "TX09D50VM1CCA @ 60",
439		.refresh	= 60,
440		.xres		= 240,		.yres		= 320,
441		.pixclock	= KHZ2PICOS(4965),
442
443		.left_margin	= 1,		.right_margin	= 33,
444		.upper_margin	= 1,		.lower_margin	= 0,
445		.hsync_len	= 5,		.vsync_len	= 1,
446
447		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
448		.vmode		= FB_VMODE_NONINTERLACED,
449	},
450};
451
452static struct fb_monspecs at91fb_default_tft_monspecs = {
453	.manufacturer	= "HIT",
454	.monitor        = "TX09D50VM1CCA",
455
456	.modedb		= at91_tft_vga_modes,
457	.modedb_len	= ARRAY_SIZE(at91_tft_vga_modes),
458	.hfmin		= 15000,
459	.hfmax		= 64000,
460	.vfmin		= 50,
461	.vfmax		= 150,
462};
463
464#define AT91SAM9261_DEFAULT_TFT_LCDCON2	(ATMEL_LCDC_MEMOR_LITTLE \
465					| ATMEL_LCDC_DISTYPE_TFT    \
466					| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
467
468static void at91_lcdc_tft_power_control(int on)
469{
470	if (on)
471		at91_set_gpio_value(AT91_PIN_PA12, 0);	/* power up */
472	else
473		at91_set_gpio_value(AT91_PIN_PA12, 1);	/* power down */
474}
475
476static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
477	.lcdcon_is_backlight		= true,
478	.default_bpp			= 16,
479	.default_dmacon			= ATMEL_LCDC_DMAEN,
480	.default_lcdcon2		= AT91SAM9261_DEFAULT_TFT_LCDCON2,
481	.default_monspecs		= &at91fb_default_tft_monspecs,
482	.atmel_lcdfb_power_control	= at91_lcdc_tft_power_control,
483	.guard_time			= 1,
484#if defined(CONFIG_MACH_AT91SAM9G10EK)
485	.lcd_wiring_mode		= ATMEL_LCDC_WIRING_RGB,
486#endif
487};
488#endif
489
490#else
491static struct atmel_lcdfb_info __initdata ek_lcdc_data;
492#endif
493
494
495/*
496 * GPIO Buttons
497 */
498#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
499static struct gpio_keys_button ek_buttons[] = {
500	{
501		.gpio		= AT91_PIN_PA27,
502		.code		= BTN_0,
503		.desc		= "Button 0",
504		.active_low	= 1,
505		.wakeup		= 1,
506	},
507	{
508		.gpio		= AT91_PIN_PA26,
509		.code		= BTN_1,
510		.desc		= "Button 1",
511		.active_low	= 1,
512		.wakeup		= 1,
513	},
514	{
515		.gpio		= AT91_PIN_PA25,
516		.code		= BTN_2,
517		.desc		= "Button 2",
518		.active_low	= 1,
519		.wakeup		= 1,
520	},
521	{
522		.gpio		= AT91_PIN_PA24,
523		.code		= BTN_3,
524		.desc		= "Button 3",
525		.active_low	= 1,
526		.wakeup		= 1,
527	}
528};
529
530static struct gpio_keys_platform_data ek_button_data = {
531	.buttons	= ek_buttons,
532	.nbuttons	= ARRAY_SIZE(ek_buttons),
533};
534
535static struct platform_device ek_button_device = {
536	.name		= "gpio-keys",
537	.id		= -1,
538	.num_resources	= 0,
539	.dev		= {
540		.platform_data	= &ek_button_data,
541	}
542};
543
544static void __init ek_add_device_buttons(void)
545{
546	at91_set_gpio_input(AT91_PIN_PA27, 1);	/* btn0 */
547	at91_set_deglitch(AT91_PIN_PA27, 1);
548	at91_set_gpio_input(AT91_PIN_PA26, 1);	/* btn1 */
549	at91_set_deglitch(AT91_PIN_PA26, 1);
550	at91_set_gpio_input(AT91_PIN_PA25, 1);	/* btn2 */
551	at91_set_deglitch(AT91_PIN_PA25, 1);
552	at91_set_gpio_input(AT91_PIN_PA24, 1);	/* btn3 */
553	at91_set_deglitch(AT91_PIN_PA24, 1);
554
555	platform_device_register(&ek_button_device);
556}
557#else
558static void __init ek_add_device_buttons(void) {}
559#endif
560
561/*
562 * LEDs
563 */
564static struct gpio_led ek_leds[] = {
565	{	/* "bottom" led, green, userled1 to be defined */
566		.name			= "ds7",
567		.gpio			= AT91_PIN_PA14,
568		.active_low		= 1,
569		.default_trigger	= "none",
570	},
571	{	/* "top" led, green, userled2 to be defined */
572		.name			= "ds8",
573		.gpio			= AT91_PIN_PA13,
574		.active_low		= 1,
575		.default_trigger	= "none",
576	},
577	{	/* "power" led, yellow */
578		.name			= "ds1",
579		.gpio			= AT91_PIN_PA23,
580		.default_trigger	= "heartbeat",
581	}
582};
583
584static void __init ek_board_init(void)
585{
586	/* Serial */
587	at91_add_device_serial();
588	/* USB Host */
589	at91_add_device_usbh(&ek_usbh_data);
590	/* USB Device */
591	at91_add_device_udc(&ek_udc_data);
592	/* I2C */
593	at91_add_device_i2c(NULL, 0);
594	/* NAND */
595	ek_add_device_nand();
596	/* DM9000 ethernet */
597	ek_add_device_dm9000();
598
599	/* spi0 and mmc/sd share the same PIO pins */
600#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
601	/* SPI */
602	at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
603	/* Touchscreen */
604	ek_add_device_ts();
605	/* SSC (to AT73C213) */
606	at73c213_set_clk(&at73c213_data);
607	at91_add_device_ssc(AT91SAM9261_ID_SSC1, ATMEL_SSC_TX);
608#else
609	/* MMC */
610	at91_add_device_mmc(0, &ek_mmc_data);
611#endif
612	/* LCD Controller */
613	at91_add_device_lcdc(&ek_lcdc_data);
614	/* Push Buttons */
615	ek_add_device_buttons();
616	/* LEDs */
617	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
618}
619
620#if defined(CONFIG_MACH_AT91SAM9261EK)
621MACHINE_START(AT91SAM9261EK, "Atmel AT91SAM9261-EK")
622#else
623MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")
624#endif
625	/* Maintainer: Atmel */
626	.phys_io	= AT91_BASE_SYS,
627	.io_pg_offst	= (AT91_VA_BASE_SYS >> 18) & 0xfffc,
628	.boot_params	= AT91_SDRAM_BASE + 0x100,
629	.timer		= &at91sam926x_timer,
630	.map_io		= ek_map_io,
631	.init_irq	= ek_init_irq,
632	.init_machine	= ek_board_init,
633MACHINE_END
634