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.
This commit is contained in:
lintao
2013-09-11 17:37:15 +08:00
parent 9fdf501364
commit d77fa6a9d2
2 changed files with 19 additions and 5 deletions

View File

@@ -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:

View File

@@ -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: