All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
@ 2009-06-17  0:54 Rob Emanuele
  2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
                   ` (6 more replies)
  0 siblings, 7 replies; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

Unification of the atmel-mci driver to support the AT91 processors MCI interface.  The atmel-mci driver currently supports the AVR32 and this patch adds AT91 support.

To use this new driver on a at91 the platform driver for your board needs to updated.  See the following patch for an example of how to do that.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 drivers/mmc/host/Kconfig     |   16 ++++++++++++----
 drivers/mmc/host/atmel-mci.c |   37 +++++++++++++++++++++++++++++++++----
 2 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 40111a6..a0eaf69 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -135,6 +135,12 @@ config MMC_AU1X
 
 	  If unsure, say N.
 
+choice
+	prompt "Atmel MMC Driver"
+	default MMC_ATMELMCI if AVR32
+	help
+	  Choose which driver to use for the Atmel MCI Silicon
+
 config MMC_AT91
 	tristate "AT91 SD/MMC Card Interface support"
 	depends on ARCH_AT91
@@ -145,17 +151,19 @@ config MMC_AT91
 
 config MMC_ATMELMCI
 	tristate "Atmel Multimedia Card Interface support"
-	depends on AVR32
+	depends on AVR32 || ARCH_AT91
 	help
 	  This selects the Atmel Multimedia Card Interface driver. If
-	  you have an AT32 (AVR32) platform with a Multimedia Card
-	  slot, say Y or M here.
+	  you have an AT32 (AVR32) or AT91 platform with a Multimedia
+	  Card slot, say Y or M here.
 
 	  If unsure, say N.
 
+endchoice
+
 config MMC_ATMELMCI_DMA
 	bool "Atmel MCI DMA support (EXPERIMENTAL)"
-	depends on MMC_ATMELMCI && DMA_ENGINE && EXPERIMENTAL
+	depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
 	help
 	  Say Y here to have the Atmel MCI driver use a DMA engine to
 	  do data transfers and thus increase the throughput and
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 7b603e4..98b25de 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -30,11 +30,14 @@
 #include <asm/io.h>
 #include <asm/unaligned.h>
 
+#include <mach/cpu.h>
 #include <mach/board.h>
 
 #include "atmel-mci-regs.h"
 
-#define ATMCI_DATA_ERROR_FLAGS	(MCI_DCRCE | MCI_DTOE | MCI_OVRE | MCI_UNRE)
+#define ATMCI_DATA_ERROR_FLAGS	(MCI_RINDE | MCI_RDIRE | MCI_RCRCE  \
+				 | MCI_RENDE | MCI_RTOE | MCI_DCRCE \
+				 | MCI_DTOE | MCI_OVRE | MCI_UNRE)
 #define ATMCI_DMA_THRESHOLD	16
 
 enum {
@@ -210,6 +213,18 @@ struct atmel_mci_slot {
 	set_bit(event, &host->pending_events)
 
 /*
+ * Enable or disable features/registers based on
+ * whether the processor supports them
+ */
+static bool mci_has_rwproof(void)
+{
+	if (cpu_is_at91sam9261() || cpu_is_at91rm9200())
+		return false;
+	else
+		return true;
+}
+
+/*
  * The debugfs stuff below is mostly optimized away when
  * CONFIG_DEBUG_FS is not set.
  */
@@ -276,8 +291,13 @@ static void atmci_show_status_reg(struct seq_file *s,
 		[3]	= "BLKE",
 		[4]	= "DTIP",
 		[5]	= "NOTBUSY",
+		[6]	= "ENDRX",
+		[7]	= "ENDTX",
 		[8]	= "SDIOIRQA",
 		[9]	= "SDIOIRQB",
+		[12]	= "SDIOWAIT",
+		[14]	= "RXBUFF",
+		[15]	= "TXBUFE",
 		[16]	= "RINDE",
 		[17]	= "RDIRE",
 		[18]	= "RCRCE",
@@ -285,6 +305,11 @@ static void atmci_show_status_reg(struct seq_file *s,
 		[20]	= "RTOE",
 		[21]	= "DCRCE",
 		[22]	= "DTOE",
+		[23]    = "CSTOE",
+		[24]    = "BLKOVRE",
+		[25]    = "DMADONE",
+		[26]    = "FIFOEMPTY",
+		[27]    = "XFRDONE",
 		[30]	= "OVRE",
 		[31]	= "UNRE",
 	};
@@ -849,13 +874,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 			clkdiv = 255;
 		}
 
+		host->mode_reg = MCI_MR_CLKDIV(clkdiv);
+
 		/*
 		 * WRPROOF and RDPROOF prevent overruns/underruns by
 		 * stopping the clock when the FIFO is full/empty.
 		 * This state is not expected to last for long.
 		 */
-		host->mode_reg = MCI_MR_CLKDIV(clkdiv) | MCI_MR_WRPROOF
-					| MCI_MR_RDPROOF;
+		if (mci_has_rwproof())
+			host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF);
 
 		if (list_empty(&host->queue))
 			mci_writel(host, MR, host->mode_reg);
@@ -1648,8 +1675,10 @@ static int __init atmci_probe(struct platform_device *pdev)
 			nr_slots++;
 	}
 
-	if (!nr_slots)
+	if (!nr_slots) {
+		printk(KERN_ERR "Atmel MCI controller init failed.  atmci_init_slot error or no slots with bus_width > 0.\n");
 		goto err_init_slot;
+	}
 
 	dev_info(&pdev->dev,
 			"Atmel MCI controller at 0x%08lx irq %d, %u slots\n",
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
@ 2009-06-17  0:54 ` Rob Emanuele
  2009-06-17 10:27   ` Nicolas Ferre
  2009-06-18 19:58   ` Andrew Victor
  2009-06-17  0:54 ` [PATCH 3/6] atmel-mci: Optional controller reset before every command Rob Emanuele
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

Created a modified version of the at91sam9g20 evaluation kit platform (board-sam9g20ek-2slot-mmc.c) and device support to make use of the updated atmel-mci driver.

This patch shows how an AT91 developer could add support for both SD slots for their project.

This requires getting the most updated arch/arm/tools/mach-types from http://www.arm.linux.org.uk/developer/machines/download.php to have the machine type for the modified at91sam9g20ek.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 arch/arm/mach-at91/Kconfig                     |    7 +
 arch/arm/mach-at91/Makefile                    |    1 +
 arch/arm/mach-at91/at91sam9260_devices.c       |   95 ++++++++
 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |  277 ++++++++++++++++++++++++
 arch/arm/mach-at91/include/mach/board.h        |    5 +
 5 files changed, 385 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 323b47f..5c8d770 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -276,6 +276,13 @@ config MACH_AT91SAM9G20EK
 	help
 	  Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit.
 
+config MACH_AT91SAM9G20EK_2MMC
+	bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
+	depends on ARCH_AT91SAM9G20
+	help
+	  Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
+	  Rev A or B modified for 2 MMC Slots.
+
 endif
 
 # ----------------------------------------------------------
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c69ff23..cdddba8 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -54,6 +54,7 @@ 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
 
 # AT91CAP9 board-specific support
 obj-$(CONFIG_MACH_AT91CAP9ADK)	+= board-cap9adk.o
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index d74c9ac..c372f4f 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -278,6 +278,101 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
 void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
 #endif
 
+/* --------------------------------------------------------------------
+ *  MMC / SD Slot for Atmel MCI Driver
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
+static u64 mmc_dmamask = DMA_BIT_MASK(32);
+static struct mci_platform_data mmc_data;
+
+static struct resource mmc_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_MCI,
+		.end	= AT91SAM9260_BASE_MCI + SZ_16K - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= AT91SAM9260_ID_MCI,
+		.end	= AT91SAM9260_ID_MCI,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device at91sam9260_mmc_device = {
+	.name		= "atmel_mci",
+	.id		= -1,
+	.dev		= {
+				.dma_mask		= &mmc_dmamask,
+				.coherent_dma_mask	= DMA_BIT_MASK(32),
+				.platform_data		= &mmc_data,
+	},
+	.resource	= mmc_resources,
+	.num_resources	= ARRAY_SIZE(mmc_resources),
+};
+
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
+{
+	unsigned int i;
+	unsigned int slot_count = 0;
+
+	if (!data)
+		return;
+
+	for (i = 0; i < ATMEL_MCI_MAX_NR_SLOTS; i++) {
+	   if (data->slot[i].bus_width) {
+			/* input/irq */
+			if (data->slot[i].detect_pin) {
+				at91_set_gpio_input(data->slot[i].detect_pin, 1);
+				at91_set_deglitch(data->slot[i].detect_pin, 1);
+			}
+			if (data->slot[i].wp_pin)
+				at91_set_gpio_input(data->slot[i].wp_pin, 1);
+
+			switch(i) {
+			case 0:
+				/* CMD */
+				at91_set_A_periph(AT91_PIN_PA7, 1);
+				/* DAT0, maybe DAT1..DAT3 */
+				at91_set_A_periph(AT91_PIN_PA6, 1);
+				if (data->slot[i].bus_width == 4) {
+					at91_set_A_periph(AT91_PIN_PA9, 1);
+					at91_set_A_periph(AT91_PIN_PA10, 1);
+					at91_set_A_periph(AT91_PIN_PA11, 1);
+				}
+				break;
+			case 1:
+				/* CMD */
+				at91_set_B_periph(AT91_PIN_PA1, 1);
+				/* DAT0, maybe DAT1..DAT3 */
+				at91_set_B_periph(AT91_PIN_PA0, 1);
+				if (data->slot[i].bus_width == 4) {
+					at91_set_B_periph(AT91_PIN_PA5, 1);
+					at91_set_B_periph(AT91_PIN_PA4, 1);
+					at91_set_B_periph(AT91_PIN_PA3, 1);
+				}
+				break;
+			default:
+				printk("Configuration Error, No MMC Port %d\n",i);
+				break;
+			};
+			slot_count++;
+		}
+	}
+
+	if (slot_count) {
+		/* CLK */
+		at91_set_A_periph(AT91_PIN_PA8, 0);
+
+		mmc_data = *data;
+		platform_device_register(&at91sam9260_mmc_device);
+	}
+}
+#else
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
+#endif
+
+
 
 /* --------------------------------------------------------------------
  *  NAND / SmartMedia
diff --git a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
new file mode 100644
index 0000000..a28e53f
--- /dev/null
+++ b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
@@ -0,0 +1,277 @@
+/*
+ *  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 <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)
+	{	/* 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_PC12,
+	.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)
+ * det_pin and wp_pin are 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	= -ENODEV,
+		.wp_pin		= -ENODEV,
+	},
+	.slot[1] = {
+		.bus_width	= 4,
+		.detect_pin	= -ENODEV,
+		.wp_pin		= -ENODEV,
+	},
+
+};
+#else
+static struct amci_platform_data __initdata ek_mmc_data = {
+};
+#endif
+
+/*
+ * LEDs
+ */
+static struct gpio_led ek_leds[] = {
+	{	/* "bottom" led, green, userled1 to be defined */
+		.name			= "ds5",
+		.gpio			= AT91_PIN_PB12,
+		.active_low		= 1,
+		.default_trigger	= "none",
+	},
+	{	/* "power" led, yellow */
+		.name			= "ds1",
+		.gpio			= AT91_PIN_PB13,
+		.default_trigger	= "heartbeat",
+	}
+};
+
+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);
+	/* MMC */
+	at91_add_device_mci(0, &ek_mmc_data);
+	/* 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/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
index e6afff8..a635dad 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -37,6 +37,7 @@
 #include <linux/leds.h>
 #include <linux/spi/spi.h>
 #include <linux/usb/atmel_usba_udc.h>
+#include <linux/atmel-mci.h>
 
  /* USB Device */
 struct at91_udc_data {
@@ -63,6 +64,7 @@ struct at91_cf_data {
 extern void __init at91_add_device_cf(struct at91_cf_data *data);
 
  /* MMC / SD */
+  /* at91_mci platform config */
 struct at91_mmc_data {
 	u8		det_pin;	/* card detect IRQ */
 	unsigned	slot_b:1;	/* uses Slot B */
@@ -72,6 +74,9 @@ struct at91_mmc_data {
 };
 extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data);
 
+  /* atmel-mci platform config */
+extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);
+
  /* Ethernet (EMAC & MACB) */
 struct at91_eth_data {
 	u32		phy_mask;
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 3/6] atmel-mci: Optional controller reset before every command
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
  2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
@ 2009-06-17  0:54 ` Rob Emanuele
  2009-06-17  8:32   ` Marc Pignat
  2009-06-17  0:54 ` [PATCH 4/6] atmel-mci: CLKDIV cap to restrict the MCI controller speed Rob Emanuele
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

