1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (c) 2019 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com/ |
5 | * |
6 | * Samsung Exynos 5422 SoC Adaptive Supply Voltage support |
7 | */ |
8 | |
9 | #include <linux/bitrev.h> |
10 | #include <linux/errno.h> |
11 | #include <linux/regmap.h> |
12 | #include <linux/soc/samsung/exynos-chipid.h> |
13 | #include <linux/slab.h> |
14 | |
15 | #include "exynos-asv.h" |
16 | #include "exynos5422-asv.h" |
17 | |
18 | #define ASV_GROUPS_NUM 14 |
19 | #define ASV_ARM_DVFS_NUM 20 |
20 | #define ASV_ARM_BIN2_DVFS_NUM 17 |
21 | #define ASV_KFC_DVFS_NUM 14 |
22 | #define ASV_KFC_BIN2_DVFS_NUM 12 |
23 | |
24 | /* |
25 | * This array is a set of 4 ASV data tables, first column of each ASV table |
26 | * contains frequency value in MHz and subsequent columns contain the CPU |
27 | * cluster's supply voltage values in uV. |
28 | * In order to create a set of OPPs for specific SoC revision one of the voltage |
29 | * columns (1...14) from one of the tables (0...3) is selected during |
30 | * initialization. There are separate ASV tables for the big (ARM) and little |
31 | * (KFC) CPU cluster. Only OPPs which are already defined in devicetree |
32 | * will be updated. |
33 | */ |
34 | |
35 | static const u32 asv_arm_table[][ASV_ARM_DVFS_NUM][ASV_GROUPS_NUM + 1] = { |
36 | { |
37 | /* ARM 0, 1 */ |
38 | { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, |
39 | 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, |
40 | { 2000, 1312500, 1312500, 1300000, 1287500, 1275000, 1262500, 1250000, |
41 | 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
42 | { 1900, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, |
43 | 1162500, 1150000, 1162500, 1150000, 1137500, 1125000, 1112500 }, |
44 | { 1800, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, |
45 | 1112500, 1100000, 1112500, 1100000, 1087500, 1075000, 1062500 }, |
46 | { 1700, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, |
47 | 1075000, 1062500, 1075000, 1062500, 1050000, 1037500, 1025000 }, |
48 | { 1600, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, |
49 | 1037500, 1025000, 1037500, 1025000, 1012500, 1000000, 987500 }, |
50 | { 1500, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, |
51 | 1000000, 987500, 1000000, 987500, 975000, 962500, 950000 }, |
52 | { 1400, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, |
53 | 975000, 962500, 975000, 962500, 950000, 937500, 925000 }, |
54 | { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, |
55 | 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, |
56 | { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
57 | 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, |
58 | { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, |
59 | 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, |
60 | { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, |
61 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
62 | { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
63 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
64 | { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, |
65 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
66 | { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
67 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
68 | { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
69 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
70 | { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
71 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
72 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
73 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
74 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
75 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
76 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
77 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
78 | }, { |
79 | /* ARM 2 */ |
80 | { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, |
81 | 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, |
82 | { 2000, 1312500, 1312500, 1312500, 1300000, 1275000, 1262500, 1250000, |
83 | 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
84 | { 1900, 1262500, 1250000, 1250000, 1237500, 1212500, 1200000, 1187500, |
85 | 1175000, 1162500, 1175000, 1162500, 1150000, 1137500, 1125000 }, |
86 | { 1800, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, |
87 | 1125000, 1112500, 1125000, 1112500, 1100000, 1087500, 1075000 }, |
88 | { 1700, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, |
89 | 1087500, 1075000, 1087500, 1075000, 1062500, 1050000, 1037500 }, |
90 | { 1600, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, |
91 | 1050000, 1037500, 1050000, 1037500, 1025000, 1012500, 1000000 }, |
92 | { 1500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
93 | 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, |
94 | { 1400, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, |
95 | 987500, 975000, 987500, 975000, 962500, 950000, 937500 }, |
96 | { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, |
97 | 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, |
98 | { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
99 | 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, |
100 | { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, |
101 | 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, |
102 | { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, |
103 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
104 | { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
105 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
106 | { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, |
107 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
108 | { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
109 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
110 | { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
111 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
112 | { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
113 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
114 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
115 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
116 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
117 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
118 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
119 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
120 | }, { |
121 | /* ARM 3 */ |
122 | { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, |
123 | 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, |
124 | { 2000, 1312500, 1312500, 1300000, 1287500, 1275000, 1262500, 1250000, |
125 | 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
126 | { 1900, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, |
127 | 1175000, 1162500, 1175000, 1162500, 1150000, 1137500, 1125000 }, |
128 | { 1800, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, |
129 | 1125000, 1112500, 1125000, 1112500, 1100000, 1087500, 1075000 }, |
130 | { 1700, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, |
131 | 1087500, 1075000, 1087500, 1075000, 1062500, 1050000, 1037500 }, |
132 | { 1600, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, |
133 | 1050000, 1037500, 1050000, 1037500, 1025000, 1012500, 1000000 }, |
134 | { 1500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
135 | 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, |
136 | { 1400, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, |
137 | 987500, 975000, 987500, 975000, 962500, 950000, 937500 }, |
138 | { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, |
139 | 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, |
140 | { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
141 | 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, |
142 | { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, |
143 | 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, |
144 | { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, |
145 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
146 | { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
147 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
148 | { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, |
149 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
150 | { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
151 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
152 | { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
153 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
154 | { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
155 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
156 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
157 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
158 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
159 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
160 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
161 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
162 | }, { |
163 | /* ARM bin 2 */ |
164 | { 1800, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, |
165 | 1150000, 1137500, 1150000, 1137500, 1125000, 1112500, 1100000 }, |
166 | { 1700, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, |
167 | 1112500, 1100000, 1112500, 1100000, 1087500, 1075000, 1062500 }, |
168 | { 1600, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, |
169 | 1075000, 1062500, 1075000, 1062500, 1050000, 1037500, 1025000 }, |
170 | { 1500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, |
171 | 1037500, 1025000, 1037500, 1025000, 1012500, 1000000, 987500 }, |
172 | { 1400, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
173 | 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, |
174 | { 1300, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, |
175 | 1000000, 987500, 1000000, 987500, 975000, 962500, 950000 }, |
176 | { 1200, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, |
177 | 975000, 962500, 975000, 962500, 950000, 937500, 925000 }, |
178 | { 1100, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 962500, |
179 | 950000, 937500, 950000, 937500, 925000, 912500, 900000 }, |
180 | { 1000, 1012500, 1000000, 987500, 975000, 962500, 950000, 937500, |
181 | 925000, 912500, 925000, 912500, 900000, 900000, 900000 }, |
182 | { 900, 987500, 975000, 962500, 950000, 937500, 925000, 912500, |
183 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
184 | { 800, 962500, 950000, 937500, 925000, 912500, 900000, 900000, |
185 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
186 | { 700, 937500, 925000, 912500, 900000, 900000, 900000, 900000, |
187 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
188 | { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
189 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
190 | { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
191 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
192 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
193 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
194 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
195 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
196 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
197 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
198 | } |
199 | }; |
200 | |
201 | static const u32 asv_kfc_table[][ASV_KFC_DVFS_NUM][ASV_GROUPS_NUM + 1] = { |
202 | { |
203 | /* KFC 0, 1 */ |
204 | { 1500000, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, |
205 | 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
206 | { 1400000, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, |
207 | 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, |
208 | { 1300000, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, |
209 | 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, |
210 | { 1200000, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, |
211 | 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, |
212 | { 1100000, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, |
213 | 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, |
214 | { 1000000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
215 | 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, |
216 | { 900000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, |
217 | 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, |
218 | { 800000, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
219 | 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, |
220 | { 700000, 987500, 975000, 962500, 950000, 937500, 925000, 912500, |
221 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
222 | { 600000, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
223 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
224 | { 500000, 912500, 900000, 900000, 900000, 900000, 900000, 900000, |
225 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
226 | { 400000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
227 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
228 | { 300000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
229 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
230 | { 200000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
231 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
232 | }, { |
233 | /* KFC 2 */ |
234 | { 1500, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, |
235 | 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
236 | { 1400, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, |
237 | 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, |
238 | { 1300, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, |
239 | 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, |
240 | { 1200, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, |
241 | 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, |
242 | { 1100, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, |
243 | 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, |
244 | { 1000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
245 | 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, |
246 | { 900, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, |
247 | 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, |
248 | { 800, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
249 | 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, |
250 | { 700, 987500, 975000, 962500, 950000, 937500, 925000, 912500, |
251 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
252 | { 600, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
253 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
254 | { 500, 912500, 900000, 900000, 900000, 900000, 900000, 900000, |
255 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
256 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
257 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
258 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
259 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
260 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
261 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
262 | }, { |
263 | /* KFC 3 */ |
264 | { 1500, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, |
265 | 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, |
266 | { 1400, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, |
267 | 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, |
268 | { 1300, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, |
269 | 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, |
270 | { 1200, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, |
271 | 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, |
272 | { 1100, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, |
273 | 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, |
274 | { 1000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, |
275 | 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, |
276 | { 900, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, |
277 | 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, |
278 | { 800, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, |
279 | 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, |
280 | { 700, 987500, 975000, 962500, 950000, 937500, 925000, 912500, |
281 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
282 | { 600, 950000, 937500, 925000, 912500, 900000, 900000, 900000, |
283 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
284 | { 500, 912500, 900000, 900000, 900000, 900000, 900000, 900000, |
285 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
286 | { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
287 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
288 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
289 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
290 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
291 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
292 | }, { |
293 | /* KFC bin 2 */ |
294 | { 1300, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, |
295 | 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500 }, |
296 | { 1200, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, |
297 | 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500 }, |
298 | { 1100, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, |
299 | 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000 }, |
300 | { 1000, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, |
301 | 1037500, 1025000, 1012500, 1000000, 987500, 975000, 962500 }, |
302 | { 900, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, |
303 | 1000000, 987500, 975000, 962500, 950000, 937500, 925000 }, |
304 | { 800, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, |
305 | 962500, 950000, 937500, 925000, 912500, 900000, 900000 }, |
306 | { 700, 1012500, 1000000, 987500, 975000, 962500, 950000, 937500, |
307 | 925000, 912500, 900000, 900000, 900000, 900000, 900000 }, |
308 | { 600, 975000, 962500, 950000, 937500, 925000, 912500, 900000, |
309 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
310 | { 500, 937500, 925000, 912500, 900000, 900000, 900000, 900000, |
311 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
312 | { 400, 925000, 912500, 900000, 900000, 900000, 900000, 900000, |
313 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
314 | { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
315 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
316 | { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, |
317 | 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, |
318 | } |
319 | }; |
320 | |
321 | static const struct asv_limit_entry __asv_limits[ASV_GROUPS_NUM] = { |
322 | { 13, 55 }, |
323 | { 21, 65 }, |
324 | { 25, 69 }, |
325 | { 30, 72 }, |
326 | { 36, 74 }, |
327 | { 43, 76 }, |
328 | { 51, 78 }, |
329 | { 65, 80 }, |
330 | { 81, 82 }, |
331 | { 98, 84 }, |
332 | { 119, 87 }, |
333 | { 135, 89 }, |
334 | { 150, 92 }, |
335 | { 999, 999 }, |
336 | }; |
337 | |
338 | static int exynos5422_asv_get_group(struct exynos_asv *asv) |
339 | { |
340 | unsigned int pkgid_reg, auxi_reg; |
341 | int hpm, ids, i; |
342 | |
343 | regmap_read(map: asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, val: &pkgid_reg); |
344 | regmap_read(map: asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, val: &auxi_reg); |
345 | |
346 | if (asv->use_sg) { |
347 | u32 sga = (pkgid_reg >> EXYNOS5422_SG_A_OFFSET) & |
348 | EXYNOS5422_SG_A_MASK; |
349 | |
350 | u32 sgb = (pkgid_reg >> EXYNOS5422_SG_B_OFFSET) & |
351 | EXYNOS5422_SG_B_MASK; |
352 | |
353 | if ((pkgid_reg >> EXYNOS5422_SG_BSIGN_OFFSET) & |
354 | EXYNOS5422_SG_BSIGN_MASK) |
355 | return sga + sgb; |
356 | else |
357 | return sga - sgb; |
358 | } |
359 | |
360 | hpm = (auxi_reg >> EXYNOS5422_TMCB_OFFSET) & EXYNOS5422_TMCB_MASK; |
361 | ids = (pkgid_reg >> EXYNOS5422_IDS_OFFSET) & EXYNOS5422_IDS_MASK; |
362 | |
363 | for (i = 0; i < ASV_GROUPS_NUM; i++) { |
364 | if (ids <= __asv_limits[i].ids) |
365 | break; |
366 | if (hpm <= __asv_limits[i].hpm) |
367 | break; |
368 | } |
369 | if (i < ASV_GROUPS_NUM) |
370 | return i; |
371 | |
372 | return 0; |
373 | } |
374 | |
375 | static int __asv_offset_voltage(unsigned int index) |
376 | { |
377 | switch (index) { |
378 | case 1: |
379 | return 12500; |
380 | case 2: |
381 | return 50000; |
382 | case 3: |
383 | return 25000; |
384 | default: |
385 | return 0; |
386 | } |
387 | } |
388 | |
389 | static void exynos5422_asv_offset_voltage_setup(struct exynos_asv *asv) |
390 | { |
391 | struct exynos_asv_subsys *subsys; |
392 | unsigned int reg, value; |
393 | |
394 | regmap_read(map: asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, val: ®); |
395 | |
396 | /* ARM offset voltage setup */ |
397 | subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_ARM]; |
398 | |
399 | subsys->base_volt = 1000000; |
400 | |
401 | value = (reg >> EXYNOS5422_ARM_UP_OFFSET) & EXYNOS5422_ARM_UP_MASK; |
402 | subsys->offset_volt_h = __asv_offset_voltage(index: value); |
403 | |
404 | value = (reg >> EXYNOS5422_ARM_DN_OFFSET) & EXYNOS5422_ARM_DN_MASK; |
405 | subsys->offset_volt_l = __asv_offset_voltage(index: value); |
406 | |
407 | /* KFC offset voltage setup */ |
408 | subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_KFC]; |
409 | |
410 | subsys->base_volt = 1000000; |
411 | |
412 | value = (reg >> EXYNOS5422_KFC_UP_OFFSET) & EXYNOS5422_KFC_UP_MASK; |
413 | subsys->offset_volt_h = __asv_offset_voltage(index: value); |
414 | |
415 | value = (reg >> EXYNOS5422_KFC_DN_OFFSET) & EXYNOS5422_KFC_DN_MASK; |
416 | subsys->offset_volt_l = __asv_offset_voltage(index: value); |
417 | } |
418 | |
419 | static int exynos5422_asv_opp_get_voltage(const struct exynos_asv_subsys *subsys, |
420 | int level, unsigned int volt) |
421 | { |
422 | unsigned int asv_volt; |
423 | |
424 | if (level >= subsys->table.num_rows) |
425 | return volt; |
426 | |
427 | asv_volt = exynos_asv_opp_get_voltage(subsys, level, |
428 | group: subsys->asv->group); |
429 | |
430 | if (volt > subsys->base_volt) |
431 | asv_volt += subsys->offset_volt_h; |
432 | else |
433 | asv_volt += subsys->offset_volt_l; |
434 | |
435 | return asv_volt; |
436 | } |
437 | |
438 | static unsigned int exynos5422_asv_parse_table(unsigned int pkg_id) |
439 | { |
440 | return (pkg_id >> EXYNOS5422_TABLE_OFFSET) & EXYNOS5422_TABLE_MASK; |
441 | } |
442 | |
443 | static bool exynos5422_asv_parse_bin2(unsigned int pkg_id) |
444 | { |
445 | return (pkg_id >> EXYNOS5422_BIN2_OFFSET) & EXYNOS5422_BIN2_MASK; |
446 | } |
447 | |
448 | static bool exynos5422_asv_parse_sg(unsigned int pkg_id) |
449 | { |
450 | return (pkg_id >> EXYNOS5422_USESG_OFFSET) & EXYNOS5422_USESG_MASK; |
451 | } |
452 | |
453 | int exynos5422_asv_init(struct exynos_asv *asv) |
454 | { |
455 | struct exynos_asv_subsys *subsys; |
456 | unsigned int table_index; |
457 | unsigned int pkg_id; |
458 | bool bin2; |
459 | |
460 | regmap_read(map: asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, val: &pkg_id); |
461 | |
462 | if (asv->of_bin == 2) { |
463 | bin2 = true; |
464 | asv->use_sg = false; |
465 | } else { |
466 | asv->use_sg = exynos5422_asv_parse_sg(pkg_id); |
467 | bin2 = exynos5422_asv_parse_bin2(pkg_id); |
468 | } |
469 | |
470 | asv->group = exynos5422_asv_get_group(asv); |
471 | asv->table = exynos5422_asv_parse_table(pkg_id); |
472 | |
473 | exynos5422_asv_offset_voltage_setup(asv); |
474 | |
475 | if (bin2) { |
476 | table_index = 3; |
477 | } else { |
478 | if (asv->table == 2 || asv->table == 3) |
479 | table_index = asv->table - 1; |
480 | else |
481 | table_index = 0; |
482 | } |
483 | |
484 | subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_ARM]; |
485 | subsys->cpu_dt_compat = "arm,cortex-a15" ; |
486 | if (bin2) |
487 | subsys->table.num_rows = ASV_ARM_BIN2_DVFS_NUM; |
488 | else |
489 | subsys->table.num_rows = ASV_ARM_DVFS_NUM; |
490 | subsys->table.num_cols = ASV_GROUPS_NUM + 1; |
491 | subsys->table.buf = (u32 *)asv_arm_table[table_index]; |
492 | |
493 | subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_KFC]; |
494 | subsys->cpu_dt_compat = "arm,cortex-a7" ; |
495 | if (bin2) |
496 | subsys->table.num_rows = ASV_KFC_BIN2_DVFS_NUM; |
497 | else |
498 | subsys->table.num_rows = ASV_KFC_DVFS_NUM; |
499 | subsys->table.num_cols = ASV_GROUPS_NUM + 1; |
500 | subsys->table.buf = (u32 *)asv_kfc_table[table_index]; |
501 | |
502 | asv->opp_get_voltage = exynos5422_asv_opp_get_voltage; |
503 | |
504 | return 0; |
505 | } |
506 | EXPORT_SYMBOL_GPL(exynos5422_asv_init); |
507 | |