Merge branch 'pm-cpufreq'

* pm-cpufreq: (38 commits)
  cpufreq: CPPC: Use transition_delay_us depending transition_latency
  cpufreq: tegra186: Don't validate the frequency table twice
  cpufreq: speedstep: Don't validate the frequency table twice
  cpufreq: sparc: Don't validate the frequency table twice
  cpufreq: sh: Don't validate the frequency table twice
  cpufreq: sfi: Don't validate the frequency table twice
  cpufreq: scpi: Don't validate the frequency table twice
  cpufreq: sc520: Don't validate the frequency table twice
  cpufreq: s3c24xx: Don't validate the frequency table twice
  cpufreq: qoirq: Don't validate the frequency table twice
  cpufreq: pxa: Don't validate the frequency table twice
  cpufreq: ppc_cbe: Don't validate the frequency table twice
  cpufreq: powernow: Don't validate the frequency table twice
  cpufreq: p4-clockmod: Don't validate the frequency table twice
  cpufreq: mediatek: Don't validate the frequency table twice
  cpufreq: longhaul: Don't validate the frequency table twice
  cpufreq: ia64-acpi: Don't validate the frequency table twice
  cpufreq: elanfreq: Don't validate the frequency table twice
  cpufreq: e_powersaver: Don't validate the frequency table twice
  cpufreq: cpufreq-dt: Don't validate the frequency table twice
  ...
This commit is contained in:
Rafael J. Wysocki 2018-04-02 11:00:46 +02:00
commit a9f36db7ec
38 changed files with 126 additions and 180 deletions

View File

@ -18,8 +18,6 @@ Optional properties:
in unit of nanoseconds. in unit of nanoseconds.
- voltage-tolerance: Specify the CPU voltage tolerance in percentage. - voltage-tolerance: Specify the CPU voltage tolerance in percentage.
- #cooling-cells: - #cooling-cells:
- cooling-min-level:
- cooling-max-level:
Please refer to Documentation/devicetree/bindings/thermal/thermal.txt. Please refer to Documentation/devicetree/bindings/thermal/thermal.txt.
Examples: Examples:
@ -40,8 +38,6 @@ cpus {
>; >;
clock-latency = <61036>; /* two CLK32 periods */ clock-latency = <61036>; /* two CLK32 periods */
#cooling-cells = <2>; #cooling-cells = <2>;
cooling-min-level = <0>;
cooling-max-level = <2>;
}; };
cpu@1 { cpu@1 {

View File

@ -21,8 +21,6 @@ Optional properties:
flow is handled by hardware, hence no software "voltage tracking" is flow is handled by hardware, hence no software "voltage tracking" is
needed. needed.
- #cooling-cells: - #cooling-cells:
- cooling-min-level:
- cooling-max-level:
Please refer to Documentation/devicetree/bindings/thermal/thermal.txt Please refer to Documentation/devicetree/bindings/thermal/thermal.txt
for detail. for detail.
@ -67,8 +65,6 @@ Example 1 (MT7623 SoC):
clock-names = "cpu", "intermediate"; clock-names = "cpu", "intermediate";
operating-points-v2 = <&cpu_opp_table>; operating-points-v2 = <&cpu_opp_table>;
#cooling-cells = <2>; #cooling-cells = <2>;
cooling-min-level = <0>;
cooling-max-level = <7>;
}; };
cpu@1 { cpu@1 {
device_type = "cpu"; device_type = "cpu";

View File

@ -87,8 +87,6 @@
clock-names = "cpu", "intermediate"; clock-names = "cpu", "intermediate";
operating-points-v2 = <&cpu_opp_table>; operating-points-v2 = <&cpu_opp_table>;
#cooling-cells = <2>; #cooling-cells = <2>;
cooling-min-level = <0>;
cooling-max-level = <7>;
clock-frequency = <1300000000>; clock-frequency = <1300000000>;
}; };

View File

@ -45,6 +45,7 @@ config ARM_DT_BL_CPUFREQ
config ARM_SCPI_CPUFREQ config ARM_SCPI_CPUFREQ
tristate "SCPI based CPUfreq driver" tristate "SCPI based CPUfreq driver"
depends on ARM_SCPI_PROTOCOL && COMMON_CLK_SCPI depends on ARM_SCPI_PROTOCOL && COMMON_CLK_SCPI
depends on !CPU_THERMAL || THERMAL
help help
This adds the CPUfreq driver support for ARM platforms using SCPI This adds the CPUfreq driver support for ARM platforms using SCPI
protocol for CPU power management. protocol for CPU power management.

View File

