162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2019 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci * http://www.samsung.com/ 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Samsung Exynos 5422 SoC Adaptive Supply Voltage support 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/bitrev.h> 1062306a36Sopenharmony_ci#include <linux/errno.h> 1162306a36Sopenharmony_ci#include <linux/regmap.h> 1262306a36Sopenharmony_ci#include <linux/soc/samsung/exynos-chipid.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "exynos-asv.h" 1662306a36Sopenharmony_ci#include "exynos5422-asv.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define ASV_GROUPS_NUM 14 1962306a36Sopenharmony_ci#define ASV_ARM_DVFS_NUM 20 2062306a36Sopenharmony_ci#define ASV_ARM_BIN2_DVFS_NUM 17 2162306a36Sopenharmony_ci#define ASV_KFC_DVFS_NUM 14 2262306a36Sopenharmony_ci#define ASV_KFC_BIN2_DVFS_NUM 12 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* 2562306a36Sopenharmony_ci * This array is a set of 4 ASV data tables, first column of each ASV table 2662306a36Sopenharmony_ci * contains frequency value in MHz and subsequent columns contain the CPU 2762306a36Sopenharmony_ci * cluster's supply voltage values in uV. 2862306a36Sopenharmony_ci * In order to create a set of OPPs for specific SoC revision one of the voltage 2962306a36Sopenharmony_ci * columns (1...14) from one of the tables (0...3) is selected during 3062306a36Sopenharmony_ci * initialization. There are separate ASV tables for the big (ARM) and little 3162306a36Sopenharmony_ci * (KFC) CPU cluster. Only OPPs which are already defined in devicetree 3262306a36Sopenharmony_ci * will be updated. 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic const u32 asv_arm_table[][ASV_ARM_DVFS_NUM][ASV_GROUPS_NUM + 1] = { 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci /* ARM 0, 1 */ 3862306a36Sopenharmony_ci { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, 3962306a36Sopenharmony_ci 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, 4062306a36Sopenharmony_ci { 2000, 1312500, 1312500, 1300000, 1287500, 1275000, 1262500, 1250000, 4162306a36Sopenharmony_ci 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 4262306a36Sopenharmony_ci { 1900, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, 4362306a36Sopenharmony_ci 1162500, 1150000, 1162500, 1150000, 1137500, 1125000, 1112500 }, 4462306a36Sopenharmony_ci { 1800, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 4562306a36Sopenharmony_ci 1112500, 1100000, 1112500, 1100000, 1087500, 1075000, 1062500 }, 4662306a36Sopenharmony_ci { 1700, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, 4762306a36Sopenharmony_ci 1075000, 1062500, 1075000, 1062500, 1050000, 1037500, 1025000 }, 4862306a36Sopenharmony_ci { 1600, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, 4962306a36Sopenharmony_ci 1037500, 1025000, 1037500, 1025000, 1012500, 1000000, 987500 }, 5062306a36Sopenharmony_ci { 1500, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 5162306a36Sopenharmony_ci 1000000, 987500, 1000000, 987500, 975000, 962500, 950000 }, 5262306a36Sopenharmony_ci { 1400, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 5362306a36Sopenharmony_ci 975000, 962500, 975000, 962500, 950000, 937500, 925000 }, 5462306a36Sopenharmony_ci { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 5562306a36Sopenharmony_ci 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, 5662306a36Sopenharmony_ci { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 5762306a36Sopenharmony_ci 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, 5862306a36Sopenharmony_ci { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, 5962306a36Sopenharmony_ci 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, 6062306a36Sopenharmony_ci { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, 6162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 6262306a36Sopenharmony_ci { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 6362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 6462306a36Sopenharmony_ci { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, 6562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 6662306a36Sopenharmony_ci { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 6762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 6862306a36Sopenharmony_ci { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 6962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 7062306a36Sopenharmony_ci { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 7162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 7262306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 7362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 7462306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 7562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 7662306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 7762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 7862306a36Sopenharmony_ci}, { 7962306a36Sopenharmony_ci /* ARM 2 */ 8062306a36Sopenharmony_ci { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, 8162306a36Sopenharmony_ci 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, 8262306a36Sopenharmony_ci { 2000, 1312500, 1312500, 1312500, 1300000, 1275000, 1262500, 1250000, 8362306a36Sopenharmony_ci 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 8462306a36Sopenharmony_ci { 1900, 1262500, 1250000, 1250000, 1237500, 1212500, 1200000, 1187500, 8562306a36Sopenharmony_ci 1175000, 1162500, 1175000, 1162500, 1150000, 1137500, 1125000 }, 8662306a36Sopenharmony_ci { 1800, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 8762306a36Sopenharmony_ci 1125000, 1112500, 1125000, 1112500, 1100000, 1087500, 1075000 }, 8862306a36Sopenharmony_ci { 1700, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 8962306a36Sopenharmony_ci 1087500, 1075000, 1087500, 1075000, 1062500, 1050000, 1037500 }, 9062306a36Sopenharmony_ci { 1600, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 9162306a36Sopenharmony_ci 1050000, 1037500, 1050000, 1037500, 1025000, 1012500, 1000000 }, 9262306a36Sopenharmony_ci { 1500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 9362306a36Sopenharmony_ci 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, 9462306a36Sopenharmony_ci { 1400, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 9562306a36Sopenharmony_ci 987500, 975000, 987500, 975000, 962500, 950000, 937500 }, 9662306a36Sopenharmony_ci { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 9762306a36Sopenharmony_ci 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, 9862306a36Sopenharmony_ci { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 9962306a36Sopenharmony_ci 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, 10062306a36Sopenharmony_ci { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, 10162306a36Sopenharmony_ci 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, 10262306a36Sopenharmony_ci { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, 10362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 10462306a36Sopenharmony_ci { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 10562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 10662306a36Sopenharmony_ci { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, 10762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 10862306a36Sopenharmony_ci { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 10962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 11062306a36Sopenharmony_ci { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 11162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 11262306a36Sopenharmony_ci { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 11362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 11462306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 11562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 11662306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 11762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 11862306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 11962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 12062306a36Sopenharmony_ci}, { 12162306a36Sopenharmony_ci /* ARM 3 */ 12262306a36Sopenharmony_ci { 2100, 1362500, 1362500, 1350000, 1337500, 1325000, 1312500, 1300000, 12362306a36Sopenharmony_ci 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000 }, 12462306a36Sopenharmony_ci { 2000, 1312500, 1312500, 1300000, 1287500, 1275000, 1262500, 1250000, 12562306a36Sopenharmony_ci 1237500, 1225000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 12662306a36Sopenharmony_ci { 1900, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, 12762306a36Sopenharmony_ci 1175000, 1162500, 1175000, 1162500, 1150000, 1137500, 1125000 }, 12862306a36Sopenharmony_ci { 1800, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 12962306a36Sopenharmony_ci 1125000, 1112500, 1125000, 1112500, 1100000, 1087500, 1075000 }, 13062306a36Sopenharmony_ci { 1700, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 13162306a36Sopenharmony_ci 1087500, 1075000, 1087500, 1075000, 1062500, 1050000, 1037500 }, 13262306a36Sopenharmony_ci { 1600, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 13362306a36Sopenharmony_ci 1050000, 1037500, 1050000, 1037500, 1025000, 1012500, 1000000 }, 13462306a36Sopenharmony_ci { 1500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 13562306a36Sopenharmony_ci 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, 13662306a36Sopenharmony_ci { 1400, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 13762306a36Sopenharmony_ci 987500, 975000, 987500, 975000, 962500, 950000, 937500 }, 13862306a36Sopenharmony_ci { 1300, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 13962306a36Sopenharmony_ci 962500, 950000, 962500, 950000, 937500, 925000, 912500 }, 14062306a36Sopenharmony_ci { 1200, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 14162306a36Sopenharmony_ci 937500, 925000, 937500, 925000, 912500, 900000, 900000 }, 14262306a36Sopenharmony_ci { 1100, 1000000, 987500, 975000, 962500, 950000, 937500, 925000, 14362306a36Sopenharmony_ci 912500, 900000, 900000, 900000, 900000, 900000, 900000 }, 14462306a36Sopenharmony_ci { 1000, 975000, 962500, 950000, 937500, 925000, 912500, 900000, 14562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 14662306a36Sopenharmony_ci { 900, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 14762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 14862306a36Sopenharmony_ci { 800, 925000, 912500, 900000, 900000, 900000, 900000, 900000, 14962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 15062306a36Sopenharmony_ci { 700, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 15162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 15262306a36Sopenharmony_ci { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 15362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 15462306a36Sopenharmony_ci { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 15562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 15662306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 15762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 15862306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 15962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 16062306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 16162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 16262306a36Sopenharmony_ci}, { 16362306a36Sopenharmony_ci /* ARM bin 2 */ 16462306a36Sopenharmony_ci { 1800, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 16562306a36Sopenharmony_ci 1150000, 1137500, 1150000, 1137500, 1125000, 1112500, 1100000 }, 16662306a36Sopenharmony_ci { 1700, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 16762306a36Sopenharmony_ci 1112500, 1100000, 1112500, 1100000, 1087500, 1075000, 1062500 }, 16862306a36Sopenharmony_ci { 1600, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, 16962306a36Sopenharmony_ci 1075000, 1062500, 1075000, 1062500, 1050000, 1037500, 1025000 }, 17062306a36Sopenharmony_ci { 1500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, 17162306a36Sopenharmony_ci 1037500, 1025000, 1037500, 1025000, 1012500, 1000000, 987500 }, 17262306a36Sopenharmony_ci { 1400, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 17362306a36Sopenharmony_ci 1012500, 1000000, 1012500, 1000000, 987500, 975000, 962500 }, 17462306a36Sopenharmony_ci { 1300, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 17562306a36Sopenharmony_ci 1000000, 987500, 1000000, 987500, 975000, 962500, 950000 }, 17662306a36Sopenharmony_ci { 1200, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 17762306a36Sopenharmony_ci 975000, 962500, 975000, 962500, 950000, 937500, 925000 }, 17862306a36Sopenharmony_ci { 1100, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 962500, 17962306a36Sopenharmony_ci 950000, 937500, 950000, 937500, 925000, 912500, 900000 }, 18062306a36Sopenharmony_ci { 1000, 1012500, 1000000, 987500, 975000, 962500, 950000, 937500, 18162306a36Sopenharmony_ci 925000, 912500, 925000, 912500, 900000, 900000, 900000 }, 18262306a36Sopenharmony_ci { 900, 987500, 975000, 962500, 950000, 937500, 925000, 912500, 18362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 18462306a36Sopenharmony_ci { 800, 962500, 950000, 937500, 925000, 912500, 900000, 900000, 18562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 18662306a36Sopenharmony_ci { 700, 937500, 925000, 912500, 900000, 900000, 900000, 900000, 18762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 18862306a36Sopenharmony_ci { 600, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 18962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 19062306a36Sopenharmony_ci { 500, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 19162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 19262306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 19362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 19462306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 19562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 19662306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 19762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic const u32 asv_kfc_table[][ASV_KFC_DVFS_NUM][ASV_GROUPS_NUM + 1] = { 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci /* KFC 0, 1 */ 20462306a36Sopenharmony_ci { 1500000, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, 20562306a36Sopenharmony_ci 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 20662306a36Sopenharmony_ci { 1400000, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 20762306a36Sopenharmony_ci 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, 20862306a36Sopenharmony_ci { 1300000, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 20962306a36Sopenharmony_ci 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, 21062306a36Sopenharmony_ci { 1200000, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 21162306a36Sopenharmony_ci 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, 21262306a36Sopenharmony_ci { 1100000, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 21362306a36Sopenharmony_ci 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, 21462306a36Sopenharmony_ci { 1000000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 21562306a36Sopenharmony_ci 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, 21662306a36Sopenharmony_ci { 900000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 21762306a36Sopenharmony_ci 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, 21862306a36Sopenharmony_ci { 800000, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 21962306a36Sopenharmony_ci 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, 22062306a36Sopenharmony_ci { 700000, 987500, 975000, 962500, 950000, 937500, 925000, 912500, 22162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 22262306a36Sopenharmony_ci { 600000, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 22362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 22462306a36Sopenharmony_ci { 500000, 912500, 900000, 900000, 900000, 900000, 900000, 900000, 22562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 22662306a36Sopenharmony_ci { 400000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 22762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 22862306a36Sopenharmony_ci { 300000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 22962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 23062306a36Sopenharmony_ci { 200000, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 23162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 23262306a36Sopenharmony_ci}, { 23362306a36Sopenharmony_ci /* KFC 2 */ 23462306a36Sopenharmony_ci { 1500, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, 23562306a36Sopenharmony_ci 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 23662306a36Sopenharmony_ci { 1400, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 23762306a36Sopenharmony_ci 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, 23862306a36Sopenharmony_ci { 1300, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 23962306a36Sopenharmony_ci 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, 24062306a36Sopenharmony_ci { 1200, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 24162306a36Sopenharmony_ci 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, 24262306a36Sopenharmony_ci { 1100, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 24362306a36Sopenharmony_ci 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, 24462306a36Sopenharmony_ci { 1000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 24562306a36Sopenharmony_ci 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, 24662306a36Sopenharmony_ci { 900, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 24762306a36Sopenharmony_ci 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, 24862306a36Sopenharmony_ci { 800, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 24962306a36Sopenharmony_ci 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, 25062306a36Sopenharmony_ci { 700, 987500, 975000, 962500, 950000, 937500, 925000, 912500, 25162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 25262306a36Sopenharmony_ci { 600, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 25362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 25462306a36Sopenharmony_ci { 500, 912500, 900000, 900000, 900000, 900000, 900000, 900000, 25562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 25662306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 25762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 25862306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 25962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 26062306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 26162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 26262306a36Sopenharmony_ci}, { 26362306a36Sopenharmony_ci /* KFC 3 */ 26462306a36Sopenharmony_ci { 1500, 1300000, 1300000, 1300000, 1287500, 1287500, 1287500, 1275000, 26562306a36Sopenharmony_ci 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500 }, 26662306a36Sopenharmony_ci { 1400, 1275000, 1262500, 1250000, 1237500, 1225000, 1212500, 1200000, 26762306a36Sopenharmony_ci 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500 }, 26862306a36Sopenharmony_ci { 1300, 1225000, 1212500, 1200000, 1187500, 1175000, 1162500, 1150000, 26962306a36Sopenharmony_ci 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500 }, 27062306a36Sopenharmony_ci { 1200, 1175000, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 27162306a36Sopenharmony_ci 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500 }, 27262306a36Sopenharmony_ci { 1100, 1137500, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 27362306a36Sopenharmony_ci 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000 }, 27462306a36Sopenharmony_ci { 1000, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 27562306a36Sopenharmony_ci 1012500, 1000000, 987500, 975000, 962500, 950000, 937500 }, 27662306a36Sopenharmony_ci { 900, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 27762306a36Sopenharmony_ci 975000, 962500, 950000, 937500, 925000, 912500, 900000 }, 27862306a36Sopenharmony_ci { 800, 1025000, 1012500, 1000000, 987500, 975000, 962500, 950000, 27962306a36Sopenharmony_ci 937500, 925000, 912500, 900000, 900000, 900000, 900000 }, 28062306a36Sopenharmony_ci { 700, 987500, 975000, 962500, 950000, 937500, 925000, 912500, 28162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 28262306a36Sopenharmony_ci { 600, 950000, 937500, 925000, 912500, 900000, 900000, 900000, 28362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 28462306a36Sopenharmony_ci { 500, 912500, 900000, 900000, 900000, 900000, 900000, 900000, 28562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 28662306a36Sopenharmony_ci { 400, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 28762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 28862306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 28962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 29062306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 29162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 29262306a36Sopenharmony_ci}, { 29362306a36Sopenharmony_ci /* KFC bin 2 */ 29462306a36Sopenharmony_ci { 1300, 1250000, 1237500, 1225000, 1212500, 1200000, 1187500, 1175000, 29562306a36Sopenharmony_ci 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500 }, 29662306a36Sopenharmony_ci { 1200, 1200000, 1187500, 1175000, 1162500, 1150000, 1137500, 1125000, 29762306a36Sopenharmony_ci 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, 1037500 }, 29862306a36Sopenharmony_ci { 1100, 1162500, 1150000, 1137500, 1125000, 1112500, 1100000, 1087500, 29962306a36Sopenharmony_ci 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 1000000 }, 30062306a36Sopenharmony_ci { 1000, 1125000, 1112500, 1100000, 1087500, 1075000, 1062500, 1050000, 30162306a36Sopenharmony_ci 1037500, 1025000, 1012500, 1000000, 987500, 975000, 962500 }, 30262306a36Sopenharmony_ci { 900, 1087500, 1075000, 1062500, 1050000, 1037500, 1025000, 1012500, 30362306a36Sopenharmony_ci 1000000, 987500, 975000, 962500, 950000, 937500, 925000 }, 30462306a36Sopenharmony_ci { 800, 1050000, 1037500, 1025000, 1012500, 1000000, 987500, 975000, 30562306a36Sopenharmony_ci 962500, 950000, 937500, 925000, 912500, 900000, 900000 }, 30662306a36Sopenharmony_ci { 700, 1012500, 1000000, 987500, 975000, 962500, 950000, 937500, 30762306a36Sopenharmony_ci 925000, 912500, 900000, 900000, 900000, 900000, 900000 }, 30862306a36Sopenharmony_ci { 600, 975000, 962500, 950000, 937500, 925000, 912500, 900000, 30962306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 31062306a36Sopenharmony_ci { 500, 937500, 925000, 912500, 900000, 900000, 900000, 900000, 31162306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 31262306a36Sopenharmony_ci { 400, 925000, 912500, 900000, 900000, 900000, 900000, 900000, 31362306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 31462306a36Sopenharmony_ci { 300, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 31562306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 31662306a36Sopenharmony_ci { 200, 900000, 900000, 900000, 900000, 900000, 900000, 900000, 31762306a36Sopenharmony_ci 900000, 900000, 900000, 900000, 900000, 900000, 900000 }, 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic const struct asv_limit_entry __asv_limits[ASV_GROUPS_NUM] = { 32262306a36Sopenharmony_ci { 13, 55 }, 32362306a36Sopenharmony_ci { 21, 65 }, 32462306a36Sopenharmony_ci { 25, 69 }, 32562306a36Sopenharmony_ci { 30, 72 }, 32662306a36Sopenharmony_ci { 36, 74 }, 32762306a36Sopenharmony_ci { 43, 76 }, 32862306a36Sopenharmony_ci { 51, 78 }, 32962306a36Sopenharmony_ci { 65, 80 }, 33062306a36Sopenharmony_ci { 81, 82 }, 33162306a36Sopenharmony_ci { 98, 84 }, 33262306a36Sopenharmony_ci { 119, 87 }, 33362306a36Sopenharmony_ci { 135, 89 }, 33462306a36Sopenharmony_ci { 150, 92 }, 33562306a36Sopenharmony_ci { 999, 999 }, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic int exynos5422_asv_get_group(struct exynos_asv *asv) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci unsigned int pkgid_reg, auxi_reg; 34162306a36Sopenharmony_ci int hpm, ids, i; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci regmap_read(asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, &pkgid_reg); 34462306a36Sopenharmony_ci regmap_read(asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, &auxi_reg); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci if (asv->use_sg) { 34762306a36Sopenharmony_ci u32 sga = (pkgid_reg >> EXYNOS5422_SG_A_OFFSET) & 34862306a36Sopenharmony_ci EXYNOS5422_SG_A_MASK; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci u32 sgb = (pkgid_reg >> EXYNOS5422_SG_B_OFFSET) & 35162306a36Sopenharmony_ci EXYNOS5422_SG_B_MASK; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci if ((pkgid_reg >> EXYNOS5422_SG_BSIGN_OFFSET) & 35462306a36Sopenharmony_ci EXYNOS5422_SG_BSIGN_MASK) 35562306a36Sopenharmony_ci return sga + sgb; 35662306a36Sopenharmony_ci else 35762306a36Sopenharmony_ci return sga - sgb; 35862306a36Sopenharmony_ci } 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci hpm = (auxi_reg >> EXYNOS5422_TMCB_OFFSET) & EXYNOS5422_TMCB_MASK; 36162306a36Sopenharmony_ci ids = (pkgid_reg >> EXYNOS5422_IDS_OFFSET) & EXYNOS5422_IDS_MASK; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci for (i = 0; i < ASV_GROUPS_NUM; i++) { 36462306a36Sopenharmony_ci if (ids <= __asv_limits[i].ids) 36562306a36Sopenharmony_ci break; 36662306a36Sopenharmony_ci if (hpm <= __asv_limits[i].hpm) 36762306a36Sopenharmony_ci break; 36862306a36Sopenharmony_ci } 36962306a36Sopenharmony_ci if (i < ASV_GROUPS_NUM) 37062306a36Sopenharmony_ci return i; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci return 0; 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic int __asv_offset_voltage(unsigned int index) 37662306a36Sopenharmony_ci{ 37762306a36Sopenharmony_ci switch (index) { 37862306a36Sopenharmony_ci case 1: 37962306a36Sopenharmony_ci return 12500; 38062306a36Sopenharmony_ci case 2: 38162306a36Sopenharmony_ci return 50000; 38262306a36Sopenharmony_ci case 3: 38362306a36Sopenharmony_ci return 25000; 38462306a36Sopenharmony_ci default: 38562306a36Sopenharmony_ci return 0; 38662306a36Sopenharmony_ci } 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic void exynos5422_asv_offset_voltage_setup(struct exynos_asv *asv) 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci struct exynos_asv_subsys *subsys; 39262306a36Sopenharmony_ci unsigned int reg, value; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci regmap_read(asv->chipid_regmap, EXYNOS_CHIPID_REG_AUX_INFO, ®); 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci /* ARM offset voltage setup */ 39762306a36Sopenharmony_ci subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_ARM]; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci subsys->base_volt = 1000000; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci value = (reg >> EXYNOS5422_ARM_UP_OFFSET) & EXYNOS5422_ARM_UP_MASK; 40262306a36Sopenharmony_ci subsys->offset_volt_h = __asv_offset_voltage(value); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci value = (reg >> EXYNOS5422_ARM_DN_OFFSET) & EXYNOS5422_ARM_DN_MASK; 40562306a36Sopenharmony_ci subsys->offset_volt_l = __asv_offset_voltage(value); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci /* KFC offset voltage setup */ 40862306a36Sopenharmony_ci subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_KFC]; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci subsys->base_volt = 1000000; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci value = (reg >> EXYNOS5422_KFC_UP_OFFSET) & EXYNOS5422_KFC_UP_MASK; 41362306a36Sopenharmony_ci subsys->offset_volt_h = __asv_offset_voltage(value); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci value = (reg >> EXYNOS5422_KFC_DN_OFFSET) & EXYNOS5422_KFC_DN_MASK; 41662306a36Sopenharmony_ci subsys->offset_volt_l = __asv_offset_voltage(value); 41762306a36Sopenharmony_ci} 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistatic int exynos5422_asv_opp_get_voltage(const struct exynos_asv_subsys *subsys, 42062306a36Sopenharmony_ci int level, unsigned int volt) 42162306a36Sopenharmony_ci{ 42262306a36Sopenharmony_ci unsigned int asv_volt; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci if (level >= subsys->table.num_rows) 42562306a36Sopenharmony_ci return volt; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci asv_volt = exynos_asv_opp_get_voltage(subsys, level, 42862306a36Sopenharmony_ci subsys->asv->group); 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci if (volt > subsys->base_volt) 43162306a36Sopenharmony_ci asv_volt += subsys->offset_volt_h; 43262306a36Sopenharmony_ci else 43362306a36Sopenharmony_ci asv_volt += subsys->offset_volt_l; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci return asv_volt; 43662306a36Sopenharmony_ci} 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic unsigned int exynos5422_asv_parse_table(unsigned int pkg_id) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci return (pkg_id >> EXYNOS5422_TABLE_OFFSET) & EXYNOS5422_TABLE_MASK; 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic bool exynos5422_asv_parse_bin2(unsigned int pkg_id) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci return (pkg_id >> EXYNOS5422_BIN2_OFFSET) & EXYNOS5422_BIN2_MASK; 44662306a36Sopenharmony_ci} 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cistatic bool exynos5422_asv_parse_sg(unsigned int pkg_id) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci return (pkg_id >> EXYNOS5422_USESG_OFFSET) & EXYNOS5422_USESG_MASK; 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ciint exynos5422_asv_init(struct exynos_asv *asv) 45462306a36Sopenharmony_ci{ 45562306a36Sopenharmony_ci struct exynos_asv_subsys *subsys; 45662306a36Sopenharmony_ci unsigned int table_index; 45762306a36Sopenharmony_ci unsigned int pkg_id; 45862306a36Sopenharmony_ci bool bin2; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci regmap_read(asv->chipid_regmap, EXYNOS_CHIPID_REG_PKG_ID, &pkg_id); 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci if (asv->of_bin == 2) { 46362306a36Sopenharmony_ci bin2 = true; 46462306a36Sopenharmony_ci asv->use_sg = false; 46562306a36Sopenharmony_ci } else { 46662306a36Sopenharmony_ci asv->use_sg = exynos5422_asv_parse_sg(pkg_id); 46762306a36Sopenharmony_ci bin2 = exynos5422_asv_parse_bin2(pkg_id); 46862306a36Sopenharmony_ci } 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci asv->group = exynos5422_asv_get_group(asv); 47162306a36Sopenharmony_ci asv->table = exynos5422_asv_parse_table(pkg_id); 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci exynos5422_asv_offset_voltage_setup(asv); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci if (bin2) { 47662306a36Sopenharmony_ci table_index = 3; 47762306a36Sopenharmony_ci } else { 47862306a36Sopenharmony_ci if (asv->table == 2 || asv->table == 3) 47962306a36Sopenharmony_ci table_index = asv->table - 1; 48062306a36Sopenharmony_ci else 48162306a36Sopenharmony_ci table_index = 0; 48262306a36Sopenharmony_ci } 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_ARM]; 48562306a36Sopenharmony_ci subsys->cpu_dt_compat = "arm,cortex-a15"; 48662306a36Sopenharmony_ci if (bin2) 48762306a36Sopenharmony_ci subsys->table.num_rows = ASV_ARM_BIN2_DVFS_NUM; 48862306a36Sopenharmony_ci else 48962306a36Sopenharmony_ci subsys->table.num_rows = ASV_ARM_DVFS_NUM; 49062306a36Sopenharmony_ci subsys->table.num_cols = ASV_GROUPS_NUM + 1; 49162306a36Sopenharmony_ci subsys->table.buf = (u32 *)asv_arm_table[table_index]; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci subsys = &asv->subsys[EXYNOS_ASV_SUBSYS_ID_KFC]; 49462306a36Sopenharmony_ci subsys->cpu_dt_compat = "arm,cortex-a7"; 49562306a36Sopenharmony_ci if (bin2) 49662306a36Sopenharmony_ci subsys->table.num_rows = ASV_KFC_BIN2_DVFS_NUM; 49762306a36Sopenharmony_ci else 49862306a36Sopenharmony_ci subsys->table.num_rows = ASV_KFC_DVFS_NUM; 49962306a36Sopenharmony_ci subsys->table.num_cols = ASV_GROUPS_NUM + 1; 50062306a36Sopenharmony_ci subsys->table.buf = (u32 *)asv_kfc_table[table_index]; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci asv->opp_get_voltage = exynos5422_asv_opp_get_voltage; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci return 0; 50562306a36Sopenharmony_ci} 50662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(exynos5422_asv_init); 507