static void tmio_mmc_set_clock(struct tmio_mmc_host *host, int new_clock)
 {
-       u32 clk = 0, clock, f_min = host->mmc->f_min;
+       u32 clk = 0, clock;
 
        if (new_clock) {
-               for (clock = f_min, clk = 0x100; new_clock >= (clock<<1); ) {
+               for (clock = host->mmc->f_min, clk = 0x80000080;
+                       new_clock >= (clock<<1); clk >>= 1)
                        clock <<= 1;
-                       clk >>= 1;
-               }
-               if (clk & 0x1)
-                       clk = 0x20000;
-
-               clk >>= 2;
-               sd_config_write8(host, CNF_SD_CLK_MODE, (clk & 0x8000) ? 0 : 1);
                clk |= 0x100;
        }
 
-       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk);
+       sd_config_write8(host, CNF_SD_CLK_MODE, clk >> 22);
+       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & 0x1ff);
 }
 
 static void tmio_mmc_clk_stop(struct tmio_mmc_host *host)