| From 850e92fd06cbf454394d72ee2578ee673a6fbfbb Mon Sep 17 00:00:00 2001 |
| From: Chanwoo Choi <cw00.choi@samsung.com> |
| Date: Tue, 2 Mar 2021 17:22:50 +0900 |
| Subject: [PATCH] FROMGIT: PM / devfreq: passive: Clean code when parent device |
| is devfreq |
| |
| In order to keep the consistent coding style between passive_devfreq |
| and passive_cpufreq, use common code for handling required opp property. |
| Also remove the unneed conditional statement and unify the comment |
| of both passive_devfreq and passive_cpufreq when getting the target frequency. |
| |
| Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> |
| |
| (cherry picked from commit 6d4e4f9ca6cc295239851e29297a5499d41dea5e |
| https://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git devfreq-testing-passive-gov) |
| |
| BUG=b:129039370 |
| TEST=boot krane |
| |
| Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> |
| Change-Id: Ib1d97f5be277f1627c435b0aa4b3cdfbbf3615c3 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2796713 |
| Reviewed-by: Sean Paul <seanpaul@chromium.org> |
| --- |
| drivers/devfreq/governor_passive.c | 80 ++++++------------------------ |
| 1 file changed, 15 insertions(+), 65 deletions(-) |
| |
| diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c |
| index 07e864509b7e..7102cb7eb30d 100644 |
| --- a/drivers/devfreq/governor_passive.c |
| +++ b/drivers/devfreq/governor_passive.c |
| @@ -91,66 +91,17 @@ static int get_target_freq_with_devfreq(struct devfreq *devfreq, |
| struct devfreq_passive_data *p_data |
| = (struct devfreq_passive_data *)devfreq->data; |
| struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; |
| - unsigned long child_freq = ULONG_MAX; |
| - struct dev_pm_opp *opp, *p_opp; |
| - int i, count; |
| - |
| - /* |
| - * If the devfreq device with passive governor has the specific method |
| - * to determine the next frequency, should use the get_target_freq() |
| - * of struct devfreq_passive_data. |
| - */ |
| - if (p_data->get_target_freq) |
| - return p_data->get_target_freq(devfreq, freq); |
| - |
| - /* |
| - * If the parent and passive devfreq device uses the OPP table, |
| - * get the next frequency by using the OPP table. |
| - */ |
| - |
| - /* |
| - * - parent devfreq device uses the governors except for passive. |
| - * - passive devfreq device uses the passive governor. |
| - * |
| - * Each devfreq has the OPP table. After deciding the new frequency |
| - * from the governor of parent devfreq device, the passive governor |
| - * need to get the index of new frequency on OPP table of parent |
| - * device. And then the index is used for getting the suitable |
| - * new frequency for passive devfreq device. |
| - */ |
| - if (!devfreq->profile || !devfreq->profile->freq_table |
| - || devfreq->profile->max_state <= 0) |
| - return -EINVAL; |
| - |
| - /* |
| - * The passive governor have to get the correct frequency from OPP |
| - * list of parent device. Because in this case, *freq is temporary |
| - * value which is decided by ondemand governor. |
| - */ |
| - if (devfreq->opp_table && parent_devfreq->opp_table) { |
| - p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent, |
| - freq, 0); |
| - if (IS_ERR(p_opp)) |
| - return PTR_ERR(p_opp); |
| - |
| - opp = dev_pm_opp_xlate_required_opp(parent_devfreq->opp_table, |
| - devfreq->opp_table, p_opp); |
| - dev_pm_opp_put(p_opp); |
| - |
| - if (IS_ERR(opp)) |
| - goto no_required_opp; |
| - |
| - *freq = dev_pm_opp_get_freq(opp); |
| - dev_pm_opp_put(opp); |
| - |
| - return 0; |
| - } |
| + unsigned long target_freq; |
| + int i; |
| + |
| + /* Get target freq via required opps */ |
| + target_freq = get_taget_freq_by_required_opp(parent_devfreq->dev.parent, |
| + parent_devfreq->opp_table, |
| + devfreq->opp_table, *freq); |
| + if (target_freq) |
| + goto out; |
| |
| -no_required_opp: |
| - /* |
| - * Get the OPP table's index of decided frequency by governor |
| - * of parent device. |
| - */ |
| + /* Use Interpolation if required opps is not available */ |
| for (i = 0; i < parent_devfreq->profile->max_state; i++) |
| if (parent_devfreq->profile->freq_table[i] == *freq) |
| break; |
| @@ -158,16 +109,15 @@ static int get_target_freq_with_devfreq(struct devfreq *devfreq, |
| if (i == parent_devfreq->profile->max_state) |
| return -EINVAL; |
| |
| - /* Get the suitable frequency by using index of parent device. */ |
| if (i < devfreq->profile->max_state) { |
| - child_freq = devfreq->profile->freq_table[i]; |
| + target_freq = devfreq->profile->freq_table[i]; |
| } else { |
| - count = devfreq->profile->max_state; |
| - child_freq = devfreq->profile->freq_table[count - 1]; |
| + i = devfreq->profile->max_state; |
| + target_freq = devfreq->profile->freq_table[i - 1]; |
| } |
| |
| - /* Return the suitable frequency for passive device. */ |
| - *freq = child_freq; |
| +out: |
| + *freq = target_freq; |
| |
| return 0; |
| } |
| -- |
| 2.32.0.93.g670b81a890-goog |
| |