diff options
-rw-r--r-- | drivers/cpufreq/cpufreq-dt.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 7374fc4b6bb3..e720954244b1 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c | |||
@@ -186,7 +186,6 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
186 | { | 186 | { |
187 | struct cpufreq_dt_platform_data *pd; | 187 | struct cpufreq_dt_platform_data *pd; |
188 | struct cpufreq_frequency_table *freq_table; | 188 | struct cpufreq_frequency_table *freq_table; |
189 | struct thermal_cooling_device *cdev; | ||
190 | struct device_node *np; | 189 | struct device_node *np; |
191 | struct private_data *priv; | 190 | struct private_data *priv; |
192 | struct device *cpu_dev; | 191 | struct device *cpu_dev; |
@@ -269,20 +268,6 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
269 | goto out_free_priv; | 268 | goto out_free_priv; |
270 | } | 269 | } |
271 | 270 | ||
272 | /* | ||
273 | * For now, just loading the cooling device; | ||
274 | * thermal DT code takes care of matching them. | ||
275 | */ | ||
276 | if (of_find_property(np, "#cooling-cells", NULL)) { | ||
277 | cdev = of_cpufreq_cooling_register(np, policy->related_cpus); | ||
278 | if (IS_ERR(cdev)) | ||
279 | dev_err(cpu_dev, | ||
280 | "running cpufreq without cooling device: %ld\n", | ||
281 | PTR_ERR(cdev)); | ||
282 | else | ||
283 | priv->cdev = cdev; | ||
284 | } | ||
285 | |||
286 | priv->cpu_dev = cpu_dev; | 271 | priv->cpu_dev = cpu_dev; |
287 | priv->cpu_reg = cpu_reg; | 272 | priv->cpu_reg = cpu_reg; |
288 | policy->driver_data = priv; | 273 | policy->driver_data = priv; |
@@ -292,7 +277,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
292 | if (ret) { | 277 | if (ret) { |
293 | dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, | 278 | dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, |
294 | ret); | 279 | ret); |
295 | goto out_cooling_unregister; | 280 | goto out_free_cpufreq_table; |
296 | } | 281 | } |
297 | 282 | ||
298 | policy->cpuinfo.transition_latency = transition_latency; | 283 | policy->cpuinfo.transition_latency = transition_latency; |
@@ -305,8 +290,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) | |||
305 | 290 | ||
306 | return 0; | 291 | return 0; |
307 | 292 | ||
308 | out_cooling_unregister: | 293 | out_free_cpufreq_table: |
309 | cpufreq_cooling_unregister(priv->cdev); | ||
310 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | 294 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); |
311 | out_free_priv: | 295 | out_free_priv: |
312 | kfree(priv); | 296 | kfree(priv); |
@@ -324,7 +308,8 @@ static int cpufreq_exit(struct cpufreq_policy *policy) | |||
324 | { | 308 | { |
325 | struct private_data *priv = policy->driver_data; | 309 | struct private_data *priv = policy->driver_data; |
326 | 310 | ||
327 | cpufreq_cooling_unregister(priv->cdev); | 311 | if (priv->cdev) |
312 | cpufreq_cooling_unregister(priv->cdev); | ||
328 | dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); | 313 | dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); |
329 | clk_put(policy->clk); | 314 | clk_put(policy->clk); |
330 | if (!IS_ERR(priv->cpu_reg)) | 315 | if (!IS_ERR(priv->cpu_reg)) |
@@ -334,6 +319,33 @@ static int cpufreq_exit(struct cpufreq_policy *policy) | |||
334 | return 0; | 319 | return 0; |
335 | } | 320 | } |
336 | 321 | ||
322 | static void cpufreq_ready(struct cpufreq_policy *policy) | ||
323 | { | ||
324 | struct private_data *priv = policy->driver_data; | ||
325 | struct device_node *np = of_node_get(priv->cpu_dev->of_node); | ||
326 | |||
327 | if (WARN_ON(!np)) | ||
328 | return; | ||
329 | |||
330 | /* | ||
331 | * For now, just loading the cooling device; | ||
332 | * thermal DT code takes care of matching them. | ||
333 | */ | ||
334 | if (of_find_property(np, "#cooling-cells", NULL)) { | ||
335 | priv->cdev = of_cpufreq_cooling_register(np, | ||
336 | policy->related_cpus); | ||
337 | if (IS_ERR(priv->cdev)) { | ||
338 | dev_err(priv->cpu_dev, | ||
339 | "running cpufreq without cooling device: %ld\n", | ||
340 | PTR_ERR(priv->cdev)); | ||
341 | |||
342 | priv->cdev = NULL; | ||
343 | } | ||
344 | } | ||
345 | |||
346 | of_node_put(np); | ||
347 | } | ||
348 | |||
337 | static struct cpufreq_driver dt_cpufreq_driver = { | 349 | static struct cpufreq_driver dt_cpufreq_driver = { |
338 | .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, | 350 | .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, |
339 | .verify = cpufreq_generic_frequency_table_verify, | 351 | .verify = cpufreq_generic_frequency_table_verify, |
@@ -341,6 +353,7 @@ static struct cpufreq_driver dt_cpufreq_driver = { | |||
341 | .get = cpufreq_generic_get, | 353 | .get = cpufreq_generic_get, |
342 | .init = cpufreq_init, | 354 | .init = cpufreq_init, |
343 | .exit = cpufreq_exit, | 355 | .exit = cpufreq_exit, |
356 | .ready = cpufreq_ready, | ||
344 | .name = "cpufreq-dt", | 357 | .name = "cpufreq-dt", |
345 | .attr = cpufreq_generic_attr, | 358 | .attr = cpufreq_generic_attr, |
346 | }; | 359 | }; |