best_src, clock, best);
 
        /* select the new clock source */
-
        if (ourhost->cur_clk != best_src) {
                struct clk *clk = ourhost->clk_bus[best_src];
 
+               clk_enable(clk);
+               clk_disable(ourhost->clk_bus[ourhost->cur_clk]);
+
                /* turn clock off to card before changing clock source */
                writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);
 
                 */
                sc->cur_clk = ptr;
 
-               clk_enable(clk);
-
                dev_info(dev, "clock source %d: %s (%ld Hz)\n",
                         ptr, name, clk_get_rate(clk));
        }
                goto err_no_busclks;
        }
 
+       clk_enable(sc->clk_bus[sc->cur_clk]);
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        host->ioaddr = devm_request_and_ioremap(&pdev->dev, res);
        if (!host->ioaddr) {
        return 0;
 
  err_req_regs:
+       clk_disable(sc->clk_bus[sc->cur_clk]);
        for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
                if (sc->clk_bus[ptr]) {
-                       clk_disable(sc->clk_bus[ptr]);
                        clk_put(sc->clk_bus[ptr]);
                }
        }
 
        pm_runtime_disable(&pdev->dev);
 
+       clk_disable(sc->clk_bus[sc->cur_clk]);
        for (ptr = 0; ptr < 3; ptr++) {
                if (sc->clk_bus[ptr]) {
-                       clk_disable(sc->clk_bus[ptr]);
                        clk_put(sc->clk_bus[ptr]);
                }
        }