This patch adds the compile time configuration option for the atmel-mci driver to reset the Atmel MCI controller before every command.

This is sometimes needed for the Atmel controller / board to function properly.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 drivers/mmc/host/Kconfig     |   10 ++++++++++
 drivers/mmc/host/atmel-mci.c |   11 ++++++++++-
 2 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index a0eaf69..5875125 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -161,6 +161,16 @@ config MMC_ATMELMCI
 
 endchoice
 
+config MMC_ATMELMCI_ALWAYS_RESET
+	bool "Reset before every request.  Sometimes needed for buggy chips."
+	depends on MMC_ATMELMCI
+	help
+	  There are reports that some buggy controllers work better
+	  with a reset before every command.  This may improve your
+	  controller's reliability.
+
+	  If unsure, say N.
+
 config MMC_ATMELMCI_DMA
 	bool "Atmel MCI DMA support (EXPERIMENTAL)"
 	depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 98b25de..e5894f6 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -63,6 +63,15 @@ struct atmel_mci_dma {
 #endif
 };
 
+/*
+ * Configuration options from the kernel config
+ */
+#ifdef CONFIG_MMC_ATMELMCI_ALWAYS_RESET
+#define MMC_ALWAYS_RESET 1
+#else
+#define MMC_ALWAYS_RESET 0
+#endif
+
 /**
  * struct atmel_mci - MMC controller state shared between all slots
  * @lock: Spinlock protecting the queue and associated data.
@@ -720,7 +729,7 @@ static void atmci_start_request(struct atmel_mci *host,
 	host->completed_events = 0;
 	host->data_status = 0;
 
-	if (host->need_reset) {
+	if (host->need_reset || MMC_ALWAYS_RESET) {
 		mci_writel(host, CR, MCI_CR_SWRST);
 		mci_writel(host, CR, MCI_CR_MCIEN);
 		mci_writel(host, MR, host->mode_reg);
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 4/6] atmel-mci: CLKDIV cap to restrict the MCI controller speed
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
  2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
  2009-06-17  0:54 ` [PATCH 3/6] atmel-mci: Optional controller reset before every command Rob Emanuele
@ 2009-06-17  0:54 ` Rob Emanuele
  2009-06-17  0:54 ` [PATCH 5/6] atmel-mci: Power control option for each MMC Slot Rob Emanuele
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

This patch adds the compile time configuration option for the atmel-mci driver to cap the MCI CLKDIV register value to a minimum value.

This is useful for debugging and for boards that have a long mci clock line.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 drivers/mmc/host/Kconfig     |   14 ++++++++++++++
 drivers/mmc/host/atmel-mci.c |   10 ++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 5875125..b628037 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -161,6 +161,20 @@ config MMC_ATMELMCI
 
 endchoice
 
+config MMC_ATMELMCI_CLKDIV_CAP
+	int "Cap the CLKDIV to keep the controller from going too fast."
+	depends on MMC_ATMELMCI
+	default 0
+	range 0 255
+	help
+	  This is the lowest value the clock divisor for the MMC
+	  controller can be.  Value is between 0 and 255.
+	  MCI_CK = MCK/(2*(CLKDIV+1))
+	  Raising this value may improve your controller's reliability
+	  at the cost of speed.
+
+	  If unsure, leave at 0.
+
 config MMC_ATMELMCI_ALWAYS_RESET
 	bool "Reset before every request.  Sometimes needed for buggy chips."
 	depends on MMC_ATMELMCI
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index e5894f6..601dae7 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -72,6 +72,10 @@ struct atmel_mci_dma {
 #define MMC_ALWAYS_RESET 0
 #endif
 
+#ifndef CONFIG_MMC_ATMELMCI_CLKDIV_CAP
+#define CONFIG_MMC_ATMELMCI_CLKDIV_CAP 0
+#endif
+
 /**
  * struct atmel_mci - MMC controller state shared between all slots
  * @lock: Spinlock protecting the queue and associated data.
@@ -882,6 +886,12 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 				clock_min, host->bus_hz / (2 * 256));
 			clkdiv = 255;
 		}
+		if (clkdiv < CONFIG_MMC_ATMELMCI_CLKDIV_CAP) {
+			dev_warn(&mmc->class_dev,
+				"clkdiv %u too fast; capped using %u\n",
+				 clkdiv, CONFIG_MMC_ATMELMCI_CLKDIV_CAP);
+			clkdiv = CONFIG_MMC_ATMELMCI_CLKDIV_CAP;
+		}
 
 		host->mode_reg = MCI_MR_CLKDIV(clkdiv);
 
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 5/6] atmel-mci: Power control option for each MMC Slot
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
                   ` (2 preceding siblings ...)
  2009-06-17  0:54 ` [PATCH 4/6] atmel-mci: CLKDIV cap to restrict the MCI controller speed Rob Emanuele
@ 2009-06-17  0:54 ` Rob Emanuele
  2009-06-17  8:08   ` Marc Pignat
  2009-06-17  0:54 ` [PATCH 6/6] atmel-mci: Platform driver MMC slot power control Rob Emanuele
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

Add support to the atmel-mci driver for a VCC pin in order to conserve power by removing power from an MMC Slot.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 drivers/mmc/host/atmel-mci.c |   33 ++++++++++++++++++++-------------
 include/linux/atmel-mci.h    |    2 ++
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 601dae7..63cd5c7 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -214,6 +214,8 @@ struct atmel_mci_slot {
 	int			detect_pin;
 	int			wp_pin;
 	bool			detect_is_active_high;
+	int			vcc_pin;
+	bool			vcc_active_low;
 
 	struct timer_list	detect_timer;
 };
@@ -932,23 +934,19 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	}
 
 	switch (ios->power_mode) {
+	case MMC_POWER_OFF:
+		if (gpio_is_valid(slot->vcc_pin))
+			gpio_set_value(slot->vcc_pin, slot->vcc_active_low);
+		break;
 	case MMC_POWER_UP:
+		if (gpio_is_valid(slot->vcc_pin))
+			gpio_set_value(slot->vcc_pin, !slot->vcc_active_low);
 		set_bit(ATMCI_CARD_NEED_INIT, &slot->flags);
 		break;
-	default:
-		/*
-		 * TODO: None of the currently available AVR32-based
-		 * boards allow MMC power to be turned off. Implement
-		 * power control when this can be tested properly.
-		 *
-		 * We also need to hook this into the clock management
-		 * somehow so that newly inserted cards aren't
-		 * subjected to a fast clock before we have a chance
-		 * to figure out what the maximum rate is. Currently,
-		 * there's no way to avoid this, and there never will
-		 * be for boards that don't support power control.
-		 */
+	case MMC_POWER_ON:
 		break;
