aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cris-artpec3-cpufreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/cris-artpec3-cpufreq.c')
-rw-r--r--drivers/cpufreq/cris-artpec3-cpufreq.c64
1 files changed, 6 insertions, 58 deletions
diff --git a/drivers/cpufreq/cris-artpec3-cpufreq.c b/drivers/cpufreq/cris-artpec3-cpufreq.c
index cb8276dd19ca..86559040c54c 100644
--- a/drivers/cpufreq/cris-artpec3-cpufreq.c
+++ b/drivers/cpufreq/cris-artpec3-cpufreq.c
@@ -27,18 +27,11 @@ static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
27 return clk_ctrl.pll ? 200000 : 6000; 27 return clk_ctrl.pll ? 200000 : 6000;
28} 28}
29 29
30static void cris_freq_set_cpu_state(struct cpufreq_policy *policy, 30static int cris_freq_target(struct cpufreq_policy *policy, unsigned int state)
31 unsigned int state)
32{ 31{
33 struct cpufreq_freqs freqs;
34 reg_clkgen_rw_clk_ctrl clk_ctrl; 32 reg_clkgen_rw_clk_ctrl clk_ctrl;
35 clk_ctrl = REG_RD(clkgen, regi_clkgen, rw_clk_ctrl); 33 clk_ctrl = REG_RD(clkgen, regi_clkgen, rw_clk_ctrl);
36 34
37 freqs.old = cris_freq_get_cpu_frequency(policy->cpu);
38 freqs.new = cris_freq_table[state].frequency;
39
40 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
41
42 local_irq_disable(); 35 local_irq_disable();
43 36
44 /* Even though we may be SMP they will share the same clock 37 /* Even though we may be SMP they will share the same clock
@@ -51,67 +44,22 @@ static void cris_freq_set_cpu_state(struct cpufreq_policy *policy,
51 44
52 local_irq_enable(); 45 local_irq_enable();
53 46
54 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
55};
56
57static int cris_freq_verify(struct cpufreq_policy *policy)
58{
59 return cpufreq_frequency_table_verify(policy, &cris_freq_table[0]);
60}
61
62static int cris_freq_target(struct cpufreq_policy *policy,
63 unsigned int target_freq,
64 unsigned int relation)
65{
66 unsigned int newstate = 0;
67
68 if (cpufreq_frequency_table_target(policy, cris_freq_table,
69 target_freq, relation, &newstate))
70 return -EINVAL;
71
72 cris_freq_set_cpu_state(policy, newstate);
73
74 return 0; 47 return 0;
75} 48}
76 49
77static int cris_freq_cpu_init(struct cpufreq_policy *policy) 50static int cris_freq_cpu_init(struct cpufreq_policy *policy)
78{ 51{
79 int result; 52 return cpufreq_generic_init(policy, cris_freq_table, 1000000);
80
81 /* cpuinfo and default policy values */
82 policy->cpuinfo.transition_latency = 1000000; /* 1ms */
83 policy->cur = cris_freq_get_cpu_frequency(0);
84
85 result = cpufreq_frequency_table_cpuinfo(policy, cris_freq_table);
86 if (result)
87 return (result);
88
89 cpufreq_frequency_table_get_attr(cris_freq_table, policy->cpu);
90
91 return 0;
92}
93
94
95static int cris_freq_cpu_exit(struct cpufreq_policy *policy)
96{
97 cpufreq_frequency_table_put_attr(policy->cpu);
98 return 0;
99} 53}
100 54
101
102static struct freq_attr *cris_freq_attr[] = {
103 &cpufreq_freq_attr_scaling_available_freqs,
104 NULL,
105};
106
107static struct cpufreq_driver cris_freq_driver = { 55static struct cpufreq_driver cris_freq_driver = {
108 .get = cris_freq_get_cpu_frequency, 56 .get = cris_freq_get_cpu_frequency,
109 .verify = cris_freq_verify, 57 .verify = cpufreq_generic_frequency_table_verify,
110 .target = cris_freq_target, 58 .target_index = cris_freq_target,
111 .init = cris_freq_cpu_init, 59 .init = cris_freq_cpu_init,
112 .exit = cris_freq_cpu_exit, 60 .exit = cpufreq_generic_exit,
113 .name = "cris_freq", 61 .name = "cris_freq",
114 .attr = cris_freq_attr, 62 .attr = cpufreq_generic_attr,
115}; 63};
116 64
117static int __init cris_freq_init(void) 65static int __init cris_freq_init(void)