int                     context_loss;
        int                     protect_card;
        int                     reqs_blocked;
-       int                     use_reg;
        int                     req_in_progress;
        unsigned long           clk_rate;
        unsigned int            flags;
                platform_get_drvdata(to_platform_device(dev));
        int ret = 0;
 
+       if (mmc_pdata(host)->set_power)
+               return mmc_pdata(host)->set_power(dev, power_on, vdd);
+
        /*
         * If we don't see a Vcc regulator, assume it's a fixed
         * voltage always-on regulator.
        struct regulator *reg;
        int ocr_value = 0;
 
+       if (mmc_pdata(host)->set_power)
+               return 0;
+
        reg = devm_regulator_get(host->dev, "vmmc");
        if (IS_ERR(reg)) {
                dev_err(host->dev, "unable to get vmmc regulator %ld\n",
                        }
                }
        }
-       mmc_pdata(host)->set_power = omap_hsmmc_set_power;
 
        /* Allow an aux regulator */
        reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
            (host->vcc_aux && regulator_is_enabled(host->vcc_aux))) {
                int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
 
-               mmc_pdata(host)->set_power(host->dev, 1, vdd);
-               mmc_pdata(host)->set_power(host->dev, 0, 0);
+               omap_hsmmc_set_power(host->dev, 1, vdd);
+               omap_hsmmc_set_power(host->dev, 0, 0);
        }
 
        return 0;
 
 static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
 {
-       mmc_pdata(host)->set_power = NULL;
+       if (mmc_pdata(host)->set_power)
+               return;
 }
 
 static inline int omap_hsmmc_have_reg(void)
 
 #else
 
+static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
+{
+       return 0;
+}
+
 static inline int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
 {
        return -EINVAL;
                clk_disable_unprepare(host->dbclk);
 
        /* Turn the power off */
-       ret = mmc_pdata(host)->set_power(host->dev, 0, 0);
+       ret = omap_hsmmc_set_power(host->dev, 0, 0);
 
        /* Turn the power ON with given VDD 1.8 or 3.0v */
        if (!ret)
-               ret = mmc_pdata(host)->set_power(host->dev, 1, vdd);
+               ret = omap_hsmmc_set_power(host->dev, 1, vdd);
        pm_runtime_get_sync(host->dev);
        if (host->dbclk)
                clk_prepare_enable(host->dbclk);
        if (ios->power_mode != host->power_mode) {
                switch (ios->power_mode) {
                case MMC_POWER_OFF:
-                       mmc_pdata(host)->set_power(host->dev, 0, 0);
+                       omap_hsmmc_set_power(host->dev, 0, 0);
                        break;
                case MMC_POWER_UP:
-                       mmc_pdata(host)->set_power(host->dev, 1, ios->vdd);
+                       omap_hsmmc_set_power(host->dev, 1, ios->vdd);
                        break;
                case MMC_POWER_ON:
                        do_send_init_stream = 1;
                goto err_irq;
        }
 
-       if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
+       if (omap_hsmmc_have_reg()) {
                ret = omap_hsmmc_reg_get(host);
                if (ret)
                        goto err_irq;
-               host->use_reg = 1;
        }
 
        mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
 
 err_slot_name:
        mmc_remove_host(mmc);
-       if (host->use_reg)
-               omap_hsmmc_reg_put(host);
+       omap_hsmmc_reg_put(host);
 err_irq:
        device_init_wakeup(&pdev->dev, false);
        if (host->tx_chan)
 
        pm_runtime_get_sync(host->dev);
        mmc_remove_host(host->mmc);
-       if (host->use_reg)
-               omap_hsmmc_reg_put(host);
+       omap_hsmmc_reg_put(host);
 
        if (host->tx_chan)
                dma_release_channel(host->tx_chan);