|
@@ -157,83 +157,6 @@ static void tmio_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void tmio_mmc_clk_start(struct tmio_mmc_host *host)
|
|
|
-{
|
|
|
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
|
|
|
- sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
|
|
|
-
|
|
|
- /* HW engineers overrode docs: no sleep needed on R-Car2+ */
|
|
|
- if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
|
|
|
- usleep_range(10000, 11000);
|
|
|
-
|
|
|
- if (host->pdata->flags & TMIO_MMC_HAVE_HIGH_REG) {
|
|
|
- sd_ctrl_write16(host, CTL_CLK_AND_WAIT_CTL, 0x0100);
|
|
|
- usleep_range(10000, 11000);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void tmio_mmc_clk_stop(struct tmio_mmc_host *host)
|
|
|
-{
|
|
|
- if (host->pdata->flags & TMIO_MMC_HAVE_HIGH_REG) {
|
|
|
- sd_ctrl_write16(host, CTL_CLK_AND_WAIT_CTL, 0x0000);
|
|
|
- usleep_range(10000, 11000);
|
|
|
- }
|
|
|
-
|
|
|
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
|
|
|
- sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
|
|
|
-
|
|
|
- /* HW engineers overrode docs: no sleep needed on R-Car2+ */
|
|
|
- if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
|
|
|
- usleep_range(10000, 11000);
|
|
|
-}
|
|
|
-
|
|
|
-static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
|
|
|
- unsigned int new_clock)
|
|
|
-{
|
|
|
- u32 clk = 0, clock;
|
|
|
-
|
|
|
- if (new_clock == 0) {
|
|
|
- tmio_mmc_clk_stop(host);
|
|
|
- return;
|
|
|
- }
|
|
|
- /*
|
|
|
- * Both HS400 and HS200/SD104 set 200MHz, but some devices need to
|
|
|
- * set 400MHz to distinguish the CPG settings in HS400.
|
|
|
- */
|
|
|
- if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400 &&
|
|
|
- host->pdata->flags & TMIO_MMC_HAVE_4TAP_HS400 &&
|
|
|
- new_clock == 200000000)
|
|
|
- new_clock = 400000000;
|
|
|
-
|
|
|
- if (host->clk_update)
|
|
|
- clock = host->clk_update(host, new_clock) / 512;
|
|
|
- else
|
|
|
- clock = host->mmc->f_min;
|
|
|
-
|
|
|
- for (clk = 0x80000080; new_clock >= (clock << 1); clk >>= 1)
|
|
|
- clock <<= 1;
|
|
|
-
|
|
|
- /* 1/1 clock is option */
|
|
|
- if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) &&
|
|
|
- ((clk >> 22) & 0x1)) {
|
|
|
- if (!(host->mmc->ios.timing == MMC_TIMING_MMC_HS400))
|
|
|
- clk |= 0xff;
|
|
|
- else
|
|
|
- clk &= ~0xff;
|
|
|
- }
|
|
|
-
|
|
|
- if (host->set_clk_div)
|
|
|
- host->set_clk_div(host->pdev, (clk >> 22) & 1);
|
|
|
-
|
|
|
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
|
|
|
- sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
|
|
|
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
|
|
|
- if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
|
|
|
- usleep_range(10000, 11000);
|
|
|
-
|
|
|
- tmio_mmc_clk_start(host);
|
|
|
-}
|
|
|
-
|
|
|
static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
|
|
{
|
|
|
/* FIXME - should we set stop clock reg here */
|
|
@@ -1040,15 +963,15 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
switch (ios->power_mode) {
|
|
|
case MMC_POWER_OFF:
|
|
|
tmio_mmc_power_off(host);
|
|
|
- tmio_mmc_set_clock(host, 0);
|
|
|
+ host->set_clock(host, 0);
|
|
|
break;
|
|
|
case MMC_POWER_UP:
|
|
|
tmio_mmc_power_on(host, ios->vdd);
|
|
|
- tmio_mmc_set_clock(host, ios->clock);
|
|
|
+ host->set_clock(host, ios->clock);
|
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
|
break;
|
|
|
case MMC_POWER_ON:
|
|
|
- tmio_mmc_set_clock(host, ios->clock);
|
|
|
+ host->set_clock(host, ios->clock);
|
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
|
break;
|
|
|
}
|
|
@@ -1234,7 +1157,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|
|
int ret;
|
|
|
|
|
|
/*
|
|
|
- * Check the sanity of mmc->f_min to prevent tmio_mmc_set_clock() from
|
|
|
+ * Check the sanity of mmc->f_min to prevent host->set_clock() from
|
|
|
* looping forever...
|
|
|
*/
|
|
|
if (mmc->f_min == 0)
|
|
@@ -1244,7 +1167,6 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|
|
_host->write16_hook = NULL;
|
|
|
|
|
|
_host->set_pwr = pdata->set_pwr;
|
|
|
- _host->set_clk_div = pdata->set_clk_div;
|
|
|
|
|
|
ret = tmio_mmc_init_ocr(_host);
|
|
|
if (ret < 0)
|
|
@@ -1307,7 +1229,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
|
|
|
if (pdata->flags & TMIO_MMC_SDIO_IRQ)
|
|
|
_host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
|
|
|
|
|
|
- tmio_mmc_set_clock(_host, 0);
|
|
|
+ _host->set_clock(_host, 0);
|
|
|
tmio_mmc_reset(_host);
|
|
|
|
|
|
_host->sdcard_irq_mask = sd_ctrl_read16_and_16_as_32(_host, CTL_IRQ_MASK);
|
|
@@ -1391,7 +1313,7 @@ int tmio_mmc_host_runtime_suspend(struct device *dev)
|
|
|
tmio_mmc_disable_mmc_irqs(host, TMIO_MASK_ALL);
|
|
|
|
|
|
if (host->clk_cache)
|
|
|
- tmio_mmc_set_clock(host, 0);
|
|
|
+ host->set_clock(host, 0);
|
|
|
|
|
|
tmio_mmc_clk_disable(host);
|
|
|
|
|
@@ -1412,7 +1334,7 @@ int tmio_mmc_host_runtime_resume(struct device *dev)
|
|
|
tmio_mmc_clk_enable(host);
|
|
|
|
|
|
if (host->clk_cache)
|
|
|
- tmio_mmc_set_clock(host, host->clk_cache);
|
|
|
+ host->set_clock(host, host->clk_cache);
|
|
|
|
|
|
if (host->native_hotplug)
|
|
|
tmio_mmc_enable_mmc_irqs(host,
|