blob: cb7e47284c7998980a8c519920aae99fe9c5fe8b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/* SPDX-License-Identifier: GPL-2.0-only */
/* EXYNOS - Thermal Management Unit */
#ifndef CPU_SAMSUNG_EXYNOS5250_TMU_H
#define CPU_SAMSUNG_EXYNOS5250_TMU_H
struct tmu_reg {
unsigned int triminfo;
unsigned int rsvd1;
unsigned int rsvd2;
unsigned int rsvd3;
unsigned int rsvd4;
unsigned int triminfo_control;
unsigned int rsvd5;
unsigned int rsvd6;
unsigned int tmu_control;
unsigned int rsvd7;
unsigned int tmu_status;
unsigned int sampling_internal;
unsigned int counter_value0;
unsigned int counter_value1;
unsigned int rsvd8;
unsigned int rsvd9;
unsigned int current_temp;
unsigned int rsvd10;
unsigned int rsvd11;
unsigned int rsvd12;
unsigned int threshold_temp_rise;
unsigned int threshold_temp_fall;
unsigned int rsvd13;
unsigned int rsvd14;
unsigned int past_temp3_0;
unsigned int past_temp7_4;
unsigned int past_temp11_8;
unsigned int past_temp15_12;
unsigned int inten;
unsigned int intstat;
unsigned int intclear;
unsigned int rsvd15;
unsigned int emul_con;
};
check_member(tmu_reg, emul_con, 0x80);
enum tmu_status_t {
TMU_STATUS_INIT = 0,
TMU_STATUS_NORMAL,
TMU_STATUS_WARNING,
TMU_STATUS_TRIPPED,
};
/* Temperature threshold values for various thermal events */
struct temperature_params {
/* minimum value in temperature code range */
unsigned int min_val;
/* maximum value in temperature code range */
unsigned int max_val;
/* temperature threshold to start warning */
unsigned int start_warning;
/* temperature threshold CPU tripping */
unsigned int start_tripping;
/* temperature threshold for HW tripping */
unsigned int hardware_tripping;
};
/* Pre-defined values and thresholds for calibration of current temperature */
struct tmu_data {
/* pre-defined temperature thresholds */
struct temperature_params ts;
/* pre-defined efuse range minimum value */
unsigned int efuse_min_value;
/* pre-defined efuse value for temperature calibration */
unsigned int efuse_value;
/* pre-defined efuse range maximum value */
unsigned int efuse_max_value;
/* current temperature sensing slope */
unsigned int slope;
};
/* TMU device specific details and status */
struct tmu_info {
/* base Address for the TMU */
unsigned int tmu_base;
/* mux Address for the TMU */
int tmu_mux;
/* pre-defined values for calibration and thresholds */
struct tmu_data data;
/* value required for triminfo_25 calibration */
unsigned int te1;
/* value required for triminfo_85 calibration */
unsigned int te2;
/* TMU DC value for threshold calculation */
int dc_value;
/* enum value indicating status of the TMU */
int tmu_state;
};
extern struct tmu_info *tmu_info;
/*
* Monitors status of the TMU device and exynos temperature
*
* @info pointer to TMU info struct
* @temp pointer to the current temperature value
* @return enum tmu_status_t value, code indicating event to execute
* and -1 on error
*/
enum tmu_status_t tmu_monitor(struct tmu_info *info, int *temp);
/*
* Initialize TMU device
*
* @info pointer to TMU info struct
* @return int value, 0 for success
*/
int tmu_init(struct tmu_info *info);
#endif /* CPU_SAMSUNG_EXYNOS5250_TMU_H */
|