}
 EXPORT_SYMBOL_GPL(mmc_regulator_set_ocr);
 
+#endif /* CONFIG_REGULATOR */
+
 int mmc_regulator_get_supply(struct mmc_host *mmc)
 {
        struct device *dev = mmc_dev(mmc);
-       struct regulator *supply;
        int ret;
 
-       supply = devm_regulator_get(dev, "vmmc");
-       mmc->supply.vmmc = supply;
+       mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc");
        mmc->supply.vqmmc = devm_regulator_get_optional(dev, "vqmmc");
 
-       if (IS_ERR(supply))
-               return PTR_ERR(supply);
+       if (IS_ERR(mmc->supply.vmmc)) {
+               if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER)
+                       return -EPROBE_DEFER;
+               dev_info(dev, "No vmmc regulator found\n");
+       } else {
+               ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc);
+               if (ret > 0)
+                       mmc->ocr_avail = ret;
+               else
+                       dev_warn(dev, "Failed getting OCR mask: %d\n", ret);
+       }
 
-       ret = mmc_regulator_get_ocrmask(supply);
-       if (ret > 0)
-               mmc->ocr_avail = ret;
-       else
-               dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret);
+       if (IS_ERR(mmc->supply.vqmmc)) {
+               if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER)
+                       return -EPROBE_DEFER;
+               dev_info(dev, "No vqmmc regulator found\n");
+       }
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(mmc_regulator_get_supply);
 
-#endif /* CONFIG_REGULATOR */
-
 /*
  * Mask off any voltages we don't support and select
  * the lowest voltage
 
 int mmc_regulator_set_ocr(struct mmc_host *mmc,
                        struct regulator *supply,
                        unsigned short vdd_bit);
-int mmc_regulator_get_supply(struct mmc_host *mmc);
 #else
 static inline int mmc_regulator_get_ocrmask(struct regulator *supply)
 {
 {
        return 0;
 }
-
-static inline int mmc_regulator_get_supply(struct mmc_host *mmc)
-{
-       return 0;
-}
 #endif
 
+int mmc_regulator_get_supply(struct mmc_host *mmc);
+
 int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
 
 static inline int mmc_card_is_removable(struct mmc_host *host)