]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
regulator: Fix useless O^2 complexity in suspend/resume
authorMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 3 Sep 2018 14:49:36 +0000 (16:49 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 3 Sep 2018 15:11:04 +0000 (16:11 +0100)
regulator_pm_ops with regulator_suspend and regulator_resume functions are
assigned to every regulator device registered in the system, so there is no
need to iterate over all again in them. Replace class_for_each_device()
construction with direct operation on the rdev embedded in the given
regulator device. This saves a lots of useless operations in suspend and
resume paths.

Fixes: f7efad10b5c4: regulator: add PM suspend and resume hooks
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/core.c

index f686f2311317ab0ef87409fae4afe6a189b417bc..a147871af09b0e3550642ef0d5acf4105c01ff09 100644 (file)
@@ -4464,19 +4464,6 @@ void regulator_unregister(struct regulator_dev *rdev)
 EXPORT_SYMBOL_GPL(regulator_unregister);
 
 #ifdef CONFIG_SUSPEND
-static int _regulator_suspend(struct device *dev, void *data)
-{
-       struct regulator_dev *rdev = dev_to_rdev(dev);
-       suspend_state_t *state = data;
-       int ret;
-
-       regulator_lock(rdev);
-       ret = suspend_set_state(rdev, *state);
-       regulator_unlock(rdev);
-
-       return ret;
-}
-
 /**
  * regulator_suspend - prepare regulators for system wide suspend
  * @state: system suspend state
@@ -4485,20 +4472,25 @@ static int _regulator_suspend(struct device *dev, void *data)
  */
 static int regulator_suspend(struct device *dev)
 {
+       struct regulator_dev *rdev = dev_to_rdev(dev);
        suspend_state_t state = pm_suspend_target_state;
+       int ret;
+
+       regulator_lock(rdev);
+       ret = suspend_set_state(rdev, state);
+       regulator_unlock(rdev);
 
-       return class_for_each_device(&regulator_class, NULL, &state,
-                                    _regulator_suspend);
+       return ret;
 }
 
-static int _regulator_resume(struct device *dev, void *data)
+static int regulator_resume(struct device *dev)
 {
-       int ret = 0;
+       suspend_state_t state = pm_suspend_target_state;
        struct regulator_dev *rdev = dev_to_rdev(dev);
-       suspend_state_t *state = data;
        struct regulator_state *rstate;
+       int ret = 0;
 
-       rstate = regulator_get_suspend_state(rdev, *state);
+       rstate = regulator_get_suspend_state(rdev, state);
        if (rstate == NULL)
                return 0;
 
@@ -4513,15 +4505,6 @@ static int _regulator_resume(struct device *dev, void *data)
 
        return ret;
 }
-
-static int regulator_resume(struct device *dev)
-{
-       suspend_state_t state = pm_suspend_target_state;
-
-       return class_for_each_device(&regulator_class, NULL, &state,
-                                    _regulator_resume);
-}
-
 #else /* !CONFIG_SUSPEND */
 
 #define regulator_suspend      NULL