|
@@ -27,6 +27,7 @@
|
|
|
|
|
|
#include <linux/mmc/mmc.h>
|
|
|
#include <linux/mmc/host.h>
|
|
|
+#include <linux/mmc/card.h>
|
|
|
|
|
|
#include "sdhci.h"
|
|
|
|
|
@@ -1245,6 +1246,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
struct sdhci_host *host;
|
|
|
bool present;
|
|
|
unsigned long flags;
|
|
|
+ u32 tuning_opcode;
|
|
|
|
|
|
host = mmc_priv(mmc);
|
|
|
|
|
@@ -1292,8 +1294,12 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
*/
|
|
|
if ((host->flags & SDHCI_NEEDS_RETUNING) &&
|
|
|
!(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) {
|
|
|
+ /* eMMC uses cmd21 while sd and sdio use cmd19 */
|
|
|
+ tuning_opcode = mmc->card->type == MMC_TYPE_MMC ?
|
|
|
+ MMC_SEND_TUNING_BLOCK_HS200 :
|
|
|
+ MMC_SEND_TUNING_BLOCK;
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
- sdhci_execute_tuning(mmc, mrq->cmd->opcode);
|
|
|
+ sdhci_execute_tuning(mmc, tuning_opcode);
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
|
|
|
/* Restore original mmc_request structure */
|