@ -794,15 +794,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
valid_states++; valid_states++;
} }
freq_table[valid_states].frequency = CPUFREQ_TABLE_END; freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
policy->freq_table = freq_table;
perf->state = 0; perf->state = 0;
result = cpufreq_table_validate_and_show(policy, freq_table);
if (result)
goto err_freqfree;
if (perf->states[0].core_frequency * 1000 != policy->cpuinfo.max_freq)
pr_warn(FW_WARN "P-state 0 is not max freq\n");
switch (perf->control_register.space_id) { switch (perf->control_register.space_id) {
case ACPI_ADR_SPACE_SYSTEM_IO: case ACPI_ADR_SPACE_SYSTEM_IO:
/* /*
@ -842,8 +836,6 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
return result; return result;
err_freqfree:
kfree(freq_table);
err_unreg: err_unreg:
acpi_processor_unregister_performance(cpu); acpi_processor_unregister_performance(cpu);
err_free_mask: err_free_mask:
@ -871,6 +863,15 @@ static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
return 0; return 0;
} }
static void acpi_cpufreq_cpu_ready(struct cpufreq_policy *policy)
{
struct acpi_processor_performance *perf = per_cpu_ptr(acpi_perf_data,
policy->cpu);
if (perf->states[0].core_frequency * 1000 != policy->cpuinfo.max_freq)
pr_warn(FW_WARN "P-state 0 is not max freq\n");
}
static int acpi_cpufreq_resume(struct cpufreq_policy *policy) static int acpi_cpufreq_resume(struct cpufreq_policy *policy)
{ {
struct acpi_cpufreq_data *data = policy->driver_data; struct acpi_cpufreq_data *data = policy->driver_data;
@ -898,6 +899,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
.bios_limit = acpi_processor_get_bios_limit, .bios_limit = acpi_processor_get_bios_limit,
.init = acpi_cpufreq_cpu_init, .init = acpi_cpufreq_cpu_init,
.exit = acpi_cpufreq_cpu_exit, .exit = acpi_cpufreq_cpu_exit,
.ready = acpi_cpufreq_cpu_ready,
.resume = acpi_cpufreq_resume, .resume = acpi_cpufreq_resume,
.name = "acpi-cpufreq", .name = "acpi-cpufreq",
.attr = acpi_cpufreq_attr, .attr = acpi_cpufreq_attr,

View File

@ -483,14 +483,7 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
if (ret) if (ret)
return ret; return ret;
ret = cpufreq_table_validate_and_show(policy, freq_table[cur_cluster]); policy->freq_table = freq_table[cur_cluster];
if (ret) {
dev_err(cpu_dev, "CPU %d, cluster: %d invalid freq table\n",
policy->cpu, cur_cluster);
put_cluster_clk_and_freq_table(cpu_dev, policy->cpus);
return ret;
}
policy->cpuinfo.transition_latency = policy->cpuinfo.transition_latency =
arm_bL_ops->get_transition_latency(cpu_dev); arm_bL_ops->get_transition_latency(cpu_dev);

View File

@ -902,11 +902,7 @@ static int brcm_avs_cpufreq_init(struct cpufreq_policy *policy)
return ret; return ret;
} }
ret = cpufreq_table_validate_and_show(policy, freq_table); policy->freq_table = freq_table;
if (ret) {
dev_err(dev, "invalid frequency table: %d\n", ret);
return ret;
}
/* All cores share the same clock and thus the same policy. */ /* All cores share the same clock and thus the same policy. */
cpumask_setall(policy->cpus); cpumask_setall(policy->cpus);

View File

@ -20,6 +20,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/time.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
@ -162,6 +163,8 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.max_freq = cppc_dmi_max_khz; policy->cpuinfo.max_freq = cppc_dmi_max_khz;
policy->cpuinfo.transition_latency = cppc_get_transition_latency(cpu_num); policy->cpuinfo.transition_latency = cppc_get_transition_latency(cpu_num);
policy->transition_delay_us = cppc_get_transition_latency(cpu_num) /
NSEC_PER_USEC;
policy->shared_type = cpu->shared_type; policy->shared_type = cpu->shared_type;
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
@ -230,8 +233,13 @@ static int __init cppc_cpufreq_init(void)
return ret; return ret;
out: out:
for_each_possible_cpu(i) for_each_possible_cpu(i) {
kfree(all_cpu_data[i]); cpu = all_cpu_data[i];
if (!cpu)
break;
free_cpumask_var(cpu->shared_cpu_map);
kfree(cpu);
}
kfree(all_cpu_data); kfree(all_cpu_data);
return -ENODEV; return -ENODEV;

View File

@ -258,16 +258,10 @@ static int cpufreq_init(struct cpufreq_policy *policy)
priv->cpu_dev = cpu_dev; priv->cpu_dev = cpu_dev;
policy->driver_data = priv; policy->driver_data = priv;
policy->clk = cpu_clk; policy->clk = cpu_clk;
policy->freq_table = freq_table;
policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000; policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000;
ret = cpufreq_table_validate_and_show(policy, freq_table);
if (ret) {
dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__,
ret);
goto out_free_cpufreq_table;
}
/* Support turbo/boost mode */ /* Support turbo/boost mode */
if (policy_has_boost_freq(policy)) { if (policy_has_boost_freq(policy)) {
/* This gets disabled by core on driver unregister */ /* This gets disabled by core on driver unregister */

View File

@ -178,14 +178,7 @@ int cpufreq_generic_init(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table, struct cpufreq_frequency_table *table,
unsigned int transition_latency) unsigned int transition_latency)
{ {
int ret; policy->freq_table = table;
ret = cpufreq_table_validate_and_show(policy, table);
if (ret) {
pr_err("%s: invalid frequency table: %d\n", __func__, ret);
return ret;
}
policy->cpuinfo.transition_latency = transition_latency; policy->cpuinfo.transition_latency = transition_latency;
/* /*
@ -1219,6 +1212,10 @@ static int cpufreq_online(unsigned int cpu)
goto out_free_policy; goto out_free_policy;
} }
ret = cpufreq_table_validate_and_sort(policy);
if (ret)
goto out_exit_policy;
down_write(&policy->rwsem); down_write(&policy->rwsem);
if (new_policy) { if (new_policy) {
@ -1249,7 +1246,7 @@ static int cpufreq_online(unsigned int cpu)
policy->cur = cpufreq_driver->get(policy->cpu); policy->cur = cpufreq_driver->get(policy->cpu);
if (!policy->cur) { if (!policy->cur) {
pr_err("%s: ->get() failed\n", __func__); pr_err("%s: ->get() failed\n", __func__);
goto out_exit_policy; goto out_destroy_policy;
} }
} }
@ -1296,7 +1293,7 @@ static int cpufreq_online(unsigned int cpu)
if (new_policy) { if (new_policy) {
ret = cpufreq_add_dev_interface(policy); ret = cpufreq_add_dev_interface(policy);
if (ret) if (ret)
goto out_exit_policy; goto out_destroy_policy;
cpufreq_stats_create_table(policy); cpufreq_stats_create_table(policy);
@ -1311,7 +1308,7 @@ static int cpufreq_online(unsigned int cpu)
__func__, cpu, ret); __func__, cpu, ret);
/* cpufreq_policy_free() will notify based on this */ /* cpufreq_policy_free() will notify based on this */
new_policy = false; new_policy = false;
goto out_exit_policy; goto out_destroy_policy;
} }
up_write(&policy->rwsem); up_write(&policy->rwsem);
@ -1326,15 +1323,16 @@ static int cpufreq_online(unsigned int cpu)
return 0; return 0;
out_exit_policy: out_destroy_policy:
up_write(&policy->rwsem);
if (cpufreq_driver->exit)
cpufreq_driver->exit(policy);
for_each_cpu(j, policy->real_cpus) for_each_cpu(j, policy->real_cpus)
remove_cpu_dev_symlink(policy, get_cpu_device(j)); remove_cpu_dev_symlink(policy, get_cpu_device(j));
up_write(&policy->rwsem);
out_exit_policy:
if (cpufreq_driver->exit)
cpufreq_driver->exit(policy);
out_free_policy: out_free_policy:
cpufreq_policy_free(policy); cpufreq_policy_free(policy);
return ret; return ret;

View File

@ -184,7 +184,6 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
struct cpuinfo_x86 *c = &cpu_data(0); struct cpuinfo_x86 *c = &cpu_data(0);
struct cpufreq_frequency_table *f_table; struct cpufreq_frequency_table *f_table;
int k, step, voltage; int k, step, voltage;
int ret;
int states; int states;
#if IS_ENABLED(CONFIG_ACPI_PROCESSOR) #if IS_ENABLED(CONFIG_ACPI_PROCESSOR)
unsigned int limit; unsigned int limit;
@ -359,12 +358,7 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
} }
policy->cpuinfo.transition_latency = 140000; /* 844mV -> 700mV in ns */ policy->cpuinfo.transition_latency = 140000; /* 844mV -> 700mV in ns */
policy->freq_table = &centaur->freq_table[0];
ret = cpufreq_table_validate_and_show(policy, &centaur->freq_table[0]);
if (ret) {
kfree(centaur);
return ret;
}
return 0; return 0;
} }

