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: Rob Emanuele <rob@emanuele.us> Signed-off-by: Nicolas 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7c979ec713
commit
04d699c364
@ -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
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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 {
|
|||||||
#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,
|
|||||||
[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,
|
|||||||
[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)
|
|||||||
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)
|
|||||||
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",
|
||||||
|
Loading…
Reference in New Issue
Block a user