18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2019, Linaro Limited 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/bitops.h> 78c2ecf20Sopenharmony_ci#include <linux/regmap.h> 88c2ecf20Sopenharmony_ci#include <linux/delay.h> 98c2ecf20Sopenharmony_ci#include <linux/slab.h> 108c2ecf20Sopenharmony_ci#include "tsens.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* ----- SROT ------ */ 138c2ecf20Sopenharmony_ci#define SROT_HW_VER_OFF 0x0000 148c2ecf20Sopenharmony_ci#define SROT_CTRL_OFF 0x0004 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci/* ----- TM ------ */ 178c2ecf20Sopenharmony_ci#define TM_INT_EN_OFF 0x0000 188c2ecf20Sopenharmony_ci#define TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF 0x0004 198c2ecf20Sopenharmony_ci#define TM_Sn_STATUS_OFF 0x0044 208c2ecf20Sopenharmony_ci#define TM_TRDY_OFF 0x0084 218c2ecf20Sopenharmony_ci#define TM_HIGH_LOW_INT_STATUS_OFF 0x0088 228c2ecf20Sopenharmony_ci#define TM_HIGH_LOW_Sn_INT_THRESHOLD_OFF 0x0090 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* eeprom layout data for msm8956/76 (v1) */ 258c2ecf20Sopenharmony_ci#define MSM8976_BASE0_MASK 0xff 268c2ecf20Sopenharmony_ci#define MSM8976_BASE1_MASK 0xff 278c2ecf20Sopenharmony_ci#define MSM8976_BASE1_SHIFT 8 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define MSM8976_S0_P1_MASK 0x3f00 308c2ecf20Sopenharmony_ci#define MSM8976_S1_P1_MASK 0x3f00000 318c2ecf20Sopenharmony_ci#define MSM8976_S2_P1_MASK 0x3f 328c2ecf20Sopenharmony_ci#define MSM8976_S3_P1_MASK 0x3f000 338c2ecf20Sopenharmony_ci#define MSM8976_S4_P1_MASK 0x3f00 348c2ecf20Sopenharmony_ci#define MSM8976_S5_P1_MASK 0x3f00000 358c2ecf20Sopenharmony_ci#define MSM8976_S6_P1_MASK 0x3f 368c2ecf20Sopenharmony_ci#define MSM8976_S7_P1_MASK 0x3f000 378c2ecf20Sopenharmony_ci#define MSM8976_S8_P1_MASK 0x1f8 388c2ecf20Sopenharmony_ci#define MSM8976_S9_P1_MASK 0x1f8000 398c2ecf20Sopenharmony_ci#define MSM8976_S10_P1_MASK 0xf8000000 408c2ecf20Sopenharmony_ci#define MSM8976_S10_P1_MASK_1 0x1 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define MSM8976_S0_P2_MASK 0xfc000 438c2ecf20Sopenharmony_ci#define MSM8976_S1_P2_MASK 0xfc000000 448c2ecf20Sopenharmony_ci#define MSM8976_S2_P2_MASK 0xfc0 458c2ecf20Sopenharmony_ci#define MSM8976_S3_P2_MASK 0xfc0000 468c2ecf20Sopenharmony_ci#define MSM8976_S4_P2_MASK 0xfc000 478c2ecf20Sopenharmony_ci#define MSM8976_S5_P2_MASK 0xfc000000 488c2ecf20Sopenharmony_ci#define MSM8976_S6_P2_MASK 0xfc0 498c2ecf20Sopenharmony_ci#define MSM8976_S7_P2_MASK 0xfc0000 508c2ecf20Sopenharmony_ci#define MSM8976_S8_P2_MASK 0x7e00 518c2ecf20Sopenharmony_ci#define MSM8976_S9_P2_MASK 0x7e00000 528c2ecf20Sopenharmony_ci#define MSM8976_S10_P2_MASK 0x7e 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci#define MSM8976_S0_P1_SHIFT 8 558c2ecf20Sopenharmony_ci#define MSM8976_S1_P1_SHIFT 20 568c2ecf20Sopenharmony_ci#define MSM8976_S2_P1_SHIFT 0 578c2ecf20Sopenharmony_ci#define MSM8976_S3_P1_SHIFT 12 588c2ecf20Sopenharmony_ci#define MSM8976_S4_P1_SHIFT 8 598c2ecf20Sopenharmony_ci#define MSM8976_S5_P1_SHIFT 20 608c2ecf20Sopenharmony_ci#define MSM8976_S6_P1_SHIFT 0 618c2ecf20Sopenharmony_ci#define MSM8976_S7_P1_SHIFT 12 628c2ecf20Sopenharmony_ci#define MSM8976_S8_P1_SHIFT 3 638c2ecf20Sopenharmony_ci#define MSM8976_S9_P1_SHIFT 15 648c2ecf20Sopenharmony_ci#define MSM8976_S10_P1_SHIFT 27 658c2ecf20Sopenharmony_ci#define MSM8976_S10_P1_SHIFT_1 0 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci#define MSM8976_S0_P2_SHIFT 14 688c2ecf20Sopenharmony_ci#define MSM8976_S1_P2_SHIFT 26 698c2ecf20Sopenharmony_ci#define MSM8976_S2_P2_SHIFT 6 708c2ecf20Sopenharmony_ci#define MSM8976_S3_P2_SHIFT 18 718c2ecf20Sopenharmony_ci#define MSM8976_S4_P2_SHIFT 14 728c2ecf20Sopenharmony_ci#define MSM8976_S5_P2_SHIFT 26 738c2ecf20Sopenharmony_ci#define MSM8976_S6_P2_SHIFT 6 748c2ecf20Sopenharmony_ci#define MSM8976_S7_P2_SHIFT 18 758c2ecf20Sopenharmony_ci#define MSM8976_S8_P2_SHIFT 9 768c2ecf20Sopenharmony_ci#define MSM8976_S9_P2_SHIFT 21 778c2ecf20Sopenharmony_ci#define MSM8976_S10_P2_SHIFT 1 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci#define MSM8976_CAL_SEL_MASK 0x3 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci/* eeprom layout data for qcs404/405 (v1) */ 828c2ecf20Sopenharmony_ci#define BASE0_MASK 0x000007f8 838c2ecf20Sopenharmony_ci#define BASE1_MASK 0x0007f800 848c2ecf20Sopenharmony_ci#define BASE0_SHIFT 3 858c2ecf20Sopenharmony_ci#define BASE1_SHIFT 11 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci#define S0_P1_MASK 0x0000003f 888c2ecf20Sopenharmony_ci#define S1_P1_MASK 0x0003f000 898c2ecf20Sopenharmony_ci#define S2_P1_MASK 0x3f000000 908c2ecf20Sopenharmony_ci#define S3_P1_MASK 0x000003f0 918c2ecf20Sopenharmony_ci#define S4_P1_MASK 0x003f0000 928c2ecf20Sopenharmony_ci#define S5_P1_MASK 0x0000003f 938c2ecf20Sopenharmony_ci#define S6_P1_MASK 0x0003f000 948c2ecf20Sopenharmony_ci#define S7_P1_MASK 0x3f000000 958c2ecf20Sopenharmony_ci#define S8_P1_MASK 0x000003f0 968c2ecf20Sopenharmony_ci#define S9_P1_MASK 0x003f0000 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define S0_P2_MASK 0x00000fc0 998c2ecf20Sopenharmony_ci#define S1_P2_MASK 0x00fc0000 1008c2ecf20Sopenharmony_ci#define S2_P2_MASK_1_0 0xc0000000 1018c2ecf20Sopenharmony_ci#define S2_P2_MASK_5_2 0x0000000f 1028c2ecf20Sopenharmony_ci#define S3_P2_MASK 0x0000fc00 1038c2ecf20Sopenharmony_ci#define S4_P2_MASK 0x0fc00000 1048c2ecf20Sopenharmony_ci#define S5_P2_MASK 0x00000fc0 1058c2ecf20Sopenharmony_ci#define S6_P2_MASK 0x00fc0000 1068c2ecf20Sopenharmony_ci#define S7_P2_MASK_1_0 0xc0000000 1078c2ecf20Sopenharmony_ci#define S7_P2_MASK_5_2 0x0000000f 1088c2ecf20Sopenharmony_ci#define S8_P2_MASK 0x0000fc00 1098c2ecf20Sopenharmony_ci#define S9_P2_MASK 0x0fc00000 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci#define S0_P1_SHIFT 0 1128c2ecf20Sopenharmony_ci#define S0_P2_SHIFT 6 1138c2ecf20Sopenharmony_ci#define S1_P1_SHIFT 12 1148c2ecf20Sopenharmony_ci#define S1_P2_SHIFT 18 1158c2ecf20Sopenharmony_ci#define S2_P1_SHIFT 24 1168c2ecf20Sopenharmony_ci#define S2_P2_SHIFT_1_0 30 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci#define S2_P2_SHIFT_5_2 0 1198c2ecf20Sopenharmony_ci#define S3_P1_SHIFT 4 1208c2ecf20Sopenharmony_ci#define S3_P2_SHIFT 10 1218c2ecf20Sopenharmony_ci#define S4_P1_SHIFT 16 1228c2ecf20Sopenharmony_ci#define S4_P2_SHIFT 22 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci#define S5_P1_SHIFT 0 1258c2ecf20Sopenharmony_ci#define S5_P2_SHIFT 6 1268c2ecf20Sopenharmony_ci#define S6_P1_SHIFT 12 1278c2ecf20Sopenharmony_ci#define S6_P2_SHIFT 18 1288c2ecf20Sopenharmony_ci#define S7_P1_SHIFT 24 1298c2ecf20Sopenharmony_ci#define S7_P2_SHIFT_1_0 30 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci#define S7_P2_SHIFT_5_2 0 1328c2ecf20Sopenharmony_ci#define S8_P1_SHIFT 4 1338c2ecf20Sopenharmony_ci#define S8_P2_SHIFT 10 1348c2ecf20Sopenharmony_ci#define S9_P1_SHIFT 16 1358c2ecf20Sopenharmony_ci#define S9_P2_SHIFT 22 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci#define CAL_SEL_MASK 7 1388c2ecf20Sopenharmony_ci#define CAL_SEL_SHIFT 0 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cistatic int calibrate_v1(struct tsens_priv *priv) 1418c2ecf20Sopenharmony_ci{ 1428c2ecf20Sopenharmony_ci u32 base0 = 0, base1 = 0; 1438c2ecf20Sopenharmony_ci u32 p1[10], p2[10]; 1448c2ecf20Sopenharmony_ci u32 mode = 0, lsb = 0, msb = 0; 1458c2ecf20Sopenharmony_ci u32 *qfprom_cdata; 1468c2ecf20Sopenharmony_ci int i; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib"); 1498c2ecf20Sopenharmony_ci if (IS_ERR(qfprom_cdata)) 1508c2ecf20Sopenharmony_ci return PTR_ERR(qfprom_cdata); 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci mode = (qfprom_cdata[4] & CAL_SEL_MASK) >> CAL_SEL_SHIFT; 1538c2ecf20Sopenharmony_ci dev_dbg(priv->dev, "calibration mode is %d\n", mode); 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci switch (mode) { 1568c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 1578c2ecf20Sopenharmony_ci base1 = (qfprom_cdata[4] & BASE1_MASK) >> BASE1_SHIFT; 1588c2ecf20Sopenharmony_ci p2[0] = (qfprom_cdata[0] & S0_P2_MASK) >> S0_P2_SHIFT; 1598c2ecf20Sopenharmony_ci p2[1] = (qfprom_cdata[0] & S1_P2_MASK) >> S1_P2_SHIFT; 1608c2ecf20Sopenharmony_ci /* This value is split over two registers, 2 bits and 4 bits */ 1618c2ecf20Sopenharmony_ci lsb = (qfprom_cdata[0] & S2_P2_MASK_1_0) >> S2_P2_SHIFT_1_0; 1628c2ecf20Sopenharmony_ci msb = (qfprom_cdata[1] & S2_P2_MASK_5_2) >> S2_P2_SHIFT_5_2; 1638c2ecf20Sopenharmony_ci p2[2] = msb << 2 | lsb; 1648c2ecf20Sopenharmony_ci p2[3] = (qfprom_cdata[1] & S3_P2_MASK) >> S3_P2_SHIFT; 1658c2ecf20Sopenharmony_ci p2[4] = (qfprom_cdata[1] & S4_P2_MASK) >> S4_P2_SHIFT; 1668c2ecf20Sopenharmony_ci p2[5] = (qfprom_cdata[2] & S5_P2_MASK) >> S5_P2_SHIFT; 1678c2ecf20Sopenharmony_ci p2[6] = (qfprom_cdata[2] & S6_P2_MASK) >> S6_P2_SHIFT; 1688c2ecf20Sopenharmony_ci /* This value is split over two registers, 2 bits and 4 bits */ 1698c2ecf20Sopenharmony_ci lsb = (qfprom_cdata[2] & S7_P2_MASK_1_0) >> S7_P2_SHIFT_1_0; 1708c2ecf20Sopenharmony_ci msb = (qfprom_cdata[3] & S7_P2_MASK_5_2) >> S7_P2_SHIFT_5_2; 1718c2ecf20Sopenharmony_ci p2[7] = msb << 2 | lsb; 1728c2ecf20Sopenharmony_ci p2[8] = (qfprom_cdata[3] & S8_P2_MASK) >> S8_P2_SHIFT; 1738c2ecf20Sopenharmony_ci p2[9] = (qfprom_cdata[3] & S9_P2_MASK) >> S9_P2_SHIFT; 1748c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 1758c2ecf20Sopenharmony_ci p2[i] = ((base1 + p2[i]) << 2); 1768c2ecf20Sopenharmony_ci fallthrough; 1778c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 1788c2ecf20Sopenharmony_ci base0 = (qfprom_cdata[4] & BASE0_MASK) >> BASE0_SHIFT; 1798c2ecf20Sopenharmony_ci p1[0] = (qfprom_cdata[0] & S0_P1_MASK) >> S0_P1_SHIFT; 1808c2ecf20Sopenharmony_ci p1[1] = (qfprom_cdata[0] & S1_P1_MASK) >> S1_P1_SHIFT; 1818c2ecf20Sopenharmony_ci p1[2] = (qfprom_cdata[0] & S2_P1_MASK) >> S2_P1_SHIFT; 1828c2ecf20Sopenharmony_ci p1[3] = (qfprom_cdata[1] & S3_P1_MASK) >> S3_P1_SHIFT; 1838c2ecf20Sopenharmony_ci p1[4] = (qfprom_cdata[1] & S4_P1_MASK) >> S4_P1_SHIFT; 1848c2ecf20Sopenharmony_ci p1[5] = (qfprom_cdata[2] & S5_P1_MASK) >> S5_P1_SHIFT; 1858c2ecf20Sopenharmony_ci p1[6] = (qfprom_cdata[2] & S6_P1_MASK) >> S6_P1_SHIFT; 1868c2ecf20Sopenharmony_ci p1[7] = (qfprom_cdata[2] & S7_P1_MASK) >> S7_P1_SHIFT; 1878c2ecf20Sopenharmony_ci p1[8] = (qfprom_cdata[3] & S8_P1_MASK) >> S8_P1_SHIFT; 1888c2ecf20Sopenharmony_ci p1[9] = (qfprom_cdata[3] & S9_P1_MASK) >> S9_P1_SHIFT; 1898c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 1908c2ecf20Sopenharmony_ci p1[i] = (((base0) + p1[i]) << 2); 1918c2ecf20Sopenharmony_ci break; 1928c2ecf20Sopenharmony_ci default: 1938c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 1948c2ecf20Sopenharmony_ci p1[i] = 500; 1958c2ecf20Sopenharmony_ci p2[i] = 780; 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci break; 1988c2ecf20Sopenharmony_ci } 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci compute_intercept_slope(priv, p1, p2, mode); 2018c2ecf20Sopenharmony_ci kfree(qfprom_cdata); 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci return 0; 2048c2ecf20Sopenharmony_ci} 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cistatic int calibrate_8976(struct tsens_priv *priv) 2078c2ecf20Sopenharmony_ci{ 2088c2ecf20Sopenharmony_ci int base0 = 0, base1 = 0, i; 2098c2ecf20Sopenharmony_ci u32 p1[11], p2[11]; 2108c2ecf20Sopenharmony_ci int mode = 0, tmp = 0; 2118c2ecf20Sopenharmony_ci u32 *qfprom_cdata; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib"); 2148c2ecf20Sopenharmony_ci if (IS_ERR(qfprom_cdata)) 2158c2ecf20Sopenharmony_ci return PTR_ERR(qfprom_cdata); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci mode = (qfprom_cdata[4] & MSM8976_CAL_SEL_MASK); 2188c2ecf20Sopenharmony_ci dev_dbg(priv->dev, "calibration mode is %d\n", mode); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci switch (mode) { 2218c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 2228c2ecf20Sopenharmony_ci base1 = (qfprom_cdata[2] & MSM8976_BASE1_MASK) >> MSM8976_BASE1_SHIFT; 2238c2ecf20Sopenharmony_ci p2[0] = (qfprom_cdata[0] & MSM8976_S0_P2_MASK) >> MSM8976_S0_P2_SHIFT; 2248c2ecf20Sopenharmony_ci p2[1] = (qfprom_cdata[0] & MSM8976_S1_P2_MASK) >> MSM8976_S1_P2_SHIFT; 2258c2ecf20Sopenharmony_ci p2[2] = (qfprom_cdata[1] & MSM8976_S2_P2_MASK) >> MSM8976_S2_P2_SHIFT; 2268c2ecf20Sopenharmony_ci p2[3] = (qfprom_cdata[1] & MSM8976_S3_P2_MASK) >> MSM8976_S3_P2_SHIFT; 2278c2ecf20Sopenharmony_ci p2[4] = (qfprom_cdata[2] & MSM8976_S4_P2_MASK) >> MSM8976_S4_P2_SHIFT; 2288c2ecf20Sopenharmony_ci p2[5] = (qfprom_cdata[2] & MSM8976_S5_P2_MASK) >> MSM8976_S5_P2_SHIFT; 2298c2ecf20Sopenharmony_ci p2[6] = (qfprom_cdata[3] & MSM8976_S6_P2_MASK) >> MSM8976_S6_P2_SHIFT; 2308c2ecf20Sopenharmony_ci p2[7] = (qfprom_cdata[3] & MSM8976_S7_P2_MASK) >> MSM8976_S7_P2_SHIFT; 2318c2ecf20Sopenharmony_ci p2[8] = (qfprom_cdata[4] & MSM8976_S8_P2_MASK) >> MSM8976_S8_P2_SHIFT; 2328c2ecf20Sopenharmony_ci p2[9] = (qfprom_cdata[4] & MSM8976_S9_P2_MASK) >> MSM8976_S9_P2_SHIFT; 2338c2ecf20Sopenharmony_ci p2[10] = (qfprom_cdata[5] & MSM8976_S10_P2_MASK) >> MSM8976_S10_P2_SHIFT; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 2368c2ecf20Sopenharmony_ci p2[i] = ((base1 + p2[i]) << 2); 2378c2ecf20Sopenharmony_ci fallthrough; 2388c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 2398c2ecf20Sopenharmony_ci base0 = qfprom_cdata[0] & MSM8976_BASE0_MASK; 2408c2ecf20Sopenharmony_ci p1[0] = (qfprom_cdata[0] & MSM8976_S0_P1_MASK) >> MSM8976_S0_P1_SHIFT; 2418c2ecf20Sopenharmony_ci p1[1] = (qfprom_cdata[0] & MSM8976_S1_P1_MASK) >> MSM8976_S1_P1_SHIFT; 2428c2ecf20Sopenharmony_ci p1[2] = (qfprom_cdata[1] & MSM8976_S2_P1_MASK) >> MSM8976_S2_P1_SHIFT; 2438c2ecf20Sopenharmony_ci p1[3] = (qfprom_cdata[1] & MSM8976_S3_P1_MASK) >> MSM8976_S3_P1_SHIFT; 2448c2ecf20Sopenharmony_ci p1[4] = (qfprom_cdata[2] & MSM8976_S4_P1_MASK) >> MSM8976_S4_P1_SHIFT; 2458c2ecf20Sopenharmony_ci p1[5] = (qfprom_cdata[2] & MSM8976_S5_P1_MASK) >> MSM8976_S5_P1_SHIFT; 2468c2ecf20Sopenharmony_ci p1[6] = (qfprom_cdata[3] & MSM8976_S6_P1_MASK) >> MSM8976_S6_P1_SHIFT; 2478c2ecf20Sopenharmony_ci p1[7] = (qfprom_cdata[3] & MSM8976_S7_P1_MASK) >> MSM8976_S7_P1_SHIFT; 2488c2ecf20Sopenharmony_ci p1[8] = (qfprom_cdata[4] & MSM8976_S8_P1_MASK) >> MSM8976_S8_P1_SHIFT; 2498c2ecf20Sopenharmony_ci p1[9] = (qfprom_cdata[4] & MSM8976_S9_P1_MASK) >> MSM8976_S9_P1_SHIFT; 2508c2ecf20Sopenharmony_ci p1[10] = (qfprom_cdata[4] & MSM8976_S10_P1_MASK) >> MSM8976_S10_P1_SHIFT; 2518c2ecf20Sopenharmony_ci tmp = (qfprom_cdata[5] & MSM8976_S10_P1_MASK_1) << MSM8976_S10_P1_SHIFT_1; 2528c2ecf20Sopenharmony_ci p1[10] |= tmp; 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 2558c2ecf20Sopenharmony_ci p1[i] = (((base0) + p1[i]) << 2); 2568c2ecf20Sopenharmony_ci break; 2578c2ecf20Sopenharmony_ci default: 2588c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 2598c2ecf20Sopenharmony_ci p1[i] = 500; 2608c2ecf20Sopenharmony_ci p2[i] = 780; 2618c2ecf20Sopenharmony_ci } 2628c2ecf20Sopenharmony_ci break; 2638c2ecf20Sopenharmony_ci } 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci compute_intercept_slope(priv, p1, p2, mode); 2668c2ecf20Sopenharmony_ci kfree(qfprom_cdata); 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci return 0; 2698c2ecf20Sopenharmony_ci} 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci/* v1.x: msm8956,8976,qcs404,405 */ 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_cistatic struct tsens_features tsens_v1_feat = { 2748c2ecf20Sopenharmony_ci .ver_major = VER_1_X, 2758c2ecf20Sopenharmony_ci .crit_int = 0, 2768c2ecf20Sopenharmony_ci .adc = 1, 2778c2ecf20Sopenharmony_ci .srot_split = 1, 2788c2ecf20Sopenharmony_ci .max_sensors = 11, 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cistatic const struct reg_field tsens_v1_regfields[MAX_REGFIELDS] = { 2828c2ecf20Sopenharmony_ci /* ----- SROT ------ */ 2838c2ecf20Sopenharmony_ci /* VERSION */ 2848c2ecf20Sopenharmony_ci [VER_MAJOR] = REG_FIELD(SROT_HW_VER_OFF, 28, 31), 2858c2ecf20Sopenharmony_ci [VER_MINOR] = REG_FIELD(SROT_HW_VER_OFF, 16, 27), 2868c2ecf20Sopenharmony_ci [VER_STEP] = REG_FIELD(SROT_HW_VER_OFF, 0, 15), 2878c2ecf20Sopenharmony_ci /* CTRL_OFFSET */ 2888c2ecf20Sopenharmony_ci [TSENS_EN] = REG_FIELD(SROT_CTRL_OFF, 0, 0), 2898c2ecf20Sopenharmony_ci [TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF, 1, 1), 2908c2ecf20Sopenharmony_ci [SENSOR_EN] = REG_FIELD(SROT_CTRL_OFF, 3, 13), 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci /* ----- TM ------ */ 2938c2ecf20Sopenharmony_ci /* INTERRUPT ENABLE */ 2948c2ecf20Sopenharmony_ci [INT_EN] = REG_FIELD(TM_INT_EN_OFF, 0, 0), 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci /* UPPER/LOWER TEMPERATURE THRESHOLDS */ 2978c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOW_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 0, 9), 2988c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UP_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 10, 19), 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci /* UPPER/LOWER INTERRUPTS [CLEAR/STATUS] */ 3018c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOW_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 20, 20), 3028c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UP_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 21, 21), 3038c2ecf20Sopenharmony_ci [LOW_INT_STATUS_0] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 0, 0), 3048c2ecf20Sopenharmony_ci [LOW_INT_STATUS_1] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 1, 1), 3058c2ecf20Sopenharmony_ci [LOW_INT_STATUS_2] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 2, 2), 3068c2ecf20Sopenharmony_ci [LOW_INT_STATUS_3] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 3, 3), 3078c2ecf20Sopenharmony_ci [LOW_INT_STATUS_4] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 4, 4), 3088c2ecf20Sopenharmony_ci [LOW_INT_STATUS_5] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 5, 5), 3098c2ecf20Sopenharmony_ci [LOW_INT_STATUS_6] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 6, 6), 3108c2ecf20Sopenharmony_ci [LOW_INT_STATUS_7] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 7, 7), 3118c2ecf20Sopenharmony_ci [UP_INT_STATUS_0] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 8, 8), 3128c2ecf20Sopenharmony_ci [UP_INT_STATUS_1] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 9, 9), 3138c2ecf20Sopenharmony_ci [UP_INT_STATUS_2] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 10, 10), 3148c2ecf20Sopenharmony_ci [UP_INT_STATUS_3] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 11, 11), 3158c2ecf20Sopenharmony_ci [UP_INT_STATUS_4] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 12, 12), 3168c2ecf20Sopenharmony_ci [UP_INT_STATUS_5] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 13, 13), 3178c2ecf20Sopenharmony_ci [UP_INT_STATUS_6] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 14, 14), 3188c2ecf20Sopenharmony_ci [UP_INT_STATUS_7] = REG_FIELD(TM_HIGH_LOW_INT_STATUS_OFF, 15, 15), 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci /* NO CRITICAL INTERRUPT SUPPORT on v1 */ 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci /* Sn_STATUS */ 3238c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LAST_TEMP, TM_Sn_STATUS_OFF, 0, 9), 3248c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(VALID, TM_Sn_STATUS_OFF, 14, 14), 3258c2ecf20Sopenharmony_ci /* xxx_STATUS bits: 1 == threshold violated */ 3268c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(MIN_STATUS, TM_Sn_STATUS_OFF, 10, 10), 3278c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOWER_STATUS, TM_Sn_STATUS_OFF, 11, 11), 3288c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UPPER_STATUS, TM_Sn_STATUS_OFF, 12, 12), 3298c2ecf20Sopenharmony_ci /* No CRITICAL field on v1.x */ 3308c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(MAX_STATUS, TM_Sn_STATUS_OFF, 13, 13), 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci /* TRDY: 1=ready, 0=in progress */ 3338c2ecf20Sopenharmony_ci [TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0), 3348c2ecf20Sopenharmony_ci}; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_cistatic int __init init_8956(struct tsens_priv *priv) { 3378c2ecf20Sopenharmony_ci priv->sensor[0].slope = 3313; 3388c2ecf20Sopenharmony_ci priv->sensor[1].slope = 3275; 3398c2ecf20Sopenharmony_ci priv->sensor[2].slope = 3320; 3408c2ecf20Sopenharmony_ci priv->sensor[3].slope = 3246; 3418c2ecf20Sopenharmony_ci priv->sensor[4].slope = 3279; 3428c2ecf20Sopenharmony_ci priv->sensor[5].slope = 3257; 3438c2ecf20Sopenharmony_ci priv->sensor[6].slope = 3234; 3448c2ecf20Sopenharmony_ci priv->sensor[7].slope = 3269; 3458c2ecf20Sopenharmony_ci priv->sensor[8].slope = 3255; 3468c2ecf20Sopenharmony_ci priv->sensor[9].slope = 3239; 3478c2ecf20Sopenharmony_ci priv->sensor[10].slope = 3286; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci return init_common(priv); 3508c2ecf20Sopenharmony_ci} 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_generic_v1 = { 3538c2ecf20Sopenharmony_ci .init = init_common, 3548c2ecf20Sopenharmony_ci .calibrate = calibrate_v1, 3558c2ecf20Sopenharmony_ci .get_temp = get_temp_tsens_valid, 3568c2ecf20Sopenharmony_ci}; 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_cistruct tsens_plat_data data_tsens_v1 = { 3598c2ecf20Sopenharmony_ci .ops = &ops_generic_v1, 3608c2ecf20Sopenharmony_ci .feat = &tsens_v1_feat, 3618c2ecf20Sopenharmony_ci .fields = tsens_v1_regfields, 3628c2ecf20Sopenharmony_ci}; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_8956 = { 3658c2ecf20Sopenharmony_ci .init = init_8956, 3668c2ecf20Sopenharmony_ci .calibrate = calibrate_8976, 3678c2ecf20Sopenharmony_ci .get_temp = get_temp_tsens_valid, 3688c2ecf20Sopenharmony_ci}; 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_cistruct tsens_plat_data data_8956 = { 3718c2ecf20Sopenharmony_ci .num_sensors = 11, 3728c2ecf20Sopenharmony_ci .ops = &ops_8956, 3738c2ecf20Sopenharmony_ci .feat = &tsens_v1_feat, 3748c2ecf20Sopenharmony_ci .fields = tsens_v1_regfields, 3758c2ecf20Sopenharmony_ci}; 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_8976 = { 3788c2ecf20Sopenharmony_ci .init = init_common, 3798c2ecf20Sopenharmony_ci .calibrate = calibrate_8976, 3808c2ecf20Sopenharmony_ci .get_temp = get_temp_tsens_valid, 3818c2ecf20Sopenharmony_ci}; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_cistruct tsens_plat_data data_8976 = { 3848c2ecf20Sopenharmony_ci .num_sensors = 11, 3858c2ecf20Sopenharmony_ci .ops = &ops_8976, 3868c2ecf20Sopenharmony_ci .hw_ids = (unsigned int[]){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 3878c2ecf20Sopenharmony_ci .feat = &tsens_v1_feat, 3888c2ecf20Sopenharmony_ci .fields = tsens_v1_regfields, 3898c2ecf20Sopenharmony_ci}; 390