diff options
Diffstat (limited to 'drivers/cpufreq/imx6q-cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/imx6q-cpufreq.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c index 8b3c2a79ad6c..b2ff423ad7f8 100644 --- a/drivers/cpufreq/imx6q-cpufreq.c +++ b/drivers/cpufreq/imx6q-cpufreq.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/clk.h> | 9 | #include <linux/clk.h> |
| 10 | #include <linux/cpu.h> | 10 | #include <linux/cpu.h> |
| 11 | #include <linux/cpufreq.h> | 11 | #include <linux/cpufreq.h> |
| 12 | #include <linux/cpu_cooling.h> | ||
| 12 | #include <linux/err.h> | 13 | #include <linux/err.h> |
| 13 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 14 | #include <linux/of.h> | 15 | #include <linux/of.h> |
| @@ -50,6 +51,7 @@ static struct clk_bulk_data clks[] = { | |||
| 50 | }; | 51 | }; |
| 51 | 52 | ||
| 52 | static struct device *cpu_dev; | 53 | static struct device *cpu_dev; |
| 54 | static struct thermal_cooling_device *cdev; | ||
| 53 | static bool free_opp; | 55 | static bool free_opp; |
| 54 | static struct cpufreq_frequency_table *freq_table; | 56 | static struct cpufreq_frequency_table *freq_table; |
| 55 | static unsigned int max_freq; | 57 | static unsigned int max_freq; |
| @@ -191,6 +193,16 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) | |||
| 191 | return 0; | 193 | return 0; |
| 192 | } | 194 | } |
| 193 | 195 | ||
| 196 | static void imx6q_cpufreq_ready(struct cpufreq_policy *policy) | ||
| 197 | { | ||
| 198 | cdev = of_cpufreq_cooling_register(policy); | ||
| 199 | |||
| 200 | if (!cdev) | ||
| 201 | dev_err(cpu_dev, | ||
| 202 | "running cpufreq without cooling device: %ld\n", | ||
| 203 | PTR_ERR(cdev)); | ||
| 204 | } | ||
| 205 | |||
| 194 | static int imx6q_cpufreq_init(struct cpufreq_policy *policy) | 206 | static int imx6q_cpufreq_init(struct cpufreq_policy *policy) |
| 195 | { | 207 | { |
| 196 | int ret; | 208 | int ret; |
| @@ -202,13 +214,22 @@ static int imx6q_cpufreq_init(struct cpufreq_policy *policy) | |||
| 202 | return ret; | 214 | return ret; |
| 203 | } | 215 | } |
| 204 | 216 | ||
| 217 | static int imx6q_cpufreq_exit(struct cpufreq_policy *policy) | ||
| 218 | { | ||
| 219 | cpufreq_cooling_unregister(cdev); | ||
| 220 | |||
| 221 | return 0; | ||
| 222 | } | ||
| 223 | |||
| 205 | static struct cpufreq_driver imx6q_cpufreq_driver = { | 224 | static struct cpufreq_driver imx6q_cpufreq_driver = { |
| 206 | .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, | 225 | .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, |
| 207 | .verify = cpufreq_generic_frequency_table_verify, | 226 | .verify = cpufreq_generic_frequency_table_verify, |
| 208 | .target_index = imx6q_set_target, | 227 | .target_index = imx6q_set_target, |
| 209 | .get = cpufreq_generic_get, | 228 | .get = cpufreq_generic_get, |
| 210 | .init = imx6q_cpufreq_init, | 229 | .init = imx6q_cpufreq_init, |
| 230 | .exit = imx6q_cpufreq_exit, | ||
| 211 | .name = "imx6q-cpufreq", | 231 | .name = "imx6q-cpufreq", |
| 232 | .ready = imx6q_cpufreq_ready, | ||
| 212 | .attr = cpufreq_generic_attr, | 233 | .attr = cpufreq_generic_attr, |
| 213 | .suspend = cpufreq_generic_suspend, | 234 | .suspend = cpufreq_generic_suspend, |
| 214 | }; | 235 | }; |
