]>
Commit | Line | Data |
---|---|---|
8502f9f6 FA |
1 | /* |
2 | * TI Bandgap temperature sensor driver | |
3 | * | |
4 | * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU General Public License as | |
8 | * published by the Free Software Foundation version 2. | |
9 | * | |
10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | |
11 | * kind, whether express or implied; without even the implied warranty | |
12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * Taken from Linux v4.9 (drivers/thermal/ti-soc-thermal/ti-bandgap.c) | |
16 | * and ported to uboot. | |
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 | ||
27 | struct ti_bandgap { | |
28 | ulong base; | |
29 | int temperature; /* in mili degree celsius */ | |
30 | }; | |
31 | ||
32 | /* | |
33 | * DRA752 : Temperature values in milli degree celsius | |
34 | * ADC code values from 540 to 945 | |
35 | */ | |
36 | static int dra752_adc_to_temp[] = { | |
37 | /* Index 540 - 549 */ | |
38 | -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200, | |
39 | -37800, | |
40 | /* Index 550 - 559 */ | |
41 | -37400, -37000, -36600, -36200, -35800, -35300, -34700, -34200, -33800, | |
42 | -33400, | |
43 | /* Index 560 - 569 */ | |
44 | -33000, -32600, -32200, -31800, -31400, -31000, -30600, -30200, -29800, | |
45 | -29400, | |
46 | /* Index 570 - 579 */ | |
47 | -29000, -28600, -28200, -27700, -27100, -26600, -26200, -25800, -25400, | |
48 | -25000, | |
49 | /* Index 580 - 589 */ | |
50 | -24600, -24200, -23800, -23400, -23000, -22600, -22200, -21800, -21400, | |
51 | -21000, | |
52 | /* Index 590 - 599 */ | |
53 | -20500, -19900, -19400, -19000, -18600, -18200, -17800, -17400, -17000, | |
54 | -16600, | |
55 | /* Index 600 - 609 */ | |
56 | -16200, -15800, -15400, -15000, -14600, -14200, -13800, -13400, -13000, | |
57 | -12500, | |
58 | /* Index 610 - 619 */ | |
59 | -11900, -11400, -11000, -10600, -10200, -9800, -9400, -9000, -8600, | |
60 | -8200, | |
61 | /* Index 620 - 629 */ | |
62 | -7800, -7400, -7000, -6600, -6200, -5800, -5400, -5000, -4500, | |
63 | -3900, | |
64 | /* Index 630 - 639 */ | |
65 | -3400, -3000, -2600, -2200, -1800, -1400, -1000, -600, -200, | |
66 | 200, | |
67 | /* Index 640 - 649 */ | |
68 | 600, 1000, 1400, 1800, 2200, 2600, 3000, 3400, 3900, | |
69 | 4500, | |
70 | /* Index 650 - 659 */ | |
71 | 5000, 5400, 5800, 6200, 6600, 7000, 7400, 7800, 8200, | |
72 | 8600, | |
73 | /* Index 660 - 669 */ | |
74 | 9000, 9400, 9800, 10200, 10600, 11000, 11400, 11800, 12200, | |
75 | 12700, | |
76 | /* Index 670 - 679 */ | |
77 | 13300, 13800, 14200, 14600, 15000, 15400, 15800, 16200, 16600, | |
78 | 17000, | |
79 | /* Index 680 - 689 */ | |
80 | 17400, 17800, 18200, 18600, 19000, 19400, 19800, 20200, 20600, | |
81 | 21000, | |
82 | /* Index 690 - 699 */ | |
83 | 21400, 21900, 22500, 23000, 23400, 23800, 24200, 24600, 25000, | |
84 | 25400, | |
85 | /* Index 700 - 709 */ | |
86 | 25800, 26200, 26600, 27000, 27400, 27800, 28200, 28600, 29000, | |
87 | 29400, | |
88 | /* Index 710 - 719 */ | |
89 | 29800, 30200, 30600, 31000, 31400, 31900, 32500, 33000, 33400, | |
90 | 33800, | |
91 | /* Index 720 - 729 */ | |
92 | 34200, 34600, 35000, 35400, 35800, 36200, 36600, 37000, 37400, | |
93 | 37800, | |
94 | /* Index 730 - 739 */ | |
95 | 38200, 38600, 39000, 39400, 39800, 40200, 40600, 41000, 41400, | |
96 | 41800, | |
97 | /* Index 740 - 749 */ | |
98 | 42200, 42600, 43100, 43700, 44200, 44600, 45000, 45400, 45800, | |
99 | 46200, | |
100 | /* Index 750 - 759 */ | |
101 | 46600, 47000, 47400, 47800, 48200, 48600, 49000, 49400, 49800, | |
102 | 50200, | |
103 | /* Index 760 - 769 */ | |
104 | 50600, 51000, 51400, 51800, 52200, 52600, 53000, 53400, 53800, | |
105 | 54200, | |
106 | /* Index 770 - 779 */ | |
107 | 54600, 55000, 55400, 55900, 56500, 57000, 57400, 57800, 58200, | |
108 | 58600, | |
109 | /* Index 780 - 789 */ | |
110 | 59000, 59400, 59800, 60200, 60600, 61000, 61400, 61800, 62200, | |
111 | 62600, | |
112 | /* Index 790 - 799 */ | |
113 | 63000, 63400, 63800, 64200, 64600, 65000, 65400, 65800, 66200, | |
114 | 66600, | |
115 | /* Index 800 - 809 */ | |
116 | 67000, 67400, 67800, 68200, 68600, 69000, 69400, 69800, 70200, | |
117 | 70600, | |
118 | /* Index 810 - 819 */ | |
119 | 71000, 71500, 72100, 72600, 73000, 73400, 73800, 74200, 74600, | |
120 | 75000, | |
121 | /* Index 820 - 829 */ | |
122 | 75400, 75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, | |
123 | 79000, | |
124 | /* Index 830 - 839 */ | |
125 | 79400, 79800, 80200, 80600, 81000, 81400, 81800, 82200, 82600, | |
126 | 83000, | |
127 | /* Index 840 - 849 */ | |
128 | 83400, 83800, 84200, 84600, 85000, 85400, 85800, 86200, 86600, | |
129 | 87000, | |
130 | /* Index 850 - 859 */ | |
131 | 87400, 87800, 88200, 88600, 89000, 89400, 89800, 90200, 90600, | |
132 | 91000, | |
133 | /* Index 860 - 869 */ | |
134 | 91400, 91800, 92200, 92600, 93000, 93400, 93800, 94200, 94600, | |
135 | 95000, | |
136 | /* Index 870 - 879 */ | |
137 | 95400, 95800, 96200, 96600, 97000, 97500, 98100, 98600, 99000, | |
138 | 99400, | |
139 | /* Index 880 - 889 */ | |
140 | 99800, 100200, 100600, 101000, 101400, 101800, 102200, 102600, 103000, | |
141 | 103400, | |
142 | /* Index 890 - 899 */ | |
143 | 103800, 104200, 104600, 105000, 105400, 105800, 106200, 106600, 107000, | |
144 | 107400, | |
145 | /* Index 900 - 909 */ | |
146 | 107800, 108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000, | |
147 | 111400, | |
148 | /* Index 910 - 919 */ | |
149 | 111800, 112200, 112600, 113000, 113400, 113800, 114200, 114600, 115000, | |
150 | 115400, | |
151 | /* Index 920 - 929 */ | |
152 | 115800, 116200, 116600, 117000, 117400, 117800, 118200, 118600, 119000, | |
153 | 119400, | |
154 | /* Index 930 - 939 */ | |
155 | 119800, 120200, 120600, 121000, 121400, 121800, 122200, 122600, 123000, | |
156 | 123400, | |
157 | /* Index 940 - 945 */ | |
158 | 123800, 124200, 124600, 124900, 125000, 125000, | |
159 | }; | |
160 | ||
161 | static int ti_bandgap_get_temp(struct udevice *dev, int *temp) | |
162 | { | |
163 | struct ti_bandgap *bgp = dev_get_priv(dev); | |
164 | ||
165 | bgp->temperature = 0x3ff & readl(bgp->base + CTRL_CORE_TEMP_SENSOR_MPU); | |
166 | *temp = dra752_adc_to_temp[bgp->temperature - DRA752_ADC_START_VALUE]; | |
167 | ||
168 | return 0; | |
169 | } | |
170 | ||
171 | static struct dm_thermal_ops ti_thermal_ops = { | |
172 | .get_temp = ti_bandgap_get_temp, | |
173 | }; | |
174 | ||
175 | static 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 | ||
184 | static const struct udevice_id of_ti_bandgap_match[] = { | |
185 | { | |
186 | .compatible = "ti,dra752-bandgap", | |
187 | }, | |
188 | {}, | |
189 | }; | |
190 | ||
191 | U_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_alloc_size = sizeof(struct ti_bandgap), | |
198 | }; |