]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/cpufreq/imx6q-cpufreq.c
Merge branch 'for-4.20/microsoft' into for-linus
[linux.git] / drivers / cpufreq / imx6q-cpufreq.c
index 8b3c2a79ad6cd113e38982f6cb1700a282ebff16..b2ff423ad7f82f6252d2c3ff7a0a38811ca2449b 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/clk.h>
 #include <linux/cpu.h>
 #include <linux/cpufreq.h>
+#include <linux/cpu_cooling.h>
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -50,6 +51,7 @@ static struct clk_bulk_data clks[] = {
 };
 
 static struct device *cpu_dev;
+static struct thermal_cooling_device *cdev;
 static bool free_opp;
 static struct cpufreq_frequency_table *freq_table;
 static unsigned int max_freq;
@@ -191,6 +193,16 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
        return 0;
 }
 
+static void imx6q_cpufreq_ready(struct cpufreq_policy *policy)
+{
+       cdev = of_cpufreq_cooling_register(policy);
+
+       if (!cdev)
+               dev_err(cpu_dev,
+                       "running cpufreq without cooling device: %ld\n",
+                       PTR_ERR(cdev));
+}
+
 static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
 {
        int ret;
@@ -202,13 +214,22 @@ static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
        return ret;
 }
 
+static int imx6q_cpufreq_exit(struct cpufreq_policy *policy)
+{
+       cpufreq_cooling_unregister(cdev);
+
+       return 0;
+}
+
 static struct cpufreq_driver imx6q_cpufreq_driver = {
        .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK,
        .verify = cpufreq_generic_frequency_table_verify,
        .target_index = imx6q_set_target,
        .get = cpufreq_generic_get,
        .init = imx6q_cpufreq_init,
+       .exit = imx6q_cpufreq_exit,
        .name = "imx6q-cpufreq",
+       .ready = imx6q_cpufreq_ready,
        .attr = cpufreq_generic_attr,
        .suspend = cpufreq_generic_suspend,
 };