linux/drivers/soc/samsung/exynos5422-asv.c
<<
>>
Prefs
   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
  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                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
 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, &reg);
 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        else
 433                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                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