+	default:
+		WARN_ON(1);
 	}
 }
 
@@ -1507,6 +1505,8 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 	slot->detect_pin = slot_data->detect_pin;
 	slot->wp_pin = slot_data->wp_pin;
 	slot->detect_is_active_high = slot_data->detect_is_active_high;
+	slot->vcc_pin = slot_data->vcc_pin;
+	slot->vcc_active_low = slot_data->vcc_active_low;
 	slot->sdc_reg = sdc_reg;
 
 	mmc->ops = &atmci_ops;
@@ -1544,6 +1544,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
 		}
 	}
 
+	if (gpio_is_valid(slot->vcc_pin)) {
+		if (gpio_request(slot->vcc_pin, "mmc_pow")) {
+			dev_dbg(&mmc->class_dev, "no power pin available\n");
+			slot->vcc_pin = -EBUSY;
+		}
+	}
+
 	host->slot[id] = slot;
 	mmc_add_host(mmc);
 
diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h
index 57b1846..7c15a7c 100644
--- a/include/linux/atmel-mci.h
+++ b/include/linux/atmel-mci.h
@@ -26,6 +26,8 @@ struct mci_slot_pdata {
 	int			detect_pin;
 	int			wp_pin;
 	bool			detect_is_active_high;
+	int			vcc_pin;
+	unsigned		vcc_active_low:1;
 };
 
 /**
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 6/6] atmel-mci: Platform driver MMC slot power control
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
                   ` (3 preceding siblings ...)
  2009-06-17  0:54 ` [PATCH 5/6] atmel-mci: Power control option for each MMC Slot Rob Emanuele
@ 2009-06-17  0:54 ` Rob Emanuele
  2009-06-17  1:23   ` Ryan Mallon
  2009-06-17  9:56 ` [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Nicolas Ferre
  2009-06-23 17:39   ` Nicolas Ferre
  6 siblings, 1 reply; 21+ messages in thread
From: Rob Emanuele @ 2009-06-17  0:54 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel, Rob Emanuele

Add support to the at91sam9g20ek_2mmc platform (board-sam9g20ek-2slot-mmc.c) and support files for a VCC pin using the atmel-mci driver.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
---
 arch/arm/mach-at91/at91sam9260_devices.c       |    2 ++
 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |    3 +++
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index c372f4f..7634632 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -328,6 +328,8 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
 			}
 			if (data->slot[i].wp_pin)
 				at91_set_gpio_input(data->slot[i].wp_pin, 1);
+			if (data->slot[i].vcc_pin)
+				at91_set_gpio_output(data->slot[i].vcc_pin, 0);
 
 			switch(i) {
 			case 0:
diff --git a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
index a28e53f..20c6738 100644
--- a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
+++ b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
@@ -202,11 +202,14 @@ static struct mci_platform_data __initdata ek_mmc_data = {
 		.bus_width	= 4,
 		.detect_pin	= -ENODEV,
 		.wp_pin		= -ENODEV,
+		.vcc_pin	= AT91_PIN_PA30,
+		.vcc_active_low	= 1,
 	},
 	.slot[1] = {
 		.bus_width	= 4,
 		.detect_pin	= -ENODEV,
 		.wp_pin		= -ENODEV,
+		.vcc_pin	= -ENODEV,
 	},
 
 };
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH 6/6] atmel-mci: Platform driver MMC slot power control
  2009-06-17  0:54 ` [PATCH 6/6] atmel-mci: Platform driver MMC slot power control Rob Emanuele
@ 2009-06-17  1:23   ` Ryan Mallon
  0 siblings, 0 replies; 21+ messages in thread
From: Ryan Mallon @ 2009-06-17  1:23 UTC (permalink / raw)
  To: Rob Emanuele
  Cc: nicolas.ferre, haavard.skinnemoen, linux-arm-kernel, linux-kernel

Rob Emanuele wrote:
> Add support to the at91sam9g20ek_2mmc platform (board-sam9g20ek-2slot-mmc.c) and support files for a VCC pin using the atmel-mci driver.
> 
> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> ---
>  arch/arm/mach-at91/at91sam9260_devices.c       |    2 ++
>  arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |    3 +++
>  2 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
> index c372f4f..7634632 100644
> --- a/arch/arm/mach-at91/at91sam9260_devices.c
> +++ b/arch/arm/mach-at91/at91sam9260_devices.c
> @@ -328,6 +328,8 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
>  			}
>  			if (data->slot[i].wp_pin)
>  				at91_set_gpio_input(data->slot[i].wp_pin, 1);
> +			if (data->slot[i].vcc_pin)
> +				at91_set_gpio_output(data->slot[i].vcc_pin, 0);
>  

Can use gpio_direction_output on these.

~Ryan

-- 
Bluewater Systems Ltd - ARM Technology Solution Centre

       Ryan Mallon                              Unit 5, Amuri Park
       Phone: +64 3 3779127                     404 Barbadoes St
       Fax:   +64 3 3779135                     PO Box 13 889
       Email: ryan@bluewatersys.com             Christchurch, 8013
       Web:   http://www.bluewatersys.com       New Zealand
       Freecall Australia  1800 148 751         USA 1800 261 2934

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 5/6] atmel-mci: Power control option for each MMC Slot
  2009-06-17  0:54 ` [PATCH 5/6] atmel-mci: Power control option for each MMC Slot Rob Emanuele
@ 2009-06-17  8:08   ` Marc Pignat
  0 siblings, 0 replies; 21+ messages in thread
From: Marc Pignat @ 2009-06-17  8:08 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Emanuele, nicolas.ferre, haavard.skinnemoen, linux-kernel

Hi!

On Wednesday 17 June 2009 02:54:38 Rob Emanuele wrote:
> Add support to the atmel-mci driver for a VCC pin in order to conserve power by removing power from an MMC Slot.
...

> @@ -1544,6 +1544,13 @@ static int __init atmci_init_slot(struct atmel_mci *host,
>  		}
>  	}
>  
> +	if (gpio_is_valid(slot->vcc_pin)) {
> +		if (gpio_request(slot->vcc_pin, "mmc_pow")) {

gpio_request will check for "gpio_is_valid" so this is not necessary.

> +			dev_dbg(&mmc->class_dev, "no power pin available\n");
> +			slot->vcc_pin = -EBUSY;
> +		}
> +	}
> +
...

Best regards

Marc

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 3/6] atmel-mci: Optional controller reset before every command
  2009-06-17  0:54 ` [PATCH 3/6] atmel-mci: Optional controller reset before every command Rob Emanuele
@ 2009-06-17  8:32   ` Marc Pignat
  2009-06-17 18:27     ` Robert Emanuele
  0 siblings, 1 reply; 21+ messages in thread
From: Marc Pignat @ 2009-06-17  8:32 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Rob Emanuele, nicolas.ferre, haavard.skinnemoen, linux-kernel

Hi!

On Wednesday 17 June 2009 02:54:36 Rob Emanuele wrote:
> This patch adds the compile time configuration option for the atmel-mci driver to reset the Atmel MCI controller before every command.
> 
> This is sometimes needed for the Atmel controller / board to function properly.
> 
> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> ---
>  drivers/mmc/host/Kconfig     |   10 ++++++++++
>  drivers/mmc/host/atmel-mci.c |   11 ++++++++++-
>  2 files changed, 20 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index a0eaf69..5875125 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -161,6 +161,16 @@ config MMC_ATMELMCI
>  
>  endchoice
>  
> +config MMC_ATMELMCI_ALWAYS_RESET
> +	bool "Reset before every request.  Sometimes needed for buggy chips."
> +	depends on MMC_ATMELMCI
> +	help
> +	  There are reports that some buggy controllers work better
> +	  with a reset before every command.  This may improve your
> +	  controller's reliability.
> +
> +	  If unsure, say N.
> +
>  config MMC_ATMELMCI_DMA
>  	bool "Atmel MCI DMA support (EXPERIMENTAL)"
>  	depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
> diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
> index 98b25de..e5894f6 100644
> --- a/drivers/mmc/host/atmel-mci.c
> +++ b/drivers/mmc/host/atmel-mci.c
> @@ -63,6 +63,15 @@ struct atmel_mci_dma {
>  #endif
>  };
>  
> +/*
> + * Configuration options from the kernel config
> + */
> +#ifdef CONFIG_MMC_ATMELMCI_ALWAYS_RESET
> +#define MMC_ALWAYS_RESET 1
> +#else
> +#define MMC_ALWAYS_RESET 0
> +#endif

