|
@@ -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,6 +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 struct thermal_cooling_device *cdev;
|
|
|
|
|
|
static unsigned int cpu0_get_speed(unsigned int cpu)
|
|
|
{
|
|
@@ -201,6 +205,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 +228,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);
|
|
|
|