diff options
author | Rob Emanuele <rob@emanuele.us> | 2009-09-22 19:45:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:37 -0400 |
commit | 04d699c3643fbf75dd72c03a4eacec87149c4aca (patch) | |
tree | 039513a649e9c83648b89aaeb291a6065eb86af8 /drivers/mmc | |
parent | 7c979ec7135d96bbff34790bf4b85a8508ede7fc (diff) |
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>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/Kconfig | 16 | ||||
-rw-r--r-- | 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 34fdfa968fe9..6f20eb93554b 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig | |||
@@ -160,6 +160,12 @@ config MMC_AU1X | |||
160 | 160 | ||
161 | If unsure, say N. | 161 | If unsure, say N. |
162 | 162 | ||
163 | choice | ||
164 | prompt "Atmel SD/MMC Driver" | ||
165 | default MMC_ATMELMCI if AVR32 | ||
166 | help | ||
167 | Choose which driver to use for the Atmel MCI Silicon | ||
168 | |||
163 | config MMC_AT91 | 169 | config MMC_AT91 |
164 | tristate "AT91 SD/MMC Card Interface support" | 170 | tristate "AT91 SD/MMC Card Interface support" |
165 | depends on ARCH_AT91 | 171 | depends on ARCH_AT91 |
@@ -170,17 +176,19 @@ config MMC_AT91 | |||
170 | 176 | ||
171 | config MMC_ATMELMCI | 177 | config MMC_ATMELMCI |
172 | tristate "Atmel Multimedia Card Interface support" | 178 | tristate "Atmel Multimedia Card Interface support" |
173 | depends on AVR32 | 179 | depends on AVR32 || ARCH_AT91 |
174 | help | 180 | help |
175 | This selects the Atmel Multimedia Card Interface driver. If | 181 | This selects the Atmel Multimedia Card Interface driver. If |
176 | you have an AT32 (AVR32) platform with a Multimedia Card | 182 | you have an AT32 (AVR32) or AT91 platform with a Multimedia |
177 | slot, say Y or M here. | 183 | Card slot, say Y or M here. |
178 | 184 | ||
179 | If unsure, say N. | 185 | If unsure, say N. |
180 | 186 | ||
187 | endchoice | ||
188 | |||
181 | config MMC_ATMELMCI_DMA | 189 | config MMC_ATMELMCI_DMA |
182 | bool "Atmel MCI DMA support (EXPERIMENTAL)" | 190 | bool "Atmel MCI DMA support (EXPERIMENTAL)" |
183 | depends on MMC_ATMELMCI && DMA_ENGINE && EXPERIMENTAL | 191 | depends on MMC_ATMELMCI && AVR32 && DMA_ENGINE && EXPERIMENTAL |
184 | help | 192 | help |
185 | Say Y here to have the Atmel MCI driver use a DMA engine to | 193 | Say Y here to have the Atmel MCI driver use a DMA engine to |
186 | do data transfers and thus increase the throughput and | 194 | 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 7b603e4b41db..065fa818be57 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/unaligned.h> | 31 | #include <asm/unaligned.h> |
32 | 32 | ||
33 | #include <mach/cpu.h> | ||
33 | #include <mach/board.h> | 34 | #include <mach/board.h> |
34 | 35 | ||
35 | #include "atmel-mci-regs.h" | 36 | #include "atmel-mci-regs.h" |
@@ -210,6 +211,18 @@ struct atmel_mci_slot { | |||
210 | set_bit(event, &host->pending_events) | 211 | set_bit(event, &host->pending_events) |
211 | 212 | ||
212 | /* | 213 | /* |
214 | * Enable or disable features/registers based on | ||
215 | * whether the processor supports them | ||
216 | */ | ||
217 | static bool mci_has_rwproof(void) | ||
218 | { | ||
219 | if (cpu_is_at91sam9261() || cpu_is_at91rm9200()) | ||
220 | return false; | ||
221 | else | ||
222 | return true; | ||
223 | } | ||
224 | |||
225 | /* | ||
213 | * The debugfs stuff below is mostly optimized away when | 226 | * The debugfs stuff below is mostly optimized away when |
214 | * CONFIG_DEBUG_FS is not set. | 227 | * CONFIG_DEBUG_FS is not set. |
215 | */ | 228 | */ |
@@ -276,8 +289,13 @@ static void atmci_show_status_reg(struct seq_file *s, | |||
276 | [3] = "BLKE", | 289 | [3] = "BLKE", |
277 | [4] = "DTIP", | 290 | [4] = "DTIP", |
278 | [5] = "NOTBUSY", | 291 | [5] = "NOTBUSY", |
292 | [6] = "ENDRX", | ||
293 | [7] = "ENDTX", | ||
279 | [8] = "SDIOIRQA", | 294 | [8] = "SDIOIRQA", |
280 | [9] = "SDIOIRQB", | 295 | [9] = "SDIOIRQB", |
296 | [12] = "SDIOWAIT", | ||
297 | [14] = "RXBUFF", | ||
298 | [15] = "TXBUFE", | ||
281 | [16] = "RINDE", | 299 | [16] = "RINDE", |
282 | [17] = "RDIRE", | 300 | [17] = "RDIRE", |
283 | [18] = "RCRCE", | 301 | [18] = "RCRCE", |
@@ -285,6 +303,11 @@ static void atmci_show_status_reg(struct seq_file *s, | |||
285 | [20] = "RTOE", | 303 | [20] = "RTOE", |
286 | [21] = "DCRCE", | 304 | [21] = "DCRCE", |
287 | [22] = "DTOE", | 305 | [22] = "DTOE", |
306 | [23] = "CSTOE", | ||
307 | [24] = "BLKOVRE", | ||
308 | [25] = "DMADONE", | ||
309 | [26] = "FIFOEMPTY", | ||
310 | [27] = "XFRDONE", | ||
288 | [30] = "OVRE", | 311 | [30] = "OVRE", |
289 | [31] = "UNRE", | 312 | [31] = "UNRE", |
290 | }; | 313 | }; |
@@ -849,13 +872,15 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
849 | clkdiv = 255; | 872 | clkdiv = 255; |
850 | } | 873 | } |
851 | 874 | ||
875 | host->mode_reg = MCI_MR_CLKDIV(clkdiv); | ||
876 | |||
852 | /* | 877 | /* |
853 | * WRPROOF and RDPROOF prevent overruns/underruns by | 878 | * WRPROOF and RDPROOF prevent overruns/underruns by |
854 | * stopping the clock when the FIFO is full/empty. | 879 | * stopping the clock when the FIFO is full/empty. |
855 | * This state is not expected to last for long. | 880 | * This state is not expected to last for long. |
856 | */ | 881 | */ |
857 | host->mode_reg = MCI_MR_CLKDIV(clkdiv) | MCI_MR_WRPROOF | 882 | if (mci_has_rwproof()) |
858 | | MCI_MR_RDPROOF; | 883 | host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF); |
859 | 884 | ||
860 | if (list_empty(&host->queue)) | 885 | if (list_empty(&host->queue)) |
861 | mci_writel(host, MR, host->mode_reg); | 886 | mci_writel(host, MR, host->mode_reg); |
@@ -1648,8 +1673,10 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
1648 | nr_slots++; | 1673 | nr_slots++; |
1649 | } | 1674 | } |
1650 | 1675 | ||
1651 | if (!nr_slots) | 1676 | if (!nr_slots) { |
1677 | dev_err(&pdev->dev, "init failed: no slot defined\n"); | ||
1652 | goto err_init_slot; | 1678 | goto err_init_slot; |
1679 | } | ||
1653 | 1680 | ||
1654 | dev_info(&pdev->dev, | 1681 | dev_info(&pdev->dev, |
1655 | "Atmel MCI controller at 0x%08lx irq %d, %u slots\n", | 1682 | "Atmel MCI controller at 0x%08lx irq %d, %u slots\n", |