Some chips are known to hang after (some) transfer. There is no need for this
configuration option, I think we should just do : 

#define MMC_ALWAYS_RESET (cpu_is_at91rm9200() || add_your_cpu_name_here())

> +
>  /**
>   * struct atmel_mci - MMC controller state shared between all slots
>   * @lock: Spinlock protecting the queue and associated data.
> @@ -720,7 +729,7 @@ static void atmci_start_request(struct atmel_mci *host,
>  	host->completed_events = 0;
>  	host->data_status = 0;
>  
> -	if (host->need_reset) {
> +	if (host->need_reset || MMC_ALWAYS_RESET) {
>  		mci_writel(host, CR, MCI_CR_SWRST);
>  		mci_writel(host, CR, MCI_CR_MCIEN);
>  		mci_writel(host, MR, host->mode_reg);

Another option is to always reset the controller.

The reset operation won't hurt, it is simple and fast, and the code will be
simpler and better tested.

Best regards

Marc

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
  2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
                   ` (4 preceding siblings ...)
  2009-06-17  0:54 ` [PATCH 6/6] atmel-mci: Platform driver MMC slot power control Rob Emanuele
@ 2009-06-17  9:56 ` Nicolas Ferre
  2009-06-17 10:08   ` Haavard Skinnemoen
  2009-06-23 17:39   ` Nicolas Ferre
  6 siblings, 1 reply; 21+ messages in thread
From: Nicolas Ferre @ 2009-06-17  9:56 UTC (permalink / raw)
  To: Rob Emanuele, haavard.skinnemoen; +Cc: linux-arm-kernel, linux-kernel

Rob, Haavard,

Rob Emanuele :
> Unification of the atmel-mci driver to support the AT91 processors MCI interface.  The atmel-mci driver currently supports the AVR32 and this patch adds AT91 support.
> 
> To use this new driver on a at91 the platform driver for your board needs to updated.  See the following patch for an example of how to do that.

I format those lines remove last sentence and add :
"Add read/write proof selection switch dependent on chip availability
 of this feature."


> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> ---
>  drivers/mmc/host/Kconfig     |   16 ++++++++++++----
>  drivers/mmc/host/atmel-mci.c |   37 +++++++++++++++++++++++++++++++++----
>  2 files changed, 45 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 40111a6..a0eaf69 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -135,6 +135,12 @@ config MMC_AU1X
>  
>  	  If unsure, say N.
>  
> +choice
> +	prompt "Atmel MMC Driver"

I add SD/MMC

> +	default MMC_ATMELMCI if AVR32
> +	help
> +	  Choose which driver to use for the Atmel MCI Silicon
> +
>  config MMC_AT91
>  	tristate "AT91 SD/MMC Card Interface support"
>  	depends on ARCH_AT91
> @@ -145,17 +151,19 @@ config MMC_AT91
>  
>  config MMC_ATMELMCI
>  	tristate "Atmel Multimedia Card Interface support"
> -	depends on AVR32
> +	depends on AVR32 || ARCH_AT91
>  	help
>  	  This selects the Atmel Multimedia Card Interface driver. If
> -	  you have an AT32 (AVR32) platform with a Multimedia Card
> -	  slot, say Y or M here.
> +	  you have an AT32 (AVR32) or AT91 platform with a Multimedia
> +	  Card slot, say Y or M here.
>  
>  	  If unsure, say N.
>  
> +endchoice
> +
>  config MMC_ATMELMCI_DMA
>  	bool "Atmel MCI DMA support (EXPERIMENTAL)"
> -	depends on MMC_ATMELMCI && DMA_ENGINE && EXPERIMENTAL
> +	depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
>  	help
>  	  Say Y here to have the Atmel MCI driver use a DMA engine to
>  	  do data transfers and thus increase the throughput and
> diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
> index 7b603e4..98b25de 100644
> --- a/drivers/mmc/host/atmel-mci.c
> +++ b/drivers/mmc/host/atmel-mci.c
> @@ -30,11 +30,14 @@
>  #include <asm/io.h>
>  #include <asm/unaligned.h>
>  
> +#include <mach/cpu.h>
>  #include <mach/board.h>
>  
>  #include "atmel-mci-regs.h"
>  
> -#define ATMCI_DATA_ERROR_FLAGS	(MCI_DCRCE | MCI_DTOE | MCI_OVRE | MCI_UNRE)
> +#define ATMCI_DATA_ERROR_FLAGS	(MCI_RINDE | MCI_RDIRE | MCI_RCRCE  \
> +				 | MCI_RENDE | MCI_RTOE | MCI_DCRCE \
> +				 | MCI_DTOE | MCI_OVRE | MCI_UNRE)

Haavard, is it ok to add those flags on an AVR32 platform for now ?

>  #define ATMCI_DMA_THRESHOLD	16
>  
>  enum {
> @@ -210,6 +213,18 @@ struct atmel_mci_slot {
>  	set_bit(event, &host->pending_events)
>  
>  /*
> + * Enable or disable features/registers based on
> + * whether the processor supports them
> + */
> +static bool mci_has_rwproof(void)
> +{
> +	if (cpu_is_at91sam9261() || cpu_is_at91rm9200())
> +		return false;
> +	else
> +		return true;
> +}
> +
> +/*
>   * The debugfs stuff below is mostly optimized away when
>   * CONFIG_DEBUG_FS is not set.
>   */
> @@ -276,8 +291,13 @@ static void atmci_show_status_reg(struct seq_file *s,
>  		[3]	= "BLKE",
>  		[4]	= "DTIP",
>  		[5]	= "NOTBUSY",
> +		[6]	= "ENDRX",
> +		[7]	= "ENDTX",
>  		[8]	= "SDIOIRQA",
>  		[9]	= "SDIOIRQB",
> +		[12]	= "SDIOWAIT",
> +		[14]	= "RXBUFF",
> +		[15]	= "TXBUFE",
>  		[16]	= "RINDE",
>  		[17]	= "RDIRE",
>  		[18]	= "RCRCE",
> @@ -285,6 +305,11 @@ static void atmci_show_status_reg(struct seq_file *s,
>  		[20]	= "RTOE",
>  		[21]	= "DCRCE",
>  		[22]	= "DTOE",
> +		[23]    = "CSTOE",
> +		[24]    = "BLKOVRE",
> +		[25]    = "DMADONE",
> +		[26]    = "FIFOEMPTY",
> +		[27]    = "XFRDONE",

Little indentation modifications.

>  		[30]	= "OVRE",
>  		[31]	= "UNRE",
>  	};
> @@ -849,13 +874,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  			clkdiv = 255;
>  		}
>  
> +		host->mode_reg = MCI_MR_CLKDIV(clkdiv);
> +
>  		/*
>  		 * WRPROOF and RDPROOF prevent overruns/underruns by
>  		 * stopping the clock when the FIFO is full/empty.
>  		 * This state is not expected to last for long.
>  		 */
> -		host->mode_reg = MCI_MR_CLKDIV(clkdiv) | MCI_MR_WRPROOF
> -					| MCI_MR_RDPROOF;
> +		if (mci_has_rwproof())
> +			host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF);
>  
>  		if (list_empty(&host->queue))
>  			mci_writel(host, MR, host->mode_reg);
> @@ -1648,8 +1675,10 @@ static int __init atmci_probe(struct platform_device *pdev)
>  			nr_slots++;
>  	}
>  
> -	if (!nr_slots)
> +	if (!nr_slots) {
> +		printk(KERN_ERR "Atmel MCI controller init failed.  atmci_init_slot error or no slots with bus_width > 0.\n");

I change this to :
dev_err(&pdev->dev, "init failed: no slot defined\n");

>  		goto err_init_slot;
> +	}
>  
>  	dev_info(&pdev->dev,
>  			"Atmel MCI controller at 0x%08lx irq %d, %u slots\n",

If Haavard is ok, I post the patch to Pierre Ossman with the tiny
modifications above (your SOB & From: preserved of course).

Thanks, Bye,
-- 
Nicolas Ferre


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
  2009-06-17  9:56 ` [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Nicolas Ferre
@ 2009-06-17 10:08   ` Haavard Skinnemoen
  2009-06-23 16:28     ` Nicolas Ferre
  0 siblings, 1 reply; 21+ messages in thread
From: Haavard Skinnemoen @ 2009-06-17 10:08 UTC (permalink / raw)
  To: Nicolas Ferre; +Cc: Rob Emanuele, linux-arm-kernel, linux-kernel

Nicolas Ferre wrote:
> > -#define ATMCI_DATA_ERROR_FLAGS	(MCI_DCRCE | MCI_DTOE | MCI_OVRE | MCI_UNRE)
> > +#define ATMCI_DATA_ERROR_FLAGS	(MCI_RINDE | MCI_RDIRE | MCI_RCRCE  \
> > +				 | MCI_RENDE | MCI_RTOE | MCI_DCRCE \
> > +				 | MCI_DTOE | MCI_OVRE | MCI_UNRE)  
> 
> Haavard, is it ok to add those flags on an AVR32 platform for now ?

It probably doesn't hurt on AVR32. But I'm not a great fan since it
seems like the wrong thing to do, and it may simply mask the real
problem.

Haavard

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver
  2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
@ 2009-06-17 10:27   ` Nicolas Ferre
  2009-06-18 19:58   ` Andrew Victor
  1 sibling, 0 replies; 21+ messages in thread
From: Nicolas Ferre @ 2009-06-17 10:27 UTC (permalink / raw)
  To: Rob Emanuele, Andrew Victor
  Cc: haavard.skinnemoen, linux-arm-kernel, linux-kernel

Rob Emanuele :
> Created a modified version of the at91sam9g20 evaluation kit platform (board-sam9g20ek-2slot-mmc.c) and device support to make use of the updated atmel-mci driver.
> 
> This patch shows how an AT91 developer could add support for both SD slots for their project.

Comment formated.

> This requires getting the most updated arch/arm/tools/mach-types from http://www.arm.linux.org.uk/developer/machines/download.php to have the machine type for the modified at91sam9g20ek.

Ok moved below "---"

> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> ---
>  arch/arm/mach-at91/Kconfig                     |    7 +
>  arch/arm/mach-at91/Makefile                    |    1 +
>  arch/arm/mach-at91/at91sam9260_devices.c       |   95 ++++++++
>  arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |  277 ++++++++++++++++++++++++
>  arch/arm/mach-at91/include/mach/board.h        |    5 +
>  5 files changed, 385 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
> 
> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
> index 323b47f..5c8d770 100644
> --- a/arch/arm/mach-at91/Kconfig
> +++ b/arch/arm/mach-at91/Kconfig
> @@ -276,6 +276,13 @@ config MACH_AT91SAM9G20EK
>  	help
>  	  Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit.
>  
> +config MACH_AT91SAM9G20EK_2MMC
> +	bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
> +	depends on ARCH_AT91SAM9G20
> +	help
> +	  Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
> +	  Rev A or B modified for 2 MMC Slots.
> +
>  endif
>  
>  # ----------------------------------------------------------
> diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
> index c69ff23..cdddba8 100644
> --- a/arch/arm/mach-at91/Makefile
> +++ b/arch/arm/mach-at91/Makefile
> @@ -54,6 +54,7 @@ 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
>  
>  # AT91CAP9 board-specific support
>  obj-$(CONFIG_MACH_AT91CAP9ADK)	+= board-cap9adk.o
> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
> index d74c9ac..c372f4f 100644
> --- a/arch/arm/mach-at91/at91sam9260_devices.c
> +++ b/arch/arm/mach-at91/at91sam9260_devices.c
> @@ -278,6 +278,101 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
>  void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
>  #endif
>  
> +/* --------------------------------------------------------------------
> + *  MMC / SD Slot for Atmel MCI Driver
> + * -------------------------------------------------------------------- */
> +
> +#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
> +static u64 mmc_dmamask = DMA_BIT_MASK(32);
> +static struct mci_platform_data mmc_data;
> +
> +static struct resource mmc_resources[] = {
> +	[0] = {
> +		.start	= AT91SAM9260_BASE_MCI,
> +		.end	= AT91SAM9260_BASE_MCI + SZ_16K - 1,
> +		.flags	= IORESOURCE_MEM,
> +	},
> +	[1] = {
> +		.start	= AT91SAM9260_ID_MCI,
> +		.end	= AT91SAM9260_ID_MCI,
> +		.flags	= IORESOURCE_IRQ,
> +	},
> +};
> +
> +static struct platform_device at91sam9260_mmc_device = {
> +	.name		= "atmel_mci",
> +	.id		= -1,
> +	.dev		= {
> +				.dma_mask		= &mmc_dmamask,
> +				.coherent_dma_mask	= DMA_BIT_MASK(32),
> +				.platform_data		= &mmc_data,
> +	},
> +	.resource	= mmc_resources,
> +	.num_resources	= ARRAY_SIZE(mmc_resources),
> +};
> +
> +void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
> +{
> +	unsigned int i;
> +	unsigned int slot_count = 0;
> +
> +	if (!data)
> +		return;
> +
> +	for (i = 0; i < ATMEL_MCI_MAX_NR_SLOTS; i++) {
> +	   if (data->slot[i].bus_width) {

Indentation.

> +			/* input/irq */
> +			if (data->slot[i].detect_pin) {
> +				at91_set_gpio_input(data->slot[i].detect_pin, 1);
> +				at91_set_deglitch(data->slot[i].detect_pin, 1);
> +			}
> +			if (data->slot[i].wp_pin)
> +				at91_set_gpio_input(data->slot[i].wp_pin, 1);
> +
> +			switch(i) {
> +			case 0:
> +				/* CMD */
> +				at91_set_A_periph(AT91_PIN_PA7, 1);
> +				/* DAT0, maybe DAT1..DAT3 */
> +				at91_set_A_periph(AT91_PIN_PA6, 1);
> +				if (data->slot[i].bus_width == 4) {
> +					at91_set_A_periph(AT91_PIN_PA9, 1);
> +					at91_set_A_periph(AT91_PIN_PA10, 1);
> +					at91_set_A_periph(AT91_PIN_PA11, 1);
> +				}

I put slot_count here...
+			slot_count++;

> +				break;
> +			case 1:
> +				/* CMD */
> +				at91_set_B_periph(AT91_PIN_PA1, 1);
> +				/* DAT0, maybe DAT1..DAT3 */
> +				at91_set_B_periph(AT91_PIN_PA0, 1);
> +				if (data->slot[i].bus_width == 4) {
> +					at91_set_B_periph(AT91_PIN_PA5, 1);
> +					at91_set_B_periph(AT91_PIN_PA4, 1);
> +					at91_set_B_periph(AT91_PIN_PA3, 1);
> +				}

and here...
+			slot_count++;

> +				break;
> +			default:
> +				printk("Configuration Error, No MMC Port %d\n",i);

Replaced with:
                      printk(KERN_ERR
                            "AT91: SD/MMC slot %d not available\n", i);


> +				break;
> +			};

removed here.

> +			slot_count++;
> +		}
> +	}
> +
> +	if (slot_count) {
> +		/* CLK */
> +		at91_set_A_periph(AT91_PIN_PA8, 0);
> +
> +		mmc_data = *data;
> +		platform_device_register(&at91sam9260_mmc_device);
> +	}
> +}
> +#else
> +void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
> +#endif
> +
> +
>  
>  /* --------------------------------------------------------------------
>   *  NAND / SmartMedia
> diff --git a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
> new file mode 100644
> index 0000000..a28e53f
> --- /dev/null
> +++ b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c

Ok. True that it duplicates code but it is simpler.
It also can be a testbed for future -EK revision D and following.

[..]


> diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
> index e6afff8..a635dad 100644
> --- a/arch/arm/mach-at91/include/mach/board.h
> +++ b/arch/arm/mach-at91/include/mach/board.h
> @@ -37,6 +37,7 @@
>  #include <linux/leds.h>
>  #include <linux/spi/spi.h>
>  #include <linux/usb/atmel_usba_udc.h>
> +#include <linux/atmel-mci.h>
>  
>   /* USB Device */
>  struct at91_udc_data {
> @@ -63,6 +64,7 @@ struct at91_cf_data {
>  extern void __init at91_add_device_cf(struct at91_cf_data *data);
>  
>   /* MMC / SD */
> +  /* at91_mci platform config */
>  struct at91_mmc_data {
>  	u8		det_pin;	/* card detect IRQ */
>  	unsigned	slot_b:1;	/* uses Slot B */
> @@ -72,6 +74,9 @@ struct at91_mmc_data {
>  };
>  extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data);
>  
> +  /* atmel-mci platform config */
> +extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);
> +
>   /* Ethernet (EMAC & MACB) */
>  struct at91_eth_data {
>  	u32		phy_mask;

Ok.


I post the patch to Andrew Victor with the tiny
modifications above (your SOB & From: preserved of course).

Thanks, Bye,

-- 
Nicolas Ferre


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 3/6] atmel-mci: Optional controller reset before every  command
  2009-06-17  8:32   ` Marc Pignat
@ 2009-06-17 18:27     ` Robert Emanuele
  0 siblings, 0 replies; 21+ messages in thread
From: Robert Emanuele @ 2009-06-17 18:27 UTC (permalink / raw)
  To: Marc Pignat
  Cc: linux-arm-kernel, nicolas.ferre, haavard.skinnemoen, linux-kernel

Marc,

(This may be a resend, gmail and its fancy text hates me.)

There has been debate over whether always reseting the MCI controller
is the correct thing to do.  I think for some platforms it is required
but there is no consensus to what those platforms are.  I think the
config option is the best of both worlds as a user of this
kernel/driver can choose to enable this or not without having to
modify their source.  It may even be a decent idea to enable this
option if they are using certain chips that we know reseting improves
their behavior.

Thank you,
Rob

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/6] atmel-mci: Platform configuration to the the  atmel-mci driver
  2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
  2009-06-17 10:27   ` Nicolas Ferre
@ 2009-06-18 19:58   ` Andrew Victor
  2009-06-18 20:00     ` Andrew Victor
  1 sibling, 1 reply; 21+ messages in thread
From: Andrew Victor @ 2009-06-18 19:58 UTC (permalink / raw)
  To: Rob Emanuele
  Cc: nicolas.ferre, haavard.skinnemoen, linux-arm-kernel, linux-kernel

hi,

> +          if (data->slot[i].bus_width) {
> +                       /* input/irq */
> +                       if (data->slot[i].detect_pin) {
> +                               at91_set_gpio_input(data->slot[i].detect_pin, 1);
> +                               at91_set_deglitch(data->slot[i].detect_pin, 1);
> +                       }
> +                       if (data->slot[i].wp_pin)
> +                               at91_set_gpio_input(data->slot[i].wp_pin, 1);

The current at91_mci also allows the driver to control the "vcc_pin".
Can that functionality be merged into atmel_mci driver?


Regards.
  Andre Victor

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/6] atmel-mci: Platform configuration to the the  atmel-mci driver
  2009-06-18 19:58   ` Andrew Victor
@ 2009-06-18 20:00     ` Andrew Victor
  0 siblings, 0 replies; 21+ messages in thread
From: Andrew Victor @ 2009-06-18 20:00 UTC (permalink / raw)
  To: Rob Emanuele
  Cc: nicolas.ferre, haavard.skinnemoen, linux-arm-kernel, linux-kernel

> The current at91_mci also allows the driver to control the "vcc_pin".
> Can that functionality be merged into atmel_mci driver?

Ignore that comment, I see it's in Patch 5.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
  2009-06-17 10:08   ` Haavard Skinnemoen
@ 2009-06-23 16:28     ` Nicolas Ferre
  0 siblings, 0 replies; 21+ messages in thread
From: Nicolas Ferre @ 2009-06-23 16:28 UTC (permalink / raw)
  To: Haavard Skinnemoen, Rob Emanuele
  Cc: linux-arm-kernel, linux-kernel, Pierre Ossman

Haavard Skinnemoen :
> Nicolas Ferre wrote:
>>> -#define ATMCI_DATA_ERROR_FLAGS	(MCI_DCRCE | MCI_DTOE | MCI_OVRE | MCI_UNRE)
>>> +#define ATMCI_DATA_ERROR_FLAGS	(MCI_RINDE | MCI_RDIRE | MCI_RCRCE  \
>>> +				 | MCI_RENDE | MCI_RTOE | MCI_DCRCE \
>>> +				 | MCI_DTOE | MCI_OVRE | MCI_UNRE)  
>> Haavard, is it ok to add those flags on an AVR32 platform for now ?
> 
> It probably doesn't hurt on AVR32. But I'm not a great fan since it
> seems like the wrong thing to do, and it may simply mask the real
> problem.

