Merge branch 'drop-time' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek...
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / cpufreq-cpu0.c
index d4585ce2346cf187a0c5511fafdd7ac08204f1bb..0c12ffc0ebcbf2a5daad62e4a47674fdcedadf75 100644 (file)
@@ -13,7 +13,9 @@
 
 #include <linux/clk.h>
 #include <linux/cpu.h>
+#include <linux/cpu_cooling.h>
 #include <linux/cpufreq.h>
+#include <linux/cpumask.h>
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -21,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
+#include <linux/thermal.h>
 
 static unsigned int transition_latency;
 static unsigned int voltage_tolerance; /* in percentage */
@@ -29,11 +32,7 @@ static struct device *cpu_dev;
 static struct clk *cpu_clk;
 static struct regulator *cpu_reg;
 static struct cpufreq_frequency_table *freq_table;
-
-static unsigned int cpu0_get_speed(unsigned int cpu)
-{
-       return clk_get_rate(cpu_clk) / 1000;
-}
+static struct thermal_cooling_device *cdev;
 
 static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
 {
@@ -44,7 +43,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
        int ret;
 
        freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000);
-       if (freq_Hz < 0)
+       if (freq_Hz <= 0)
                freq_Hz = freq_table[index].frequency * 1000;
 
        freq_exact = freq_Hz;
@@ -100,6 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
 
 static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
 {
+       policy->clk = cpu_clk;
        return cpufreq_generic_init(policy, freq_table, transition_latency);
 }
 
@@ -107,7 +107,7 @@ static struct cpufreq_driver cpu0_cpufreq_driver = {
        .flags = CPUFREQ_STICKY,
        .verify = cpufreq_generic_frequency_table_verify,
        .target_index = cpu0_set_target,
-       .get = cpu0_get_speed,
+       .get = cpufreq_generic_get,
        .init = cpu0_cpufreq_init,
        .exit = cpufreq_generic_exit,
        .name = "generic_cpu0",
@@ -201,6 +201,17 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
                goto out_free_table;
        }
 
+       /*
+        * For now, just loading the cooling device;
+        * thermal DT code takes care of matching them.
+        */
+       if (of_find_property(np, "#cooling-cells", NULL)) {
+               cdev = of_cpufreq_cooling_register(np, cpu_present_mask);
+               if (IS_ERR(cdev))
+                       pr_err("running cpufreq without cooling device: %ld\n",
+                              PTR_ERR(cdev));
+       }
+
        of_node_put(np);
        return 0;
 
@@ -213,6 +224,7 @@ out_put_node:
 
 static int cpu0_cpufreq_remove(struct platform_device *pdev)
 {
+       cpufreq_cooling_unregister(cdev);
        cpufreq_unregister_driver(&cpu0_cpufreq_driver);
        dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);