#define CLK_CTRL_TIMEOUT_SHIFT 16
#define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT)
#define CLK_CTRL_TIMEOUT_MIN_EXP 13
+#define SD_CLK_25_MHZ 25000000
+#define SD_CLK_19_MHZ 19000000
/**
* struct sdhci_arasan_data
if (clock > MMC_HIGH_52_MAX_DTR && (!IS_ERR(sdhci_arasan->phy)))
ctrl_phy = true;
+ if ((host->quirks2 & SDHCI_QUIRK2_CLOCK_STANDARD_25_BROKEN) &&
+ (host->version >= SDHCI_SPEC_300)) {
+ if (clock == SD_CLK_25_MHZ)
+ clock = SD_CLK_19_MHZ;
+ }
+
if (ctrl_phy) {
spin_unlock_irq(&host->lock);
phy_power_off(sdhci_arasan->phy);
goto clk_disable_all;
}
+ if (of_device_is_compatible(pdev->dev.of_node, "arasan,sdhci-8.9a")) {
+ host->quirks2 |= SDHCI_QUIRK2_CLOCK_STANDARD_25_BROKEN;
+ }
+
sdhci_arasan->phy = ERR_PTR(-ENODEV);
if (of_device_is_compatible(pdev->dev.of_node,
"arasan,sdhci-5.1")) {
#define SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN (1<<15)
/* Tuning Broken for HS200, SDR50 and SDR104 */
#define SDHCI_QUIRK2_BROKEN_TUNING (1<<16)
+/* Broken Clock between 19MHz-25MHz */
+#define SDHCI_QUIRK2_CLOCK_STANDARD_25_BROKEN (1<<17)
+
/*
* When internal clock is disabled, a delay is needed before modifying the
* SD clock frequency or enabling back the internal clock.