Agreed.

To move forward, I will submit a first patch series without those flags
added.

Best regards,
-- 
Nicolas Ferre


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 1/2] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
@ 2009-06-23 17:39   ` Nicolas Ferre
  2009-09-02  7:31     ` Haavard Skinnemoen
  0 siblings, 1 reply; 21+ messages in thread
From: Nicolas Ferre @ 2009-06-23 17:39 UTC (permalink / raw)
  To: pierre, avictor.za
  Cc: linux-kernel, haavard.skinnemoen, linux-arm-kernel, rob, nicolas.ferre

From: Rob Emanuele <rob@emanuele.us>

Unification of the atmel-mci driver to support the AT91 processors MCI
interface.  The atmel-mci driver currently supports the AVR32 and this patch
adds AT91 support.
Add read/write proof selection switch dependent on chip availability of this
feature.

To use this new driver on a at91 the platform driver for your board needs to
updated.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
[nicolas.ferre@atmel.com indent, Kconfig comment and one printk modification]
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
 drivers/mmc/host/Kconfig     |   16 ++++++++++++----
 drivers/mmc/host/atmel-mci.c |   33 ++++++++++++++++++++++++++++++---
 2 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index b4cf691..e779049 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -124,6 +124,12 @@ config MMC_AU1X
 
 	  If unsure, say N.
 
