mmc: core: Only execute tuning for SDR50 and SDR104
authorlintao <lintao@rock-chips.com>
Wed, 11 Sep 2013 09:37:15 +0000 (17:37 +0800)
committerlintao <lintao@rock-chips.com>
Wed, 11 Sep 2013 09:37:15 +0000 (17:37 +0800)
Only execute tuning for sd and sdio devices that are using
SDR50 or SDR104.

Make sure clock is hold during tuning for sdio devices.

drivers/mmc/core/sd.c
drivers/mmc/core/sdio.c

index ed92b92a02e035e2c6d4d76b8cd0c83b5409bf60..57618f9e8c2119e5134b3ae002e78bfb477eeb16 100755 (executable)
@@ -23,6 +23,7 @@
 #include "mmc_ops.h"
 #include "sd.h"
 #include "sd_ops.h"
+#include "host.h"
 
 static const unsigned int tran_exp[] = {
        10000,          100000,         1000000,        10000000,
@@ -628,7 +629,11 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
                goto out;
 
        /* SPI mode doesn't define CMD19 */
-       if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning)
+       if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning &&
+           (card->sd_bus_speed == UHS_SDR50_BUS_SPEED ||
+            card->sd_bus_speed == UHS_SDR104_BUS_SPEED))
+
+           mmc_host_clk_hold(card->host);
                err = card->host->ops->execute_tuning(card->host,MMC_SEND_TUNING_BLOCK);
 
 out:
index 05cf2c1ff4a43402952e9bbde3376ab6ce64b6eb..8c2245a678917ecaeb2382395c0588f649882c4b 100755 (executable)
@@ -22,6 +22,7 @@
 #include "core.h"
 #include "bus.h"
 #include "sd.h"
+#include "host.h"
 #include "sdio_bus.h"
 #include "mmc_ops.h"
 #include "sd_ops.h"
@@ -569,10 +570,18 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card)
        if (err)
                goto out;
 
-       /* Initialize and start re-tuning timer */
-       if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning)
-               err = card->host->ops->execute_tuning(card->host,
-                                                     MMC_SEND_TUNING_BLOCK);
+    
+     /*
+      * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and
+      * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104.
+      */
+     if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning &&
+          ((card->sw_caps.sd3_bus_mode == SD_MODE_UHS_SDR50) ||
+           (card->sw_caps.sd3_bus_mode ==  SD_MODE_UHS_SDR104))) {
+                  mmc_host_clk_hold(card->host);
+                   err = card->host->ops->execute_tuning(card->host,MMC_SEND_TUNING_BLOCK);
+                  mmc_host_clk_release(card->host);
+      }
 
 out: