aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/thermal/samsung/exynos_tmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/thermal/samsung/exynos_tmu.c')
-rw-r--r--drivers/thermal/samsung/exynos_tmu.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index fa33a485ee5b..401ec980c592 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -49,7 +49,6 @@
49#define EXYNOS_TMU_BUF_SLOPE_SEL_MASK 0xf 49#define EXYNOS_TMU_BUF_SLOPE_SEL_MASK 0xf
50#define EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT 8 50#define EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT 8
51#define EXYNOS_TMU_CORE_EN_SHIFT 0 51#define EXYNOS_TMU_CORE_EN_SHIFT 0
52#define EXYNOS_TMU_DEF_CODE_TO_TEMP_OFFSET 50
53 52
54/* Exynos4210 specific registers */ 53/* Exynos4210 specific registers */
55#define EXYNOS4210_TMU_REG_THRESHOLD_TEMP 0x44 54#define EXYNOS4210_TMU_REG_THRESHOLD_TEMP 0x44
@@ -94,9 +93,6 @@
94#define EXYNOS_TMU_INTEN_FALL1_SHIFT 20 93#define EXYNOS_TMU_INTEN_FALL1_SHIFT 20
95#define EXYNOS_TMU_INTEN_FALL2_SHIFT 24 94#define EXYNOS_TMU_INTEN_FALL2_SHIFT 24
96 95
97#define EFUSE_MIN_VALUE 40
98#define EFUSE_MAX_VALUE 100
99
100#ifdef CONFIG_THERMAL_EMULATION 96#ifdef CONFIG_THERMAL_EMULATION
101#define EXYNOS_EMUL_TIME 0x57F0 97#define EXYNOS_EMUL_TIME 0x57F0
102#define EXYNOS_EMUL_TIME_MASK 0xffff 98#define EXYNOS_EMUL_TIME_MASK 0xffff
@@ -136,15 +132,16 @@ static int temp_to_code(struct exynos_tmu_data *data, u8 temp)
136 132
137 switch (pdata->cal_type) { 133 switch (pdata->cal_type) {
138 case TYPE_TWO_POINT_TRIMMING: 134 case TYPE_TWO_POINT_TRIMMING:
139 temp_code = (temp - 25) * 135 temp_code = (temp - pdata->first_point_trim) *
140 (data->temp_error2 - data->temp_error1) / 136 (data->temp_error2 - data->temp_error1) /
141 (85 - 25) + data->temp_error1; 137 (pdata->second_point_trim - pdata->first_point_trim) +
138 data->temp_error1;
142 break; 139 break;
143 case TYPE_ONE_POINT_TRIMMING: 140 case TYPE_ONE_POINT_TRIMMING:
144 temp_code = temp + data->temp_error1 - 25; 141 temp_code = temp + data->temp_error1 - pdata->first_point_trim;
145 break; 142 break;
146 default: 143 default:
147 temp_code = temp + EXYNOS_TMU_DEF_CODE_TO_TEMP_OFFSET; 144 temp_code = temp + pdata->default_temp_offset;
148 break; 145 break;
149 } 146 }
150out: 147out:
@@ -169,14 +166,16 @@ static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code)
169 166
170 switch (pdata->cal_type) { 167 switch (pdata->cal_type) {
171 case TYPE_TWO_POINT_TRIMMING: 168 case TYPE_TWO_POINT_TRIMMING:
172 temp = (temp_code - data->temp_error1) * (85 - 25) / 169 temp = (temp_code - data->temp_error1) *
173 (data->temp_error2 - data->temp_error1) + 25; 170 (pdata->second_point_trim - pdata->first_point_trim) /
171 (data->temp_error2 - data->temp_error1) +
172 pdata->first_point_trim;
174 break; 173 break;
175 case TYPE_ONE_POINT_TRIMMING: 174 case TYPE_ONE_POINT_TRIMMING:
176 temp = temp_code - data->temp_error1 + 25; 175 temp = temp_code - data->temp_error1 + pdata->first_point_trim;
177 break; 176 break;
178 default: 177 default:
179 temp = temp_code - EXYNOS_TMU_DEF_CODE_TO_TEMP_OFFSET; 178 temp = temp_code - pdata->default_temp_offset;
180 break; 179 break;
181 } 180 }
182out: 181out:
@@ -209,8 +208,8 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
209 data->temp_error1 = trim_info & EXYNOS_TMU_TRIM_TEMP_MASK; 208 data->temp_error1 = trim_info & EXYNOS_TMU_TRIM_TEMP_MASK;
210 data->temp_error2 = ((trim_info >> 8) & EXYNOS_TMU_TRIM_TEMP_MASK); 209 data->temp_error2 = ((trim_info >> 8) & EXYNOS_TMU_TRIM_TEMP_MASK);
211 210
212 if ((EFUSE_MIN_VALUE > data->temp_error1) || 211 if ((pdata->min_efuse_value > data->temp_error1) ||
213 (data->temp_error1 > EFUSE_MAX_VALUE) || 212 (data->temp_error1 > pdata->max_efuse_value) ||
214 (data->temp_error2 != 0)) 213 (data->temp_error2 != 0))
215 data->temp_error1 = pdata->efuse_value; 214 data->temp_error1 = pdata->efuse_value;
216 215
@@ -300,10 +299,10 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
300 if (on) { 299 if (on) {
301 con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT); 300 con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT);
302 interrupt_en = 301 interrupt_en =
303 pdata->trigger_level3_en << EXYNOS_TMU_INTEN_RISE3_SHIFT | 302 pdata->trigger_enable[3] << EXYNOS_TMU_INTEN_RISE3_SHIFT |
304 pdata->trigger_level2_en << EXYNOS_TMU_INTEN_RISE2_SHIFT | 303 pdata->trigger_enable[2] << EXYNOS_TMU_INTEN_RISE2_SHIFT |
305 pdata->trigger_level1_en << EXYNOS_TMU_INTEN_RISE1_SHIFT | 304 pdata->trigger_enable[1] << EXYNOS_TMU_INTEN_RISE1_SHIFT |
306 pdata->trigger_level0_en << EXYNOS_TMU_INTEN_RISE0_SHIFT; 305 pdata->trigger_enable[0] << EXYNOS_TMU_INTEN_RISE0_SHIFT;
307 if (pdata->threshold_falling) 306 if (pdata->threshold_falling)
308 interrupt_en |= 307 interrupt_en |=
309 interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT; 308 interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT;
@@ -533,9 +532,9 @@ static int exynos_tmu_probe(struct platform_device *pdev)
533 532
534 /* Register the sensor with thermal management interface */ 533 /* Register the sensor with thermal management interface */
535 (&exynos_sensor_conf)->private_data = data; 534 (&exynos_sensor_conf)->private_data = data;
536 exynos_sensor_conf.trip_data.trip_count = pdata->trigger_level0_en + 535 exynos_sensor_conf.trip_data.trip_count = pdata->trigger_enable[0] +
537 pdata->trigger_level1_en + pdata->trigger_level2_en + 536 pdata->trigger_enable[1] + pdata->trigger_enable[2]+
538 pdata->trigger_level3_en; 537 pdata->trigger_enable[3];
539 538
540 for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++) 539 for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++)
541 exynos_sensor_conf.trip_data.trip_val[i] = 540 exynos_sensor_conf.trip_data.trip_val[i] =