View File

@ -165,7 +165,8 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
if (pos->frequency > max_freq) if (pos->frequency > max_freq)
pos->frequency = CPUFREQ_ENTRY_INVALID; pos->frequency = CPUFREQ_ENTRY_INVALID;
return cpufreq_table_validate_and_show(policy, elanfreq_table); policy->freq_table = elanfreq_table;
return 0;
} }

View File

@ -362,10 +362,24 @@ int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
return ret; return ret;
policy->freq_table = table; policy->freq_table = table;
return set_freq_table_sorted(policy); return 0;
} }
EXPORT_SYMBOL_GPL(cpufreq_table_validate_and_show); EXPORT_SYMBOL_GPL(cpufreq_table_validate_and_show);
int cpufreq_table_validate_and_sort(struct cpufreq_policy *policy)
{
int ret;
if (!policy->freq_table)
return 0;
ret = cpufreq_frequency_table_cpuinfo(policy, policy->freq_table);
if (ret)
return ret;
return set_freq_table_sorted(policy);
}
MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
MODULE_DESCRIPTION("CPUfreq frequency table helpers"); MODULE_DESCRIPTION("CPUfreq frequency table helpers");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -270,10 +270,7 @@ acpi_cpufreq_cpu_init (
} }
} }
result = cpufreq_table_validate_and_show(policy, freq_table); policy->freq_table = freq_table;
if (result) {
goto err_freqfree;
}
/* notify BIOS that we exist */ /* notify BIOS that we exist */
acpi_processor_notify_smm(THIS_MODULE); acpi_processor_notify_smm(THIS_MODULE);
@ -296,8 +293,6 @@ acpi_cpufreq_cpu_init (
return (result); return (result);
err_freqfree:
kfree(freq_table);
err_unreg: err_unreg:
acpi_processor_unregister_performance(cpu); acpi_processor_unregister_performance(cpu);
err_free: err_free:

View File

@ -52,6 +52,7 @@ static struct clk_bulk_data clks[] = {
static struct device *cpu_dev; static struct device *cpu_dev;
static bool free_opp; static bool free_opp;
static struct cpufreq_frequency_table *freq_table; static struct cpufreq_frequency_table *freq_table;
static unsigned int max_freq;
static unsigned int transition_latency; static unsigned int transition_latency;
static u32 *imx6_soc_volt; static u32 *imx6_soc_volt;
@ -196,7 +197,7 @@ static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
policy->clk = clks[ARM].clk; policy->clk = clks[ARM].clk;
ret = cpufreq_generic_init(policy, freq_table, transition_latency); ret = cpufreq_generic_init(policy, freq_table, transition_latency);
policy->suspend_freq = policy->max; policy->suspend_freq = max_freq;
return ret; return ret;
} }
@ -437,12 +438,12 @@ soc_opp_out:
* freq_table initialised from OPP is therefore sorted in the * freq_table initialised from OPP is therefore sorted in the
* same order. * same order.
*/ */
max_freq = freq_table[--num].frequency;
opp = dev_pm_opp_find_freq_exact(cpu_dev, opp = dev_pm_opp_find_freq_exact(cpu_dev,
freq_table[0].frequency * 1000, true); freq_table[0].frequency * 1000, true);
min_volt = dev_pm_opp_get_voltage(opp); min_volt = dev_pm_opp_get_voltage(opp);
dev_pm_opp_put(opp); dev_pm_opp_put(opp);
opp = dev_pm_opp_find_freq_exact(cpu_dev, opp = dev_pm_opp_find_freq_exact(cpu_dev, max_freq * 1000, true);
freq_table[--num].frequency * 1000, true);
max_volt = dev_pm_opp_get_voltage(opp); max_volt = dev_pm_opp_get_voltage(opp);
dev_pm_opp_put(opp); dev_pm_opp_put(opp);

View File

@ -895,8 +895,9 @@ static int longhaul_cpu_init(struct cpufreq_policy *policy)
longhaul_setup_voltagescaling(); longhaul_setup_voltagescaling();
policy->transition_delay_us = 200000; /* usec */ policy->transition_delay_us = 200000; /* usec */
policy->freq_table = longhaul_table;
return cpufreq_table_validate_and_show(policy, longhaul_table); return 0;
} }
static struct cpufreq_driver longhaul_driver = { static struct cpufreq_driver longhaul_driver = {

View File

@ -460,21 +460,12 @@ static int mtk_cpufreq_init(struct cpufreq_policy *policy)
return ret; return ret;
} }
ret = cpufreq_table_validate_and_show(policy, freq_table);
if (ret) {
pr_err("%s: invalid frequency table: %d\n", __func__, ret);
goto out_free_cpufreq_table;
}
cpumask_copy(policy->cpus, &info->cpus); cpumask_copy(policy->cpus, &info->cpus);
policy->freq_table = freq_table;
policy->driver_data = info; policy->driver_data = info;
policy->clk = info->cpu_clk; policy->clk = info->cpu_clk;
return 0; return 0;
out_free_cpufreq_table:
dev_pm_opp_free_cpufreq_table(info->cpu_dev, &freq_table);
return ret;
} }
static int mtk_cpufreq_exit(struct cpufreq_policy *policy) static int mtk_cpufreq_exit(struct cpufreq_policy *policy)
@ -578,7 +569,7 @@ static int __init mtk_cpufreq_driver_init(void)
match = of_match_node(mtk_cpufreq_machines, np); match = of_match_node(mtk_cpufreq_machines, np);
of_node_put(np); of_node_put(np);
if (!match) { if (!match) {
pr_warn("Machine is not compatible with mtk-cpufreq\n"); pr_debug("Machine is not compatible with mtk-cpufreq\n");
return -ENODEV; return -ENODEV;
} }

