Commit 86ad9a24 authored by Saravana Kannan's avatar Saravana Kannan Committed by Viresh Kumar

PM / devfreq: Add required OPPs support to passive governor

Look at the required OPPs of the "parent" device to determine the OPP that
is required from the slave device managed by the passive governor. This
allows having mappings between a parent device and a slave device even when
they don't have the same number of OPPs.

While at it do a minor spell-fix and remove out label.
Signed-off-by: default avatarSaravana Kannan <saravanak@google.com>
Acked-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
Acked-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: default avatarHsin-Yi Wang <hsinyi@chromium.org>
[ Viresh: Rearranged code and clean error paths ]
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 26f9c7cc
...@@ -19,18 +19,16 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, ...@@ -19,18 +19,16 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq,
= (struct devfreq_passive_data *)devfreq->data; = (struct devfreq_passive_data *)devfreq->data;
struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent;
unsigned long child_freq = ULONG_MAX; unsigned long child_freq = ULONG_MAX;
struct dev_pm_opp *opp; struct dev_pm_opp *opp, *p_opp;
int i, count, ret = 0; int i, count;
/* /*
* If the devfreq device with passive governor has the specific method * If the devfreq device with passive governor has the specific method
* to determine the next frequency, should use the get_target_freq() * to determine the next frequency, should use the get_target_freq()
* of struct devfreq_passive_data. * of struct devfreq_passive_data.
*/ */
if (p_data->get_target_freq) { if (p_data->get_target_freq)
ret = p_data->get_target_freq(devfreq, freq); return p_data->get_target_freq(devfreq, freq);
goto out;
}
/* /*
* If the parent and passive devfreq device uses the OPP table, * If the parent and passive devfreq device uses the OPP table,
...@@ -56,26 +54,35 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, ...@@ -56,26 +54,35 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq,
* list of parent device. Because in this case, *freq is temporary * list of parent device. Because in this case, *freq is temporary
* value which is decided by ondemand governor. * value which is decided by ondemand governor.
*/ */
opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); if (devfreq->opp_table && parent_devfreq->opp_table) {
if (IS_ERR(opp)) { p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent,
ret = PTR_ERR(opp); freq, 0);
goto out; 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);
dev_pm_opp_put(opp); if (IS_ERR(opp))
return PTR_ERR(opp);
*freq = dev_pm_opp_get_freq(opp);
dev_pm_opp_put(opp);
return 0;
}
/* /*
* Get the OPP table's index of decided freqeuncy by governor * Get the OPP table's index of decided frequency by governor
* of parent device. * of parent device.
*/ */
for (i = 0; i < parent_devfreq->profile->max_state; i++) for (i = 0; i < parent_devfreq->profile->max_state; i++)
if (parent_devfreq->profile->freq_table[i] == *freq) if (parent_devfreq->profile->freq_table[i] == *freq)
break; break;
if (i == parent_devfreq->profile->max_state) { if (i == parent_devfreq->profile->max_state)
ret = -EINVAL; return -EINVAL;
goto out;
}
/* Get the suitable frequency by using index of parent device. */ /* Get the suitable frequency by using index of parent device. */
if (i < devfreq->profile->max_state) { if (i < devfreq->profile->max_state) {
...@@ -88,8 +95,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, ...@@ -88,8 +95,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq,
/* Return the suitable frequency for passive device. */ /* Return the suitable frequency for passive device. */
*freq = child_freq; *freq = child_freq;
out: return 0;
return ret;
} }
static int devfreq_passive_notifier_call(struct notifier_block *nb, static int devfreq_passive_notifier_call(struct notifier_block *nb,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment