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/host/atmel-mci.c | |
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/host/atmel-mci.c')
-rw-r--r-- | drivers/mmc/host/atmel-mci.c | 33 |
1 files changed, 30 insertions, 3 deletions
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", |