]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
at91_mci: Cover more AT91RM9200 and AT91SAM9261 errata.
authorVille Syrjala <syrjala@sci.fi>
Mon, 9 Jun 2008 19:06:44 +0000 (22:06 +0300)
committerPierre Ossman <drzeus@drzeus.cx>
Tue, 15 Jul 2008 12:14:42 +0000 (14:14 +0200)
According to the documentation the AT91SAM9261 MCI shares the block size
limitations of the AT91RM9200 MCI. Also the errata documentation for
AT91RM9200 and AT91SAM9261 state that stream commands are not supported.
This has not been tested on actual hardware.

Signed-off-by: Ville Syrjala <syrjala@sci.fi>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
drivers/mmc/host/at91_mci.c

index d3e96ff4142877238311761d8489a2f71ad3998f..f8c3f7c330e32d38d13ebbe2f049fe3840cbde1c 100644 (file)
@@ -520,11 +520,19 @@ static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command
 
        if (data) {
 
-               if ( cpu_is_at91rm9200() && (data->blksz & 0x3) ) {
-                       pr_debug("Unsupported block size\n");
-                       cmd->error = -EINVAL;
-                       mmc_request_done(host->mmc, host->request);
-                       return;
+               if (cpu_is_at91rm9200() || cpu_is_at91sam9261()) {
+                       if (data->blksz & 0x3) {
+                               pr_debug("Unsupported block size\n");
+                               cmd->error = -EINVAL;
+                               mmc_request_done(host->mmc, host->request);
+                               return;
+                       }
+                       if (data->flags & MMC_DATA_STREAM) {
+                               pr_debug("Stream commands not supported\n");
+                               cmd->error = -EINVAL;
+                               mmc_request_done(host->mmc, host->request);
+                               return;
+                       }
                }
 
                block_length = data->blksz;
@@ -577,7 +585,7 @@ static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command
                mr |= AT91_MCI_PDCMODE;
                at91_mci_write(host, AT91_MCI_MR, mr);
 
-               if (!cpu_is_at91rm9200())
+               if (!(cpu_is_at91rm9200() || cpu_is_at91sam9261()))
                        at91_mci_write(host, AT91_MCI_BLKR,
                                AT91_MCI_BLKR_BCNT(blocks) |
                                AT91_MCI_BLKR_BLKLEN(block_length));