]> Pileus Git - ~andy/linux/blobdiff - drivers/regulator/core.c
Merge remote-tracking branch 'regulator/topic/optional' into regulator-next
[~andy/linux] / drivers / regulator / core.c
index 960103a6100041e008ce6793304c82299ca59b16..6382f0af353bc257e3ee6c3b545f75c0c1f2904e 100644 (file)
@@ -55,7 +55,6 @@ static LIST_HEAD(regulator_map_list);
 static LIST_HEAD(regulator_ena_gpio_list);
 static LIST_HEAD(regulator_supply_alias_list);
 static bool has_full_constraints;
-static bool board_wants_dummy_regulator;
 
 static struct dentry *debugfs_root;
 
@@ -1303,12 +1302,12 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 
 /* Internal regulator request function */
 static struct regulator *_regulator_get(struct device *dev, const char *id,
-                                       bool exclusive)
+                                       bool exclusive, bool allow_dummy)
 {
        struct regulator_dev *rdev;
        struct regulator *regulator = ERR_PTR(-EPROBE_DEFER);
        const char *devname = NULL;
-       int ret = 0;
+       int ret = -EPROBE_DEFER;
 
        if (id == NULL) {
                pr_err("get() with no identifier\n");
@@ -1324,34 +1323,32 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
        if (rdev)
                goto found;
 
+       regulator = ERR_PTR(ret);
+
        /*
         * If we have return value from dev_lookup fail, we do not expect to
         * succeed, so, quit with appropriate error value
         */
-       if (ret) {
-               regulator = ERR_PTR(ret);
+       if (ret && ret != -ENODEV) {
                goto out;
        }
 
-       if (board_wants_dummy_regulator) {
-               rdev = dummy_regulator_rdev;
-               goto found;
-       }
-
-#ifdef CONFIG_REGULATOR_DUMMY
        if (!devname)
                devname = "deviceless";
 
-       /* If the board didn't flag that it was fully constrained then
-        * substitute in a dummy regulator so consumers can continue.
+       /*
+        * Assume that a regulator is physically present and enabled
+        * even if it isn't hooked up and just provide a dummy.
         */
-       if (!has_full_constraints) {
+       if (has_full_constraints && allow_dummy) {
                pr_warn("%s supply %s not found, using dummy regulator\n",
                        devname, id);
+
                rdev = dummy_regulator_rdev;
                goto found;
+       } else {
+               dev_err(dev, "dummy supplies not allowed\n");
        }
-#endif
 
        mutex_unlock(&regulator_list_mutex);
        return regulator;
@@ -1409,7 +1406,7 @@ out:
  */
 struct regulator *regulator_get(struct device *dev, const char *id)
 {
-       return _regulator_get(dev, id, false);
+       return _regulator_get(dev, id, false, true);
 }
 EXPORT_SYMBOL_GPL(regulator_get);
 
@@ -1436,7 +1433,7 @@ EXPORT_SYMBOL_GPL(regulator_get);
  */
 struct regulator *regulator_get_exclusive(struct device *dev, const char *id)
 {
-       return _regulator_get(dev, id, true);
+       return _regulator_get(dev, id, true, false);
 }
 EXPORT_SYMBOL_GPL(regulator_get_exclusive);
 
@@ -1465,7 +1462,7 @@ EXPORT_SYMBOL_GPL(regulator_get_exclusive);
  */
 struct regulator *regulator_get_optional(struct device *dev, const char *id)
 {
-       return _regulator_get(dev, id, 0);
+       return _regulator_get(dev, id, false, false);
 }
 EXPORT_SYMBOL_GPL(regulator_get_optional);
 
@@ -3663,22 +3660,6 @@ void regulator_has_full_constraints(void)
 }
 EXPORT_SYMBOL_GPL(regulator_has_full_constraints);
 
-/**
- * regulator_use_dummy_regulator - Provide a dummy regulator when none is found
- *
- * Calling this function will cause the regulator API to provide a
- * dummy regulator to consumers if no physical regulator is found,
- * allowing most consumers to proceed as though a regulator were
- * configured.  This allows systems such as those with software
- * controllable regulators for the CPU core only to be brought up more
- * readily.
- */
-void regulator_use_dummy_regulator(void)
-{
-       board_wants_dummy_regulator = true;
-}
-EXPORT_SYMBOL_GPL(regulator_use_dummy_regulator);
-
 /**
  * rdev_get_drvdata - get rdev regulator driver data
  * @rdev: regulator