+choice
+	prompt "Atmel SD/MMC Driver"
+	default MMC_ATMELMCI if AVR32
+	help
+	  Choose which driver to use for the Atmel MCI Silicon
+
 config MMC_AT91
 	tristate "AT91 SD/MMC Card Interface support"
 	depends on ARCH_AT91
@@ -134,17 +140,19 @@ config MMC_AT91
 
 config MMC_ATMELMCI
 	tristate "Atmel Multimedia Card Interface support"
-	depends on AVR32
+	depends on AVR32 || ARCH_AT91
 	help
 	  This selects the Atmel Multimedia Card Interface driver. If
-	  you have an AT32 (AVR32) platform with a Multimedia Card
-	  slot, say Y or M here.
+	  you have an AT32 (AVR32) or AT91 platform with a Multimedia
+	  Card slot, say Y or M here.
 
 	  If unsure, say N.
 
+endchoice
+
 config MMC_ATMELMCI_DMA
 	bool "Atmel MCI DMA support (EXPERIMENTAL)"
-	depends on MMC_ATMELMCI && DMA_ENGINE && EXPERIMENTAL
+	depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
 	help
 	  Say Y here to have the Atmel MCI driver use a DMA engine to
 	  do data transfers and thus increase the throughput and
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 7b603e4..065fa81 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -30,6 +30,7 @@
 #include <asm/io.h>
 #include <asm/unaligned.h>
 
