Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50529e0a authored by Rama Krishna Phani A's avatar Rama Krishna Phani A
Browse files

thermal: tsens: Update msm8952 TSENS fuse map



Update the msm8952 fuse map to accommodate the new TSENS
fuse bit allocations.

Update the DT document to add missing DT compatible string
for 8952 compatible string support.

Change-Id: Ib49b3f8168a197b4a01e8b04b95e77ea8d0a1f4c
Signed-off-by: default avatarRama Krishna Phani A <rphani@codeaurora.org>
parent 1779195e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ Required properties:
	       should be "qcom,msm8916-tsens" for 8916 TSENS driver.
	       should be "qcom,msm8939-tsens" for 8939 TSENS driver.
	       should be "qcom,msm8909-tsens" for 8909 TSENS driver.
	       should be "qcom,msm8952-tsens" for 8952 TSENS driver.
	       should be "qcom,msmzirc-tsens" for zirc TSENS driver.
	       The compatible property is used to identify the respective fusemap to use
	       for the corresponding SoC.
+391 −0
Original line number Diff line number Diff line
@@ -555,6 +555,87 @@
#define TSENS4_OFFSET_ZIRC_MASK		0xf0
#define TSENS4_OFFSET_ZIRC_SHIFT	4

#define TSENS_MSM8952_BASE0_MASK                0x000000ff
#define TSENS_MSM8952_BASE1_MASK                0xff000000

#define TSENS0_MSM8952_POINT1_MASK              0x000001f8
#define TSENS1_MSM8952_POINT1_MASK              0x001f8000
#define TSENS2_MSM8952_POINT1_MASK_0_4          0xf8000000
#define TSENS2_MSM8952_POINT1_MASK_5            0x00000001
#define TSENS3_MSM8952_POINT1_MASK              0x00001f80
#define TSENS4_MSM8952_POINT1_MASK              0x01f80000
#define TSENS5_MSM8952_POINT1_MASK              0x00003f00
#define TSENS6_MSM8952_POINT1_MASK              0x03f00000
#define TSENS7_MSM8952_POINT1_MASK              0x0000003f
#define TSENS8_MSM8952_POINT1_MASK              0x0003f000
#define TSENS9_MSM8952_POINT1_MASK              0x0000003f
#define TSENS10_MSM8952_POINT1_MASK             0x0003f000

#define TSENS0_MSM8952_POINT2_MASK              0x00007e00
#define TSENS1_MSM8952_POINT2_MASK              0x07e00000
#define TSENS2_MSM8952_POINT2_MASK              0x0000007e
#define TSENS3_MSM8952_POINT2_MASK              0x0007e000
#define TSENS4_MSM8952_POINT2_MASK              0x7e000000
#define TSENS5_MSM8952_POINT2_MASK              0x000fc000
#define TSENS6_MSM8952_POINT2_MASK              0xfc000000
#define TSENS7_MSM8952_POINT2_MASK              0x00000fc0
#define TSENS8_MSM8952_POINT2_MASK              0x00fc0000
#define TSENS9_MSM8952_POINT2_MASK              0x00000fc0
#define TSENS10_MSM8952_POINT2_MASK             0x00fc0000

#define TSENS_MSM8952_TSENS_CAL_SEL     0x00000007
#define TSENS_MSM8952_BASE1_SHIFT       24

#define TSENS0_MSM8952_POINT1_SHIFT     3
#define TSENS1_MSM8952_POINT1_SHIFT     15
#define TSENS2_MSM8952_POINT1_SHIFT_0_4 27
#define TSENS2_MSM8952_POINT1_SHIFT_5   5
#define TSENS3_MSM8952_POINT1_SHIFT     7
#define TSENS4_MSM8952_POINT1_SHIFT     19
#define TSENS5_MSM8952_POINT1_SHIFT     8
#define TSENS6_MSM8952_POINT1_SHIFT     20
#define TSENS8_MSM8952_POINT1_SHIFT     12
#define TSENS10_MSM8952_POINT1_SHIFT    12

#define TSENS0_MSM8952_POINT2_SHIFT     9
#define TSENS1_MSM8952_POINT2_SHIFT     21
#define TSENS2_MSM8952_POINT2_SHIFT     1
#define TSENS3_MSM8952_POINT2_SHIFT     13
#define TSENS4_MSM8952_POINT2_SHIFT     25
#define TSENS5_MSM8952_POINT2_SHIFT     14
#define TSENS6_MSM8952_POINT2_SHIFT     26
#define TSENS7_MSM8952_POINT2_SHIFT     6
#define TSENS8_MSM8952_POINT2_SHIFT     18
#define TSENS9_MSM8952_POINT2_SHIFT     6
#define TSENS10_MSM8952_POINT2_SHIFT    18

#define TSENS_TWO_POINT_CALIB_N_WA			0x6
#define TSENS_TWO_POINT_CALIB_N_OFFSET_WA		0x7

#define TSENS_MSM8952_D30_WA_S0   2
#define TSENS_MSM8952_D30_WA_S1   4
#define TSENS_MSM8952_D30_WA_S2   4
#define TSENS_MSM8952_D30_WA_S3   1
#define TSENS_MSM8952_D30_WA_S4   2
#define TSENS_MSM8952_D30_WA_S5   1
#define TSENS_MSM8952_D30_WA_S7   3
#define TSENS_MSM8952_D30_WA_S8   2
#define TSENS_MSM8952_D30_WA_S10  3

#define TSENS_MSM8952_D120_WA_S0  1
#define TSENS_MSM8952_D120_WA_S1  4
#define TSENS_MSM8952_D120_WA_S2  5
#define TSENS_MSM8952_D120_WA_S3  1
#define TSENS_MSM8952_D120_WA_S4  3
#define TSENS_MSM8952_D120_WA_S5  1
#define TSENS_MSM8952_D120_WA_S6  1
#define TSENS_MSM8952_D120_WA_S7  4
#define TSENS_MSM8952_D120_WA_S8  4
#define TSENS_MSM8952_D120_WA_S10 2

#define TSENS_NO_CALIB_POINT1_DATA 500
#define TSENS_NO_CALIB_POINT2_DATA 780

enum tsens_calib_fuse_map_type {
	TSENS_CALIB_FUSE_MAP_8974 = 0,
	TSENS_CALIB_FUSE_MAP_8X26,
@@ -568,6 +649,7 @@ enum tsens_calib_fuse_map_type {
	TSENS_CALIB_FUSE_MAP_MSMZIRC,
	TSENS_CALIB_FUSE_MAP_NONE,
	TSENS_CALIB_FUSE_MAP_8992,
	TSENS_CALIB_FUSE_MAP_MSM8952,
	TSENS_CALIB_FUSE_MAP_NUM,
};

@@ -688,6 +770,9 @@ static struct of_device_id tsens_match[] = {
	{	.compatible = "qcom,msm8992-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_8992,
	},
	{       .compatible = "qcom,msm8952-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_MSM8952,
	},
	{}
};

@@ -1786,6 +1871,310 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev)
	return 0;
}

