- clock-latency: Specify the possible maximum transition latency for clock,
   in unit of nanoseconds.
 - voltage-tolerance: Specify the CPU voltage tolerance in percentage.
+- #cooling-cells:
+- cooling-min-level:
+- cooling-max-level:
+     Please refer to Documentation/devicetree/bindings/thermal/thermal.txt.
 
 Examples:
 
                        198000  850000
                >;
                clock-latency = <61036>; /* two CLK32 periods */
+               #cooling-cells = <2>;
+               cooling-min-level = <0>;
+               cooling-max-level = <2>;
        };
 
        cpu@1 {
 
 
 config GENERIC_CPUFREQ_CPU0
        tristate "Generic CPU0 cpufreq driver"
-       depends on HAVE_CLK && REGULATOR && PM_OPP && OF
+       depends on HAVE_CLK && REGULATOR && PM_OPP && OF && THERMAL && CPU_THERMAL
        help
          This adds a generic cpufreq driver for CPU0 frequency management.
          It supports both uniprocessor (UP) and symmetric multiprocessor (SMP)
 
 
 #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>
 #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 */
 static struct clk *cpu_clk;
 static struct regulator *cpu_reg;
 static struct cpufreq_frequency_table *freq_table;
+static struct thermal_cooling_device *cdev;
 
 static unsigned int cpu0_get_speed(unsigned int cpu)
 {
                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;
 
 
 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);