mmc: mxs-mmc: Implement CMD23 support
authorStefan Wahren <stefan.wahren@i2se.com>
Sat, 14 Jan 2017 17:29:18 +0000 (17:29 +0000)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 13 Feb 2017 12:20:27 +0000 (13:20 +0100)
This patch implements support for multiblock transfers bounded
by SET_BLOCK_COUNT (CMD23) on the MXS MMC host driver.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/mxs-mmc.c

index c8b8ac66ff7e3a4839ba4943c9069e540846c87e..add1e70195ea6a2c7111f768c5865d15b17f085e 100644 (file)
@@ -153,7 +153,11 @@ static void mxs_mmc_request_done(struct mxs_mmc_host *host)
                }
        }
 
-       if (data) {
+       if (cmd == mrq->sbc) {
+               /* Finished CMD23, now send actual command. */
+               mxs_mmc_start_cmd(host, mrq->cmd);
+               return;
+       } else if (data) {
                dma_unmap_sg(mmc_dev(host->mmc), data->sg,
                             data->sg_len, ssp->dma_dir);
                /*
@@ -166,7 +170,7 @@ static void mxs_mmc_request_done(struct mxs_mmc_host *host)
                        data->bytes_xfered = 0;
 
                host->data = NULL;
-               if (mrq->stop) {
+               if (data->stop && (data->error || !mrq->sbc)) {
                        mxs_mmc_start_cmd(host, mrq->stop);
                        return;
                }
@@ -495,7 +499,11 @@ static void mxs_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
 
        WARN_ON(host->mrq != NULL);
        host->mrq = mrq;
-       mxs_mmc_start_cmd(host, mrq->cmd);
+
+       if (mrq->sbc)
+               mxs_mmc_start_cmd(host, mrq->sbc);
+       else
+               mxs_mmc_start_cmd(host, mrq->cmd);
 }
 
 static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
@@ -642,7 +650,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
        /* set mmc core parameters */
        mmc->ops = &mxs_mmc_ops;
        mmc->caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED |
-                   MMC_CAP_SDIO_IRQ | MMC_CAP_NEEDS_POLL;
+                   MMC_CAP_SDIO_IRQ | MMC_CAP_NEEDS_POLL | MMC_CAP_CMD23;
 
        host->broken_cd = of_property_read_bool(np, "broken-cd");