mmc: tmio: stop clock when 0Hz is requested
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Fri, 1 Apr 2016 15:44:35 +0000 (17:44 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 2 May 2016 08:33:13 +0000 (10:33 +0200)
Setting frequency to 0 is not enough, the clock explicitly has to be
disabled. Otherwise voltage switching (which needs SDCLK to be quiet)
fails for various cards.

Because we now do the 'new_clock == 0' check right at the beginning,
the indentation level of the rest of the code can be decreased a little.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/tmio_mmc_pio.c

index 79a4a795747478152fc03ce50ddd43a9894de0d2..8290f987d1ba6eee36ac6aa859990c08952e9358 100644 (file)
@@ -166,25 +166,39 @@ static void tmio_mmc_clk_start(struct tmio_mmc_host *host)
        }
 }
 
+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);
+               msleep(10);
+       }
+
+       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 ? 5 : 10);
+}
+
 static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
                                unsigned int new_clock)
 {
        u32 clk = 0, clock;
 
-       if (new_clock) {
-               if (host->clk_update)
-                       clock = host->clk_update(host, new_clock) / 512;
-               else
-                       clock = host->mmc->f_min;
+       if (new_clock == 0) {
+               tmio_mmc_clk_stop(host);
+               return;
+       }
 
-               for (clk = 0x80000080; new_clock >= (clock << 1); clk >>= 1)
-                       clock <<= 1;
+       if (host->clk_update)
+               clock = host->clk_update(host, new_clock) / 512;
+       else
+               clock = host->mmc->f_min;
 
-               /* 1/1 clock is option */
-               if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) &&
-                  ((clk >> 22) & 0x1))
-                       clk |= 0xff;
-       }
+       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))
+               clk |= 0xff;
 
        if (host->set_clk_div)
                host->set_clk_div(host->pdev, (clk >> 22) & 1);
@@ -198,18 +212,6 @@ static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
        tmio_mmc_clk_start(host);
 }
 
-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);
-               msleep(10);
-       }
-
-       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 ? 5 : 10);
-}
-
 static void tmio_mmc_reset(struct tmio_mmc_host *host)
 {
        /* FIXME - should we set stop clock reg here */