|
@@ -674,7 +674,8 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
|
|
|
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
|
|
struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
|
|
|
unsigned int host_clock = pltfm_host->clock;
|
|
|
- int pre_div = 2;
|
|
|
+ int ddr_pre_div = imx_data->is_ddr ? 2 : 1;
|
|
|
+ int pre_div = 1;
|
|
|
int div = 1;
|
|
|
u32 temp, val;
|
|
|
|
|
@@ -689,28 +690,23 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (esdhc_is_usdhc(imx_data) && !imx_data->is_ddr)
|
|
|
- pre_div = 1;
|
|
|
-
|
|
|
temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
|
|
|
temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
|
|
|
| ESDHC_CLOCK_MASK);
|
|
|
sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
|
|
|
|
|
|
- while (host_clock / pre_div / 16 > clock && pre_div < 256)
|
|
|
+ while (host_clock / (16 * pre_div * ddr_pre_div) > clock &&
|
|
|
+ pre_div < 256)
|
|
|
pre_div *= 2;
|
|
|
|
|
|
- while (host_clock / pre_div / div > clock && div < 16)
|
|
|
+ while (host_clock / (div * pre_div * ddr_pre_div) > clock && div < 16)
|
|
|
div++;
|
|
|
|
|
|
- host->mmc->actual_clock = host_clock / pre_div / div;
|
|
|
+ host->mmc->actual_clock = host_clock / (div * pre_div * ddr_pre_div);
|
|
|
dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
|
|
|
clock, host->mmc->actual_clock);
|
|
|
|
|
|
- if (imx_data->is_ddr)
|
|
|
- pre_div >>= 2;
|
|
|
- else
|
|
|
- pre_div >>= 1;
|
|
|
+ pre_div >>= 1;
|
|
|
div--;
|
|
|
|
|
|
temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
|