^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/math64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/log2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/units.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "qcom-vadc-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* Voltage to temperature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) static const struct vadc_map_pt adcmap_100k_104ef_104fb[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) {1758, -40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) {1742, -35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {1719, -30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {1691, -25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) {1654, -20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {1608, -15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {1551, -10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) {1483, -5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {1404, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {1315, 5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {1218, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) {1114, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {1007, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {900, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {795, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {696, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) {605, 40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {522, 45},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) {448, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {383, 55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {327, 60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) {278, 65},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {237, 70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {202, 75},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {172, 80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) {146, 85},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {125, 90},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) {107, 95},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) {92, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {79, 105},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) {68, 110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) {59, 115},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) {51, 120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {44, 125}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * Voltage to temperature table for 100k pull up for NTCG104EF104 with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * 1.875V reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static const struct vadc_map_pt adcmap_100k_104ef_104fb_1875_vref[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { 1831, -40000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { 1814, -35000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { 1791, -30000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) { 1761, -25000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) { 1723, -20000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) { 1675, -15000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) { 1616, -10000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { 1545, -5000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { 1463, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) { 1370, 5000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) { 1268, 10000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { 1160, 15000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { 1049, 20000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { 937, 25000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { 828, 30000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { 726, 35000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { 630, 40000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { 544, 45000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { 467, 50000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { 399, 55000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { 340, 60000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { 290, 65000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { 247, 70000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { 209, 75000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { 179, 80000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { 153, 85000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) { 130, 90000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { 112, 95000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) { 96, 100000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { 82, 105000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { 71, 110000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { 62, 115000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) { 53, 120000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { 46, 125000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static const struct vadc_map_pt adcmap7_die_temp[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) { 433700, 1967},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { 473100, 1964},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { 512400, 1957},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { 551500, 1949},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { 590500, 1940},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { 629300, 1930},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) { 667900, 1921},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) { 706400, 1910},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) { 744600, 1896},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) { 782500, 1878},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) { 820100, 1859},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) { 857300, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * Resistance to temperature table for 100k pull up for NTCG104EF104.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) static const struct vadc_map_pt adcmap7_100k[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { 4250657, -40960 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) { 3962085, -39936 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) { 3694875, -38912 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) { 3447322, -37888 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) { 3217867, -36864 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) { 3005082, -35840 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) { 2807660, -34816 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) { 2624405, -33792 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) { 2454218, -32768 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { 2296094, -31744 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { 2149108, -30720 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { 2012414, -29696 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) { 1885232, -28672 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { 1766846, -27648 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) { 1656598, -26624 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) { 1553884, -25600 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) { 1458147, -24576 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) { 1368873, -23552 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) { 1285590, -22528 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) { 1207863, -21504 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) { 1135290, -20480 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) { 1067501, -19456 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) { 1004155, -18432 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) { 944935, -17408 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { 889550, -16384 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { 837731, -15360 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { 789229, -14336 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { 743813, -13312 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { 701271, -12288 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { 661405, -11264 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { 624032, -10240 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { 588982, -9216 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { 556100, -8192 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { 525239, -7168 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { 496264, -6144 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { 469050, -5120 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { 443480, -4096 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { 419448, -3072 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { 396851, -2048 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { 375597, -1024 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { 355598, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { 336775, 1024 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { 319052, 2048 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { 302359, 3072 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { 286630, 4096 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { 271806, 5120 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { 257829, 6144 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { 244646, 7168 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) { 232209, 8192 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { 220471, 9216 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { 209390, 10240 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) { 198926, 11264 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { 189040, 12288 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { 179698, 13312 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) { 170868, 14336 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { 162519, 15360 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) { 154622, 16384 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) { 147150, 17408 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { 140079, 18432 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { 133385, 19456 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) { 127046, 20480 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { 121042, 21504 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) { 115352, 22528 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) { 109960, 23552 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) { 104848, 24576 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) { 100000, 25600 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) { 95402, 26624 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { 91038, 27648 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { 86897, 28672 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) { 82965, 29696 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { 79232, 30720 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { 75686, 31744 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) { 72316, 32768 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { 69114, 33792 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) { 66070, 34816 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) { 63176, 35840 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) { 60423, 36864 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { 57804, 37888 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { 55312, 38912 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) { 52940, 39936 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { 50681, 40960 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) { 48531, 41984 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) { 46482, 43008 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { 44530, 44032 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) { 42670, 45056 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) { 40897, 46080 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { 39207, 47104 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { 37595, 48128 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) { 36057, 49152 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { 34590, 50176 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { 33190, 51200 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { 31853, 52224 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { 30577, 53248 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { 29358, 54272 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { 28194, 55296 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { 27082, 56320 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { 26020, 57344 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { 25004, 58368 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { 24033, 59392 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { 23104, 60416 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) { 22216, 61440 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) { 21367, 62464 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { 20554, 63488 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) { 19776, 64512 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) { 19031, 65536 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { 18318, 66560 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) { 17636, 67584 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { 16982, 68608 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { 16355, 69632 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) { 15755, 70656 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) { 15180, 71680 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { 14628, 72704 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) { 14099, 73728 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { 13592, 74752 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { 13106, 75776 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) { 12640, 76800 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) { 12192, 77824 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { 11762, 78848 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { 11350, 79872 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { 10954, 80896 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) { 10574, 81920 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { 10209, 82944 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) { 9858, 83968 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) { 9521, 84992 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) { 9197, 86016 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) { 8886, 87040 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { 8587, 88064 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { 8299, 89088 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) { 8023, 90112 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { 7757, 91136 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { 7501, 92160 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { 7254, 93184 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) { 7017, 94208 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { 6789, 95232 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { 6570, 96256 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { 6358, 97280 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { 6155, 98304 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { 5959, 99328 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { 5770, 100352 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) { 5588, 101376 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) { 5412, 102400 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) { 5243, 103424 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) { 5080, 104448 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) { 4923, 105472 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) { 4771, 106496 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) { 4625, 107520 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) { 4484, 108544 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) { 4348, 109568 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) { 4217, 110592 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) { 4090, 111616 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { 3968, 112640 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { 3850, 113664 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) { 3736, 114688 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) { 3626, 115712 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { 3519, 116736 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) { 3417, 117760 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { 3317, 118784 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { 3221, 119808 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { 3129, 120832 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { 3039, 121856 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { 2952, 122880 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) { 2868, 123904 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { 2787, 124928 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { 2709, 125952 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { 2633, 126976 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { 2560, 128000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { 2489, 129024 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { 2420, 130048 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) static int qcom_vadc_scale_hw_calib_volt(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) u16 adc_code, int *result_uv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static int qcom_vadc_scale_hw_calib_therm(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) static int qcom_vadc7_scale_hw_calib_therm(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) static int qcom_vadc_scale_hw_smb_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) static int qcom_vadc_scale_hw_chg5_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static int qcom_vadc_scale_hw_calib_die_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) static int qcom_vadc7_scale_hw_calib_die_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) u16 adc_code, int *result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) static struct qcom_adc5_scale_type scale_adc5_fn[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) [SCALE_HW_CALIB_DEFAULT] = {qcom_vadc_scale_hw_calib_volt},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) [SCALE_HW_CALIB_THERM_100K_PULLUP] = {qcom_vadc_scale_hw_calib_therm},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) [SCALE_HW_CALIB_XOTHERM] = {qcom_vadc_scale_hw_calib_therm},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) [SCALE_HW_CALIB_THERM_100K_PU_PM7] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) qcom_vadc7_scale_hw_calib_therm},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) [SCALE_HW_CALIB_PMIC_THERM] = {qcom_vadc_scale_hw_calib_die_temp},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) [SCALE_HW_CALIB_PMIC_THERM_PM7] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) qcom_vadc7_scale_hw_calib_die_temp},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) [SCALE_HW_CALIB_PM5_CHG_TEMP] = {qcom_vadc_scale_hw_chg5_temp},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) [SCALE_HW_CALIB_PM5_SMB_TEMP] = {qcom_vadc_scale_hw_smb_temp},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) static int qcom_vadc_map_voltage_temp(const struct vadc_map_pt *pts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u32 tablesize, s32 input, int *output)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) bool descending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u32 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (!pts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* Check if table is descending or ascending */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (tablesize > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (pts[0].x < pts[1].x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) descending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) while (i < tablesize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if ((descending) && (pts[i].x < input)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) /* table entry is less than measured*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /* value and table is descending, stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) } else if ((!descending) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) (pts[i].x > input)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* table entry is greater than measured*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /*value and table is ascending, stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (i == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) *output = pts[0].y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) } else if (i == tablesize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) *output = pts[tablesize - 1].y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) /* result is between search_index and search_index-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* interpolate linearly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) *output = (((s32)((pts[i].y - pts[i - 1].y) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) (input - pts[i - 1].x)) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) (pts[i].x - pts[i - 1].x)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) pts[i - 1].y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) static void qcom_vadc_scale_calib(const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u16 adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) bool absolute,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) s64 *scale_voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) *scale_voltage = (adc_code - calib_graph->gnd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) *scale_voltage *= calib_graph->dx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) *scale_voltage = div64_s64(*scale_voltage, calib_graph->dy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (absolute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *scale_voltage += calib_graph->dx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (*scale_voltage < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) *scale_voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static int qcom_vadc_scale_volt(const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) bool absolute, u16 adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int *result_uv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) s64 voltage = 0, result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) qcom_vadc_scale_calib(calib_graph, adc_code, absolute, &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) voltage = voltage * prescale->den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) result = div64_s64(voltage, prescale->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) *result_uv = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static int qcom_vadc_scale_therm(const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) bool absolute, u16 adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) s64 voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) qcom_vadc_scale_calib(calib_graph, adc_code, absolute, &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (absolute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) voltage = div64_s64(voltage, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ret = qcom_vadc_map_voltage_temp(adcmap_100k_104ef_104fb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) ARRAY_SIZE(adcmap_100k_104ef_104fb),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) voltage, result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) *result_mdec *= 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) static int qcom_vadc_scale_die_temp(const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) bool absolute,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) s64 voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) u64 temp; /* Temporary variable for do_div */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) qcom_vadc_scale_calib(calib_graph, adc_code, absolute, &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (voltage > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) temp = voltage * prescale->den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) do_div(temp, prescale->num * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) voltage = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) *result_mdec = milli_kelvin_to_millicelsius(voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) static int qcom_vadc_scale_chg_temp(const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) bool absolute,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) s64 voltage = 0, result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) qcom_vadc_scale_calib(calib_graph, adc_code, absolute, &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) voltage = voltage * prescale->den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) voltage = div64_s64(voltage, prescale->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) voltage = ((PMI_CHG_SCALE_1) * (voltage * 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) voltage = (voltage + PMI_CHG_SCALE_2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) result = div64_s64(voltage, 1000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) *result_mdec = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static int qcom_vadc_scale_code_voltage_factor(u16 adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) unsigned int factor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) s64 voltage, temp, adc_vdd_ref_mv = 1875;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * The normal data range is between 0V to 1.875V. On cases where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * we read low voltage values, the ADC code can go beyond the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * range and the scale result is incorrect so we clamp the values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * for the cases where the code represents a value below 0V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) if (adc_code > VADC5_MAX_CODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) adc_code = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) /* (ADC code * vref_vadc (1.875V)) / full_scale_code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) voltage = (s64) adc_code * adc_vdd_ref_mv * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) voltage = div64_s64(voltage, data->full_scale_code_volt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (voltage > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) voltage *= prescale->den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) temp = prescale->num * factor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) voltage = div64_s64(voltage, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return (int) voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) static int qcom_vadc7_scale_hw_calib_therm(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) s64 resistance = adc_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) int ret, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (adc_code >= RATIO_MAX_ADC7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) resistance *= R_PU_100K;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) resistance = div64_s64(resistance, RATIO_MAX_ADC7 - adc_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) ret = qcom_vadc_map_voltage_temp(adcmap7_100k,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ARRAY_SIZE(adcmap7_100k),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) resistance, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) *result_mdec = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) static int qcom_vadc_scale_hw_calib_volt(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) u16 adc_code, int *result_uv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) *result_uv = qcom_vadc_scale_code_voltage_factor(adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) prescale, data, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) static int qcom_vadc_scale_hw_calib_therm(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) int voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) voltage = qcom_vadc_scale_code_voltage_factor(adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) prescale, data, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /* Map voltage to temperature from look-up table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return qcom_vadc_map_voltage_temp(adcmap_100k_104ef_104fb_1875_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) ARRAY_SIZE(adcmap_100k_104ef_104fb_1875_vref),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) voltage, result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) static int qcom_vadc_scale_hw_calib_die_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) *result_mdec = qcom_vadc_scale_code_voltage_factor(adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) prescale, data, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) *result_mdec = milli_kelvin_to_millicelsius(*result_mdec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) static int qcom_vadc7_scale_hw_calib_die_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) int voltage, vtemp0, temp, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) voltage = qcom_vadc_scale_code_voltage_factor(adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) prescale, data, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) if (adcmap7_die_temp[0].x > voltage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) *result_mdec = DIE_TEMP_ADC7_SCALE_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (adcmap7_die_temp[ARRAY_SIZE(adcmap7_die_temp) - 1].x <= voltage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) *result_mdec = DIE_TEMP_ADC7_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) for (i = 0; i < ARRAY_SIZE(adcmap7_die_temp); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) if (adcmap7_die_temp[i].x > voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) vtemp0 = adcmap7_die_temp[i - 1].x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) voltage = voltage - vtemp0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) temp = div64_s64(voltage * DIE_TEMP_ADC7_SCALE_FACTOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) adcmap7_die_temp[i - 1].y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) temp += DIE_TEMP_ADC7_SCALE_1 + (DIE_TEMP_ADC7_SCALE_2 * (i - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) *result_mdec = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) static int qcom_vadc_scale_hw_smb_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) *result_mdec = qcom_vadc_scale_code_voltage_factor(adc_code * 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) prescale, data, PMIC5_SMB_TEMP_SCALE_FACTOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) *result_mdec = PMIC5_SMB_TEMP_CONSTANT - *result_mdec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) static int qcom_vadc_scale_hw_chg5_temp(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) u16 adc_code, int *result_mdec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) *result_mdec = qcom_vadc_scale_code_voltage_factor(adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) prescale, data, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) *result_mdec = PMIC5_CHG_TEMP_SCALE_FACTOR - *result_mdec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) int qcom_vadc_scale(enum vadc_scale_fn_type scaletype,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) const struct vadc_linear_graph *calib_graph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) bool absolute,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) u16 adc_code, int *result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) switch (scaletype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) case SCALE_DEFAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) return qcom_vadc_scale_volt(calib_graph, prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) absolute, adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) case SCALE_THERM_100K_PULLUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) case SCALE_XOTHERM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) return qcom_vadc_scale_therm(calib_graph, prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) absolute, adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) case SCALE_PMIC_THERM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return qcom_vadc_scale_die_temp(calib_graph, prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) absolute, adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) case SCALE_PMI_CHG_TEMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) return qcom_vadc_scale_chg_temp(calib_graph, prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) absolute, adc_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) EXPORT_SYMBOL(qcom_vadc_scale);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) const struct vadc_prescale_ratio *prescale,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) const struct adc5_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u16 adc_code, int *result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) if (!(scaletype >= SCALE_HW_CALIB_DEFAULT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) scaletype < SCALE_HW_CALIB_INVALID)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) pr_err("Invalid scale type %d\n", scaletype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return scale_adc5_fn[scaletype].scale_fn(prescale, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) adc_code, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) EXPORT_SYMBOL(qcom_adc5_hw_scale);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) int qcom_vadc_decimation_from_dt(u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (!is_power_of_2(value) || value < VADC_DECIMATION_MIN ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) value > VADC_DECIMATION_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) return __ffs64(value / VADC_DECIMATION_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) EXPORT_SYMBOL(qcom_vadc_decimation_from_dt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) MODULE_DESCRIPTION("Qualcomm ADC common functionality");