aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/thermal/imx_thermal.c
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2013-12-23 15:49:22 -0500
committerZhang Rui <rui.zhang@intel.com>2014-01-03 09:49:16 -0500
commit329fe7b14d6cef4b8cf8c866ff41057a70224de2 (patch)
tree21a45022a95bf88cf529d61c4cec1a2c5e7161c5 /drivers/thermal/imx_thermal.c
parentbeeb5a1e0ef774d0a3e18c5a0e78c39e3e1a5389 (diff)
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: Anson Huang <b20788@freescale.com> Acked-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Diffstat (limited to 'drivers/thermal/imx_thermal.c')
-rw-r--r--drivers/thermal/imx_thermal.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 77a962f1837b..deab7baeeb72 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -7,6 +7,7 @@
7 * 7 *
8 */ 8 */
9 9
10#include <linux/clk.h>
10#include <linux/cpu_cooling.h> 11#include <linux/cpu_cooling.h>
11#include <linux/cpufreq.h> 12#include <linux/cpufreq.h>
12#include <linux/delay.h> 13#include <linux/delay.h>
@@ -73,6 +74,7 @@ struct imx_thermal_data {
73 unsigned long last_temp; 74 unsigned long last_temp;
74 bool irq_enabled; 75 bool irq_enabled;
75 int irq; 76 int irq;
77 struct clk *thermal_clk;
76}; 78};
77 79
78static void imx_set_alarm_temp(struct imx_thermal_data *data, 80static void imx_set_alarm_temp(struct imx_thermal_data *data,
@@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev)
457 return ret; 459 return ret;
458 } 460 }
459 461
462 data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
463 if (IS_ERR(data->thermal_clk)) {
464 dev_warn(&pdev->dev, "failed to get thermal clk!\n");
465 } else {
466 /*
467 * Thermal sensor needs clk on to get correct value, normally
468 * we should enable its clk before taking measurement and disable
469 * clk after measurement is done, but if alarm function is enabled,
470 * hardware will auto measure the temperature periodically, so we
471 * need to keep the clk always on for alarm function.
472 */
473 ret = clk_prepare_enable(data->thermal_clk);
474 if (ret)
475 dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
476 }
477
460 /* Enable measurements at ~ 10 Hz */ 478 /* Enable measurements at ~ 10 Hz */
461 regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ); 479 regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
462 measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */ 480 measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
@@ -478,6 +496,8 @@ static int imx_thermal_remove(struct platform_device *pdev)
478 496
479 /* Disable measurements */ 497 /* Disable measurements */
480 regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN); 498 regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN);
499 if (!IS_ERR(data->thermal_clk))
500 clk_disable_unprepare(data->thermal_clk);
481 501
482 thermal_zone_device_unregister(data->tz); 502 thermal_zone_device_unregister(data->tz);
483 cpufreq_cooling_unregister(data->cdev); 503 cpufreq_cooling_unregister(data->cdev);