507 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2019 Samsung Electronics Co., Ltd.4 * http://www.samsung.com/5 *6 * Samsung Exynos 5422 SoC Adaptive Supply Voltage support7 */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 1419#define ASV_ARM_DVFS_NUM 2020#define ASV_ARM_BIN2_DVFS_NUM 1721#define ASV_KFC_DVFS_NUM 1422#define ASV_KFC_BIN2_DVFS_NUM 1223 24/*25 * This array is a set of 4 ASV data tables, first column of each ASV table26 * contains frequency value in MHz and subsequent columns contain the CPU27 * cluster's supply voltage values in uV.28 * In order to create a set of OPPs for specific SoC revision one of the voltage29 * columns (1...14) from one of the tables (0...3) is selected during30 * initialization. There are separate ASV tables for the big (ARM) and little31 * (KFC) CPU cluster. Only OPPs which are already defined in devicetree32 * will be updated.33 */34 35static 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 201static 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 321static 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 338static 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 else357 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 375static 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 389static 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 419static 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 else433 asv_volt += subsys->offset_volt_l;434 435 return asv_volt;436}437 438static unsigned int exynos5422_asv_parse_table(unsigned int pkg_id)439{440 return (pkg_id >> EXYNOS5422_TABLE_OFFSET) & EXYNOS5422_TABLE_MASK;441}442 443static bool exynos5422_asv_parse_bin2(unsigned int pkg_id)444{445 return (pkg_id >> EXYNOS5422_BIN2_OFFSET) & EXYNOS5422_BIN2_MASK;446}447 448static bool exynos5422_asv_parse_sg(unsigned int pkg_id)449{450 return (pkg_id >> EXYNOS5422_USESG_OFFSET) & EXYNOS5422_USESG_MASK;451}452 453int 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 else481 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 else489 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 else498 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}506EXPORT_SYMBOL_GPL(exynos5422_asv_init);507