mmc: core: Only execute tuning for SDR50 and SDR104
authorFredrik Soderstedt <fredrik.soderstedt@stericsson.com>
Wed, 17 Apr 2013 11:50:53 +0000 (13:50 +0200)
committerlintao <lintao@rock-chips.com>
Fri, 7 Mar 2014 02:56:04 +0000 (10:56 +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.

Signed-off-by: Fredrik Soderstedt <fredrik.soderstedt@stericsson.com>
Acked-by: Johan Rudholm <jrudholm@gmail.com>
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/core/sd.c
drivers/mmc/core/sdio.c

index f008318c5c4d6765263f7e328f175329a36eae55..d654b7b595e2666c6a6539851afe0544f16e2b8d 100644 (file)
@@ -646,8 +646,13 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
        if (err)
                goto out;
 
-       /* SPI mode doesn't define CMD19 */
-       if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) {
+       /*
+        * 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->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);
index 46e68f125ff2719a03cd6547dd97cda4f693aab4..8c98fa82db34af8bed22602941d0ec0d573a06d7 100644 (file)
@@ -568,10 +568,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)
+       /*
+        * 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: