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