mmc: sdhci: Check and call config_dll callback functions

Check if the low level driver supports config_dll callback function and
call it if it does. Call with dll disable before calling set_clock and
with dll enable after it.

Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@amd.com>
This commit is contained in:
Ashok Reddy Soma 2023-01-10 04:31:22 -07:00 committed by Jaehoon Chung
parent 14ef4c7be5
commit 6f5bb9913c
2 changed files with 18 additions and 0 deletions

View file

@ -396,6 +396,14 @@ int sdhci_set_clock(struct mmc *mmc, unsigned int clock)
} }
} }
if (host->ops && host->ops->config_dll) {
ret = host->ops->config_dll(host, clock, false);
if (ret) {
printf("%s: Error while configuring dll\n", __func__);
return ret;
}
}
if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300) { if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300) {
/* /*
* Check if the Host Controller supports Programmable Clock * Check if the Host Controller supports Programmable Clock
@ -439,6 +447,14 @@ int sdhci_set_clock(struct mmc *mmc, unsigned int clock)
if (host->ops && host->ops->set_clock) if (host->ops && host->ops->set_clock)
host->ops->set_clock(host, div); host->ops->set_clock(host, div);
if (host->ops && host->ops->config_dll) {
ret = host->ops->config_dll(host, clock, true);
if (ret) {
printf("%s: Error while configuring dll\n", __func__);
return ret;
}
}
clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT; clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
<< SDHCI_DIVIDER_HI_SHIFT; << SDHCI_DIVIDER_HI_SHIFT;

View file

@ -272,6 +272,8 @@ struct sdhci_ops {
void (*set_clock)(struct sdhci_host *host, u32 div); void (*set_clock)(struct sdhci_host *host, u32 div);
int (*platform_execute_tuning)(struct mmc *host, u8 opcode); int (*platform_execute_tuning)(struct mmc *host, u8 opcode);
int (*set_delay)(struct sdhci_host *host); int (*set_delay)(struct sdhci_host *host);
/* Callback function to set DLL clock configuration */
int (*config_dll)(struct sdhci_host *host, u32 clock, bool enable);
int (*deferred_probe)(struct sdhci_host *host); int (*deferred_probe)(struct sdhci_host *host);
/** /**