|
@@ -28,13 +28,9 @@
|
|
#include "sdhci-pltfm.h"
|
|
#include "sdhci-pltfm.h"
|
|
#include <linux/of.h>
|
|
#include <linux/of.h>
|
|
|
|
|
|
-#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
|
|
|
|
#define SDHCI_ARASAN_VENDOR_REGISTER 0x78
|
|
#define SDHCI_ARASAN_VENDOR_REGISTER 0x78
|
|
|
|
|
|
#define VENDOR_ENHANCED_STROBE BIT(0)
|
|
#define VENDOR_ENHANCED_STROBE BIT(0)
|
|
-#define CLK_CTRL_TIMEOUT_SHIFT 16
|
|
|
|
-#define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT)
|
|
|
|
-#define CLK_CTRL_TIMEOUT_MIN_EXP 13
|
|
|
|
|
|
|
|
#define PHY_CLK_TOO_SLOW_HZ 400000
|
|
#define PHY_CLK_TOO_SLOW_HZ 400000
|
|
|
|
|
|
@@ -163,15 +159,15 @@ static int sdhci_arasan_syscon_write(struct sdhci_host *host,
|
|
|
|
|
|
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
|
|
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
|
|
{
|
|
{
|
|
- u32 div;
|
|
|
|
unsigned long freq;
|
|
unsigned long freq;
|
|
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
|
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
|
|
|
|
|
- div = readl(host->ioaddr + SDHCI_ARASAN_CLK_CTRL_OFFSET);
|
|
|
|
- div = (div & CLK_CTRL_TIMEOUT_MASK) >> CLK_CTRL_TIMEOUT_SHIFT;
|
|
|
|
|
|
+ /* SDHCI timeout clock is in kHz */
|
|
|
|
+ freq = DIV_ROUND_UP(clk_get_rate(pltfm_host->clk), 1000);
|
|
|
|
|
|
- freq = clk_get_rate(pltfm_host->clk);
|
|
|
|
- freq /= 1 << (CLK_CTRL_TIMEOUT_MIN_EXP + div);
|
|
|
|
|
|
+ /* or in MHz */
|
|
|
|
+ if (host->caps & SDHCI_TIMEOUT_CLK_UNIT)
|
|
|
|
+ freq = DIV_ROUND_UP(freq, 1000);
|
|
|
|
|
|
return freq;
|
|
return freq;
|
|
}
|
|
}
|