mmc: sdhci: add a quirk for single block transactions
authorVincent Yang <vincent.yang.fujitsu@gmail.com>
Tue, 20 Jan 2015 08:05:17 +0000 (16:05 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 20 Jan 2015 08:29:16 +0000 (09:29 +0100)
This patch defines a quirk to disable the block count
for single block transactions.
It is a preparation and will be used by Fujitsu
SDHCI controller f_sdh30 driver.

Signed-off-by: Vincent Yang <Vincent.Yang@tw.fujitsu.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c
include/linux/mmc/sdhci.h

index a3ecd20e55102b6ef9c8f74a90a6d010be74eef7..c9881ca131d5ba7c7d653915a19df12326af6a1f 100644 (file)
@@ -904,7 +904,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
 static void sdhci_set_transfer_mode(struct sdhci_host *host,
        struct mmc_command *cmd)
 {
-       u16 mode;
+       u16 mode = 0;
        struct mmc_data *data = cmd->data;
 
        if (data == NULL) {
@@ -922,9 +922,11 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
 
        WARN_ON(!host->data);
 
-       mode = SDHCI_TRNS_BLK_CNT_EN;
+       if (!(host->quirks2 & SDHCI_QUIRK2_SUPPORT_SINGLE))
+               mode = SDHCI_TRNS_BLK_CNT_EN;
+
        if (mmc_op_multi(cmd->opcode) || data->blocks > 1) {
-               mode |= SDHCI_TRNS_MULTI;
+               mode = SDHCI_TRNS_BLK_CNT_EN | SDHCI_TRNS_MULTI;
                /*
                 * If we are sending CMD23, CMD12 never gets sent
                 * on successful completion (so no Auto-CMD12).
index 933b897ca0953775b95615642992dfde2eea607a..c3e3db19673811a9d8c832da4001171525d40925 100644 (file)
@@ -113,6 +113,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_CAPS_BIT63_FOR_HS400              (1<<11)
 /* forced tuned clock */
 #define SDHCI_QUIRK2_TUNING_WORK_AROUND                        (1<<12)
+/* disable the block count for single block transactions */
+#define SDHCI_QUIRK2_SUPPORT_SINGLE                    (1<<13)
 
        int irq;                /* Device IRQ */
        void __iomem *ioaddr;   /* Mapped address */