mmc: sdhci: Control the delay between tuning commands
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 20 Apr 2017 08:14:43 +0000 (16:14 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:42:27 +0000 (21:42 +0200)
The delay between tuning commands for SD cards is not part of the
specification. A driver that needs it probably needs it for eMMC
too, whereas most drivers would probably like to set it to 0. Make
it a host member (host->tuning_delay) that defaults to the existing
behaviour. Drivers can set it to zero to eliminate the delay, or
set it to a positive value to always have a delay.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 4bdad8959ec26a15ff4663e57b446c0f6487b066..ecd0d4350e8a30083635331ec530b036ca8a772b 100644 (file)
@@ -2108,9 +2108,9 @@ static void __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
                        break;
                }
 
-               /* eMMC spec does not require a delay between tuning cycles */
-               if (opcode == MMC_SEND_TUNING_BLOCK)
-                       mdelay(1);
+               /* Spec does not require a delay between tuning cycles */
+               if (host->tuning_delay > 0)
+                       mdelay(host->tuning_delay);
        }
 
        pr_info("%s: Tuning failed, falling back to fixed sampling clock\n",
@@ -2172,6 +2172,9 @@ int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
 
        host->mmc->retune_period = tuning_count;
 
+       if (host->tuning_delay < 0)
+               host->tuning_delay = opcode == MMC_SEND_TUNING_BLOCK;
+
        sdhci_start_tuning(host);
 
        __sdhci_execute_tuning(host, opcode);
@@ -3114,6 +3117,8 @@ struct sdhci_host *sdhci_alloc_host(struct device *dev,
        host->cqe_ier     = SDHCI_CQE_INT_MASK;
        host->cqe_err_ier = SDHCI_CQE_INT_ERR_MASK;
 
+       host->tuning_delay = -1;
+
        return host;
 }
 
index 78437f82609e540cf5b181fd04b85052590b1fad..0469fa1914933b6dfc5d1a749d307c1920af947e 100644 (file)
@@ -538,6 +538,8 @@ struct sdhci_host {
 #define SDHCI_TUNING_MODE_1    0
 #define SDHCI_TUNING_MODE_2    1
 #define SDHCI_TUNING_MODE_3    2
+       /* Delay (ms) between tuning commands */
+       int                     tuning_delay;
 
        unsigned long private[0] ____cacheline_aligned;
 };