mmc: sdhci: Factor out some operations set to their own functions
authorFaiz Abbas <faiz_abbas@ti.com>
Thu, 16 Jan 2020 10:51:46 +0000 (16:21 +0530)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 20 Jan 2020 09:36:11 +0000 (10:36 +0100)
In preparation for adding external dma support, factor out data initialization,
block info and mrq_done to their own functions.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Tested-by: Baolin Wang <baolin.wang7@gmail.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20200116105154.7685-3-faiz_abbas@ti.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index 275102c..f97f071 100644 (file)
@@ -1025,18 +1025,9 @@ static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
        }
 }
 
-static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
+static void sdhci_initialize_data(struct sdhci_host *host,
+                                 struct mmc_data *data)
 {
-       struct mmc_data *data = cmd->data;
-
-       host->data_timeout = 0;
-
-       if (sdhci_data_line_cmd(cmd))
-               sdhci_set_timeout(host, cmd);
-
-       if (!data)
-               return;
-
        WARN_ON(host->data);
 
        /* Sanity checks */
@@ -1047,6 +1038,34 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
        host->data = data;
        host->data_early = 0;
        host->data->bytes_xfered = 0;
+}
+
+static inline void sdhci_set_block_info(struct sdhci_host *host,
+                                       struct mmc_data *data)
+{
+       /* Set the DMA boundary value and block size */
+       sdhci_writew(host,
+                    SDHCI_MAKE_BLKSZ(host->sdma_boundary, data->blksz),
+                    SDHCI_BLOCK_SIZE);
+       /*
+        * For Version 4.10 onwards, if v4 mode is enabled, 32-bit Block Count
+        * can be supported, in that case 16-bit block count register must be 0.
+        */
+       if (host->version >= SDHCI_SPEC_410 && host->v4_mode &&
+           (host->quirks2 & SDHCI_QUIRK2_USE_32BIT_BLK_CNT)) {
+               if (sdhci_readw(host, SDHCI_BLOCK_COUNT))
+                       sdhci_writew(host, 0, SDHCI_BLOCK_COUNT);
+               sdhci_writew(host, data->blocks, SDHCI_32BIT_BLK_CNT);
+       } else {
+               sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);
+       }
+}
+
+static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
+{
+       struct mmc_data *data = cmd->data;
+
+       sdhci_initialize_data(host, data);
 
        if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
                struct scatterlist *sg;
@@ -1133,22 +1152,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
 
        sdhci_set_transfer_irqs(host);
 
-       /* Set the DMA boundary value and block size */
-       sdhci_writew(host, SDHCI_MAKE_BLKSZ(host->sdma_boundary, data->blksz),
-                    SDHCI_BLOCK_SIZE);
-
-       /*
-        * For Version 4.10 onwards, if v4 mode is enabled, 32-bit Block Count
-        * can be supported, in that case 16-bit block count register must be 0.
-        */
-       if (host->version >= SDHCI_SPEC_410 && host->v4_mode &&
-           (host->quirks2 & SDHCI_QUIRK2_USE_32BIT_BLK_CNT)) {
-               if (sdhci_readw(host, SDHCI_BLOCK_COUNT))
-                       sdhci_writew(host, 0, SDHCI_BLOCK_COUNT);
-               sdhci_writew(host, data->blocks, SDHCI_32BIT_BLK_CNT);
-       } else {
-               sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);
-       }
+       sdhci_set_block_info(host, data);
 }
 
 static inline bool sdhci_auto_cmd12(struct sdhci_host *host,
@@ -1245,22 +1249,10 @@ static bool sdhci_needs_reset(struct sdhci_host *host, struct mmc_request *mrq)
                 (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)));
 }
 
-static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
+static void sdhci_set_mrq_done(struct sdhci_host *host, struct mmc_request *mrq)
 {
        int i;
 
-       if (host->cmd && host->cmd->mrq == mrq)
-               host->cmd = NULL;
-
-       if (host->data_cmd && host->data_cmd->mrq == mrq)
-               host->data_cmd = NULL;
-
-       if (host->data && host->data->mrq == mrq)
-               host->data = NULL;
-
-       if (sdhci_needs_reset(host, mrq))
-               host->pending_reset = true;
-
        for (i = 0; i < SDHCI_MAX_MRQS; i++) {
                if (host->mrqs_done[i] == mrq) {
                        WARN_ON(1);
@@ -1276,6 +1268,23 @@ static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
        }
 
        WARN_ON(i >= SDHCI_MAX_MRQS);
+}
+
+static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
+{
+       if (host->cmd && host->cmd->mrq == mrq)
+               host->cmd = NULL;
+
+       if (host->data_cmd && host->data_cmd->mrq == mrq)
+               host->data_cmd = NULL;
+
+       if (host->data && host->data->mrq == mrq)
+               host->data = NULL;
+
+       if (sdhci_needs_reset(host, mrq))
+               host->pending_reset = true;
+
+       sdhci_set_mrq_done(host, mrq);
 
        sdhci_del_timer(host, mrq);
 
@@ -1390,12 +1399,15 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
        }
 
        host->cmd = cmd;
+       host->data_timeout = 0;
        if (sdhci_data_line_cmd(cmd)) {
                WARN_ON(host->data_cmd);
                host->data_cmd = cmd;
+               sdhci_set_timeout(host, cmd);
        }
 
-       sdhci_prepare_data(host, cmd);
+       if (cmd->data)
+               sdhci_prepare_data(host, cmd);
 
        sdhci_writel(host, cmd->arg, SDHCI_ARGUMENT);