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
exynos5422_asv_get_group(struct exynos_asv * asv)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(asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, &pkgid_reg);
344 regmap_read(asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, &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
__asv_offset_voltage(unsigned int index)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
exynos5422_asv_offset_voltage_setup(struct exynos_asv * asv)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(asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, ®);
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(value);
403
404 value = (reg >> EXYNOS5422_ARM_DN_OFFSET) & EXYNOS5422_ARM_DN_MASK;
405 subsys->offset_volt_l = __asv_offset_voltage(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(value);
414
415 value = (reg >> EXYNOS5422_KFC_DN_OFFSET) & EXYNOS5422_KFC_DN_MASK;
416 subsys->offset_volt_l = __asv_offset_voltage(value);
417 }
418
exynos5422_asv_opp_get_voltage(const struct exynos_asv_subsys * subsys,int level,unsigned int volt)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 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
exynos5422_asv_parse_table(unsigned int pkg_id)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
exynos5422_asv_parse_bin2(unsigned int pkg_id)443 static bool exynos5422_asv_parse_bin2(unsigned int pkg_id)
444 {
445 return (pkg_id >> EXYNOS5422_BIN2_OFFSET) & EXYNOS5422_BIN2_MASK;
446 }
447
exynos5422_asv_parse_sg(unsigned int pkg_id)448 static bool exynos5422_asv_parse_sg(unsigned int pkg_id)
449 {
450 return (pkg_id >> EXYNOS5422_USESG_OFFSET) & EXYNOS5422_USESG_MASK;
451 }
452
exynos5422_asv_init(struct exynos_asv * asv)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(asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, &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