18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2015, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 78c2ecf20Sopenharmony_ci#include "tsens.h" 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* ----- SROT ------ */ 108c2ecf20Sopenharmony_ci#define SROT_CTRL_OFF 0x0000 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* ----- TM ------ */ 138c2ecf20Sopenharmony_ci#define TM_INT_EN_OFF 0x0000 148c2ecf20Sopenharmony_ci#define TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF 0x0004 158c2ecf20Sopenharmony_ci#define TM_Sn_STATUS_OFF 0x0030 168c2ecf20Sopenharmony_ci#define TM_TRDY_OFF 0x005c 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* eeprom layout data for 8916 */ 198c2ecf20Sopenharmony_ci#define MSM8916_BASE0_MASK 0x0000007f 208c2ecf20Sopenharmony_ci#define MSM8916_BASE1_MASK 0xfe000000 218c2ecf20Sopenharmony_ci#define MSM8916_BASE0_SHIFT 0 228c2ecf20Sopenharmony_ci#define MSM8916_BASE1_SHIFT 25 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define MSM8916_S0_P1_MASK 0x00000f80 258c2ecf20Sopenharmony_ci#define MSM8916_S1_P1_MASK 0x003e0000 268c2ecf20Sopenharmony_ci#define MSM8916_S2_P1_MASK 0xf8000000 278c2ecf20Sopenharmony_ci#define MSM8916_S3_P1_MASK 0x000003e0 288c2ecf20Sopenharmony_ci#define MSM8916_S4_P1_MASK 0x000f8000 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define MSM8916_S0_P2_MASK 0x0001f000 318c2ecf20Sopenharmony_ci#define MSM8916_S1_P2_MASK 0x07c00000 328c2ecf20Sopenharmony_ci#define MSM8916_S2_P2_MASK 0x0000001f 338c2ecf20Sopenharmony_ci#define MSM8916_S3_P2_MASK 0x00007c00 348c2ecf20Sopenharmony_ci#define MSM8916_S4_P2_MASK 0x01f00000 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#define MSM8916_S0_P1_SHIFT 7 378c2ecf20Sopenharmony_ci#define MSM8916_S1_P1_SHIFT 17 388c2ecf20Sopenharmony_ci#define MSM8916_S2_P1_SHIFT 27 398c2ecf20Sopenharmony_ci#define MSM8916_S3_P1_SHIFT 5 408c2ecf20Sopenharmony_ci#define MSM8916_S4_P1_SHIFT 15 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define MSM8916_S0_P2_SHIFT 12 438c2ecf20Sopenharmony_ci#define MSM8916_S1_P2_SHIFT 22 448c2ecf20Sopenharmony_ci#define MSM8916_S2_P2_SHIFT 0 458c2ecf20Sopenharmony_ci#define MSM8916_S3_P2_SHIFT 10 468c2ecf20Sopenharmony_ci#define MSM8916_S4_P2_SHIFT 20 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define MSM8916_CAL_SEL_MASK 0xe0000000 498c2ecf20Sopenharmony_ci#define MSM8916_CAL_SEL_SHIFT 29 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* eeprom layout data for 8939 */ 528c2ecf20Sopenharmony_ci#define MSM8939_BASE0_MASK 0x000000ff 538c2ecf20Sopenharmony_ci#define MSM8939_BASE1_MASK 0xff000000 548c2ecf20Sopenharmony_ci#define MSM8939_BASE0_SHIFT 0 558c2ecf20Sopenharmony_ci#define MSM8939_BASE1_SHIFT 24 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#define MSM8939_S0_P1_MASK 0x000001f8 588c2ecf20Sopenharmony_ci#define MSM8939_S1_P1_MASK 0x001f8000 598c2ecf20Sopenharmony_ci#define MSM8939_S2_P1_MASK_0_4 0xf8000000 608c2ecf20Sopenharmony_ci#define MSM8939_S2_P1_MASK_5 0x00000001 618c2ecf20Sopenharmony_ci#define MSM8939_S3_P1_MASK 0x00001f80 628c2ecf20Sopenharmony_ci#define MSM8939_S4_P1_MASK 0x01f80000 638c2ecf20Sopenharmony_ci#define MSM8939_S5_P1_MASK 0x00003f00 648c2ecf20Sopenharmony_ci#define MSM8939_S6_P1_MASK 0x03f00000 658c2ecf20Sopenharmony_ci#define MSM8939_S7_P1_MASK 0x0000003f 668c2ecf20Sopenharmony_ci#define MSM8939_S8_P1_MASK 0x0003f000 678c2ecf20Sopenharmony_ci#define MSM8939_S9_P1_MASK 0x07e00000 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci#define MSM8939_S0_P2_MASK 0x00007e00 708c2ecf20Sopenharmony_ci#define MSM8939_S1_P2_MASK 0x07e00000 718c2ecf20Sopenharmony_ci#define MSM8939_S2_P2_MASK 0x0000007e 728c2ecf20Sopenharmony_ci#define MSM8939_S3_P2_MASK 0x0007e000 738c2ecf20Sopenharmony_ci#define MSM8939_S4_P2_MASK 0x7e000000 748c2ecf20Sopenharmony_ci#define MSM8939_S5_P2_MASK 0x000fc000 758c2ecf20Sopenharmony_ci#define MSM8939_S6_P2_MASK 0xfc000000 768c2ecf20Sopenharmony_ci#define MSM8939_S7_P2_MASK 0x00000fc0 778c2ecf20Sopenharmony_ci#define MSM8939_S8_P2_MASK 0x00fc0000 788c2ecf20Sopenharmony_ci#define MSM8939_S9_P2_MASK_0_4 0xf8000000 798c2ecf20Sopenharmony_ci#define MSM8939_S9_P2_MASK_5 0x00002000 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#define MSM8939_S0_P1_SHIFT 3 828c2ecf20Sopenharmony_ci#define MSM8939_S1_P1_SHIFT 15 838c2ecf20Sopenharmony_ci#define MSM8939_S2_P1_SHIFT_0_4 27 848c2ecf20Sopenharmony_ci#define MSM8939_S2_P1_SHIFT_5 0 858c2ecf20Sopenharmony_ci#define MSM8939_S3_P1_SHIFT 7 868c2ecf20Sopenharmony_ci#define MSM8939_S4_P1_SHIFT 19 878c2ecf20Sopenharmony_ci#define MSM8939_S5_P1_SHIFT 8 888c2ecf20Sopenharmony_ci#define MSM8939_S6_P1_SHIFT 20 898c2ecf20Sopenharmony_ci#define MSM8939_S7_P1_SHIFT 0 908c2ecf20Sopenharmony_ci#define MSM8939_S8_P1_SHIFT 12 918c2ecf20Sopenharmony_ci#define MSM8939_S9_P1_SHIFT 21 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#define MSM8939_S0_P2_SHIFT 9 948c2ecf20Sopenharmony_ci#define MSM8939_S1_P2_SHIFT 21 958c2ecf20Sopenharmony_ci#define MSM8939_S2_P2_SHIFT 1 968c2ecf20Sopenharmony_ci#define MSM8939_S3_P2_SHIFT 13 978c2ecf20Sopenharmony_ci#define MSM8939_S4_P2_SHIFT 25 988c2ecf20Sopenharmony_ci#define MSM8939_S5_P2_SHIFT 14 998c2ecf20Sopenharmony_ci#define MSM8939_S6_P2_SHIFT 26 1008c2ecf20Sopenharmony_ci#define MSM8939_S7_P2_SHIFT 6 1018c2ecf20Sopenharmony_ci#define MSM8939_S8_P2_SHIFT 18 1028c2ecf20Sopenharmony_ci#define MSM8939_S9_P2_SHIFT_0_4 27 1038c2ecf20Sopenharmony_ci#define MSM8939_S9_P2_SHIFT_5 13 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define MSM8939_CAL_SEL_MASK 0x7 1068c2ecf20Sopenharmony_ci#define MSM8939_CAL_SEL_SHIFT 0 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci/* eeprom layout data for 8974 */ 1098c2ecf20Sopenharmony_ci#define BASE1_MASK 0xff 1108c2ecf20Sopenharmony_ci#define S0_P1_MASK 0x3f00 1118c2ecf20Sopenharmony_ci#define S1_P1_MASK 0xfc000 1128c2ecf20Sopenharmony_ci#define S2_P1_MASK 0x3f00000 1138c2ecf20Sopenharmony_ci#define S3_P1_MASK 0xfc000000 1148c2ecf20Sopenharmony_ci#define S4_P1_MASK 0x3f 1158c2ecf20Sopenharmony_ci#define S5_P1_MASK 0xfc0 1168c2ecf20Sopenharmony_ci#define S6_P1_MASK 0x3f000 1178c2ecf20Sopenharmony_ci#define S7_P1_MASK 0xfc0000 1188c2ecf20Sopenharmony_ci#define S8_P1_MASK 0x3f000000 1198c2ecf20Sopenharmony_ci#define S8_P1_MASK_BKP 0x3f 1208c2ecf20Sopenharmony_ci#define S9_P1_MASK 0x3f 1218c2ecf20Sopenharmony_ci#define S9_P1_MASK_BKP 0xfc0 1228c2ecf20Sopenharmony_ci#define S10_P1_MASK 0xfc0 1238c2ecf20Sopenharmony_ci#define S10_P1_MASK_BKP 0x3f000 1248c2ecf20Sopenharmony_ci#define CAL_SEL_0_1 0xc0000000 1258c2ecf20Sopenharmony_ci#define CAL_SEL_2 0x40000000 1268c2ecf20Sopenharmony_ci#define CAL_SEL_SHIFT 30 1278c2ecf20Sopenharmony_ci#define CAL_SEL_SHIFT_2 28 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci#define S0_P1_SHIFT 8 1308c2ecf20Sopenharmony_ci#define S1_P1_SHIFT 14 1318c2ecf20Sopenharmony_ci#define S2_P1_SHIFT 20 1328c2ecf20Sopenharmony_ci#define S3_P1_SHIFT 26 1338c2ecf20Sopenharmony_ci#define S5_P1_SHIFT 6 1348c2ecf20Sopenharmony_ci#define S6_P1_SHIFT 12 1358c2ecf20Sopenharmony_ci#define S7_P1_SHIFT 18 1368c2ecf20Sopenharmony_ci#define S8_P1_SHIFT 24 1378c2ecf20Sopenharmony_ci#define S9_P1_BKP_SHIFT 6 1388c2ecf20Sopenharmony_ci#define S10_P1_SHIFT 6 1398c2ecf20Sopenharmony_ci#define S10_P1_BKP_SHIFT 12 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci#define BASE2_SHIFT 12 1428c2ecf20Sopenharmony_ci#define BASE2_BKP_SHIFT 18 1438c2ecf20Sopenharmony_ci#define S0_P2_SHIFT 20 1448c2ecf20Sopenharmony_ci#define S0_P2_BKP_SHIFT 26 1458c2ecf20Sopenharmony_ci#define S1_P2_SHIFT 26 1468c2ecf20Sopenharmony_ci#define S2_P2_BKP_SHIFT 6 1478c2ecf20Sopenharmony_ci#define S3_P2_SHIFT 6 1488c2ecf20Sopenharmony_ci#define S3_P2_BKP_SHIFT 12 1498c2ecf20Sopenharmony_ci#define S4_P2_SHIFT 12 1508c2ecf20Sopenharmony_ci#define S4_P2_BKP_SHIFT 18 1518c2ecf20Sopenharmony_ci#define S5_P2_SHIFT 18 1528c2ecf20Sopenharmony_ci#define S5_P2_BKP_SHIFT 24 1538c2ecf20Sopenharmony_ci#define S6_P2_SHIFT 24 1548c2ecf20Sopenharmony_ci#define S7_P2_BKP_SHIFT 6 1558c2ecf20Sopenharmony_ci#define S8_P2_SHIFT 6 1568c2ecf20Sopenharmony_ci#define S8_P2_BKP_SHIFT 12 1578c2ecf20Sopenharmony_ci#define S9_P2_SHIFT 12 1588c2ecf20Sopenharmony_ci#define S9_P2_BKP_SHIFT 18 1598c2ecf20Sopenharmony_ci#define S10_P2_SHIFT 18 1608c2ecf20Sopenharmony_ci#define S10_P2_BKP_SHIFT 24 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci#define BASE2_MASK 0xff000 1638c2ecf20Sopenharmony_ci#define BASE2_BKP_MASK 0xfc0000 1648c2ecf20Sopenharmony_ci#define S0_P2_MASK 0x3f00000 1658c2ecf20Sopenharmony_ci#define S0_P2_BKP_MASK 0xfc000000 1668c2ecf20Sopenharmony_ci#define S1_P2_MASK 0xfc000000 1678c2ecf20Sopenharmony_ci#define S1_P2_BKP_MASK 0x3f 1688c2ecf20Sopenharmony_ci#define S2_P2_MASK 0x3f 1698c2ecf20Sopenharmony_ci#define S2_P2_BKP_MASK 0xfc0 1708c2ecf20Sopenharmony_ci#define S3_P2_MASK 0xfc0 1718c2ecf20Sopenharmony_ci#define S3_P2_BKP_MASK 0x3f000 1728c2ecf20Sopenharmony_ci#define S4_P2_MASK 0x3f000 1738c2ecf20Sopenharmony_ci#define S4_P2_BKP_MASK 0xfc0000 1748c2ecf20Sopenharmony_ci#define S5_P2_MASK 0xfc0000 1758c2ecf20Sopenharmony_ci#define S5_P2_BKP_MASK 0x3f000000 1768c2ecf20Sopenharmony_ci#define S6_P2_MASK 0x3f000000 1778c2ecf20Sopenharmony_ci#define S6_P2_BKP_MASK 0x3f 1788c2ecf20Sopenharmony_ci#define S7_P2_MASK 0x3f 1798c2ecf20Sopenharmony_ci#define S7_P2_BKP_MASK 0xfc0 1808c2ecf20Sopenharmony_ci#define S8_P2_MASK 0xfc0 1818c2ecf20Sopenharmony_ci#define S8_P2_BKP_MASK 0x3f000 1828c2ecf20Sopenharmony_ci#define S9_P2_MASK 0x3f000 1838c2ecf20Sopenharmony_ci#define S9_P2_BKP_MASK 0xfc0000 1848c2ecf20Sopenharmony_ci#define S10_P2_MASK 0xfc0000 1858c2ecf20Sopenharmony_ci#define S10_P2_BKP_MASK 0x3f000000 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci#define BKP_SEL 0x3 1888c2ecf20Sopenharmony_ci#define BKP_REDUN_SEL 0xe0000000 1898c2ecf20Sopenharmony_ci#define BKP_REDUN_SHIFT 29 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci#define BIT_APPEND 0x3 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cistatic int calibrate_8916(struct tsens_priv *priv) 1948c2ecf20Sopenharmony_ci{ 1958c2ecf20Sopenharmony_ci int base0 = 0, base1 = 0, i; 1968c2ecf20Sopenharmony_ci u32 p1[5], p2[5]; 1978c2ecf20Sopenharmony_ci int mode = 0; 1988c2ecf20Sopenharmony_ci u32 *qfprom_cdata, *qfprom_csel; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib"); 2018c2ecf20Sopenharmony_ci if (IS_ERR(qfprom_cdata)) 2028c2ecf20Sopenharmony_ci return PTR_ERR(qfprom_cdata); 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci qfprom_csel = (u32 *)qfprom_read(priv->dev, "calib_sel"); 2058c2ecf20Sopenharmony_ci if (IS_ERR(qfprom_csel)) { 2068c2ecf20Sopenharmony_ci kfree(qfprom_cdata); 2078c2ecf20Sopenharmony_ci return PTR_ERR(qfprom_csel); 2088c2ecf20Sopenharmony_ci } 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci mode = (qfprom_csel[0] & MSM8916_CAL_SEL_MASK) >> MSM8916_CAL_SEL_SHIFT; 2118c2ecf20Sopenharmony_ci dev_dbg(priv->dev, "calibration mode is %d\n", mode); 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci switch (mode) { 2148c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 2158c2ecf20Sopenharmony_ci base1 = (qfprom_cdata[1] & MSM8916_BASE1_MASK) >> MSM8916_BASE1_SHIFT; 2168c2ecf20Sopenharmony_ci p2[0] = (qfprom_cdata[0] & MSM8916_S0_P2_MASK) >> MSM8916_S0_P2_SHIFT; 2178c2ecf20Sopenharmony_ci p2[1] = (qfprom_cdata[0] & MSM8916_S1_P2_MASK) >> MSM8916_S1_P2_SHIFT; 2188c2ecf20Sopenharmony_ci p2[2] = (qfprom_cdata[1] & MSM8916_S2_P2_MASK) >> MSM8916_S2_P2_SHIFT; 2198c2ecf20Sopenharmony_ci p2[3] = (qfprom_cdata[1] & MSM8916_S3_P2_MASK) >> MSM8916_S3_P2_SHIFT; 2208c2ecf20Sopenharmony_ci p2[4] = (qfprom_cdata[1] & MSM8916_S4_P2_MASK) >> MSM8916_S4_P2_SHIFT; 2218c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 2228c2ecf20Sopenharmony_ci p2[i] = ((base1 + p2[i]) << 3); 2238c2ecf20Sopenharmony_ci fallthrough; 2248c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 2258c2ecf20Sopenharmony_ci base0 = (qfprom_cdata[0] & MSM8916_BASE0_MASK); 2268c2ecf20Sopenharmony_ci p1[0] = (qfprom_cdata[0] & MSM8916_S0_P1_MASK) >> MSM8916_S0_P1_SHIFT; 2278c2ecf20Sopenharmony_ci p1[1] = (qfprom_cdata[0] & MSM8916_S1_P1_MASK) >> MSM8916_S1_P1_SHIFT; 2288c2ecf20Sopenharmony_ci p1[2] = (qfprom_cdata[0] & MSM8916_S2_P1_MASK) >> MSM8916_S2_P1_SHIFT; 2298c2ecf20Sopenharmony_ci p1[3] = (qfprom_cdata[1] & MSM8916_S3_P1_MASK) >> MSM8916_S3_P1_SHIFT; 2308c2ecf20Sopenharmony_ci p1[4] = (qfprom_cdata[1] & MSM8916_S4_P1_MASK) >> MSM8916_S4_P1_SHIFT; 2318c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 2328c2ecf20Sopenharmony_ci p1[i] = (((base0) + p1[i]) << 3); 2338c2ecf20Sopenharmony_ci break; 2348c2ecf20Sopenharmony_ci default: 2358c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 2368c2ecf20Sopenharmony_ci p1[i] = 500; 2378c2ecf20Sopenharmony_ci p2[i] = 780; 2388c2ecf20Sopenharmony_ci } 2398c2ecf20Sopenharmony_ci break; 2408c2ecf20Sopenharmony_ci } 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci compute_intercept_slope(priv, p1, p2, mode); 2438c2ecf20Sopenharmony_ci kfree(qfprom_cdata); 2448c2ecf20Sopenharmony_ci kfree(qfprom_csel); 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci return 0; 2478c2ecf20Sopenharmony_ci} 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_cistatic int calibrate_8939(struct tsens_priv *priv) 2508c2ecf20Sopenharmony_ci{ 2518c2ecf20Sopenharmony_ci int base0 = 0, base1 = 0, i; 2528c2ecf20Sopenharmony_ci u32 p1[10], p2[10]; 2538c2ecf20Sopenharmony_ci int mode = 0; 2548c2ecf20Sopenharmony_ci u32 *qfprom_cdata; 2558c2ecf20Sopenharmony_ci u32 cdata[6]; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib"); 2588c2ecf20Sopenharmony_ci if (IS_ERR(qfprom_cdata)) 2598c2ecf20Sopenharmony_ci return PTR_ERR(qfprom_cdata); 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci /* Mapping between qfprom nvmem and calibration data */ 2628c2ecf20Sopenharmony_ci cdata[0] = qfprom_cdata[12]; 2638c2ecf20Sopenharmony_ci cdata[1] = qfprom_cdata[13]; 2648c2ecf20Sopenharmony_ci cdata[2] = qfprom_cdata[0]; 2658c2ecf20Sopenharmony_ci cdata[3] = qfprom_cdata[1]; 2668c2ecf20Sopenharmony_ci cdata[4] = qfprom_cdata[22]; 2678c2ecf20Sopenharmony_ci cdata[5] = qfprom_cdata[21]; 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci mode = (cdata[0] & MSM8939_CAL_SEL_MASK) >> MSM8939_CAL_SEL_SHIFT; 2708c2ecf20Sopenharmony_ci dev_dbg(priv->dev, "calibration mode is %d\n", mode); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci switch (mode) { 2738c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 2748c2ecf20Sopenharmony_ci base1 = (cdata[3] & MSM8939_BASE1_MASK) >> MSM8939_BASE1_SHIFT; 2758c2ecf20Sopenharmony_ci p2[0] = (cdata[0] & MSM8939_S0_P2_MASK) >> MSM8939_S0_P2_SHIFT; 2768c2ecf20Sopenharmony_ci p2[1] = (cdata[0] & MSM8939_S1_P2_MASK) >> MSM8939_S1_P2_SHIFT; 2778c2ecf20Sopenharmony_ci p2[2] = (cdata[1] & MSM8939_S2_P2_MASK) >> MSM8939_S2_P2_SHIFT; 2788c2ecf20Sopenharmony_ci p2[3] = (cdata[1] & MSM8939_S3_P2_MASK) >> MSM8939_S3_P2_SHIFT; 2798c2ecf20Sopenharmony_ci p2[4] = (cdata[1] & MSM8939_S4_P2_MASK) >> MSM8939_S4_P2_SHIFT; 2808c2ecf20Sopenharmony_ci p2[5] = (cdata[2] & MSM8939_S5_P2_MASK) >> MSM8939_S5_P2_SHIFT; 2818c2ecf20Sopenharmony_ci p2[6] = (cdata[2] & MSM8939_S6_P2_MASK) >> MSM8939_S6_P2_SHIFT; 2828c2ecf20Sopenharmony_ci p2[7] = (cdata[3] & MSM8939_S7_P2_MASK) >> MSM8939_S7_P2_SHIFT; 2838c2ecf20Sopenharmony_ci p2[8] = (cdata[3] & MSM8939_S8_P2_MASK) >> MSM8939_S8_P2_SHIFT; 2848c2ecf20Sopenharmony_ci p2[9] = (cdata[4] & MSM8939_S9_P2_MASK_0_4) >> MSM8939_S9_P2_SHIFT_0_4; 2858c2ecf20Sopenharmony_ci p2[9] |= ((cdata[5] & MSM8939_S9_P2_MASK_5) >> MSM8939_S9_P2_SHIFT_5) << 5; 2868c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 2878c2ecf20Sopenharmony_ci p2[i] = (base1 + p2[i]) << 2; 2888c2ecf20Sopenharmony_ci fallthrough; 2898c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 2908c2ecf20Sopenharmony_ci base0 = (cdata[2] & MSM8939_BASE0_MASK) >> MSM8939_BASE0_SHIFT; 2918c2ecf20Sopenharmony_ci p1[0] = (cdata[0] & MSM8939_S0_P1_MASK) >> MSM8939_S0_P1_SHIFT; 2928c2ecf20Sopenharmony_ci p1[1] = (cdata[0] & MSM8939_S1_P1_MASK) >> MSM8939_S1_P1_SHIFT; 2938c2ecf20Sopenharmony_ci p1[2] = (cdata[0] & MSM8939_S2_P1_MASK_0_4) >> MSM8939_S2_P1_SHIFT_0_4; 2948c2ecf20Sopenharmony_ci p1[2] |= ((cdata[1] & MSM8939_S2_P1_MASK_5) >> MSM8939_S2_P1_SHIFT_5) << 5; 2958c2ecf20Sopenharmony_ci p1[3] = (cdata[1] & MSM8939_S3_P1_MASK) >> MSM8939_S3_P1_SHIFT; 2968c2ecf20Sopenharmony_ci p1[4] = (cdata[1] & MSM8939_S4_P1_MASK) >> MSM8939_S4_P1_SHIFT; 2978c2ecf20Sopenharmony_ci p1[5] = (cdata[2] & MSM8939_S5_P1_MASK) >> MSM8939_S5_P1_SHIFT; 2988c2ecf20Sopenharmony_ci p1[6] = (cdata[2] & MSM8939_S6_P1_MASK) >> MSM8939_S6_P1_SHIFT; 2998c2ecf20Sopenharmony_ci p1[7] = (cdata[3] & MSM8939_S7_P1_MASK) >> MSM8939_S7_P1_SHIFT; 3008c2ecf20Sopenharmony_ci p1[8] = (cdata[3] & MSM8939_S8_P1_MASK) >> MSM8939_S8_P1_SHIFT; 3018c2ecf20Sopenharmony_ci p1[9] = (cdata[4] & MSM8939_S9_P1_MASK) >> MSM8939_S9_P1_SHIFT; 3028c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 3038c2ecf20Sopenharmony_ci p1[i] = ((base0) + p1[i]) << 2; 3048c2ecf20Sopenharmony_ci break; 3058c2ecf20Sopenharmony_ci default: 3068c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 3078c2ecf20Sopenharmony_ci p1[i] = 500; 3088c2ecf20Sopenharmony_ci p2[i] = 780; 3098c2ecf20Sopenharmony_ci } 3108c2ecf20Sopenharmony_ci break; 3118c2ecf20Sopenharmony_ci } 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci compute_intercept_slope(priv, p1, p2, mode); 3148c2ecf20Sopenharmony_ci kfree(qfprom_cdata); 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci return 0; 3178c2ecf20Sopenharmony_ci} 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_cistatic int calibrate_8974(struct tsens_priv *priv) 3208c2ecf20Sopenharmony_ci{ 3218c2ecf20Sopenharmony_ci int base1 = 0, base2 = 0, i; 3228c2ecf20Sopenharmony_ci u32 p1[11], p2[11]; 3238c2ecf20Sopenharmony_ci int mode = 0; 3248c2ecf20Sopenharmony_ci u32 *calib, *bkp; 3258c2ecf20Sopenharmony_ci u32 calib_redun_sel; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci calib = (u32 *)qfprom_read(priv->dev, "calib"); 3288c2ecf20Sopenharmony_ci if (IS_ERR(calib)) 3298c2ecf20Sopenharmony_ci return PTR_ERR(calib); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci bkp = (u32 *)qfprom_read(priv->dev, "calib_backup"); 3328c2ecf20Sopenharmony_ci if (IS_ERR(bkp)) { 3338c2ecf20Sopenharmony_ci kfree(calib); 3348c2ecf20Sopenharmony_ci return PTR_ERR(bkp); 3358c2ecf20Sopenharmony_ci } 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci calib_redun_sel = bkp[1] & BKP_REDUN_SEL; 3388c2ecf20Sopenharmony_ci calib_redun_sel >>= BKP_REDUN_SHIFT; 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci if (calib_redun_sel == BKP_SEL) { 3418c2ecf20Sopenharmony_ci mode = (calib[4] & CAL_SEL_0_1) >> CAL_SEL_SHIFT; 3428c2ecf20Sopenharmony_ci mode |= (calib[5] & CAL_SEL_2) >> CAL_SEL_SHIFT_2; 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci switch (mode) { 3458c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 3468c2ecf20Sopenharmony_ci base2 = (bkp[2] & BASE2_BKP_MASK) >> BASE2_BKP_SHIFT; 3478c2ecf20Sopenharmony_ci p2[0] = (bkp[2] & S0_P2_BKP_MASK) >> S0_P2_BKP_SHIFT; 3488c2ecf20Sopenharmony_ci p2[1] = (bkp[3] & S1_P2_BKP_MASK); 3498c2ecf20Sopenharmony_ci p2[2] = (bkp[3] & S2_P2_BKP_MASK) >> S2_P2_BKP_SHIFT; 3508c2ecf20Sopenharmony_ci p2[3] = (bkp[3] & S3_P2_BKP_MASK) >> S3_P2_BKP_SHIFT; 3518c2ecf20Sopenharmony_ci p2[4] = (bkp[3] & S4_P2_BKP_MASK) >> S4_P2_BKP_SHIFT; 3528c2ecf20Sopenharmony_ci p2[5] = (calib[4] & S5_P2_BKP_MASK) >> S5_P2_BKP_SHIFT; 3538c2ecf20Sopenharmony_ci p2[6] = (calib[5] & S6_P2_BKP_MASK); 3548c2ecf20Sopenharmony_ci p2[7] = (calib[5] & S7_P2_BKP_MASK) >> S7_P2_BKP_SHIFT; 3558c2ecf20Sopenharmony_ci p2[8] = (calib[5] & S8_P2_BKP_MASK) >> S8_P2_BKP_SHIFT; 3568c2ecf20Sopenharmony_ci p2[9] = (calib[5] & S9_P2_BKP_MASK) >> S9_P2_BKP_SHIFT; 3578c2ecf20Sopenharmony_ci p2[10] = (calib[5] & S10_P2_BKP_MASK) >> S10_P2_BKP_SHIFT; 3588c2ecf20Sopenharmony_ci fallthrough; 3598c2ecf20Sopenharmony_ci case ONE_PT_CALIB: 3608c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 3618c2ecf20Sopenharmony_ci base1 = bkp[0] & BASE1_MASK; 3628c2ecf20Sopenharmony_ci p1[0] = (bkp[0] & S0_P1_MASK) >> S0_P1_SHIFT; 3638c2ecf20Sopenharmony_ci p1[1] = (bkp[0] & S1_P1_MASK) >> S1_P1_SHIFT; 3648c2ecf20Sopenharmony_ci p1[2] = (bkp[0] & S2_P1_MASK) >> S2_P1_SHIFT; 3658c2ecf20Sopenharmony_ci p1[3] = (bkp[0] & S3_P1_MASK) >> S3_P1_SHIFT; 3668c2ecf20Sopenharmony_ci p1[4] = (bkp[1] & S4_P1_MASK); 3678c2ecf20Sopenharmony_ci p1[5] = (bkp[1] & S5_P1_MASK) >> S5_P1_SHIFT; 3688c2ecf20Sopenharmony_ci p1[6] = (bkp[1] & S6_P1_MASK) >> S6_P1_SHIFT; 3698c2ecf20Sopenharmony_ci p1[7] = (bkp[1] & S7_P1_MASK) >> S7_P1_SHIFT; 3708c2ecf20Sopenharmony_ci p1[8] = (bkp[2] & S8_P1_MASK_BKP) >> S8_P1_SHIFT; 3718c2ecf20Sopenharmony_ci p1[9] = (bkp[2] & S9_P1_MASK_BKP) >> S9_P1_BKP_SHIFT; 3728c2ecf20Sopenharmony_ci p1[10] = (bkp[2] & S10_P1_MASK_BKP) >> S10_P1_BKP_SHIFT; 3738c2ecf20Sopenharmony_ci break; 3748c2ecf20Sopenharmony_ci } 3758c2ecf20Sopenharmony_ci } else { 3768c2ecf20Sopenharmony_ci mode = (calib[1] & CAL_SEL_0_1) >> CAL_SEL_SHIFT; 3778c2ecf20Sopenharmony_ci mode |= (calib[3] & CAL_SEL_2) >> CAL_SEL_SHIFT_2; 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci switch (mode) { 3808c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 3818c2ecf20Sopenharmony_ci base2 = (calib[2] & BASE2_MASK) >> BASE2_SHIFT; 3828c2ecf20Sopenharmony_ci p2[0] = (calib[2] & S0_P2_MASK) >> S0_P2_SHIFT; 3838c2ecf20Sopenharmony_ci p2[1] = (calib[2] & S1_P2_MASK) >> S1_P2_SHIFT; 3848c2ecf20Sopenharmony_ci p2[2] = (calib[3] & S2_P2_MASK); 3858c2ecf20Sopenharmony_ci p2[3] = (calib[3] & S3_P2_MASK) >> S3_P2_SHIFT; 3868c2ecf20Sopenharmony_ci p2[4] = (calib[3] & S4_P2_MASK) >> S4_P2_SHIFT; 3878c2ecf20Sopenharmony_ci p2[5] = (calib[3] & S5_P2_MASK) >> S5_P2_SHIFT; 3888c2ecf20Sopenharmony_ci p2[6] = (calib[3] & S6_P2_MASK) >> S6_P2_SHIFT; 3898c2ecf20Sopenharmony_ci p2[7] = (calib[4] & S7_P2_MASK); 3908c2ecf20Sopenharmony_ci p2[8] = (calib[4] & S8_P2_MASK) >> S8_P2_SHIFT; 3918c2ecf20Sopenharmony_ci p2[9] = (calib[4] & S9_P2_MASK) >> S9_P2_SHIFT; 3928c2ecf20Sopenharmony_ci p2[10] = (calib[4] & S10_P2_MASK) >> S10_P2_SHIFT; 3938c2ecf20Sopenharmony_ci fallthrough; 3948c2ecf20Sopenharmony_ci case ONE_PT_CALIB: 3958c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 3968c2ecf20Sopenharmony_ci base1 = calib[0] & BASE1_MASK; 3978c2ecf20Sopenharmony_ci p1[0] = (calib[0] & S0_P1_MASK) >> S0_P1_SHIFT; 3988c2ecf20Sopenharmony_ci p1[1] = (calib[0] & S1_P1_MASK) >> S1_P1_SHIFT; 3998c2ecf20Sopenharmony_ci p1[2] = (calib[0] & S2_P1_MASK) >> S2_P1_SHIFT; 4008c2ecf20Sopenharmony_ci p1[3] = (calib[0] & S3_P1_MASK) >> S3_P1_SHIFT; 4018c2ecf20Sopenharmony_ci p1[4] = (calib[1] & S4_P1_MASK); 4028c2ecf20Sopenharmony_ci p1[5] = (calib[1] & S5_P1_MASK) >> S5_P1_SHIFT; 4038c2ecf20Sopenharmony_ci p1[6] = (calib[1] & S6_P1_MASK) >> S6_P1_SHIFT; 4048c2ecf20Sopenharmony_ci p1[7] = (calib[1] & S7_P1_MASK) >> S7_P1_SHIFT; 4058c2ecf20Sopenharmony_ci p1[8] = (calib[1] & S8_P1_MASK) >> S8_P1_SHIFT; 4068c2ecf20Sopenharmony_ci p1[9] = (calib[2] & S9_P1_MASK); 4078c2ecf20Sopenharmony_ci p1[10] = (calib[2] & S10_P1_MASK) >> S10_P1_SHIFT; 4088c2ecf20Sopenharmony_ci break; 4098c2ecf20Sopenharmony_ci } 4108c2ecf20Sopenharmony_ci } 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci switch (mode) { 4138c2ecf20Sopenharmony_ci case ONE_PT_CALIB: 4148c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 4158c2ecf20Sopenharmony_ci p1[i] += (base1 << 2) | BIT_APPEND; 4168c2ecf20Sopenharmony_ci break; 4178c2ecf20Sopenharmony_ci case TWO_PT_CALIB: 4188c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 4198c2ecf20Sopenharmony_ci p2[i] += base2; 4208c2ecf20Sopenharmony_ci p2[i] <<= 2; 4218c2ecf20Sopenharmony_ci p2[i] |= BIT_APPEND; 4228c2ecf20Sopenharmony_ci } 4238c2ecf20Sopenharmony_ci fallthrough; 4248c2ecf20Sopenharmony_ci case ONE_PT_CALIB2: 4258c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) { 4268c2ecf20Sopenharmony_ci p1[i] += base1; 4278c2ecf20Sopenharmony_ci p1[i] <<= 2; 4288c2ecf20Sopenharmony_ci p1[i] |= BIT_APPEND; 4298c2ecf20Sopenharmony_ci } 4308c2ecf20Sopenharmony_ci break; 4318c2ecf20Sopenharmony_ci default: 4328c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_sensors; i++) 4338c2ecf20Sopenharmony_ci p2[i] = 780; 4348c2ecf20Sopenharmony_ci p1[0] = 502; 4358c2ecf20Sopenharmony_ci p1[1] = 509; 4368c2ecf20Sopenharmony_ci p1[2] = 503; 4378c2ecf20Sopenharmony_ci p1[3] = 509; 4388c2ecf20Sopenharmony_ci p1[4] = 505; 4398c2ecf20Sopenharmony_ci p1[5] = 509; 4408c2ecf20Sopenharmony_ci p1[6] = 507; 4418c2ecf20Sopenharmony_ci p1[7] = 510; 4428c2ecf20Sopenharmony_ci p1[8] = 508; 4438c2ecf20Sopenharmony_ci p1[9] = 509; 4448c2ecf20Sopenharmony_ci p1[10] = 508; 4458c2ecf20Sopenharmony_ci break; 4468c2ecf20Sopenharmony_ci } 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_ci compute_intercept_slope(priv, p1, p2, mode); 4498c2ecf20Sopenharmony_ci kfree(calib); 4508c2ecf20Sopenharmony_ci kfree(bkp); 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci return 0; 4538c2ecf20Sopenharmony_ci} 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci/* v0.1: 8916, 8939, 8974 */ 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_cistatic struct tsens_features tsens_v0_1_feat = { 4588c2ecf20Sopenharmony_ci .ver_major = VER_0_1, 4598c2ecf20Sopenharmony_ci .crit_int = 0, 4608c2ecf20Sopenharmony_ci .adc = 1, 4618c2ecf20Sopenharmony_ci .srot_split = 1, 4628c2ecf20Sopenharmony_ci .max_sensors = 11, 4638c2ecf20Sopenharmony_ci}; 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_cistatic const struct reg_field tsens_v0_1_regfields[MAX_REGFIELDS] = { 4668c2ecf20Sopenharmony_ci /* ----- SROT ------ */ 4678c2ecf20Sopenharmony_ci /* No VERSION information */ 4688c2ecf20Sopenharmony_ci 4698c2ecf20Sopenharmony_ci /* CTRL_OFFSET */ 4708c2ecf20Sopenharmony_ci [TSENS_EN] = REG_FIELD(SROT_CTRL_OFF, 0, 0), 4718c2ecf20Sopenharmony_ci [TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF, 1, 1), 4728c2ecf20Sopenharmony_ci 4738c2ecf20Sopenharmony_ci /* ----- TM ------ */ 4748c2ecf20Sopenharmony_ci /* INTERRUPT ENABLE */ 4758c2ecf20Sopenharmony_ci [INT_EN] = REG_FIELD(TM_INT_EN_OFF, 0, 0), 4768c2ecf20Sopenharmony_ci 4778c2ecf20Sopenharmony_ci /* UPPER/LOWER TEMPERATURE THRESHOLDS */ 4788c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOW_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 0, 9), 4798c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UP_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 10, 19), 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_ci /* UPPER/LOWER INTERRUPTS [CLEAR/STATUS] */ 4828c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOW_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 20, 20), 4838c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UP_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 21, 21), 4848c2ecf20Sopenharmony_ci 4858c2ecf20Sopenharmony_ci /* NO CRITICAL INTERRUPT SUPPORT on v0.1 */ 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_ci /* Sn_STATUS */ 4888c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LAST_TEMP, TM_Sn_STATUS_OFF, 0, 9), 4898c2ecf20Sopenharmony_ci /* No VALID field on v0.1 */ 4908c2ecf20Sopenharmony_ci /* xxx_STATUS bits: 1 == threshold violated */ 4918c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(MIN_STATUS, TM_Sn_STATUS_OFF, 10, 10), 4928c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(LOWER_STATUS, TM_Sn_STATUS_OFF, 11, 11), 4938c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(UPPER_STATUS, TM_Sn_STATUS_OFF, 12, 12), 4948c2ecf20Sopenharmony_ci /* No CRITICAL field on v0.1 */ 4958c2ecf20Sopenharmony_ci REG_FIELD_FOR_EACH_SENSOR11(MAX_STATUS, TM_Sn_STATUS_OFF, 13, 13), 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci /* TRDY: 1=ready, 0=in progress */ 4988c2ecf20Sopenharmony_ci [TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0), 4998c2ecf20Sopenharmony_ci}; 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_8916 = { 5028c2ecf20Sopenharmony_ci .init = init_common, 5038c2ecf20Sopenharmony_ci .calibrate = calibrate_8916, 5048c2ecf20Sopenharmony_ci .get_temp = get_temp_common, 5058c2ecf20Sopenharmony_ci}; 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_cistruct tsens_plat_data data_8916 = { 5088c2ecf20Sopenharmony_ci .num_sensors = 5, 5098c2ecf20Sopenharmony_ci .ops = &ops_8916, 5108c2ecf20Sopenharmony_ci .hw_ids = (unsigned int []){0, 1, 2, 4, 5 }, 5118c2ecf20Sopenharmony_ci 5128c2ecf20Sopenharmony_ci .feat = &tsens_v0_1_feat, 5138c2ecf20Sopenharmony_ci .fields = tsens_v0_1_regfields, 5148c2ecf20Sopenharmony_ci}; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_8939 = { 5178c2ecf20Sopenharmony_ci .init = init_common, 5188c2ecf20Sopenharmony_ci .calibrate = calibrate_8939, 5198c2ecf20Sopenharmony_ci .get_temp = get_temp_common, 5208c2ecf20Sopenharmony_ci}; 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_cistruct tsens_plat_data data_8939 = { 5238c2ecf20Sopenharmony_ci .num_sensors = 10, 5248c2ecf20Sopenharmony_ci .ops = &ops_8939, 5258c2ecf20Sopenharmony_ci .hw_ids = (unsigned int []){ 0, 1, 2, 3, 5, 6, 7, 8, 9, 10 }, 5268c2ecf20Sopenharmony_ci 5278c2ecf20Sopenharmony_ci .feat = &tsens_v0_1_feat, 5288c2ecf20Sopenharmony_ci .fields = tsens_v0_1_regfields, 5298c2ecf20Sopenharmony_ci}; 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_cistatic const struct tsens_ops ops_8974 = { 5328c2ecf20Sopenharmony_ci .init = init_common, 5338c2ecf20Sopenharmony_ci .calibrate = calibrate_8974, 5348c2ecf20Sopenharmony_ci .get_temp = get_temp_common, 5358c2ecf20Sopenharmony_ci}; 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_cistruct tsens_plat_data data_8974 = { 5388c2ecf20Sopenharmony_ci .num_sensors = 11, 5398c2ecf20Sopenharmony_ci .ops = &ops_8974, 5408c2ecf20Sopenharmony_ci .feat = &tsens_v0_1_feat, 5418c2ecf20Sopenharmony_ci .fields = tsens_v0_1_regfields, 5428c2ecf20Sopenharmony_ci}; 543