提交 88fc6f73 编写于 作者: M Marek Szyprowski 提交者: Eduardo Valentin

thermal: exynos: Reading temperature makes sense only when TMU is turned on

When thermal sensor is not yet enabled, reading temperature might return
random value. This might even result in stopping system booting when such
temperature is higher than the critical value. Fix this by checking if TMU
has been actually enabled before reading the temperature.

This change fixes booting of Exynos4210-based board with TMU enabled (for
example Samsung Trats board), which was broken since v4.4 kernel release.
Signed-off-by: NMarek Szyprowski <m.szyprowski@samsung.com>
Fixes: 9e4249b4 ("thermal: exynos: Fix first temperature read after registering sensor")
CC: stable@vger.kernel.org # v4.6+
Signed-off-by: NBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: NEduardo Valentin <edubezval@gmail.com>
上级 6d08b06e
...@@ -185,6 +185,7 @@ ...@@ -185,6 +185,7 @@
* @regulator: pointer to the TMU regulator structure. * @regulator: pointer to the TMU regulator structure.
* @reg_conf: pointer to structure to register with core thermal. * @reg_conf: pointer to structure to register with core thermal.
* @ntrip: number of supported trip points. * @ntrip: number of supported trip points.
* @enabled: current status of TMU device
* @tmu_initialize: SoC specific TMU initialization method * @tmu_initialize: SoC specific TMU initialization method
* @tmu_control: SoC specific TMU control method * @tmu_control: SoC specific TMU control method
* @tmu_read: SoC specific TMU temperature read method * @tmu_read: SoC specific TMU temperature read method
...@@ -205,6 +206,7 @@ struct exynos_tmu_data { ...@@ -205,6 +206,7 @@ struct exynos_tmu_data {
struct regulator *regulator; struct regulator *regulator;
struct thermal_zone_device *tzd; struct thermal_zone_device *tzd;
unsigned int ntrip; unsigned int ntrip;
bool enabled;
int (*tmu_initialize)(struct platform_device *pdev); int (*tmu_initialize)(struct platform_device *pdev);
void (*tmu_control)(struct platform_device *pdev, bool on); void (*tmu_control)(struct platform_device *pdev, bool on);
...@@ -398,6 +400,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on) ...@@ -398,6 +400,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
mutex_lock(&data->lock); mutex_lock(&data->lock);
clk_enable(data->clk); clk_enable(data->clk);
data->tmu_control(pdev, on); data->tmu_control(pdev, on);
data->enabled = on;
clk_disable(data->clk); clk_disable(data->clk);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
} }
...@@ -890,7 +893,7 @@ static int exynos_get_temp(void *p, int *temp) ...@@ -890,7 +893,7 @@ static int exynos_get_temp(void *p, int *temp)
{ {
struct exynos_tmu_data *data = p; struct exynos_tmu_data *data = p;
if (!data || !data->tmu_read) if (!data || !data->tmu_read || !data->enabled)
return -EINVAL; return -EINVAL;
mutex_lock(&data->lock); mutex_lock(&data->lock);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册