Merge remote-tracking branches 'regulator/topic/lp8788', 'regulator/topic/mt6311...
[cascardo/linux.git] / drivers / regulator / core.c
index 4cf1390..744c988 100644 (file)
@@ -132,24 +132,24 @@ static bool have_full_constraints(void)
        return has_full_constraints || of_have_populated_dt();
 }
 
+static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev)
+{
+       if (rdev && rdev->supply)
+               return rdev->supply->rdev;
+
+       return NULL;
+}
+
 /**
  * regulator_lock_supply - lock a regulator and its supplies
  * @rdev:         regulator source
  */
 static void regulator_lock_supply(struct regulator_dev *rdev)
 {
-       struct regulator *supply;
-       int i = 0;
-
-       while (1) {
-               mutex_lock_nested(&rdev->mutex, i++);
-               supply = rdev->supply;
-
-               if (!rdev->supply)
-                       return;
+       int i;
 
-               rdev = supply->rdev;
-       }
+       for (i = 0; rdev; rdev = rdev_get_supply(rdev), i++)
+               mutex_lock_nested(&rdev->mutex, i);
 }
 
 /**
@@ -2368,7 +2368,6 @@ static void regulator_disable_work(struct work_struct *work)
 int regulator_disable_deferred(struct regulator *regulator, int ms)
 {
        struct regulator_dev *rdev = regulator->rdev;
-       int ret;
 
        if (regulator->always_on)
                return 0;
@@ -2380,13 +2379,9 @@ int regulator_disable_deferred(struct regulator *regulator, int ms)
        rdev->deferred_disables++;
        mutex_unlock(&rdev->mutex);
 
-       ret = queue_delayed_work(system_power_efficient_wq,
-                                &rdev->disable_work,
-                                msecs_to_jiffies(ms));
-       if (ret < 0)
-               return ret;
-       else
-               return 0;
+       queue_delayed_work(system_power_efficient_wq, &rdev->disable_work,
+                          msecs_to_jiffies(ms));
+       return 0;
 }
 EXPORT_SYMBOL_GPL(regulator_disable_deferred);
 
@@ -3710,7 +3705,7 @@ static umode_t regulator_attr_is_visible(struct kobject *kobj,
                                         struct attribute *attr, int idx)
 {
        struct device *dev = kobj_to_dev(kobj);
-       struct regulator_dev *rdev = container_of(dev, struct regulator_dev, dev);
+       struct regulator_dev *rdev = dev_to_rdev(dev);
        const struct regulator_ops *ops = rdev->desc->ops;
        umode_t mode = attr->mode;