View File

@ -202,8 +202,9 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
/* the transition latency is set to be 1 higher than the maximum /* the transition latency is set to be 1 higher than the maximum
* transition latency of the ondemand governor */ * transition latency of the ondemand governor */
policy->cpuinfo.transition_latency = 10000001; policy->cpuinfo.transition_latency = 10000001;
policy->freq_table = &p4clockmod_table[0];
return cpufreq_table_validate_and_show(policy, &p4clockmod_table[0]); return 0;
} }

View File

@ -214,8 +214,9 @@ have_busfreq:
/* cpuinfo and default policy values */ /* cpuinfo and default policy values */
policy->cpuinfo.transition_latency = 500000; policy->cpuinfo.transition_latency = 500000;
policy->freq_table = clock_ratio;
return cpufreq_table_validate_and_show(policy, clock_ratio); return 0;
} }

View File

@ -639,8 +639,9 @@ static int powernow_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.transition_latency = policy->cpuinfo.transition_latency =
cpufreq_scale(2000000UL, fsb, latency); cpufreq_scale(2000000UL, fsb, latency);
policy->freq_table = powernow_table;
return cpufreq_table_validate_and_show(policy, powernow_table); return 0;
} }
static int powernow_cpu_exit(struct cpufreq_policy *policy) static int powernow_cpu_exit(struct cpufreq_policy *policy)

View File

@ -122,14 +122,12 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
static void count_off_irt(struct powernow_k8_data *data) static void count_off_irt(struct powernow_k8_data *data)
{ {
udelay((1 << data->irt) * 10); udelay((1 << data->irt) * 10);
return;
} }
/* the voltage stabilization time */ /* the voltage stabilization time */
static void count_off_vst(struct powernow_k8_data *data) static void count_off_vst(struct powernow_k8_data *data)
{ {
udelay(data->vstable * VST_UNITS_20US); udelay(data->vstable * VST_UNITS_20US);
return;
} }
/* need to init the control msr to a safe value (for each cpu) */ /* need to init the control msr to a safe value (for each cpu) */
@ -591,10 +589,8 @@ static int fill_powernow_table(struct powernow_k8_data *data,
powernow_table = kzalloc((sizeof(*powernow_table) powernow_table = kzalloc((sizeof(*powernow_table)
* (data->numps + 1)), GFP_KERNEL); * (data->numps + 1)), GFP_KERNEL);
if (!powernow_table) { if (!powernow_table)
pr_err("powernow_table memory alloc failure\n");
return -ENOMEM; return -ENOMEM;
}
for (j = 0; j < data->numps; j++) { for (j = 0; j < data->numps; j++) {
int freq; int freq;
@ -760,10 +756,8 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
/* fill in data->powernow_table */ /* fill in data->powernow_table */
powernow_table = kzalloc((sizeof(*powernow_table) powernow_table = kzalloc((sizeof(*powernow_table)
* (data->acpi_data.state_count + 1)), GFP_KERNEL); * (data->acpi_data.state_count + 1)), GFP_KERNEL);
if (!powernow_table) { if (!powernow_table)
pr_debug("powernow_table memory alloc failure\n");
goto err_out; goto err_out;
}
/* fill in data */ /* fill in data */
data->numps = data->acpi_data.state_count; data->numps = data->acpi_data.state_count;
@ -1042,10 +1036,8 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
return -ENODEV; return -ENODEV;
data = kzalloc(sizeof(*data), GFP_KERNEL); data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data) { if (!data)
pr_err("unable to alloc powernow_k8_data\n");
return -ENOMEM; return -ENOMEM;
}
data->cpu = pol->cpu; data->cpu = pol->cpu;
@ -1084,15 +1076,7 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
cpumask_copy(pol->cpus, topology_core_cpumask(pol->cpu)); cpumask_copy(pol->cpus, topology_core_cpumask(pol->cpu));
data->available_cores = pol->cpus; data->available_cores = pol->cpus;
pol->freq_table = data->powernow_table;
/* min/max the cpu is capable of */
if (cpufreq_table_validate_and_show(pol, data->powernow_table)) {
pr_err(FW_BUG "invalid powernow_table\n");
powernow_k8_cpu_exit_acpi(data);
kfree(data->powernow_table);
kfree(data);
return -EINVAL;
}
pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n",
data->currfid, data->currvid); data->currfid, data->currvid);

