/* Get target freq via required opps */
child_freq = get_target_freq_by_required_opp(parent_devfreq->dev.parent,
parent_devfreq->opp_table,
devfreq->opp_table, freq); if (child_freq) goto out;
/* Use interpolation if required opps is not available */ for (i = 0; i < parent_devfreq->max_state; i++) if (parent_devfreq->freq_table[i] == *freq) break;
if (i == parent_devfreq->max_state) return -EINVAL;
if (i < devfreq->max_state) {
child_freq = devfreq->freq_table[i];
} else {
count = devfreq->max_state;
child_freq = devfreq->freq_table[count - 1];
}
/* * 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);
switch (p_data->parent_type) { case DEVFREQ_PARENT_DEV:
ret = get_target_freq_with_devfreq(devfreq, freq); break; case CPUFREQ_PARENT_DEV:
ret = get_target_freq_with_cpufreq(devfreq, freq); break; default:
ret = -EINVAL;
dev_err(&devfreq->dev, "Invalid parent type\n"); break;
}
p_data->nb.notifier_call = cpufreq_passive_notifier_call;
ret = cpufreq_register_notifier(&p_data->nb, CPUFREQ_TRANSITION_NOTIFIER); if (ret) {
dev_err(dev, "failed to register cpufreq notifier\n");
p_data->nb.notifier_call = NULL; goto err;
}
for_each_possible_cpu(cpu) {
policy = cpufreq_cpu_get(cpu); if (!policy) {
ret = -EPROBE_DEFER; goto err;
}
parent_cpu_data = get_parent_cpu_data(p_data, policy); if (parent_cpu_data) {
cpufreq_cpu_put(policy); continue;
}
parent_cpu_data = kzalloc(sizeof(*parent_cpu_data),
GFP_KERNEL); if (!parent_cpu_data) {
ret = -ENOMEM; goto err_put_policy;
}
cpu_dev = get_cpu_device(cpu); if (!cpu_dev) {
dev_err(dev, "failed to get cpu device\n");
ret = -ENODEV; goto err_free_cpu_data;
}
opp_table = dev_pm_opp_get_opp_table(cpu_dev); if (IS_ERR(opp_table)) {
dev_err(dev, "failed to get opp_table of cpu%d\n", cpu);
ret = PTR_ERR(opp_table); goto err_free_cpu_data;
}
mutex_lock(&devfreq->lock);
ret = devfreq_update_target(devfreq, 0L);
mutex_unlock(&devfreq->lock); if (ret)
dev_err(dev, "failed to update the frequency\n");
mutex_lock_nested(&devfreq->lock, SINGLE_DEPTH_NESTING); switch (event) { case DEVFREQ_PRECHANGE: if (parent->previous_freq > freq)
ret = devfreq_update_target(devfreq, freq);
break; case DEVFREQ_POSTCHANGE: if (parent->previous_freq < 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");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.