static int tsens_calib_msm8952_sensors(struct tsens_tm_device *tmdev)
{
	int i, tsens_base0_data = 0, tsens_base1_data = 0;
	int tsens0_point1 = 0, tsens0_point2 = 0;
	int tsens1_point1 = 0, tsens1_point2 = 0;
	int tsens2_point1 = 0, tsens2_point2 = 0;
	int tsens3_point1 = 0, tsens3_point2 = 0;
	int tsens4_point1 = 0, tsens4_point2 = 0;
	int tsens5_point1 = 0, tsens5_point2 = 0;
	int tsens6_point1 = 0, tsens6_point2 = 0;
	int tsens7_point1 = 0, tsens7_point2 = 0;
	int tsens8_point1 = 0, tsens8_point2 = 0;
	int tsens9_point1 = 0, tsens9_point2 = 0;
	int tsens10_point1 = 0, tsens10_point2 = 0;

	int tsens_calibration_mode = 0, temp = 0;
	uint32_t calib_data[5] = {0, 0, 0, 0, 0};
	uint32_t calib_tsens_point1_data[11], calib_tsens_point2_data[11];

	if (!tmdev->calibration_less_mode) {
		calib_data[0] = readl_relaxed(
					TSENS_8939_EEPROM
					(tmdev->tsens_calib_addr) + 0x30);
		calib_data[1] = readl_relaxed(
					(TSENS_8939_EEPROM
					 (tmdev->tsens_calib_addr) + 0x34));
		calib_data[2] = readl_relaxed(
					(TSENS_8939_EEPROM
					 (tmdev->tsens_calib_addr)));
		calib_data[3] = readl_relaxed(
					(TSENS_8939_EEPROM
					 (tmdev->tsens_calib_addr) + 0x4));
		calib_data[4] = readl_relaxed(
					(TSENS_8939_EEPROM
					 (tmdev->tsens_calib_addr) + 0x50));

		tsens_calibration_mode =
				(calib_data[0] &
					TSENS_MSM8952_TSENS_CAL_SEL);

		pr_debug("calib mode is %d\n", tsens_calibration_mode);
	}

	if ((tsens_calibration_mode == TSENS_TWO_POINT_CALIB) ||
		(tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2)) {
		tsens_base0_data = (calib_data[2] &
						TSENS_MSM8952_BASE0_MASK);
		tsens0_point1 = (calib_data[0] &
					TSENS0_MSM8952_POINT1_MASK)
			>> TSENS0_MSM8952_POINT1_SHIFT;
		tsens1_point1 = (calib_data[0] &
					TSENS1_MSM8952_POINT1_MASK)
				>> TSENS1_MSM8952_POINT1_SHIFT;
		tsens2_point1 = (calib_data[0] &
					TSENS2_MSM8952_POINT1_MASK_0_4)
				>> TSENS2_MSM8952_POINT1_SHIFT_0_4;
		temp = (calib_data[1] & TSENS2_MSM8952_POINT1_MASK_5)
				<< TSENS2_MSM8952_POINT1_SHIFT_5;
		tsens2_point1 |= temp;
		tsens3_point1 = (calib_data[1] &
					TSENS3_MSM8952_POINT1_MASK)
				>> TSENS3_MSM8952_POINT1_SHIFT;
		tsens4_point1 = (calib_data[1] &
					TSENS4_MSM8952_POINT1_MASK)
				>> TSENS4_MSM8952_POINT1_SHIFT;
		tsens5_point1 = (calib_data[2] &
					TSENS5_MSM8952_POINT1_MASK)
				>> TSENS5_MSM8952_POINT1_SHIFT;
		tsens6_point1 = (calib_data[2] &
					TSENS6_MSM8952_POINT1_MASK)
				>> TSENS6_MSM8952_POINT1_SHIFT;
		tsens7_point1 = (calib_data[3] &
					TSENS7_MSM8952_POINT1_MASK);
		tsens8_point1 = (calib_data[3] &
					TSENS8_MSM8952_POINT1_MASK)
				>> TSENS8_MSM8952_POINT1_SHIFT;
		tsens9_point1 = (calib_data[4] &
					TSENS9_MSM8952_POINT1_MASK);
		tsens10_point1 = (calib_data[4] &
					TSENS10_MSM8952_POINT1_MASK)
				>> TSENS10_MSM8952_POINT1_SHIFT;
	}

	if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) {
		tsens_base1_data = (calib_data[3] &
					TSENS_MSM8952_BASE1_MASK)
				>> TSENS_MSM8952_BASE1_SHIFT;
		tsens0_point2 = (calib_data[0] &
					TSENS0_MSM8952_POINT2_MASK)
				>> TSENS0_MSM8952_POINT2_SHIFT;
		tsens1_point2 = (calib_data[0] &
					TSENS1_MSM8952_POINT2_MASK)
				>> TSENS1_MSM8952_POINT2_SHIFT;
		tsens2_point2 =	(calib_data[1] &
					TSENS2_MSM8952_POINT2_MASK)
				>> TSENS2_MSM8952_POINT2_SHIFT;
		tsens3_point2 = (calib_data[1] &
					TSENS3_MSM8952_POINT2_MASK)
				>> TSENS3_MSM8952_POINT2_SHIFT;
		tsens4_point2 = (calib_data[1] &
					TSENS4_MSM8952_POINT2_MASK)
				>> TSENS4_MSM8952_POINT2_SHIFT;
		tsens5_point2 = (calib_data[2] &
					TSENS5_MSM8952_POINT2_MASK)
				>> TSENS5_MSM8952_POINT2_SHIFT;
		tsens6_point2 = (calib_data[2] &
					TSENS6_MSM8952_POINT2_MASK)
				>> TSENS6_MSM8952_POINT2_SHIFT;
		tsens7_point2 = (calib_data[3] &
					TSENS7_MSM8952_POINT2_MASK)
				>> TSENS7_MSM8952_POINT2_SHIFT;
		tsens8_point2 = (calib_data[3] &
					TSENS8_MSM8952_POINT2_MASK)
				>> TSENS8_MSM8952_POINT2_SHIFT;
		tsens9_point2 = (calib_data[4] &
					TSENS9_MSM8952_POINT2_MASK)
				>> TSENS9_MSM8952_POINT2_SHIFT;
		tsens10_point2 = (calib_data[4] &
					TSENS10_MSM8952_POINT2_MASK)
				>> TSENS10_MSM8952_POINT2_SHIFT;
	}

	if (tsens_calibration_mode == 0) {
		pr_debug("TSENS in calibrationless mode\n");
		for (i = 0; i < tmdev->tsens_num_sensor; i++) {
			calib_tsens_point2_data[i] = TSENS_NO_CALIB_POINT2_DATA;
			calib_tsens_point1_data[i] = TSENS_NO_CALIB_POINT1_DATA;
		}
	}

	if ((tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2) ||
		(tsens_calibration_mode == TSENS_TWO_POINT_CALIB)) {
		calib_tsens_point1_data[0] =
				(((tsens_base0_data) + tsens0_point1) << 2);
		calib_tsens_point1_data[0] = calib_tsens_point1_data[0] +
						TSENS_MSM8952_D30_WA_S0;
		calib_tsens_point1_data[1] =
				(((tsens_base0_data) + tsens1_point1) << 2);
		calib_tsens_point1_data[1] = calib_tsens_point1_data[1] -
						TSENS_MSM8952_D30_WA_S1;
		calib_tsens_point1_data[2] =
				(((tsens_base0_data) + tsens2_point1) << 2);
		calib_tsens_point1_data[2] = calib_tsens_point1_data[2] +
						TSENS_MSM8952_D30_WA_S2;
		calib_tsens_point1_data[3] =
				(((tsens_base0_data) + tsens3_point1) << 2);
		calib_tsens_point1_data[3] = calib_tsens_point1_data[3] +
						TSENS_MSM8952_D30_WA_S3;
		calib_tsens_point1_data[4] =
				(((tsens_base0_data) + tsens4_point1) << 2);
		calib_tsens_point1_data[4] = calib_tsens_point1_data[4] +
						TSENS_MSM8952_D30_WA_S4;
		calib_tsens_point1_data[5] =
				(((tsens_base0_data) + tsens5_point1) << 2);
		calib_tsens_point1_data[5] = calib_tsens_point1_data[5] -
						TSENS_MSM8952_D30_WA_S5;
		calib_tsens_point1_data[6] =
				(((tsens_base0_data) + tsens6_point1) << 2);
		calib_tsens_point1_data[7] =
				(((tsens_base0_data) + tsens7_point1) << 2);
		calib_tsens_point1_data[7] = calib_tsens_point1_data[7] +
						TSENS_MSM8952_D30_WA_S7;
		calib_tsens_point1_data[8] =
				(((tsens_base0_data) + tsens8_point1) << 2);
		calib_tsens_point1_data[8] = calib_tsens_point1_data[8] +
						TSENS_MSM8952_D30_WA_S8;
		calib_tsens_point1_data[9] =
				(((tsens_base0_data) + tsens9_point1) << 2);
		calib_tsens_point1_data[10] =
				(((tsens_base0_data) + tsens10_point1) << 2);
		calib_tsens_point1_data[10] = calib_tsens_point1_data[10] -
						TSENS_MSM8952_D30_WA_S10;
	}

	if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) {
		pr_debug("two point calibration calculation\n");
		calib_tsens_point2_data[0] =
				((tsens_base1_data + tsens0_point2) << 2);
		calib_tsens_point1_data[0] = calib_tsens_point1_data[0] -
						TSENS_MSM8952_D120_WA_S0;
		calib_tsens_point2_data[1] =
				((tsens_base1_data + tsens1_point2) << 2);
		calib_tsens_point1_data[1] = calib_tsens_point1_data[1] -
						TSENS_MSM8952_D120_WA_S1;
		calib_tsens_point2_data[2] =
				((tsens_base1_data + tsens2_point2) << 2);
		calib_tsens_point1_data[2] = calib_tsens_point1_data[2] +
						TSENS_MSM8952_D120_WA_S2;
		calib_tsens_point2_data[3] =
				((tsens_base1_data + tsens3_point2) << 2);
		calib_tsens_point1_data[3] = calib_tsens_point1_data[3] +
						TSENS_MSM8952_D120_WA_S3;
		calib_tsens_point2_data[4] =
				((tsens_base1_data + tsens4_point2) << 2);
		calib_tsens_point1_data[4] = calib_tsens_point1_data[4] +
						TSENS_MSM8952_D120_WA_S4;
		calib_tsens_point2_data[5] =
				((tsens_base1_data + tsens5_point2) << 2);
		calib_tsens_point1_data[5] = calib_tsens_point1_data[5] -
						TSENS_MSM8952_D120_WA_S5;
		calib_tsens_point2_data[6] =
				((tsens_base1_data + tsens6_point2) << 2);
		calib_tsens_point1_data[6] = calib_tsens_point1_data[6] -
						TSENS_MSM8952_D120_WA_S6;
		calib_tsens_point2_data[7] =
				((tsens_base1_data + tsens7_point2) << 2);
		calib_tsens_point1_data[7] = calib_tsens_point1_data[7] +
						TSENS_MSM8952_D120_WA_S7;
		calib_tsens_point2_data[8] =
				((tsens_base1_data + tsens8_point2) << 2);
		calib_tsens_point1_data[8] = calib_tsens_point1_data[8] +
						TSENS_MSM8952_D120_WA_S8;
		calib_tsens_point2_data[9] =
				((tsens_base1_data + tsens9_point2) << 2);
		calib_tsens_point2_data[10] =
				((tsens_base1_data + tsens10_point2) << 2);
		calib_tsens_point1_data[10] = calib_tsens_point1_data[10] -
						TSENS_MSM8952_D120_WA_S10;
	}

	if ((tsens_calibration_mode == TSENS_TWO_POINT_CALIB_N_WA) ||
		(tsens_calibration_mode ==
					TSENS_TWO_POINT_CALIB_N_OFFSET_WA)) {
		calib_tsens_point1_data[0] =
				(((tsens_base0_data) + tsens0_point1) << 2);
		calib_tsens_point1_data[1] =
				(((tsens_base0_data) + tsens1_point1) << 2);
		calib_tsens_point1_data[2] =
				(((tsens_base0_data) + tsens2_point1) << 2);
		calib_tsens_point1_data[3] =
				(((tsens_base0_data) + tsens3_point1) << 2);
		calib_tsens_point1_data[4] =
				(((tsens_base0_data) + tsens4_point1) << 2);
		calib_tsens_point1_data[5] =
				(((tsens_base0_data) + tsens5_point1) << 2);
		calib_tsens_point1_data[6] =
				(((tsens_base0_data) + tsens6_point1) << 2);
		calib_tsens_point1_data[7] =
				(((tsens_base0_data) + tsens7_point1) << 2);
		calib_tsens_point1_data[8] =
				(((tsens_base0_data) + tsens8_point1) << 2);
		calib_tsens_point1_data[9] =
				(((tsens_base0_data) + tsens9_point1) << 2);
		calib_tsens_point1_data[10] =
				(((tsens_base0_data) + tsens10_point1) << 2);
	}

	if ((tsens_calibration_mode == TSENS_TWO_POINT_CALIB_N_WA) ||
		(tsens_calibration_mode ==
					TSENS_TWO_POINT_CALIB_N_OFFSET_WA)) {
		pr_debug("two point calibration calculation\n");
		calib_tsens_point2_data[0] =
				((tsens_base1_data + tsens0_point2) << 2);
		calib_tsens_point2_data[1] =
				((tsens_base1_data + tsens1_point2) << 2);
		calib_tsens_point2_data[2] =
				((tsens_base1_data + tsens2_point2) << 2);
		calib_tsens_point2_data[3] =
				((tsens_base1_data + tsens3_point2) << 2);
		calib_tsens_point2_data[4] =
				((tsens_base1_data + tsens4_point2) << 2);
		calib_tsens_point2_data[5] =
				((tsens_base1_data + tsens5_point2) << 2);
		calib_tsens_point2_data[6] =
				((tsens_base1_data + tsens6_point2) << 2);
		calib_tsens_point2_data[7] =
				((tsens_base1_data + tsens7_point2) << 2);
		calib_tsens_point2_data[8] =
				((tsens_base1_data + tsens8_point2) << 2);
		calib_tsens_point2_data[9] =
				((tsens_base1_data + tsens9_point2) << 2);
		calib_tsens_point2_data[10] =
				((tsens_base1_data + tsens10_point2) << 2);
	}

	for (i = 0; i < tmdev->tsens_num_sensor; i++) {
		int32_t num = 0, den = 0;

		tmdev->sensor[i].calib_data_point2 = calib_tsens_point2_data[i];
		tmdev->sensor[i].calib_data_point1 = calib_tsens_point1_data[i];
		pr_debug("sensor:%d - calib_data_point1:0x%x, calib_data_point2:0x%x\n",
				i, tmdev->sensor[i].calib_data_point1,
				tmdev->sensor[i].calib_data_point2);
		if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) {
			/*
			 * slope (m) = adc_code2 - adc_code1 (y2 - y1)
			 * temp_120_degc - temp_30_degc (x2 - x1)
			 */
			num = tmdev->sensor[i].calib_data_point2 -
					tmdev->sensor[i].calib_data_point1;
			num *= tmdev->tsens_factor;
			den = TSENS_CAL_DEGC_POINT2 - TSENS_CAL_DEGC_POINT1;
			tmdev->sensor[i].slope_mul_tsens_factor = num/den;
		}
		tmdev->sensor[i].offset = (tmdev->sensor[i].calib_data_point1 *
				tmdev->tsens_factor) - (TSENS_CAL_DEGC_POINT1 *
				tmdev->sensor[i].slope_mul_tsens_factor);
		pr_debug("offset:%d and slope:%d\n", tmdev->sensor[i].offset,
				tmdev->sensor[i].slope_mul_tsens_factor);
		tmdev->prev_reading_avail = false;
	}
	return 0;
}

static int tsens_calib_msm8909_sensors(struct tsens_tm_device *tmdev)
{
	int i, tsens_base0_data = 0, tsens_base1_data = 0;
@@ -3735,6 +4124,8 @@ static int tsens_calib_sensors(struct tsens_tm_device *tmdev)
		rc = tsens_calib_msmzirc_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_8992)
		rc = tsens_calib_8992_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8952)
		rc = tsens_calib_msm8952_sensors(tmdev);
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_NONE) {
		pr_debug("Fuse map info not required\n");
		rc = 0;