PM / devfreq: Unify frequency change to devfreq_update_target func
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 7 Oct 2020 13:02:39 +0000 (22:02 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 26 Oct 2020 01:52:37 +0000 (10:52 +0900)
The update_devfreq() and update_passive_devfreq() have the duplicate
code when changing the target frequency on final stage. So, unify
frequency change code to devfreq_update_target() to remove the
duplicate code and to centralize the frequency change code.

Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
drivers/devfreq/devfreq.c
drivers/devfreq/governor.h
drivers/devfreq/governor_passive.c

index 861c100..ab5dd9d 100644 (file)
@@ -382,18 +382,19 @@ static int devfreq_set_target(struct devfreq *devfreq, unsigned long new_freq,
        return err;
 }
 
-/* Load monitoring helper functions for governors use */
-
 /**
- * update_devfreq() - Reevaluate the device and configure frequency.
+ * devfreq_update_target() - Reevaluate the device and configure frequency
+ *                        on the final stage.
  * @devfreq:   the devfreq instance.
+ * @freq:      the new frequency of parent device. This argument
+ *             is only used for devfreq device using passive governor.
  *
- * Note: Lock devfreq->lock before calling update_devfreq
- *      This function is exported for governors.
+ * Note: Lock devfreq->lock before calling devfreq_update_target. This function
+ *      should be only used by both update_devfreq() and devfreq governors.
  */
-int update_devfreq(struct devfreq *devfreq)
+int devfreq_update_target(struct devfreq *devfreq, unsigned long freq)
 {
-       unsigned long freq, min_freq, max_freq;
+       unsigned long min_freq, max_freq;
        int err = 0;
        u32 flags = 0;
 
@@ -418,7 +419,21 @@ int update_devfreq(struct devfreq *devfreq)
        }
 
        return devfreq_set_target(devfreq, freq, flags);
+}
+EXPORT_SYMBOL(devfreq_update_target);
+
+/* Load monitoring helper functions for governors use */
 
+/**
+ * update_devfreq() - Reevaluate the device and configure frequency.
+ * @devfreq:   the devfreq instance.
+ *
+ * Note: Lock devfreq->lock before calling update_devfreq
+ *      This function is exported for governors.
+ */
+int update_devfreq(struct devfreq *devfreq)
+{
+       return devfreq_update_target(devfreq, 0L);
 }
 EXPORT_SYMBOL(update_devfreq);
 
index ae4d0cc..02cf876 100644 (file)
@@ -67,6 +67,7 @@ int devfreq_add_governor(struct devfreq_governor *governor);
 int devfreq_remove_governor(struct devfreq_governor *governor);
 
 int devfreq_update_status(struct devfreq *devfreq, unsigned long freq);
+int devfreq_update_target(struct devfreq *devfreq, unsigned long freq);
 
 static inline int devfreq_update_stats(struct devfreq *df)
 {
index be6eeab..53a1b15 100644 (file)
@@ -92,36 +92,6 @@ out:
        return ret;
 }
 
-static int update_devfreq_passive(struct devfreq *devfreq, unsigned long freq)
-{
-       int ret;
-
-       if (!devfreq->governor)
-               return -EINVAL;
-
-       mutex_lock_nested(&devfreq->lock, SINGLE_DEPTH_NESTING);
-
-       ret = devfreq->governor->get_target_freq(devfreq, &freq);
-       if (ret < 0)
-               goto out;
-
-       ret = devfreq->profile->target(devfreq->dev.parent, &freq, 0);
-       if (ret < 0)
-               goto out;
-
-       if (devfreq->profile->freq_table
-               && (devfreq_update_status(devfreq, freq)))
-               dev_err(&devfreq->dev,
-                       "Couldn't update frequency transition information.\n");
-
-       devfreq->previous_freq = freq;
-
-out:
-       mutex_unlock(&devfreq->lock);
-
-       return 0;
-}
-
 static int devfreq_passive_notifier_call(struct notifier_block *nb,
                                unsigned long event, void *ptr)
 {
@@ -131,17 +101,25 @@ static int devfreq_passive_notifier_call(struct notifier_block *nb,
        struct devfreq *parent = (struct devfreq *)data->parent;
        struct devfreq_freqs *freqs = (struct devfreq_freqs *)ptr;
        unsigned long freq = freqs->new;
+       int ret = 0;
 
+       mutex_lock_nested(&devfreq->lock, SINGLE_DEPTH_NESTING);
        switch (event) {
        case DEVFREQ_PRECHANGE:
                if (parent->previous_freq > freq)
-                       update_devfreq_passive(devfreq, freq);
+                       ret = devfreq_update_target(devfreq, freq);
+
                break;
        case DEVFREQ_POSTCHANGE:
                if (parent->previous_freq < freq)
-                       update_devfreq_passive(devfreq, freq);
+                       ret = devfreq_update_target(devfreq, freq);
                break;
        }
+       mutex_unlock(&devfreq->lock);
+
+       if (ret < 0)
+               dev_warn(&devfreq->dev,
+                       "failed to update devfreq using passive governor\n");
 
        return NOTIFY_DONE;
 }