+#include <mach/cpu.h>
 #include <mach/board.h>
 
 #include "atmel-mci-regs.h"
@@ -210,6 +211,18 @@ struct atmel_mci_slot {
 	set_bit(event, &host->pending_events)
 
 /*
+ * Enable or disable features/registers based on
+ * whether the processor supports them
+ */
+static bool mci_has_rwproof(void)
+{
+	if (cpu_is_at91sam9261() || cpu_is_at91rm9200())
+		return false;
+	else
+		return true;
+}
+
+/*
  * The debugfs stuff below is mostly optimized away when
  * CONFIG_DEBUG_FS is not set.
  */
@@ -276,8 +289,13 @@ static void atmci_show_status_reg(struct seq_file *s,
 		[3]	= "BLKE",
 		[4]	= "DTIP",
 		[5]	= "NOTBUSY",
+		[6]	= "ENDRX",
+		[7]	= "ENDTX",
 		[8]	= "SDIOIRQA",
 		[9]	= "SDIOIRQB",
+		[12]	= "SDIOWAIT",
+		[14]	= "RXBUFF",
+		[15]	= "TXBUFE",
 		[16]	= "RINDE",
 		[17]	= "RDIRE",
 		[18]	= "RCRCE",
@@ -285,6 +303,11 @@ static void atmci_show_status_reg(struct seq_file *s,
 		[20]	= "RTOE",
 		[21]	= "DCRCE",
 		[22]	= "DTOE",
+		[23]	= "CSTOE",
+		[24]	= "BLKOVRE",
+		[25]	= "DMADONE",
+		[26]	= "FIFOEMPTY",
+		[27]	= "XFRDONE",
 		[30]	= "OVRE",
 		[31]	= "UNRE",
 	};
@@ -849,13 +872,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 			clkdiv = 255;
 		}
 
+		host->mode_reg = MCI_MR_CLKDIV(clkdiv);
+
 		/*
 		 * WRPROOF and RDPROOF prevent overruns/underruns by
 		 * stopping the clock when the FIFO is full/empty.
 		 * This state is not expected to last for long.
 		 */
-		host->mode_reg = MCI_MR_CLKDIV(clkdiv) | MCI_MR_WRPROOF
-					| MCI_MR_RDPROOF;
+		if (mci_has_rwproof())
+			host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF);
 
 		if (list_empty(&host->queue))
 			mci_writel(host, MR, host->mode_reg);
@@ -1648,8 +1673,10 @@ static int __init atmci_probe(struct platform_device *pdev)
 			nr_slots++;
 	}
 
-	if (!nr_slots)
+	if (!nr_slots) {
+		dev_err(&pdev->dev, "init failed: no slot defined\n");
 		goto err_init_slot;
+	}
 
 	dev_info(&pdev->dev,
 			"Atmel MCI controller at 0x%08lx irq %d, %u slots\n",
-- 
1.5.3.7


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 2/2] AT91: atmel-mci: Platform configuration to the the atmel-mci driver
@ 2009-06-23 17:39     ` Nicolas Ferre
  0 siblings, 0 replies; 21+ messages in thread
From: Nicolas Ferre @ 2009-06-23 17:39 UTC (permalink / raw)
  To: pierre, avictor.za
  Cc: linux-kernel, haavard.skinnemoen, linux-arm-kernel, rob, nicolas.ferre

From: Rob Emanuele <rob@emanuele.us>

Created a modified version of the at91sam9g20 evaluation kit platform
(board-sam9g20ek-2slot-mmc.c) and device support to make use of the updated
atmel-mci driver.
As the use of two slots modify GPIO pin allocation, we create another board
file.

Signed-off-by: Rob Emanuele <rob@emanuele.us>
[nicolas.ferre@atmel.com: printk, slot_count modification in at91sam9260_devices.c file]
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
This requires getting the most updated arch/arm/tools/mach-types from
http://www.arm.linux.org.uk/developer/machines/download.php to have the machine
type for the at91sam9g20ek-2slot-mmc board.

 arch/arm/mach-at91/Kconfig                     |    7 +
 arch/arm/mach-at91/Makefile                    |    1 +
 arch/arm/mach-at91/at91sam9260_devices.c       |   96 ++++++++
 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |  277 ++++++++++++++++++++++++
 arch/arm/mach-at91/include/mach/board.h        |    5 +
 5 files changed, 386 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 323b47f..5c8d770 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -276,6 +276,13 @@ config MACH_AT91SAM9G20EK
 	help
 	  Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit.
 
+config MACH_AT91SAM9G20EK_2MMC
+	bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
+	depends on ARCH_AT91SAM9G20
+	help
+	  Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
+	  Rev A or B modified for 2 MMC Slots.
+
 endif
 
 # ----------------------------------------------------------
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c69ff23..cdddba8 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -54,6 +54,7 @@ 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
 
 # AT91CAP9 board-specific support
 obj-$(CONFIG_MACH_AT91CAP9ADK)	+= board-cap9adk.o
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index d74c9ac..86a29bf 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -278,6 +278,102 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
 void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
 #endif
 
+/* --------------------------------------------------------------------
+ *  MMC / SD Slot for Atmel MCI Driver
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
+static u64 mmc_dmamask = DMA_BIT_MASK(32);
+static struct mci_platform_data mmc_data;
+
+static struct resource mmc_resources[] = {
+	[0] = {
+		.start	= AT91SAM9260_BASE_MCI,
+		.end	= AT91SAM9260_BASE_MCI + SZ_16K - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= AT91SAM9260_ID_MCI,
+		.end	= AT91SAM9260_ID_MCI,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device at91sam9260_mmc_device = {
+	.name		= "atmel_mci",
+	.id		= -1,
+	.dev		= {
+				.dma_mask		= &mmc_dmamask,
+				.coherent_dma_mask	= DMA_BIT_MASK(32),
+				.platform_data		= &mmc_data,
+	},
+	.resource	= mmc_resources,
+	.num_resources	= ARRAY_SIZE(mmc_resources),
+};
+
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
+{
+	unsigned int i;
+	unsigned int slot_count = 0;
+
+	if (!data)
+		return;
+
+	for (i = 0; i < ATMEL_MCI_MAX_NR_SLOTS; i++) {
+		if (data->slot[i].bus_width) {
+			/* input/irq */
+			if (data->slot[i].detect_pin) {
+				at91_set_gpio_input(data->slot[i].detect_pin, 1);
+				at91_set_deglitch(data->slot[i].detect_pin, 1);
+			}
+			if (data->slot[i].wp_pin)
+				at91_set_gpio_input(data->slot[i].wp_pin, 1);
+
+			switch(i) {
+			case 0:
+				/* CMD */
+				at91_set_A_periph(AT91_PIN_PA7, 1);
+				/* DAT0, maybe DAT1..DAT3 */
+				at91_set_A_periph(AT91_PIN_PA6, 1);
+				if (data->slot[i].bus_width == 4) {
+					at91_set_A_periph(AT91_PIN_PA9, 1);
+					at91_set_A_periph(AT91_PIN_PA10, 1);
+					at91_set_A_periph(AT91_PIN_PA11, 1);
+				}
+				slot_count++;
+				break;
+			case 1:
+				/* CMD */
+				at91_set_B_periph(AT91_PIN_PA1, 1);
+				/* DAT0, maybe DAT1..DAT3 */
+				at91_set_B_periph(AT91_PIN_PA0, 1);
+				if (data->slot[i].bus_width == 4) {
+					at91_set_B_periph(AT91_PIN_PA5, 1);
+					at91_set_B_periph(AT91_PIN_PA4, 1);
+					at91_set_B_periph(AT91_PIN_PA3, 1);
+				}
+				slot_count++;
+				break;
+			default:
+				printk(KERN_ERR
+					"AT91: SD/MMC slot %d not available\n", i);
+				break;
+			}
+		}
+	}
+
+	if (slot_count) {
+		/* CLK */
+		at91_set_A_periph(AT91_PIN_PA8, 0);
+
+		mmc_data = *data;
+		platform_device_register(&at91sam9260_mmc_device);
+	}
+}
+#else
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
+#endif
+
 
 /* --------------------------------------------------------------------
  *  NAND / SmartMedia
diff --git a/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
new file mode 100644
index 0000000..a28e53f
--- /dev/null
+++ b/arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
@@ -0,0 +1,277 @@
+/*
+ *  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 <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)
+	{	/* 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_PC12,
+	.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)
+ * det_pin and wp_pin are 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	= -ENODEV,
+		.wp_pin		= -ENODEV,
+	},
+	.slot[1] = {
+		.bus_width	= 4,
+		.detect_pin	= -ENODEV,
+		.wp_pin		= -ENODEV,
+	},
+
+};
+#else
+static struct amci_platform_data __initdata ek_mmc_data = {
+};
+#endif
+
+/*
+ * LEDs
+ */
+static struct gpio_led ek_leds[] = {
+	{	/* "bottom" led, green, userled1 to be defined */
+		.name			= "ds5",
+		.gpio			= AT91_PIN_PB12,
+		.active_low		= 1,
+		.default_trigger	= "none",
+	},
+	{	/* "power" led, yellow */
+		.name			= "ds1",
+		.gpio			= AT91_PIN_PB13,
+		.default_trigger	= "heartbeat",
+	}
+};
+
+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);
+	/* MMC */
+	at91_add_device_mci(0, &ek_mmc_data);
+	/* 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/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
index e6afff8..a635dad 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -37,6 +37,7 @@
 #include <linux/leds.h>
 #include <linux/spi/spi.h>
 #include <linux/usb/atmel_usba_udc.h>
+#include <linux/atmel-mci.h>
 
  /* USB Device */
 struct at91_udc_data {
@@ -63,6 +64,7 @@ struct at91_cf_data {
 extern void __init at91_add_device_cf(struct at91_cf_data *data);
 
  /* MMC / SD */
+  /* at91_mci platform config */
 struct at91_mmc_data {
 	u8		det_pin;	/* card detect IRQ */
 	unsigned	slot_b:1;	/* uses Slot B */
@@ -72,6 +74,9 @@ struct at91_mmc_data {
 };
 extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data);
 
+  /* atmel-mci platform config */
+extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);
+
  /* Ethernet (EMAC & MACB) */
 struct at91_eth_data {
 	u32		phy_mask;
-- 
1.5.3.7


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] AT91: atmel-mci: Platform configuration to the the atmel-mci driver
@ 2009-06-23 21:36     ` Jean-Christophe PLAGNIOL-VILLARD
  2009-06-26 19:26       ` Robert Emanuele
  0 siblings, 1 reply; 21+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2009-06-23 21:36 UTC (permalink / raw)
  To: Nicolas Ferre
  Cc: pierre, avictor.za, linux-kernel, haavard.skinnemoen,
	linux-arm-kernel, rob

On 19:39 Tue 23 Jun     , Nicolas Ferre wrote:
> From: Rob Emanuele <rob@emanuele.us>
> 
> Created a modified version of the at91sam9g20 evaluation kit platform
> (board-sam9g20ek-2slot-mmc.c) and device support to make use of the updated
> atmel-mci driver.
> As the use of two slots modify GPIO pin allocation, we create another board
> file.
> 
> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> [nicolas.ferre@atmel.com: printk, slot_count modification in at91sam9260_devices.c file]
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
> ---
> This requires getting the most updated arch/arm/tools/mach-types from
> http://www.arm.linux.org.uk/developer/machines/download.php to have the machine
> type for the at91sam9g20ek-2slot-mmc board.
> 
>  arch/arm/mach-at91/Kconfig                     |    7 +
>  arch/arm/mach-at91/Makefile                    |    1 +
>  arch/arm/mach-at91/at91sam9260_devices.c       |   96 ++++++++
>  arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c |  277 ++++++++++++++++++++++++
>  arch/arm/mach-at91/include/mach/board.h        |    5 +
>  5 files changed, 386 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/mach-at91/board-sam9g20ek-2slot-mmc.c
> 
> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
> index 323b47f..5c8d770 100644
> --- a/arch/arm/mach-at91/Kconfig
> +++ b/arch/arm/mach-at91/Kconfig
> @@ -276,6 +276,13 @@ config MACH_AT91SAM9G20EK
>  	help
>  	  Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit.
>  
> +config MACH_AT91SAM9G20EK_2MMC
> +	bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
> +	depends on ARCH_AT91SAM9G20
> +	help
> +	  Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
> +	  Rev A or B modified for 2 MMC Slots.
create a new machine id for just such update :(
is this not possible to detect it and use the same machine?

Best Regards,
J.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] AT91: atmel-mci: Platform configuration to the the  atmel-mci driver
  2009-06-23 21:36     ` Jean-Christophe PLAGNIOL-VILLARD