View File

@ -812,7 +812,7 @@ gpstates_done:
static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy) static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
{ {
int base, i, ret; int base, i;
struct kernfs_node *kn; struct kernfs_node *kn;
struct global_pstate_info *gpstates; struct global_pstate_info *gpstates;
@ -848,15 +848,10 @@ static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
gpstates->timer.expires = jiffies + gpstates->timer.expires = jiffies +
msecs_to_jiffies(GPSTATE_TIMER_INTERVAL); msecs_to_jiffies(GPSTATE_TIMER_INTERVAL);
spin_lock_init(&gpstates->gpstate_lock); spin_lock_init(&gpstates->gpstate_lock);
ret = cpufreq_table_validate_and_show(policy, powernv_freqs);
if (ret < 0) {
kfree(policy->driver_data);
return ret;
}
policy->freq_table = powernv_freqs;
policy->fast_switch_possible = true; policy->fast_switch_possible = true;
return ret; return 0;
} }
static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy) static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy)

View File

@ -121,9 +121,8 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
cpumask_copy(policy->cpus, cpu_sibling_mask(policy->cpu)); cpumask_copy(policy->cpus, cpu_sibling_mask(policy->cpu));
#endif #endif
/* this ensures that policy->cpuinfo_min policy->freq_table = cbe_freqs;
* and policy->cpuinfo_max are set correctly */ return 0;
return cpufreq_table_validate_and_show(policy, cbe_freqs);
} }
static int cbe_cpufreq_target(struct cpufreq_policy *policy, static int cbe_cpufreq_target(struct cpufreq_policy *policy,

View File

@ -292,10 +292,10 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
pr_info("using %s frequency table\n", pr_info("using %s frequency table\n",
pxa255_turbo_table ? "turbo" : "run"); pxa255_turbo_table ? "turbo" : "run");
cpufreq_table_validate_and_show(policy, pxa255_freq_table); policy->freq_table = pxa255_freq_table;
} }
else if (cpu_is_pxa27x()) { else if (cpu_is_pxa27x()) {
cpufreq_table_validate_and_show(policy, pxa27x_freq_table); policy->freq_table = pxa27x_freq_table;
} }
pr_info("frequency change support initialized\n"); pr_info("frequency change support initialized\n");

View File

@ -108,7 +108,9 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
pxa3xx_freqs_num = num; pxa3xx_freqs_num = num;
pxa3xx_freqs_table = table; pxa3xx_freqs_table = table;
return cpufreq_table_validate_and_show(policy, table); policy->freq_table = table;
return 0;
} }
static void __update_core_freq(struct pxa3xx_freq_info *info) static void __update_core_freq(struct pxa3xx_freq_info *info)

View File

@ -165,7 +165,7 @@ static void freq_table_sort(struct cpufreq_frequency_table *freq_table,
static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy) static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
{ {
struct device_node *np; struct device_node *np;
int i, count, ret; int i, count;
u32 freq; u32 freq;
struct clk *clk; struct clk *clk;
const struct clk_hw *hwclk; const struct clk_hw *hwclk;
@ -192,16 +192,12 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
count = clk_hw_get_num_parents(hwclk); count = clk_hw_get_num_parents(hwclk);
data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL); data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL);
if (!data->pclk) { if (!data->pclk)
pr_err("%s: no memory\n", __func__);
goto err_nomem2; goto err_nomem2;
}
table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL); table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
if (!table) { if (!table)
pr_err("%s: no memory\n", __func__);
goto err_pclk; goto err_pclk;
}
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
clk = clk_hw_get_parent_by_index(hwclk, i)->clk; clk = clk_hw_get_parent_by_index(hwclk, i)->clk;
@ -213,14 +209,7 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
freq_table_redup(table, count); freq_table_redup(table, count);
freq_table_sort(table, count); freq_table_sort(table, count);
table[i].frequency = CPUFREQ_TABLE_END; table[i].frequency = CPUFREQ_TABLE_END;
policy->freq_table = table;
/* set the min and max frequency properly */
ret = cpufreq_table_validate_and_show(policy, table);
if (ret) {
pr_err("invalid frequency table: %d\n", ret);
goto err_nomem1;
}
data->table = table; data->table = table;
/* update ->cpus if we have cluster, no harm if not */ /* update ->cpus if we have cluster, no harm if not */
@ -236,8 +225,6 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
return 0; return 0;
err_nomem1:
kfree(table);
err_pclk: err_pclk:
kfree(data->pclk); kfree(data->pclk);
err_nomem2: err_nomem2:

View File

@ -351,11 +351,8 @@ struct clk *s3c_cpufreq_clk_get(struct device *dev, const char *name)
static int s3c_cpufreq_init(struct cpufreq_policy *policy) static int s3c_cpufreq_init(struct cpufreq_policy *policy)
{ {
policy->clk = clk_arm; policy->clk = clk_arm;
policy->cpuinfo.transition_latency = cpu_cur.info->latency; policy->cpuinfo.transition_latency = cpu_cur.info->latency;
policy->freq_table = ftab;
if (ftab)
return cpufreq_table_validate_and_show(policy, ftab);
return 0; return 0;
} }
@ -479,10 +476,8 @@ int __init s3c_cpufreq_setboard(struct s3c_cpufreq_board *board)
* initdata. */ * initdata. */
ours = kzalloc(sizeof(*ours), GFP_KERNEL); ours = kzalloc(sizeof(*ours), GFP_KERNEL);
if (ours == NULL) { if (!ours)
pr_err("%s: no memory\n", __func__);
return -ENOMEM; return -ENOMEM;
}
*ours = *board; *ours = *board;
cpu_cur.board = ours; cpu_cur.board = ours;
@ -568,10 +563,8 @@ static int s3c_cpufreq_build_freq(void)
size++; size++;
ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL); ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL);
if (!ftab) { if (!ftab)
pr_err("%s: no memory for tables\n", __func__);
return -ENOMEM; return -ENOMEM;
}
ftab_size = size; ftab_size = size;

View File

@ -83,8 +83,9 @@ static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
/* cpuinfo and default policy values */ /* cpuinfo and default policy values */
policy->cpuinfo.transition_latency = 1000000; /* 1ms */ policy->cpuinfo.transition_latency = 1000000; /* 1ms */
policy->freq_table = sc520_freq_table;
return cpufreq_table_validate_and_show(policy, sc520_freq_table); return 0;
} }

View File

@ -158,13 +158,7 @@ static int scpi_cpufreq_init(struct cpufreq_policy *policy)
} }
policy->driver_data = priv; policy->driver_data = priv;
policy->freq_table = freq_table;
ret = cpufreq_table_validate_and_show(policy, freq_table);
if (ret) {
dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__,
ret);
goto out_put_clk;
}
/* scpi allows DVFS request for any domain from any CPU */ /* scpi allows DVFS request for any domain from any CPU */
policy->dvfs_possible_from_any_cpu = true; policy->dvfs_possible_from_any_cpu = true;
@ -178,8 +172,6 @@ static int scpi_cpufreq_init(struct cpufreq_policy *policy)
policy->fast_switch_possible = false; policy->fast_switch_possible = false;
return 0; return 0;
out_put_clk:
clk_put(priv->clk);
out_free_cpufreq_table: out_free_cpufreq_table:
dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);
out_free_priv: out_free_priv:

View File

@ -72,8 +72,9 @@ static int sfi_cpufreq_cpu_init(struct cpufreq_policy *policy)
{ {
policy->shared_type = CPUFREQ_SHARED_TYPE_HW; policy->shared_type = CPUFREQ_SHARED_TYPE_HW;
policy->cpuinfo.transition_latency = 100000; /* 100us */ policy->cpuinfo.transition_latency = 100000; /* 100us */
policy->freq_table = freq_table;
return cpufreq_table_validate_and_show(policy, freq_table); return 0;
} }
static struct cpufreq_driver sfi_cpufreq_driver = { static struct cpufreq_driver sfi_cpufreq_driver = {

View File

@ -122,11 +122,7 @@ static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy)
freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL; freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL;
if (freq_table) { if (freq_table) {
int result; policy->freq_table = freq_table;
result = cpufreq_table_validate_and_show(policy, freq_table);
if (result)
return result;
} else { } else {
dev_notice(dev, "no frequency table found, falling back " dev_notice(dev, "no frequency table found, falling back "
"to rate rounding.\n"); "to rate rounding.\n");
@ -137,11 +133,6 @@ static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy)
(clk_round_rate(cpuclk, ~0UL) + 500) / 1000; (clk_round_rate(cpuclk, ~0UL) + 500) / 1000;
} }
dev_info(dev, "CPU Frequencies - Minimum %u.%03u MHz, "
"Maximum %u.%03u MHz.\n",
policy->min / 1000, policy->min % 1000,
policy->max / 1000, policy->max % 1000);
return 0; return 0;
} }
@ -155,6 +146,16 @@ static int sh_cpufreq_cpu_exit(struct cpufreq_policy *policy)
return 0; return 0;
} }
static void sh_cpufreq_cpu_ready(struct cpufreq_policy *policy)
{
struct device *dev = get_cpu_device(policy->cpu);
dev_info(dev, "CPU Frequencies - Minimum %u.%03u MHz, "
"Maximum %u.%03u MHz.\n",
policy->min / 1000, policy->min % 1000,
policy->max / 1000, policy->max % 1000);
}
static struct cpufreq_driver sh_cpufreq_driver = { static struct cpufreq_driver sh_cpufreq_driver = {
.name = "sh", .name = "sh",
.flags = CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING, .flags = CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING,
@ -163,6 +164,7 @@ static struct cpufreq_driver sh_cpufreq_driver = {
.verify = sh_cpufreq_verify, .verify = sh_cpufreq_verify,
.init = sh_cpufreq_cpu_init, .init = sh_cpufreq_cpu_init,
.exit = sh_cpufreq_cpu_exit, .exit = sh_cpufreq_cpu_exit,
.ready = sh_cpufreq_cpu_ready,
.attr = cpufreq_generic_attr, .attr = cpufreq_generic_attr,
}; };

View File

@ -292,8 +292,9 @@ static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.transition_latency = 0; policy->cpuinfo.transition_latency = 0;
policy->cur = clock_tick; policy->cur = clock_tick;
policy->freq_table = table;
return cpufreq_table_validate_and_show(policy, table); return 0;
} }
static int us2e_freq_cpu_exit(struct cpufreq_policy *policy) static int us2e_freq_cpu_exit(struct cpufreq_policy *policy)

View File

@ -136,8 +136,9 @@ static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.transition_latency = 0; policy->cpuinfo.transition_latency = 0;
policy->cur = clock_tick; policy->cur = clock_tick;
policy->freq_table = table;
return cpufreq_table_validate_and_show(policy, table); return 0;
} }
static int us3_freq_cpu_exit(struct cpufreq_policy *policy) static int us3_freq_cpu_exit(struct cpufreq_policy *policy)

View File

@ -394,9 +394,9 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.transition_latency = 10000; policy->cpuinfo.transition_latency = 10000;
/* 10uS transition latency */ /* 10uS transition latency */
policy->freq_table = per_cpu(centrino_model, policy->cpu)->op_points;
return cpufreq_table_validate_and_show(policy, return 0;
per_cpu(centrino_model, policy->cpu)->op_points);
} }
static int centrino_cpu_exit(struct cpufreq_policy *policy) static int centrino_cpu_exit(struct cpufreq_policy *policy)

View File

@ -304,7 +304,9 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
if (gf.ret) if (gf.ret)
return gf.ret; return gf.ret;
return cpufreq_table_validate_and_show(policy, speedstep_freqs); policy->freq_table = speedstep_freqs;
return 0;
} }

View File

@ -266,7 +266,9 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
pr_debug("workaround worked.\n"); pr_debug("workaround worked.\n");
} }
return cpufreq_table_validate_and_show(policy, speedstep_freqs); policy->freq_table = speedstep_freqs;
return 0;
} }
static unsigned int speedstep_get(unsigned int cpu) static unsigned int speedstep_get(unsigned int cpu)

View File

@ -78,7 +78,8 @@ static int tegra186_cpufreq_init(struct cpufreq_policy *policy)
policy->driver_data = policy->driver_data =
data->regs + info->offset + EDVD_CORE_VOLT_FREQ(core); data->regs + info->offset + EDVD_CORE_VOLT_FREQ(core);
cpufreq_table_validate_and_show(policy, cluster->table); policy->freq_table = cluster->table;
break;
} }
policy->cpuinfo.transition_latency = 300 * 1000; policy->cpuinfo.transition_latency = 300 * 1000;

View File

@ -962,6 +962,7 @@ extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
extern struct freq_attr *cpufreq_generic_attr[]; extern struct freq_attr *cpufreq_generic_attr[];
int cpufreq_table_validate_and_show(struct cpufreq_policy *policy, int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table); struct cpufreq_frequency_table *table);
int cpufreq_table_validate_and_sort(struct cpufreq_policy *policy);
unsigned int cpufreq_generic_get(unsigned int cpu); unsigned int cpufreq_generic_get(unsigned int cpu);
int cpufreq_generic_init(struct cpufreq_policy *policy, int cpufreq_generic_init(struct cpufreq_policy *policy,