mmc: at91: add multi block read/write support.
authorWu, Josh <Josh.wu@atmel.com>
Thu, 13 Sep 2012 22:22:04 +0000 (22:22 +0000)
committerAndreas Bießmann <andreas.devel@googlemail.com>
Wed, 17 Oct 2012 09:28:54 +0000 (11:28 +0200)
Since the at91sam9263, the mmc hardware support multi blocks read/write. So this driver enable it.

Signed-off-by: Josh Wu <josh.wu@atmel.com>
Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
drivers/mmc/gen_atmel_mci.c
include/atmel_mci.h

index 4968c5e4912aa46da6b68884e58fc9edda4375f3..9f0630454895c60bc15316976d633f19742a37c7 100644 (file)
@@ -87,6 +87,11 @@ static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
                 | MMCI_BF(BLKLEN, blklen)
                 | MMCI_BIT(RDPROOF)
                 | MMCI_BIT(WRPROOF)), &mci->mr);
+       /*
+        * On some new platforms BLKLEN in mci->mr is ignored.
+        * Should use the BLKLEN in the block register.
+        */
+       writel(MMCI_BF(BLKLEN, blklen), &mci->blkr);
        initialized = 1;
 }
 
@@ -183,6 +188,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
        /* Figure out the transfer arguments */
        cmdr = mci_encode_cmd(cmd, data, &error_flags);
 
+       /* For multi blocks read/write, set the block register */
+       if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK)
+                       || (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK))
+               writel(data->blocks | MMCI_BF(BLKLEN, mmc->read_bl_len),
+                       &mci->blkr);
+
        /* Send the command */
        writel(cmd->cmdarg, &mci->argr);
        writel(cmdr, &mci->cmdr);
index 3dd5d67be9d0de7600ce67df230f1c9b008163ef..c711881276bdd8dc4366095364c3d43aae2df771 100644 (file)
@@ -38,7 +38,7 @@ typedef struct atmel_mci {
        u32     sdcr;   /* 0x0c */
        u32     argr;   /* 0x10 */
        u32     cmdr;   /* 0x14 */
-       u32     _18;    /* 0x18 */
+       u32     blkr;   /* 0x18 */
        u32     _1c;    /* 0x1c */
        u32     rspr;   /* 0x20 */
        u32     rspr1;  /* 0x24 */
@@ -118,6 +118,11 @@ typedef struct atmel_mci {
 #define MMCI_TRTYP_OFFSET                      19
 #define MMCI_TRTYP_SIZE                                2
 
+/* Bitfields in BLKR */
+/* MMCI_BLKLEN_OFFSET/SIZE already defined in MR */
+#define MMCI_BCNT_OFFSET                       0
+#define MMCI_BCNT_SIZE                 16
+
 /* Bitfields in RSPRx */
 #define MMCI_RSP_OFFSET                                0
 #define MMCI_RSP_SIZE                          32