mmc: sdhci: make max-frequency property in device tree work
Device tree provides option to specify the max freqency with property "max-frequency" in dts and common parse function mmc_of_parse() will parse it and use this value to set host->f_max to tell the MMC core the maxinum frequency the host works. However, current sdhci driver will finally overwrite this value with host->max_clk regardless of the max-frequency property. This patch makes sure not overwrite the max-frequency set from device tree and do basic sanity check. Signed-off-by: Dong Aisheng <aisheng.dong@freescale.com> Reviewed-by: Johan Derycke <johan.derycke@barco.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
91fa425287
commit
5924175755
|
@ -2866,6 +2866,7 @@ int sdhci_add_host(struct sdhci_host *host)
|
||||||
u32 max_current_caps;
|
u32 max_current_caps;
|
||||||
unsigned int ocr_avail;
|
unsigned int ocr_avail;
|
||||||
unsigned int override_timeout_clk;
|
unsigned int override_timeout_clk;
|
||||||
|
u32 max_clk;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
WARN_ON(host == NULL);
|
WARN_ON(host == NULL);
|
||||||
|
@ -3050,18 +3051,22 @@ int sdhci_add_host(struct sdhci_host *host)
|
||||||
* Set host parameters.
|
* Set host parameters.
|
||||||
*/
|
*/
|
||||||
mmc->ops = &sdhci_ops;
|
mmc->ops = &sdhci_ops;
|
||||||
mmc->f_max = host->max_clk;
|
max_clk = host->max_clk;
|
||||||
|
|
||||||
if (host->ops->get_min_clock)
|
if (host->ops->get_min_clock)
|
||||||
mmc->f_min = host->ops->get_min_clock(host);
|
mmc->f_min = host->ops->get_min_clock(host);
|
||||||
else if (host->version >= SDHCI_SPEC_300) {
|
else if (host->version >= SDHCI_SPEC_300) {
|
||||||
if (host->clk_mul) {
|
if (host->clk_mul) {
|
||||||
mmc->f_min = (host->max_clk * host->clk_mul) / 1024;
|
mmc->f_min = (host->max_clk * host->clk_mul) / 1024;
|
||||||
mmc->f_max = host->max_clk * host->clk_mul;
|
max_clk = host->max_clk * host->clk_mul;
|
||||||
} else
|
} else
|
||||||
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300;
|
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300;
|
||||||
} else
|
} else
|
||||||
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
|
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
|
||||||
|
|
||||||
|
if (!mmc->f_max || (mmc->f_max && (mmc->f_max > max_clk)))
|
||||||
|
mmc->f_max = max_clk;
|
||||||
|
|
||||||
if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
|
if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
|
||||||
host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >>
|
host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >>
|
||||||
SDHCI_TIMEOUT_CLK_SHIFT;
|
SDHCI_TIMEOUT_CLK_SHIFT;
|
||||||
|
|
Loading…
Reference in New Issue