diff options
| author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2010-09-21 18:01:37 +0200 | 
|---|---|---|
| committer | Nicolas Ferre <nicolas.ferre@atmel.com> | 2010-10-07 19:56:31 +0200 | 
| commit | a6e016f19d393fbe4e040bee8155b03b840fa689 (patch) | |
| tree | b68b4a7d8c999a75b0693f7f82b8083e5508ad3f /arch | |
| parent | 9a400da84ffe7205b9921c87ac24069217442c84 (diff) | |
| download | linux-a6e016f19d393fbe4e040bee8155b03b840fa689.tar.bz2 | |
AT91: at91sam9g20ek: merge 2mmc version in one board
The board-sam9g20ek-2slot-mmc.c was a revision of the at91sam9g20ek
since board revision C. It contains 2 sd/mmc slots.
This merge keep the support of the old machine ID
MACH_AT91SAM9G20EK_2MMC for backward compatibility.
Now we use the ATAG to pass the hardware functionality to kernel
with this board revision encoding
 bit 0:
     0 => 1 sd/mmc slot
     1 => 2 sd/mmc slots connectors (board from revision C)
system_rev tested on Barebox commit d8f3ee103a9f4bd
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/configs/at91sam9g20ek_defconfig | 1 | ||||
| -rw-r--r-- | arch/arm/mach-at91/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm/mach-at91/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c | 329 | ||||
| -rw-r--r-- | arch/arm/mach-at91/board-sam9g20ek.c | 74 | 
5 files changed, 70 insertions, 336 deletions
| diff --git a/arch/arm/configs/at91sam9g20ek_defconfig b/arch/arm/configs/at91sam9g20ek_defconfig index f1bac70d6ce9..9e90e6d79297 100644 --- a/arch/arm/configs/at91sam9g20ek_defconfig +++ b/arch/arm/configs/at91sam9g20ek_defconfig @@ -13,6 +13,7 @@ CONFIG_MODULE_UNLOAD=y  CONFIG_ARCH_AT91=y  CONFIG_ARCH_AT91SAM9G20=y  CONFIG_MACH_AT91SAM9G20EK=y +CONFIG_MACH_AT91SAM9G20EK_2MMC=y  CONFIG_AT91_PROGRAMMABLE_CLOCKS=y  # CONFIG_ARM_THUMB is not set  CONFIG_AEABI=y diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 7b6ae6d274b4..23bf5c2c0fab 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -338,6 +338,7 @@ config MACH_AT91SAM9G20EK  	  that embeds only one SD/MMC slot.  config MACH_AT91SAM9G20EK_2MMC +	depends on MACH_AT91SAM9G20EK  	bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots"  	select HAVE_NAND_ATMEL_BUSWIDTH_16  	help diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 585ede048966..3a07a3696441 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -61,7 +61,6 @@ obj-$(CONFIG_MACH_AT91SAM9RLEK)	+= board-sam9rlek.o  # AT91SAM9G20 board-specific support  obj-$(CONFIG_MACH_AT91SAM9G20EK) += board-sam9g20ek.o -obj-$(CONFIG_MACH_AT91SAM9G20EK_2MMC) += board-sam9g20ek-2slot-mmc.o  obj-$(CONFIG_MACH_CPU9G20)	+= board-cpu9krea.o  obj-$(CONFIG_MACH_STAMP9G20)	+= board-stamp9g20.o  obj-$(CONFIG_MACH_PORTUXG20)	+= board-stamp9g20.o diff --git a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c deleted file mode 100644 index c49f5c003ee1..000000000000 --- a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - *  Copyright (C) 2005 SAN People - *  Copyright (C) 2008 Atmel - *  Copyright (C) 2009 Rob Emanuele - * - * 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/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/clk.h> -#include <linux/regulator/machine.h> -#include <linux/regulator/fixed.h> -#include <linux/regulator/consumer.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/board.h> -#include <mach/gpio.h> -#include <mach/at91sam9_smc.h> - -#include "sam9_smc.h" -#include "generic.h" - - -static void __init ek_map_io(void) -{ -	/* Initialize processor: 18.432 MHz crystal */ -	at91sam9260_initialize(18432000); - -	/* DGBU 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); - -	/* set serial console to ttyS0 (ie, DBGU) */ -	at91_set_serial_console(0); -} - -static void __init ek_init_irq(void) -{ -	at91sam9260_init_interrupts(NULL); -} - - -/* - * USB Host port - */ -static struct at91_usbh_data __initdata ek_usbh_data = { -	.ports		= 2, -}; - -/* - * USB Device port - */ -static struct at91_udc_data __initdata ek_udc_data = { -	.vbus_pin	= AT91_PIN_PC5, -	.pullup_pin	= 0,		/* pull-up driven by UDC */ -}; - - -/* - * SPI devices. - */ -static struct spi_board_info ek_spi_devices[] = { -#if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91)) -	{	/* 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 at91_eth_data __initdata ek_macb_data = { -	.phy_irq_pin	= AT91_PIN_PB0, -	.is_rmii	= 1, -}; - - -/* - * 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, -	}, -}; - -static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) -{ -	*num_partitions = ARRAY_SIZE(ek_nand_partition); -	return ek_nand_partition; -} - -/* 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, -	.partition_info	= nand_partitions, -#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) -	.bus_width_16	= 1, -#else -	.bus_width_16	= 0, -#endif -}; - -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) -{ -	/* 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(3, &ek_nand_smc_config); - -	at91_add_device_nand(&ek_nand_data); -} - - -/* - * MCI (SD/MMC) - * wp_pin is not connected - */ -#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) -static struct mci_platform_data __initdata ek_mmc_data = { -	.slot[0] = { -		.bus_width	= 4, -		.detect_pin	= AT91_PIN_PC2, -		.wp_pin		= -ENODEV, -	}, -	.slot[1] = { -		.bus_width	= 4, -		.detect_pin	= AT91_PIN_PC9, -		.wp_pin		= -ENODEV, -	}, - -}; -#else -static struct at91_mmc_data __initdata ek_mmc_data = { -	.slot_b		= 1,	/* Only one slot so use slot B */ -	.wire4		= 1, -	.det_pin	= AT91_PIN_PC9, -}; -#endif - -/* - * LEDs - */ -static struct gpio_led ek_leds[] = { -	{	/* "bottom" led, green, userled1 to be defined */ -		.name			= "ds5", -		.gpio			= AT91_PIN_PB8, -		.active_low		= 1, -		.default_trigger	= "none", -	}, -	{	/* "power" led, yellow */ -		.name			= "ds1", -		.gpio			= AT91_PIN_PB9, -		.default_trigger	= "heartbeat", -	} -}; - -#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); -} -#else -static void __init ek_add_regulators(void) {} -#endif - -static struct i2c_board_info __initdata ek_i2c_devices[] = { -	{ -		I2C_BOARD_INFO("24c512", 0x50), -	}, -}; - - -static void __init ek_board_init(void) -{ -	/* Serial */ -	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 */ -	at91_add_device_eth(&ek_macb_data); -	/* Regulators */ -	ek_add_regulators(); -	/* MMC */ -#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) -	at91_add_device_mci(0, &ek_mmc_data); -#else -	at91_add_device_mmc(0, &ek_mmc_data); -#endif -	/* I2C */ -	at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); -	/* LEDs */ -	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); -	/* 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); -} - -MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod") -	/* Maintainer: Rob Emanuele */ -	.phys_io	= AT91_BASE_SYS, -	.io_pg_offst	= (AT91_VA_BASE_SYS >> 18) & 0xfffc, -	.boot_params	= AT91_SDRAM_BASE + 0x100, -	.timer		= &at91sam926x_timer, -	.map_io		= ek_map_io, -	.init_irq	= ek_init_irq, -	.init_machine	= ek_board_init, -MACHINE_END diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 6ea9808b8868..b463e340c4a0 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -47,6 +47,18 @@  #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_map_io(void)  { @@ -94,7 +106,7 @@ static struct at91_udc_data __initdata ek_udc_data = {   * SPI devices.   */  static struct spi_board_info ek_spi_devices[] = { -#if !defined(CONFIG_MMC_AT91) +#if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91))  	{	/* DataFlash chip */  		.modalias	= "mtd_dataflash",  		.chip_select	= 1, @@ -121,6 +133,13 @@ static struct at91_eth_data __initdata ek_macb_data = {  	.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 @@ -198,13 +217,36 @@ static void __init ek_add_device_nand(void)  /*   * MCI (SD/MMC) - * det_pin, wp_pin and vcc_pin are not connected + * wp_pin and vcc_pin are not connected   */ +#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) +static struct mci_platform_data __initdata ek_mmc_data = { +	.slot[1] = { +		.bus_width	= 4, +		.detect_pin	= AT91_PIN_PC9, +	}, + +}; +#else  static struct at91_mmc_data __initdata ek_mmc_data = { -	.slot_b		= 1, +	.slot_b		= 1,	/* Only one slot so use slot B */  	.wire4		= 1, +	.det_pin	= AT91_PIN_PC9,  }; +#endif +static void __init ek_add_device_mmc(void) +{ +#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) +	if (ek_have_2mmc()) { +		ek_mmc_data.slot[0].bus_width = 4; +		ek_mmc_data.slot[0].detect_pin = AT91_PIN_PC2; +	} +	at91_add_device_mci(0, &ek_mmc_data); +#else +	at91_add_device_mmc(0, &ek_mmc_data); +#endif +}  /*   * LEDs @@ -223,6 +265,15 @@ static struct gpio_led ek_leds[] = {  	}  }; +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 @@ -336,15 +387,15 @@ static void __init ek_board_init(void)  	/* NAND */  	ek_add_device_nand();  	/* Ethernet */ -	at91_add_device_eth(&ek_macb_data); +	ek_add_device_macb();  	/* Regulators */  	ek_add_regulators();  	/* MMC */ -	at91_add_device_mmc(0, &ek_mmc_data); +	ek_add_device_mmc();  	/* I2C */  	at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));  	/* LEDs */ -	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); +	ek_add_device_gpio_leds();  	/* Push Buttons */  	ek_add_device_buttons();  	/* PCK0 provides MCLK to the WM8731 */ @@ -363,3 +414,14 @@ MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")  	.init_irq	= ek_init_irq,  	.init_machine	= ek_board_init,  MACHINE_END + +MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod") +	/* Maintainer: Atmel */ +	.phys_io	= AT91_BASE_SYS, +	.io_pg_offst	= (AT91_VA_BASE_SYS >> 18) & 0xfffc, +	.boot_params	= AT91_SDRAM_BASE + 0x100, +	.timer		= &at91sam926x_timer, +	.map_io		= ek_map_io, +	.init_irq	= ek_init_irq, +	.init_machine	= ek_board_init, +MACHINE_END |