Commit 04d699c3 authored by Rob Emanuele's avatar Rob Emanuele Committed by Linus Torvalds

atmel-mci: unified Atmel MCI drivers (AVR32 & AT91)

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 be updated.

[nicolas.ferre@atmel.com indent, Kconfig comment and one printk modification]
Signed-off-by: default avatarRob Emanuele <rob@emanuele.us>
Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Andrew Victor <linux@maxim.org.za>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7c979ec7
...@@ -160,6 +160,12 @@ config MMC_AU1X ...@@ -160,6 +160,12 @@ config MMC_AU1X
If unsure, say N. 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 config MMC_AT91
tristate "AT91 SD/MMC Card Interface support" tristate "AT91 SD/MMC Card Interface support"
depends on ARCH_AT91 depends on ARCH_AT91
...@@ -170,17 +176,19 @@ config MMC_AT91 ...@@ -170,17 +176,19 @@ config MMC_AT91
config MMC_ATMELMCI config MMC_ATMELMCI
tristate "Atmel Multimedia Card Interface support" tristate "Atmel Multimedia Card Interface support"
depends on AVR32 depends on AVR32 || ARCH_AT91
help help
This selects the Atmel Multimedia Card Interface driver. If This selects the Atmel Multimedia Card Interface driver. If
you have an AT32 (AVR32) platform with a Multimedia Card you have an AT32 (AVR32) or AT91 platform with a Multimedia
slot, say Y or M here. Card slot, say Y or M here.
If unsure, say N. If unsure, say N.
endchoice
config MMC_ATMELMCI_DMA config MMC_ATMELMCI_DMA
bool "Atmel MCI DMA support (EXPERIMENTAL)" bool "Atmel MCI DMA support (EXPERIMENTAL)"
depends on MMC_ATMELMCI && DMA_ENGINE && EXPERIMENTAL depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL
help help
Say Y here to have the Atmel MCI driver use a DMA engine to Say Y here to have the Atmel MCI driver use a DMA engine to
do data transfers and thus increase the throughput and do data transfers and thus increase the throughput and
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <mach/cpu.h>
#include <mach/board.h> #include <mach/board.h>
#include "atmel-mci-regs.h" #include "atmel-mci-regs.h"
...@@ -209,6 +210,18 @@ struct atmel_mci_slot { ...@@ -209,6 +210,18 @@ struct atmel_mci_slot {
#define atmci_set_pending(host, event) \ #define atmci_set_pending(host, event) \
set_bit(event, &host->pending_events) 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 * The debugfs stuff below is mostly optimized away when
* CONFIG_DEBUG_FS is not set. * CONFIG_DEBUG_FS is not set.
...@@ -276,8 +289,13 @@ static void atmci_show_status_reg(struct seq_file *s, ...@@ -276,8 +289,13 @@ static void atmci_show_status_reg(struct seq_file *s,
[3] = "BLKE", [3] = "BLKE",
[4] = "DTIP", [4] = "DTIP",
[5] = "NOTBUSY", [5] = "NOTBUSY",
[6] = "ENDRX",
[7] = "ENDTX",
[8] = "SDIOIRQA", [8] = "SDIOIRQA",
[9] = "SDIOIRQB", [9] = "SDIOIRQB",
[12] = "SDIOWAIT",
[14] = "RXBUFF",
[15] = "TXBUFE",
[16] = "RINDE", [16] = "RINDE",
[17] = "RDIRE", [17] = "RDIRE",
[18] = "RCRCE", [18] = "RCRCE",
...@@ -285,6 +303,11 @@ static void atmci_show_status_reg(struct seq_file *s, ...@@ -285,6 +303,11 @@ static void atmci_show_status_reg(struct seq_file *s,
[20] = "RTOE", [20] = "RTOE",
[21] = "DCRCE", [21] = "DCRCE",
[22] = "DTOE", [22] = "DTOE",
[23] = "CSTOE",
[24] = "BLKOVRE",
[25] = "DMADONE",
[26] = "FIFOEMPTY",
[27] = "XFRDONE",
[30] = "OVRE", [30] = "OVRE",
[31] = "UNRE", [31] = "UNRE",
}; };
...@@ -849,13 +872,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) ...@@ -849,13 +872,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
clkdiv = 255; clkdiv = 255;
} }
host->mode_reg = MCI_MR_CLKDIV(clkdiv);
/* /*
* WRPROOF and RDPROOF prevent overruns/underruns by * WRPROOF and RDPROOF prevent overruns/underruns by
* stopping the clock when the FIFO is full/empty. * stopping the clock when the FIFO is full/empty.
* This state is not expected to last for long. * This state is not expected to last for long.
*/ */
host->mode_reg = MCI_MR_CLKDIV(clkdiv) | MCI_MR_WRPROOF if (mci_has_rwproof())
| MCI_MR_RDPROOF; host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF);
if (list_empty(&host->queue)) if (list_empty(&host->queue))
mci_writel(host, MR, host->mode_reg); mci_writel(host, MR, host->mode_reg);
...@@ -1648,8 +1673,10 @@ static int __init atmci_probe(struct platform_device *pdev) ...@@ -1648,8 +1673,10 @@ static int __init atmci_probe(struct platform_device *pdev)
nr_slots++; nr_slots++;
} }
if (!nr_slots) if (!nr_slots) {
dev_err(&pdev->dev, "init failed: no slot defined\n");
goto err_init_slot; goto err_init_slot;
}
dev_info(&pdev->dev, dev_info(&pdev->dev,
"Atmel MCI controller at 0x%08lx irq %d, %u slots\n", "Atmel MCI controller at 0x%08lx irq %d, %u slots\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment