|
@@ -154,6 +154,18 @@ 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));
|
|
|
|
+ msleep(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG ? 1 : 10);
|
|
|
|
+
|
|
|
|
+ if (host->pdata->flags & TMIO_MMC_HAVE_HIGH_REG) {
|
|
|
|
+ sd_ctrl_write16(host, CTL_CLK_AND_WAIT_CTL, 0x0100);
|
|
|
|
+ msleep(10);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
|
|
static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
|
|
unsigned int new_clock)
|
|
unsigned int new_clock)
|
|
{
|
|
{
|
|
@@ -182,6 +194,8 @@ static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
|
|
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
|
|
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
|
|
if (!(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG))
|
|
if (!(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG))
|
|
msleep(10);
|
|
msleep(10);
|
|
|
|
+
|
|
|
|
+ tmio_mmc_clk_start(host);
|
|
}
|
|
}
|
|
|
|
|
|
static void tmio_mmc_clk_stop(struct tmio_mmc_host *host)
|
|
static void tmio_mmc_clk_stop(struct tmio_mmc_host *host)
|
|
@@ -196,18 +210,6 @@ static void tmio_mmc_clk_stop(struct tmio_mmc_host *host)
|
|
msleep(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG ? 5 : 10);
|
|
msleep(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG ? 5 : 10);
|
|
}
|
|
}
|
|
|
|
|
|
-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));
|
|
|
|
- msleep(host->pdata->flags & TMIO_MMC_FAST_CLK_CHG ? 1 : 10);
|
|
|
|
-
|
|
|
|
- if (host->pdata->flags & TMIO_MMC_HAVE_HIGH_REG) {
|
|
|
|
- sd_ctrl_write16(host, CTL_CLK_AND_WAIT_CTL, 0x0100);
|
|
|
|
- msleep(10);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
|
static void tmio_mmc_reset(struct tmio_mmc_host *host)
|
|
{
|
|
{
|
|
/* FIXME - should we set stop clock reg here */
|
|
/* FIXME - should we set stop clock reg here */
|
|
@@ -955,14 +957,12 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
tmio_mmc_clk_stop(host);
|
|
tmio_mmc_clk_stop(host);
|
|
break;
|
|
break;
|
|
case MMC_POWER_UP:
|
|
case MMC_POWER_UP:
|
|
- tmio_mmc_set_clock(host, ios->clock);
|
|
|
|
tmio_mmc_power_on(host, ios->vdd);
|
|
tmio_mmc_power_on(host, ios->vdd);
|
|
- tmio_mmc_clk_start(host);
|
|
|
|
|
|
+ tmio_mmc_set_clock(host, ios->clock);
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
break;
|
|
break;
|
|
case MMC_POWER_ON:
|
|
case MMC_POWER_ON:
|
|
tmio_mmc_set_clock(host, ios->clock);
|
|
tmio_mmc_set_clock(host, ios->clock);
|
|
- tmio_mmc_clk_start(host);
|
|
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1271,10 +1271,8 @@ int tmio_mmc_host_runtime_resume(struct device *dev)
|
|
tmio_mmc_reset(host);
|
|
tmio_mmc_reset(host);
|
|
tmio_mmc_clk_enable(host);
|
|
tmio_mmc_clk_enable(host);
|
|
|
|
|
|
- if (host->clk_cache) {
|
|
|
|
|
|
+ if (host->clk_cache)
|
|
tmio_mmc_set_clock(host, host->clk_cache);
|
|
tmio_mmc_set_clock(host, host->clk_cache);
|
|
- tmio_mmc_clk_start(host);
|
|
|
|
- }
|
|
|
|
|
|
|
|
tmio_mmc_enable_dma(host, true);
|
|
tmio_mmc_enable_dma(host, true);
|
|
|
|
|