@ 2009-06-26 19:26       ` Robert Emanuele
  0 siblings, 0 replies; 21+ messages in thread
From: Robert Emanuele @ 2009-06-26 19:26 UTC (permalink / raw)
  To: Jean-Christophe PLAGNIOL-VILLARD
  Cc: Nicolas Ferre, pierre, avictor.za, linux-kernel,
	haavard.skinnemoen, linux-arm-kernel

After talking with Nicholas Ferre, we decided there were enough
changes made to the at91sam9g20-ek (eval kit) that it warranted its
own machine and related board-xxx.c file.  In addition, Atmel has
released schematics for its newest revision of the at91sam9g20-ek
(rev. D) which will go into production once their supply of rev. C
boards is sufficiently small.  The rev. D board is much different than
the previous revisions. The new machine with its board file is an
excellent base to build on once the rev. D board is released.

Thank you,

Rob Emanuele

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/2] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91)
  2009-06-23 17:39   ` Nicolas Ferre
@ 2009-09-02  7:31     ` Haavard Skinnemoen
  0 siblings, 0 replies; 21+ messages in thread
From: Haavard Skinnemoen @ 2009-09-02  7:31 UTC (permalink / raw)
  To: Nicolas Ferre
  Cc: pierre, avictor.za, linux-kernel, linux-arm-kernel, rob, nicolas.ferre

Nicolas Ferre <nicolas.ferre@atmel.com> wrote:
> From: Rob Emanuele <rob@emanuele.us>
> 
> Unification of the atmel-mci driver to support the AT91 processors MCI
> interface.  The atmel-mci driver currently supports the AVR32 and this patch
> adds AT91 support.
> Add read/write proof selection switch dependent on chip availability of this
> feature.
> 
> To use this new driver on a at91 the platform driver for your board needs to
> updated.
> 
> Signed-off-by: Rob Emanuele <rob@emanuele.us>
> [nicolas.ferre@atmel.com indent, Kconfig comment and one printk modification]
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>

Acked-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2009-09-02  7:31 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-17  0:54 [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Rob Emanuele
2009-06-17  0:54 ` [PATCH 2/6] atmel-mci: Platform configuration to the the atmel-mci driver Rob Emanuele
2009-06-17 10:27   ` Nicolas Ferre
2009-06-18 19:58   ` Andrew Victor
2009-06-18 20:00     ` Andrew Victor
2009-06-17  0:54 ` [PATCH 3/6] atmel-mci: Optional controller reset before every command Rob Emanuele
2009-06-17  8:32   ` Marc Pignat
2009-06-17 18:27     ` Robert Emanuele
2009-06-17  0:54 ` [PATCH 4/6] atmel-mci: CLKDIV cap to restrict the MCI controller speed Rob Emanuele
2009-06-17  0:54 ` [PATCH 5/6] atmel-mci: Power control option for each MMC Slot Rob Emanuele
2009-06-17  8:08   ` Marc Pignat
2009-06-17  0:54 ` [PATCH 6/6] atmel-mci: Platform driver MMC slot power control Rob Emanuele
2009-06-17  1:23   ` Ryan Mallon
2009-06-17  9:56 ` [PATCH 1/6] atmel-mci: Unified Atmel MCI drivers (AVR32 & AT91) Nicolas Ferre
2009-06-17 10:08   ` Haavard Skinnemoen
2009-06-23 16:28     ` Nicolas Ferre
2009-06-23 17:39 ` [PATCH 1/2] " Nicolas Ferre
2009-06-23 17:39   ` Nicolas Ferre
2009-09-02  7:31     ` Haavard Skinnemoen
2009-06-23 17:39   ` [PATCH 2/2] AT91: atmel-mci: Platform configuration to the the atmel-mci driver Nicolas Ferre
2009-06-23 17:39     ` Nicolas Ferre
2009-06-23 21:36     ` Jean-Christophe PLAGNIOL-VILLARD
2009-06-26 19:26       ` Robert Emanuele

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.