From d77fa6a9d2fb46a43dc19da897f8f3f1c7a7cd8b Mon Sep 17 00:00:00 2001 From: lintao Date: Wed, 11 Sep 2013 17:37:15 +0800 Subject: [PATCH] mmc: core: Only execute tuning for SDR50 and SDR104 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 | 7 ++++++- drivers/mmc/core/sdio.c | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index ed92b92a02e0..57618f9e8c21 100755 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -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: diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 05cf2c1ff4a4..8c2245a67891 100755 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -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: -- 2.34.1