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: