diff options
Diffstat (limited to 'drivers/cpufreq/omap-cpufreq.c')
-rw-r--r-- | drivers/cpufreq/omap-cpufreq.c | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c index 5de1e5f73eca..590f5b66d181 100644 --- a/drivers/cpufreq/omap-cpufreq.c +++ b/drivers/cpufreq/omap-cpufreq.c | |||
@@ -36,21 +36,9 @@ | |||
36 | 36 | ||
37 | static struct cpufreq_frequency_table *freq_table; | 37 | static struct cpufreq_frequency_table *freq_table; |
38 | static atomic_t freq_table_users = ATOMIC_INIT(0); | 38 | static atomic_t freq_table_users = ATOMIC_INIT(0); |
39 | static struct clk *mpu_clk; | ||
40 | static struct device *mpu_dev; | 39 | static struct device *mpu_dev; |
41 | static struct regulator *mpu_reg; | 40 | static struct regulator *mpu_reg; |
42 | 41 | ||
43 | static unsigned int omap_getspeed(unsigned int cpu) | ||
44 | { | ||
45 | unsigned long rate; | ||
46 | |||
47 | if (cpu >= NR_CPUS) | ||
48 | return 0; | ||
49 | |||
50 | rate = clk_get_rate(mpu_clk) / 1000; | ||
51 | return rate; | ||
52 | } | ||
53 | |||
54 | static int omap_target(struct cpufreq_policy *policy, unsigned int index) | 42 | static int omap_target(struct cpufreq_policy *policy, unsigned int index) |
55 | { | 43 | { |
56 | int r, ret; | 44 | int r, ret; |
@@ -58,11 +46,11 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int index) | |||
58 | unsigned long freq, volt = 0, volt_old = 0, tol = 0; | 46 | unsigned long freq, volt = 0, volt_old = 0, tol = 0; |
59 | unsigned int old_freq, new_freq; | 47 | unsigned int old_freq, new_freq; |
60 | 48 | ||
61 | old_freq = omap_getspeed(policy->cpu); | 49 | old_freq = policy->cur; |
62 | new_freq = freq_table[index].frequency; | 50 | new_freq = freq_table[index].frequency; |
63 | 51 | ||
64 | freq = new_freq * 1000; | 52 | freq = new_freq * 1000; |
65 | ret = clk_round_rate(mpu_clk, freq); | 53 | ret = clk_round_rate(policy->clk, freq); |
66 | if (IS_ERR_VALUE(ret)) { | 54 | if (IS_ERR_VALUE(ret)) { |
67 | dev_warn(mpu_dev, | 55 | dev_warn(mpu_dev, |
68 | "CPUfreq: Cannot find matching frequency for %lu\n", | 56 | "CPUfreq: Cannot find matching frequency for %lu\n", |
@@ -100,7 +88,7 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int index) | |||
100 | } | 88 | } |
101 | } | 89 | } |
102 | 90 | ||
103 | ret = clk_set_rate(mpu_clk, new_freq * 1000); | 91 | ret = clk_set_rate(policy->clk, new_freq * 1000); |
104 | 92 | ||
105 | /* scaling down? scale voltage after frequency */ | 93 | /* scaling down? scale voltage after frequency */ |
106 | if (mpu_reg && (new_freq < old_freq)) { | 94 | if (mpu_reg && (new_freq < old_freq)) { |
@@ -108,7 +96,7 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int index) | |||
108 | if (r < 0) { | 96 | if (r < 0) { |
109 | dev_warn(mpu_dev, "%s: unable to scale voltage down.\n", | 97 | dev_warn(mpu_dev, "%s: unable to scale voltage down.\n", |
110 | __func__); | 98 | __func__); |
111 | clk_set_rate(mpu_clk, old_freq * 1000); | 99 | clk_set_rate(policy->clk, old_freq * 1000); |
112 | return r; | 100 | return r; |
113 | } | 101 | } |
114 | } | 102 | } |
@@ -126,9 +114,9 @@ static int omap_cpu_init(struct cpufreq_policy *policy) | |||
126 | { | 114 | { |
127 | int result; | 115 | int result; |
128 | 116 | ||
129 | mpu_clk = clk_get(NULL, "cpufreq_ck"); | 117 | policy->clk = clk_get(NULL, "cpufreq_ck"); |
130 | if (IS_ERR(mpu_clk)) | 118 | if (IS_ERR(policy->clk)) |
131 | return PTR_ERR(mpu_clk); | 119 | return PTR_ERR(policy->clk); |
132 | 120 | ||
133 | if (!freq_table) { | 121 | if (!freq_table) { |
134 | result = dev_pm_opp_init_cpufreq_table(mpu_dev, &freq_table); | 122 | result = dev_pm_opp_init_cpufreq_table(mpu_dev, &freq_table); |
@@ -149,7 +137,7 @@ static int omap_cpu_init(struct cpufreq_policy *policy) | |||
149 | 137 | ||
150 | freq_table_free(); | 138 | freq_table_free(); |
151 | fail: | 139 | fail: |
152 | clk_put(mpu_clk); | 140 | clk_put(policy->clk); |
153 | return result; | 141 | return result; |
154 | } | 142 | } |
155 | 143 | ||
@@ -157,7 +145,7 @@ static int omap_cpu_exit(struct cpufreq_policy *policy) | |||
157 | { | 145 | { |
158 | cpufreq_frequency_table_put_attr(policy->cpu); | 146 | cpufreq_frequency_table_put_attr(policy->cpu); |
159 | freq_table_free(); | 147 | freq_table_free(); |
160 | clk_put(mpu_clk); | 148 | clk_put(policy->clk); |
161 | return 0; | 149 | return 0; |
162 | } | 150 | } |
163 | 151 | ||
@@ -165,7 +153,7 @@ static struct cpufreq_driver omap_driver = { | |||
165 | .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, | 153 | .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, |
166 | .verify = cpufreq_generic_frequency_table_verify, | 154 | .verify = cpufreq_generic_frequency_table_verify, |
167 | .target_index = omap_target, | 155 | .target_index = omap_target, |
168 | .get = omap_getspeed, | 156 | .get = cpufreq_generic_get, |
169 | .init = omap_cpu_init, | 157 | .init = omap_cpu_init, |
170 | .exit = omap_cpu_exit, | 158 | .exit = omap_cpu_exit, |
171 | .name = "omap", | 159 | .name = "omap", |