|
@@ -55,8 +55,32 @@ static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
|
|
|
return freq;
|
|
|
}
|
|
|
|
|
|
+static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
+{
|
|
|
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
|
|
+ struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
|
|
|
+ bool ctrl_phy = false;
|
|
|
+
|
|
|
+ if (clock > MMC_HIGH_52_MAX_DTR && (!IS_ERR(sdhci_arasan->phy)))
|
|
|
+ ctrl_phy = true;
|
|
|
+
|
|
|
+ if (ctrl_phy) {
|
|
|
+ spin_unlock_irq(&host->lock);
|
|
|
+ phy_power_off(sdhci_arasan->phy);
|
|
|
+ spin_lock_irq(&host->lock);
|
|
|
+ }
|
|
|
+
|
|
|
+ sdhci_set_clock(host, clock);
|
|
|
+
|
|
|
+ if (ctrl_phy) {
|
|
|
+ spin_unlock_irq(&host->lock);
|
|
|
+ phy_power_on(sdhci_arasan->phy);
|
|
|
+ spin_lock_irq(&host->lock);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static struct sdhci_ops sdhci_arasan_ops = {
|
|
|
- .set_clock = sdhci_set_clock,
|
|
|
+ .set_clock = sdhci_arasan_set_clock,
|
|
|
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
|
|
|
.get_timeout_clock = sdhci_arasan_get_timeout_clock,
|
|
|
.set_bus_width = sdhci_set_bus_width,
|