| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 | /* *  Copyright (C) 2005 SAN People *  Copyright (C) 2008 Atmel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <linux/types.h>#include <linux/gpio.h>#include <linux/init.h>#include <linux/mm.h>#include <linux/module.h>#include <linux/platform_device.h>#include <linux/spi/spi.h>#include <linux/spi/at73c213.h>#include <linux/gpio_keys.h>#include <linux/input.h>#include <linux/clk.h>#include <linux/regulator/machine.h>#include <linux/regulator/fixed.h>#include <linux/regulator/consumer.h>#include <linux/platform_data/at91_adc.h>#include <mach/hardware.h>#include <asm/setup.h>#include <asm/mach-types.h>#include <asm/irq.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include <asm/mach/irq.h>#include <mach/at91sam9_smc.h>#include <mach/system_rev.h>#include "at91_aic.h"#include "board.h"#include "sam9_smc.h"#include "generic.h"/* * board revision encoding * bit 0: * 	0 => 1 sd/mmc slot * 	1 => 2 sd/mmc slots connectors (board from revision C) */#define HAVE_2MMC	(1 << 0)static int inline ek_have_2mmc(void){	return machine_is_at91sam9g20ek_2mmc() || (system_rev & HAVE_2MMC);}static void __init ek_init_early(void){	/* Initialize processor: 18.432 MHz crystal */	at91_initialize(18432000);}/* * USB Host port */static struct at91_usbh_data __initdata ek_usbh_data = {	.ports		= 2,	.vbus_pin	= {-EINVAL, -EINVAL},	.overcurrent_pin= {-EINVAL, -EINVAL},};/* * USB Device port */static struct at91_udc_data __initdata ek_udc_data = {	.vbus_pin	= AT91_PIN_PC5,	.pullup_pin	= -EINVAL,		/* pull-up driven by UDC */};/* * SPI devices. */static struct spi_board_info ek_spi_devices[] = {#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)	{	/* DataFlash chip */		.modalias	= "mtd_dataflash",		.chip_select	= 1,		.max_speed_hz	= 15 * 1000 * 1000,		.bus_num	= 0,	},#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)	{	/* DataFlash card */		.modalias	= "mtd_dataflash",		.chip_select	= 0,		.max_speed_hz	= 15 * 1000 * 1000,		.bus_num	= 0,	},#endif#endif};/* * MACB Ethernet device */static struct macb_platform_data __initdata ek_macb_data = {	.phy_irq_pin	= AT91_PIN_PA7,	.is_rmii	= 1,};static void __init ek_add_device_macb(void){	if (ek_have_2mmc())		ek_macb_data.phy_irq_pin = AT91_PIN_PB0;	at91_add_device_eth(&ek_macb_data);}/* * NAND flash */static struct mtd_partition __initdata ek_nand_partition[] = {	{		.name   = "Bootstrap",		.offset = 0,		.size   = 4 * SZ_1M,	},	{		.name	= "Partition 1",		.offset	= MTDPART_OFS_NXTBLK,		.size	= 60 * SZ_1M,	},	{		.name	= "Partition 2",		.offset	= MTDPART_OFS_NXTBLK,		.size	= MTDPART_SIZ_FULL,	},};/* det_pin is not connected */static struct atmel_nand_data __initdata ek_nand_data = {	.ale		= 21,	.cle		= 22,	.rdy_pin	= AT91_PIN_PC13,	.enable_pin	= AT91_PIN_PC14,	.det_pin	= -EINVAL,	.ecc_mode	= NAND_ECC_SOFT,	.on_flash_bbt	= 1,	.parts		= ek_nand_partition,	.num_parts	= ARRAY_SIZE(ek_nand_partition),};static struct sam9_smc_config __initdata ek_nand_smc_config = {	.ncs_read_setup		= 0,	.nrd_setup		= 2,	.ncs_write_setup	= 0,	.nwe_setup		= 2,	.ncs_read_pulse		= 4,	.nrd_pulse		= 4,	.ncs_write_pulse	= 4,	.nwe_pulse		= 4,	.read_cycle		= 7,	.write_cycle		= 7,	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,	.tdf_cycles		= 3,};static void __init ek_add_device_nand(void){	ek_nand_data.bus_width_16 = board_have_nand_16bit();	/* setup bus-width (8 or 16) */	if (ek_nand_data.bus_width_16)		ek_nand_smc_config.mode |= AT91_SMC_DBW_16;	else		ek_nand_smc_config.mode |= AT91_SMC_DBW_8;	/* configure chip-select 3 (NAND) */	sam9_smc_configure(0, 3, &ek_nand_smc_config);	at91_add_device_nand(&ek_nand_data);}/* * MCI (SD/MMC) * wp_pin and vcc_pin are not connected */static struct mci_platform_data __initdata ek_mmc_data = {	.slot[1] = {		.bus_width	= 4,		.detect_pin	= AT91_PIN_PC9,		.wp_pin		= -EINVAL,	},};static void __init ek_add_device_mmc(void){	if (ek_have_2mmc()) {		ek_mmc_data.slot[0].bus_width = 4;		ek_mmc_data.slot[0].detect_pin = AT91_PIN_PC2;		ek_mmc_data.slot[0].wp_pin = -1;	}	at91_add_device_mci(0, &ek_mmc_data);}/* * LEDs */static struct gpio_led ek_leds[] = {	{	/* "bottom" led, green, userled1 to be defined */		.name			= "ds5",		.gpio			= AT91_PIN_PA6,		.active_low		= 1,		.default_trigger	= "none",	},	{	/* "power" led, yellow */		.name			= "ds1",		.gpio			= AT91_PIN_PA9,		.default_trigger	= "heartbeat",	}};static void __init ek_add_device_gpio_leds(void){	if (ek_have_2mmc()) {		ek_leds[0].gpio = AT91_PIN_PB8;		ek_leds[1].gpio = AT91_PIN_PB9;	}	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));}/* * GPIO Buttons */#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)static struct gpio_keys_button ek_buttons[] = {	{		.gpio		= AT91_PIN_PA30,		.code		= BTN_3,		.desc		= "Button 3",		.active_low	= 1,		.wakeup		= 1,	},	{		.gpio		= AT91_PIN_PA31,		.code		= BTN_4,		.desc		= "Button 4",		.active_low	= 1,		.wakeup		= 1,	}};static struct gpio_keys_platform_data ek_button_data = {	.buttons	= ek_buttons,	.nbuttons	= ARRAY_SIZE(ek_buttons),};static struct platform_device ek_button_device = {	.name		= "gpio-keys",	.id		= -1,	.num_resources	= 0,	.dev		= {		.platform_data	= &ek_button_data,	}};static void __init ek_add_device_buttons(void){	at91_set_gpio_input(AT91_PIN_PA30, 1);	/* btn3 */	at91_set_deglitch(AT91_PIN_PA30, 1);	at91_set_gpio_input(AT91_PIN_PA31, 1);	/* btn4 */	at91_set_deglitch(AT91_PIN_PA31, 1);	platform_device_register(&ek_button_device);}#elsestatic void __init ek_add_device_buttons(void) {}#endif/* * ADCs */static struct at91_adc_data ek_adc_data = {	.channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3),	.use_external_triggers = true,	.vref = 3300,};#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)static struct regulator_consumer_supply ek_audio_consumer_supplies[] = {	REGULATOR_SUPPLY("AVDD", "0-001b"),	REGULATOR_SUPPLY("HPVDD", "0-001b"),	REGULATOR_SUPPLY("DBVDD", "0-001b"),	REGULATOR_SUPPLY("DCVDD", "0-001b"),};static struct regulator_init_data ek_avdd_reg_init_data = {	.constraints	= {		.name	= "3V3",		.valid_ops_mask = REGULATOR_CHANGE_STATUS,	},	.consumer_supplies = ek_audio_consumer_supplies,	.num_consumer_supplies = ARRAY_SIZE(ek_audio_consumer_supplies),};static struct fixed_voltage_config ek_vdd_pdata = {	.supply_name	= "board-3V3",	.microvolts	= 3300000,	.gpio		= -EINVAL,	.enabled_at_boot = 0,	.init_data	= &ek_avdd_reg_init_data,};static struct platform_device ek_voltage_regulator = {	.name		= "reg-fixed-voltage",	.id		= -1,	.num_resources	= 0,	.dev		= {		.platform_data	= &ek_vdd_pdata,	},};static void __init ek_add_regulators(void){	platform_device_register(&ek_voltage_regulator);}#elsestatic void __init ek_add_regulators(void) {}#endifstatic struct i2c_board_info __initdata ek_i2c_devices[] = {        {                I2C_BOARD_INFO("24c512", 0x50)        },        {                I2C_BOARD_INFO("wm8731", 0x1b)        },};static struct platform_device sam9g20ek_audio_device = {	.name   = "at91sam9g20ek-audio",	.id     = -1,};static void __init ek_add_device_audio(void){	platform_device_register(&sam9g20ek_audio_device);}static void __init ek_board_init(void){	/* Serial */	/* DBGU on ttyS0. (Rx & Tx only) */	at91_register_uart(0, 0, 0);	/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */	at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS			   | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD			   | ATMEL_UART_RI);	/* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */	at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);	at91_add_device_serial();	/* USB Host */	at91_add_device_usbh(&ek_usbh_data);	/* USB Device */	at91_add_device_udc(&ek_udc_data);	/* SPI */	at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));	/* NAND */	ek_add_device_nand();	/* Ethernet */	ek_add_device_macb();	/* Regulators */	ek_add_regulators();	/* MMC */	ek_add_device_mmc();	/* I2C */	at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));	/* LEDs */	ek_add_device_gpio_leds();	/* Push Buttons */	ek_add_device_buttons();	/* ADCs */	at91_add_device_adc(&ek_adc_data);	/* PCK0 provides MCLK to the WM8731 */	at91_set_B_periph(AT91_PIN_PC1, 0);	/* SSC (for WM8731) */	at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);	ek_add_device_audio();}MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")	/* Maintainer: Atmel */	.timer		= &at91sam926x_timer,	.map_io		= at91_map_io,	.handle_irq	= at91_aic_handle_irq,	.init_early	= ek_init_early,	.init_irq	= at91_init_irq_default,	.init_machine	= ek_board_init,MACHINE_ENDMACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")	/* Maintainer: Atmel */	.timer		= &at91sam926x_timer,	.map_io		= at91_map_io,	.handle_irq	= at91_aic_handle_irq,	.init_early	= ek_init_early,	.init_irq	= at91_init_irq_default,	.init_machine	= ek_board_init,MACHINE_END
 |