diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-pci-core.c')
| -rw-r--r-- | drivers/mmc/host/sdhci-pci-core.c | 35 | 
1 files changed, 31 insertions, 4 deletions
| diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 6d1a983e6227..82c4f05f91d8 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -654,9 +654,36 @@ static void byt_read_dsm(struct sdhci_pci_slot *slot)  	slot->chip->rpm_retune = intel_host->d3_retune;  } -static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) +static int intel_execute_tuning(struct mmc_host *mmc, u32 opcode) +{ +	int err = sdhci_execute_tuning(mmc, opcode); +	struct sdhci_host *host = mmc_priv(mmc); + +	if (err) +		return err; + +	/* +	 * Tuning can leave the IP in an active state (Buffer Read Enable bit +	 * set) which prevents the entry to low power states (i.e. S0i3). Data +	 * reset will clear it. +	 */ +	sdhci_reset(host, SDHCI_RESET_DATA); + +	return 0; +} + +static void byt_probe_slot(struct sdhci_pci_slot *slot)  { +	struct mmc_host_ops *ops = &slot->host->mmc_host_ops; +  	byt_read_dsm(slot); + +	ops->execute_tuning = intel_execute_tuning; +} + +static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) +{ +	byt_probe_slot(slot);  	slot->host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |  				 MMC_CAP_HW_RESET | MMC_CAP_1_8V_DDR |  				 MMC_CAP_CMD_DURING_TFR | @@ -779,7 +806,7 @@ static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot)  {  	int err; -	byt_read_dsm(slot); +	byt_probe_slot(slot);  	err = ni_set_max_freq(slot);  	if (err) @@ -792,7 +819,7 @@ static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot)  static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)  { -	byt_read_dsm(slot); +	byt_probe_slot(slot);  	slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE |  				 MMC_CAP_WAIT_WHILE_BUSY;  	return 0; @@ -800,7 +827,7 @@ static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)  static int byt_sd_probe_slot(struct sdhci_pci_slot *slot)  { -	byt_read_dsm(slot); +	byt_probe_slot(slot);  	slot->host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY |  				 MMC_CAP_AGGRESSIVE_PM | MMC_CAP_CD_WAKE;  	slot->cd_idx = 0; | 

