return dev ? dev_to_rdev(dev) : NULL;
 }
 
+static struct regulator_dev *regulator_dt_lookup(struct device *dev,
+                                                const char *supply)
+{
+       struct regulator_dev *r = NULL;
+
+       if (dev_of_node(dev)) {
+               r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
+               if (PTR_ERR(r) == -ENODEV)
+                       r = NULL;
+       }
+
+       return r;
+}
+
 /**
  * regulator_dev_lookup - lookup a regulator device.
  * @dev: device for regulator "consumer".
        regulator_supply_alias(&dev, &supply);
 
        /* first do a dt based lookup */
-       if (dev_of_node(dev)) {
-               r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
-               if (!IS_ERR(r))
-                       return r;
-               if (PTR_ERR(r) == -EPROBE_DEFER)
-                       return r;
-
-               if (PTR_ERR(r) == -ENODEV)
-                       r = NULL;
-       }
+       r = regulator_dt_lookup(dev, supply);
+       if (r)
+               return r;
 
        /* if not found, try doing it non-dt way */
        if (dev)
        if (rdev->supply)
                return 0;
 
-       r = regulator_dev_lookup(dev, rdev->supply_name);
+       /* first do a dt based lookup on the node described in the virtual
+        * device.
+        */
+       r = regulator_dt_lookup(&rdev->dev, rdev->supply_name);
+
+       /* If regulator not found use usual search path in the parent
+        * device.
+        */
+       if (!r)
+               r = regulator_dev_lookup(dev, rdev->supply_name);
+
        if (IS_ERR(r)) {
                ret = PTR_ERR(r);