host->clock = clock;
 }
 
-static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
+static int sdhci_set_power(struct sdhci_host *host, unsigned short power)
 {
        u8 pwr = 0;
 
        }
 
        if (host->pwr == pwr)
-               return;
+               return -1;
 
        host->pwr = pwr;
 
        if (pwr == 0) {
                sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
-               return;
+               return 0;
        }
 
        /*
         */
        if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
                mdelay(10);
+
+       return power;
 }
 
 /*****************************************************************************\
 static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
 {
        unsigned long flags;
+       int vdd_bit = -1;
        u8 ctrl;
 
        spin_lock_irqsave(&host->lock, flags);
 
-       if (host->flags & SDHCI_DEVICE_DEAD)
-               goto out;
+       if (host->flags & SDHCI_DEVICE_DEAD) {
+               spin_unlock_irqrestore(&host->lock, flags);
+               if (host->vmmc && ios->power_mode == MMC_POWER_OFF)
+                       mmc_regulator_set_ocr(host->mmc, host->vmmc, 0);
+               return;
+       }
 
        /*
         * Reset the chip on each power off.
        sdhci_set_clock(host, ios->clock);
 
        if (ios->power_mode == MMC_POWER_OFF)
-               sdhci_set_power(host, -1);
+               vdd_bit = sdhci_set_power(host, -1);
        else
-               sdhci_set_power(host, ios->vdd);
+               vdd_bit = sdhci_set_power(host, ios->vdd);
+
+       if (host->vmmc && vdd_bit != -1) {
+               spin_unlock_irqrestore(&host->lock, flags);
+               mmc_regulator_set_ocr(host->mmc, host->vmmc, vdd_bit);
+               spin_lock_irqsave(&host->lock, flags);
+       }
 
        if (host->ops->platform_send_init_74_clocks)
                host->ops->platform_send_init_74_clocks(host, ios->power_mode);
        if(host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS)
                sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
 
-out:
        mmiowb();
        spin_unlock_irqrestore(&host->lock, flags);
 }
 
        free_irq(host->irq, host);
 
-       if (host->vmmc)
-               ret = regulator_disable(host->vmmc);
-
        return ret;
 }
 
 {
        int ret;
 
-       if (host->vmmc) {
-               int ret = regulator_enable(host->vmmc);
-               if (ret)
-                       return ret;
-       }
-
        if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
                if (host->ops->enable_dma)
                        host->ops->enable_dma(host);
        if (IS_ERR(host->vmmc)) {
                pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc));
                host->vmmc = NULL;
-       } else {
-               regulator_enable(host->vmmc);
        }
 
        sdhci_init(host, 0);
        tasklet_kill(&host->card_tasklet);
        tasklet_kill(&host->finish_tasklet);
 
-       if (host->vmmc) {
-               regulator_disable(host->vmmc);
+       if (host->vmmc)
                regulator_put(host->vmmc);
-       }
 
        kfree(host->adma_desc);
        kfree(host->align_buffer);