1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <asm/io.h>
21#include <dm.h>
22#include <thermal.h>
23
24#define CTRL_CORE_TEMP_SENSOR_MPU 0
25#define DRA752_ADC_START_VALUE 540
26
27struct ti_bandgap {
28 ulong base;
29 uint adc_val;
30};
31
32
33
34
35
36static int dra752_adc_to_temp[] = {
37
38 -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200,
39 -37800,
40
41 -37400, -37000, -36600, -36200, -35800, -35300, -34700, -34200, -33800,
42 -33400,
43
44 -33000, -32600, -32200, -31800, -31400, -31000, -30600, -30200, -29800,
45 -29400,
46
47 -29000, -28600, -28200, -27700, -27100, -26600, -26200, -25800, -25400,
48 -25000,
49
50 -24600, -24200, -23800, -23400, -23000, -22600, -22200, -21800, -21400,
51 -21000,
52
53 -20500, -19900, -19400, -19000, -18600, -18200, -17800, -17400, -17000,
54 -16600,
55
56 -16200, -15800, -15400, -15000, -14600, -14200, -13800, -13400, -13000,
57 -12500,
58
59 -11900, -11400, -11000, -10600, -10200, -9800, -9400, -9000, -8600,
60 -8200,
61
62 -7800, -7400, -7000, -6600, -6200, -5800, -5400, -5000, -4500,
63 -3900,
64
65 -3400, -3000, -2600, -2200, -1800, -1400, -1000, -600, -200,
66 200,
67
68 600, 1000, 1400, 1800, 2200, 2600, 3000, 3400, 3900,
69 4500,
70
71 5000, 5400, 5800, 6200, 6600, 7000, 7400, 7800, 8200,
72 8600,
73
74 9000, 9400, 9800, 10200, 10600, 11000, 11400, 11800, 12200,
75 12700,
76
77 13300, 13800, 14200, 14600, 15000, 15400, 15800, 16200, 16600,
78 17000,
79
80 17400, 17800, 18200, 18600, 19000, 19400, 19800, 20200, 20600,
81 21000,
82
83 21400, 21900, 22500, 23000, 23400, 23800, 24200, 24600, 25000,
84 25400,
85
86 25800, 26200, 26600, 27000, 27400, 27800, 28200, 28600, 29000,
87 29400,
88
89 29800, 30200, 30600, 31000, 31400, 31900, 32500, 33000, 33400,
90 33800,
91
92 34200, 34600, 35000, 35400, 35800, 36200, 36600, 37000, 37400,
93 37800,
94
95 38200, 38600, 39000, 39400, 39800, 40200, 40600, 41000, 41400,
96 41800,
97
98 42200, 42600, 43100, 43700, 44200, 44600, 45000, 45400, 45800,
99 46200,
100
101 46600, 47000, 47400, 47800, 48200, 48600, 49000, 49400, 49800,
102 50200,
103
104 50600, 51000, 51400, 51800, 52200, 52600, 53000, 53400, 53800,
105 54200,
106
107 54600, 55000, 55400, 55900, 56500, 57000, 57400, 57800, 58200,
108 58600,
109
110 59000, 59400, 59800, 60200, 60600, 61000, 61400, 61800, 62200,
111 62600,
112
113 63000, 63400, 63800, 64200, 64600, 65000, 65400, 65800, 66200,
114 66600,
115
116 67000, 67400, 67800, 68200, 68600, 69000, 69400, 69800, 70200,
117 70600,
118
119 71000, 71500, 72100, 72600, 73000, 73400, 73800, 74200, 74600,
120 75000,
121
122 75400, 75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600,
123 79000,
124
125 79400, 79800, 80200, 80600, 81000, 81400, 81800, 82200, 82600,
126 83000,
127
128 83400, 83800, 84200, 84600, 85000, 85400, 85800, 86200, 86600,
129 87000,
130
131 87400, 87800, 88200, 88600, 89000, 89400, 89800, 90200, 90600,
132 91000,
133
134 91400, 91800, 92200, 92600, 93000, 93400, 93800, 94200, 94600,
135 95000,
136
137 95400, 95800, 96200, 96600, 97000, 97500, 98100, 98600, 99000,
138 99400,
139
140 99800, 100200, 100600, 101000, 101400, 101800, 102200, 102600, 103000,
141 103400,
142
143 103800, 104200, 104600, 105000, 105400, 105800, 106200, 106600, 107000,
144 107400,
145
146 107800, 108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000,
147 111400,
148
149 111800, 112200, 112600, 113000, 113400, 113800, 114200, 114600, 115000,
150 115400,
151
152 115800, 116200, 116600, 117000, 117400, 117800, 118200, 118600, 119000,
153 119400,
154
155 119800, 120200, 120600, 121000, 121400, 121800, 122200, 122600, 123000,
156 123400,
157
158 123800, 124200, 124600, 124900, 125000, 125000,
159};
160
161static int ti_bandgap_get_temp(struct udevice *dev, int *temp)
162{
163 struct ti_bandgap *bgp = dev_get_priv(dev);
164
165 bgp->adc_val = 0x3ff & readl(bgp->base + CTRL_CORE_TEMP_SENSOR_MPU);
166 *temp = dra752_adc_to_temp[bgp->adc_val - DRA752_ADC_START_VALUE];
167
168 return 0;
169}
170
171static struct dm_thermal_ops ti_thermal_ops = {
172 .get_temp = ti_bandgap_get_temp,
173};
174
175static int ti_bandgap_probe(struct udevice *dev)
176{
177 struct ti_bandgap *bgp = dev_get_priv(dev);
178
179 bgp->base = devfdt_get_addr_index(dev, 1);
180
181 return 0;
182}
183
184static const struct udevice_id of_ti_bandgap_match[] = {
185 {
186 .compatible = "ti,dra752-bandgap",
187 },
188 {},
189};
190
191U_BOOT_DRIVER(ti_bandgap_thermal) = {
192 .name = "ti_bandgap_thermal",
193 .id = UCLASS_THERMAL,
194 .ops = &ti_thermal_ops,
195 .probe = ti_bandgap_probe,
196 .of_match = of_ti_bandgap_match,
197 .priv_auto = sizeof(struct ti_bandgap),
198};
199