提交 329fe7b1 编写于 作者: A Anson Huang 提交者: Zhang Rui

thermal: imx: add necessary clk operation

Thermal sensor needs pll3_usb_otg when measuring temperature,
otherwise the temperature read will be incorrect, so need to
enable this clk before sensor working, for alarm function,
as hardware will take measurement periodically, so we should
keep this clk always on once alarm function is enabled.
Signed-off-by: NAnson Huang <b20788@freescale.com>
Acked-by: NShawn Guo <shawn.guo@linaro.org>
Signed-off-by: NZhang Rui <rui.zhang@intel.com>
上级 beeb5a1e
...@@ -8,10 +8,14 @@ Required properties: ...@@ -8,10 +8,14 @@ Required properties:
calibration data, e.g. OCOTP on imx6q. The details about calibration data calibration data, e.g. OCOTP on imx6q. The details about calibration data
can be found in SoC Reference Manual. can be found in SoC Reference Manual.
Optional properties:
- clocks : thermal sensor's clock source.
Example: Example:
tempmon { tempmon {
compatible = "fsl,imx6q-tempmon"; compatible = "fsl,imx6q-tempmon";
fsl,tempmon = <&anatop>; fsl,tempmon = <&anatop>;
fsl,tempmon-data = <&ocotp>; fsl,tempmon-data = <&ocotp>;
clocks = <&clks 172>;
}; };
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* *
*/ */
#include <linux/clk.h>
#include <linux/cpu_cooling.h> #include <linux/cpu_cooling.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -73,6 +74,7 @@ struct imx_thermal_data { ...@@ -73,6 +74,7 @@ struct imx_thermal_data {
unsigned long last_temp; unsigned long last_temp;
bool irq_enabled; bool irq_enabled;
int irq; int irq;
struct clk *thermal_clk;
}; };
static void imx_set_alarm_temp(struct imx_thermal_data *data, static void imx_set_alarm_temp(struct imx_thermal_data *data,
...@@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev) ...@@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev)
return ret; return ret;
} }
data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(data->thermal_clk)) {
dev_warn(&pdev->dev, "failed to get thermal clk!\n");
} else {
/*
* Thermal sensor needs clk on to get correct value, normally
* we should enable its clk before taking measurement and disable
* clk after measurement is done, but if alarm function is enabled,
* hardware will auto measure the temperature periodically, so we
* need to keep the clk always on for alarm function.
*/
ret = clk_prepare_enable(data->thermal_clk);
if (ret)
dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
}
/* Enable measurements at ~ 10 Hz */ /* Enable measurements at ~ 10 Hz */
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ); regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */ measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
...@@ -478,6 +496,8 @@ static int imx_thermal_remove(struct platform_device *pdev) ...@@ -478,6 +496,8 @@ static int imx_thermal_remove(struct platform_device *pdev)
/* Disable measurements */ /* Disable measurements */
regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN); regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN);
if (!IS_ERR(data->thermal_clk))
clk_disable_unprepare(data->thermal_clk);
thermal_zone_device_unregister(data->tz); thermal_zone_device_unregister(data->tz);
cpufreq_cooling_unregister(data->cdev); cpufreq_cooling_unregister(data->cdev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册