@@ -279,6 +279,9 @@ static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd)
cmdr |= SDMMC_CMD_DAT_WR;
}
+ if (slot->host->use_hold_reg)
+ cmdr |= SDMMC_CMD_USE_HOLD_REG;
+
if (drv_data && drv_data->prepare_command)
drv_data->prepare_command(slot->host, &cmdr);
@@ -969,6 +972,17 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
mci_writel(slot->host, UHS_REG, regs);
slot->host->timing = ios->timing;
+ switch (slot->host->timing) {
+ case MMC_TIMING_UHS_SDR50:
+ case MMC_TIMING_UHS_SDR104:
+ case MMC_TIMING_UHS_DDR50:
+ case MMC_TIMING_MMC_HS200:
+ slot->host->use_hold_reg = 0;
+ break;
+ default:
+ slot->host->use_hold_reg = 1;
+ }
+
/*
* Use mirror of ios->clock to prevent race with mmc
* core ios update when finding the minimum.
@@ -191,6 +191,7 @@ struct dw_mci {
struct regulator *vmmc; /* Power regulator */
unsigned long irq_flags; /* IRQ flags */
int irq;
+ bool use_hold_reg;
};
/* DMA ops for Internal/External DMAC interface */