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

Commit 7df95891 authored by Siddartha Mohanadoss's avatar Siddartha Mohanadoss
Browse files

thermal: tsens: Add support for plutonium



Add Calibration masks used to abstract the EFUSE data
and obtain the offsets for each of the sensors. The
offsets are used in the final temperature calculation.

Temperature sensors(TSENS) provides an interface to clients
to read temperature and set thresholds and recieve notification
once the set temperature thresholds are crossed.

Change-Id: I85e631297c8074c094f015ce1bf92c6d2ce08b62
Signed-off-by: default avatarSiddartha Mohanadoss <smohanad@codeaurora.org>
parent 642f1231
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ Required properties:
	       should be "qcom,msm8x26-tsens" for 8x26 TSENS driver.
	       should be "qcom,fsm9900-tsens" for 9900 TSENS driver.
	       should be "qcom,mdm9630-tsens" for 9630 TSENS driver.
	       should be "qcom,msmplutonium-tsens" for Plutonium TSENS driver.
	       The compatible property is used to identify the respective fusemap to use
	       for the corresponding SoC.
- reg : offset and length of the TSENS registers.
+337 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
#define TSENS_TRDY_MASK			BIT(0)

#define TSENS2_SN_STATUS_ADDR(n)	((n) + 0x1044)
#define TSENS2_SN_STATUS_VALID		BIT(14)
#define TSENS2_TRDY_ADDR(n)		((n) + 0x84)

#define TSENS_CTRL_ADDR(n)		(n)
@@ -92,6 +93,14 @@

#define TSENS_8936_EEPROM(n)			((n) + 0xa0)

#define TSENS_PLUTO_EEPROM(n)			((n) + 0xd0)
#define TSENS_PLUTO_EEPROM_REDUN_SEL(n)		((n) + 0x464)
#define TSENS_REDUN_REGION1_EEPROM(n)		((n) + 0x1c0)
#define TSENS_REDUN_REGION2_EEPROM(n)		((n) + 0x1c4)
#define TSENS_REDUN_REGION3_EEPROM(n)		((n) + 0x1cc)
#define TSENS_REDUN_REGION4_EEPROM(n)		((n) + 0x440)
#define TSENS_REDUN_REGION5_EEPROM(n)		((n) + 0x444)

/* TSENS calibration Mask data */
#define TSENS_BASE1_MASK		0xff
#define TSENS0_POINT1_MASK		0x3f00
@@ -330,6 +339,7 @@
#define TSENS1_8916_POINT2_SHIFT	22
#define TSENS3_8916_POINT2_SHIFT	10
#define TSENS4_8916_POINT2_SHIFT	20
#define TSENS_VALID_CNT_2	2

#define TSENS_8936_BASE0_MASK		0x00ff0000
#define TSENS_8936_BASE1_MASK		0xff000000
@@ -383,6 +393,84 @@
#define TSENS7_8936_POINT2_SHIFT_2_5	2
#define TSENS8_8936_POINT2_SHIFT	10

#define TSENS_BASE0_PLUTO_MASK		0x3ff
#define TSENS_BASE1_PLUTO_MASK		0xffc00
#define TSENS_BASE1_PLUTO_SHIFT		10
#define TSENS0_OFFSET_PLUTO_MASK	0xf00000
#define TSENS0_OFFSET_PLUTO_SHIFT	20
#define TSENS1_OFFSET_PLUTO_MASK	0xf000000
#define TSENS1_OFFSET_PLUTO_SHIFT	24
#define TSENS2_OFFSET_PLUTO_MASK	0xf0000000
#define TSENS2_OFFSET_PLUTO_SHIFT	28
#define TSENS3_OFFSET_PLUTO_MASK	0xf
#define TSENS4_OFFSET_PLUTO_MASK	0xf0
#define TSENS4_OFFSET_PLUTO_SHIFT	4
#define TSENS5_OFFSET_PLUTO_MASK	0xf00
#define TSENS5_OFFSET_PLUTO_SHIFT	8
#define TSENS6_OFFSET_PLUTO_MASK	0xf000
#define TSENS6_OFFSET_PLUTO_SHIFT	12
#define TSENS7_OFFSET_PLUTO_MASK	0xf0000
#define TSENS7_OFFSET_PLUTO_SHIFT	16
#define TSENS8_OFFSET_PLUTO_MASK	0xf00000
#define TSENS8_OFFSET_PLUTO_SHIFT	20
#define TSENS9_OFFSET_PLUTO_MASK	0xf000000
#define TSENS9_OFFSET_PLUTO_SHIFT	24
#define TSENS10_OFFSET_PLUTO_MASK	0xf0000000
#define TSENS10_OFFSET_PLUTO_SHIFT	28
#define TSENS11_OFFSET_PLUTO_MASK	0xf
#define TSENS12_OFFSET_PLUTO_MASK	0xf0
#define TSENS12_OFFSET_PLUTO_SHIFT	4
#define TSENS13_OFFSET_PLUTO_MASK	0xf00
#define TSENS13_OFFSET_PLUTO_SHIFT	8
#define TSENS14_OFFSET_PLUTO_MASK	0xf000
#define TSENS14_OFFSET_PLUTO_SHIFT	12
#define TSENS15_OFFSET_PLUTO_MASK	0xf0000
#define TSENS15_OFFSET_PLUTO_SHIFT	16
#define TSENS_PLUTO_CAL_SEL_MASK	0x700000
#define TSENS_PLUTO_CAL_SEL_SHIFT	20

#define TSENS_BASE0_PLUTO_REDUN_MASK		0x7fe00000
#define TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT	21
#define TSENS_BASE1_BIT0_PLUTO_REDUN_MASK	0x80000000
#define TSENS_BASE1_BIT0_SHIFT_COMPUTE		22
#define TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK	0x1ff
#define TSENS0_OFFSET_PLUTO_REDUN_MASK		0x1e00
#define TSENS0_OFFSET_PLUTO_REDUN_SHIFT		9
#define TSENS1_OFFSET_PLUTO_REDUN_MASK		0x1e000
#define TSENS1_OFFSET_PLUTO_REDUN_SHIFT		13
#define TSENS2_OFFSET_PLUTO_REDUN_MASK		0x1e0000
#define TSENS2_OFFSET_PLUTO_REDUN_SHIFT		17
#define TSENS3_OFFSET_PLUTO_REDUN_MASK		0x1e00000
#define TSENS3_OFFSET_PLUTO_REDUN_SHIFT		21
#define TSENS4_OFFSET_PLUTO_REDUN_MASK		0x1e000000
#define TSENS4_OFFSET_PLUTO_REDUN_SHIFT		25
#define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2	0xe0000000
#define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2	29
#define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3	0x800000
#define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3	20
#define TSENS6_OFFSET_PLUTO_REDUN_MASK		0xf000000
#define TSENS6_OFFSET_PLUTO_REDUN_SHIFT		24
#define TSENS7_OFFSET_PLUTO_REDUN_MASK		0xf0000000
#define TSENS7_OFFSET_PLUTO_REDUN_SHIFT		28
#define TSENS8_OFFSET_PLUTO_REDUN_MASK		0xf
#define TSENS9_OFFSET_PLUTO_REDUN_MASK		0xf0
#define TSENS9_OFFSET_PLUTO_REDUN_SHIFT		4
#define TSENS10_OFFSET_PLUTO_REDUN_MASK		0xf00
#define TSENS10_OFFSET_PLUTO_REDUN_SHIFT	8
#define TSENS11_OFFSET_PLUTO_REDUN_MASK		0xf000
#define TSENS11_OFFSET_PLUTO_REDUN_SHIFT	12
#define TSENS12_OFFSET_PLUTO_REDUN_MASK		0xf0000
#define TSENS12_OFFSET_PLUTO_REDUN_SHIFT	16
#define TSENS13_OFFSET_PLUTO_REDUN_MASK		0xf00000
#define TSENS13_OFFSET_PLUTO_REDUN_SHIFT	20
#define TSENS14_OFFSET_PLUTO_REDUN_MASK		0xf000000
#define TSENS14_OFFSET_PLUTO_REDUN_SHIFT	24
#define TSENS15_OFFSET_PLUTO_REDUN_MASK		0xf0000000
#define TSENS15_OFFSET_PLUTO_REDUN_SHIFT	28
#define TSENS_PLUTO_REDUN_SEL_MASK		0x7
#define TSENS_PLUTO_CAL_SEL_REDUN_MASK		0xe0000000
#define TSENS_PLUTO_CAL_SEL_REDUN_SHIFT		29

enum tsens_calib_fuse_map_type {
	TSENS_CALIB_FUSE_MAP_8974 = 0,
	TSENS_CALIB_FUSE_MAP_8X26,
@@ -391,6 +479,7 @@ enum tsens_calib_fuse_map_type {
	TSENS_CALIB_FUSE_MAP_9630,
	TSENS_CALIB_FUSE_MAP_8916,
	TSENS_CALIB_FUSE_MAP_8936,
	TSENS_CALIB_FUSE_MAP_PLUTO,
	TSENS_CALIB_FUSE_MAP_NUM,
};

@@ -1321,6 +1410,249 @@ compute_intercept_slope:
	return 0;
}

static int tsens_calib_pluto_sensors(void)
{
	int i, tsens_base0_data = 0, tsens0_point = 0, tsens1_point = 0;
	int tsens2_point = 0, tsens3_point = 0, tsens4_point = 0;
	int tsens5_point = 0, tsens6_point = 0, tsens7_point = 0;
	int tsens8_point = 0, tsens9_point = 0, tsens10_point = 0;
	int tsens11_point = 0, tsens12_point = 0, tsens13_point = 0;
	int tsens14_point = 0, tsens15_point = 0;
	int tsens_base1_data = 0, calib_mode = 0;
	uint32_t calib_data[6], calib_tsens_point_data[16], calib_redun_sel;

	if (tmdev->calibration_less_mode)
		goto calibration_less_mode;

	calib_redun_sel = readl_relaxed(
			TSENS_PLUTO_EEPROM_REDUN_SEL(tmdev->tsens_calib_addr));
	calib_redun_sel = calib_redun_sel & TSENS_PLUTO_CAL_SEL_REDUN_MASK;
	calib_redun_sel >>= TSENS_PLUTO_CAL_SEL_REDUN_SHIFT;

	if (calib_redun_sel == TSENS_QFPROM_BACKUP_SEL) {
		calib_data[0] = readl_relaxed(
			TSENS_REDUN_REGION1_EEPROM(tmdev->tsens_calib_addr));
		calib_data[1] = readl_relaxed(
			TSENS_REDUN_REGION2_EEPROM(tmdev->tsens_calib_addr));
		calib_data[2] = readl_relaxed(
			TSENS_REDUN_REGION3_EEPROM(tmdev->tsens_calib_addr));
		calib_data[3] = readl_relaxed(
			TSENS_REDUN_REGION4_EEPROM(tmdev->tsens_calib_addr));
		calib_data[4] = readl_relaxed(
			TSENS_REDUN_REGION5_EEPROM(tmdev->tsens_calib_addr));

		calib_mode = (calib_data[4] & TSENS_PLUTO_REDUN_SEL_MASK);
		pr_debug("calib mode is %d\n", calib_mode);
		if (calib_mode == TSENS_TWO_POINT_CALIB) {
			tsens_base0_data = (calib_data[0] &
				TSENS_BASE0_PLUTO_REDUN_MASK) >>
				TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT;
			tsens_base1_data = (calib_data[0] &
				TSENS_BASE1_BIT0_PLUTO_REDUN_MASK) >>
				TSENS_BASE1_BIT0_SHIFT_COMPUTE;
			tsens_base1_data |= (calib_data[1] &
				TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK);
			tsens0_point = (calib_data[1] &
				TSENS0_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS0_OFFSET_PLUTO_REDUN_SHIFT;
			tsens1_point = (calib_data[1] &
				TSENS1_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS1_OFFSET_PLUTO_REDUN_SHIFT;
			tsens2_point = (calib_data[1] &
				TSENS2_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS2_OFFSET_PLUTO_REDUN_SHIFT;
			tsens3_point = (calib_data[1] &
				TSENS3_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS3_OFFSET_PLUTO_REDUN_SHIFT;
			tsens4_point = (calib_data[1] &
				TSENS4_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS4_OFFSET_PLUTO_REDUN_SHIFT;
			tsens5_point = (calib_data[1] &
				TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2) >>
				TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2;
			tsens5_point |= ((calib_data[2] &
				TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3) >>
				TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3);
			tsens6_point = (calib_data[2] &
				TSENS6_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS6_OFFSET_PLUTO_REDUN_SHIFT;
			tsens7_point = (calib_data[2] &
				TSENS7_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS7_OFFSET_PLUTO_REDUN_SHIFT;
			tsens8_point = (calib_data[3] &
				TSENS8_OFFSET_PLUTO_REDUN_MASK);
			tsens9_point = (calib_data[3] &
				TSENS9_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS9_OFFSET_PLUTO_REDUN_SHIFT;
			tsens10_point = (calib_data[3] &
				TSENS10_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS10_OFFSET_PLUTO_REDUN_SHIFT;
			tsens11_point = (calib_data[3] &
				TSENS11_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS11_OFFSET_PLUTO_REDUN_SHIFT;
			tsens12_point = (calib_data[3] &
				TSENS12_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS12_OFFSET_PLUTO_REDUN_SHIFT;
			tsens13_point = (calib_data[3] &
				TSENS13_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS13_OFFSET_PLUTO_REDUN_SHIFT;
			tsens14_point = (calib_data[3] &
				TSENS14_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS14_OFFSET_PLUTO_REDUN_SHIFT;
			tsens15_point = (calib_data[3] &
				TSENS15_OFFSET_PLUTO_REDUN_MASK) >>
				TSENS15_OFFSET_PLUTO_REDUN_SHIFT;
			calib_tsens_point_data[0] = tsens0_point;
			calib_tsens_point_data[1] = tsens1_point;
			calib_tsens_point_data[2] = tsens2_point;
			calib_tsens_point_data[3] = tsens3_point;
			calib_tsens_point_data[4] = tsens4_point;
			calib_tsens_point_data[5] = tsens5_point;
			calib_tsens_point_data[6] = tsens6_point;
			calib_tsens_point_data[7] = tsens7_point;
			calib_tsens_point_data[8] = tsens8_point;
			calib_tsens_point_data[9] = tsens9_point;
			calib_tsens_point_data[10] = tsens10_point;
			calib_tsens_point_data[11] = tsens11_point;
			calib_tsens_point_data[12] = tsens12_point;
			calib_tsens_point_data[13] = tsens13_point;
			calib_tsens_point_data[14] = tsens14_point;
			calib_tsens_point_data[15] = tsens15_point;
		} else
			goto calibration_less_mode;
	} else {
		calib_data[0] = readl_relaxed(
			TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr));
		calib_data[1] = readl_relaxed(
			(TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0X4));
		calib_data[2] = readl_relaxed(
			(TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0x8));

		calib_mode = (calib_data[2] & TSENS_PLUTO_CAL_SEL_MASK) >>
				TSENS_PLUTO_CAL_SEL_SHIFT;
		pr_debug("calib mode is %d\n", calib_mode);
		if (calib_mode == TSENS_TWO_POINT_CALIB) {
			tsens_base0_data = (calib_data[0] &
				TSENS_BASE0_PLUTO_MASK);
			tsens_base1_data = (calib_data[0] &
				TSENS_BASE1_PLUTO_MASK) >>
				TSENS_BASE1_PLUTO_SHIFT;
			tsens0_point = (calib_data[0] &
				TSENS0_OFFSET_PLUTO_MASK) >>
				TSENS0_OFFSET_PLUTO_SHIFT;
			tsens1_point = (calib_data[0] &
				TSENS1_OFFSET_PLUTO_MASK) >>
				TSENS1_OFFSET_PLUTO_SHIFT;
			tsens2_point = (calib_data[0] &
				TSENS2_OFFSET_PLUTO_MASK) >>
				TSENS2_OFFSET_PLUTO_SHIFT;
			tsens3_point = (calib_data[1] &
				TSENS3_OFFSET_PLUTO_MASK);
			tsens4_point = (calib_data[1] &
				TSENS4_OFFSET_PLUTO_MASK) >>
				TSENS4_OFFSET_PLUTO_SHIFT;
			tsens5_point = (calib_data[1] &
				TSENS5_OFFSET_PLUTO_MASK) >>
				TSENS5_OFFSET_PLUTO_SHIFT;
			tsens6_point = (calib_data[1] &
				TSENS6_OFFSET_PLUTO_MASK) >>
				TSENS6_OFFSET_PLUTO_SHIFT;
			tsens7_point = (calib_data[1] &
				TSENS7_OFFSET_PLUTO_MASK) >>
				TSENS7_OFFSET_PLUTO_SHIFT;
			tsens8_point = (calib_data[1] &
				TSENS8_OFFSET_PLUTO_MASK) >>
				TSENS8_OFFSET_PLUTO_SHIFT;
			tsens9_point = (calib_data[1] &
				TSENS9_OFFSET_PLUTO_MASK) >>
				TSENS9_OFFSET_PLUTO_SHIFT;
			tsens10_point = (calib_data[1] &
				TSENS10_OFFSET_PLUTO_MASK) >>
				TSENS10_OFFSET_PLUTO_SHIFT;
			tsens11_point = (calib_data[2] &
				TSENS11_OFFSET_PLUTO_MASK);
			tsens12_point = (calib_data[2] &
				TSENS12_OFFSET_PLUTO_MASK) >>
				TSENS12_OFFSET_PLUTO_SHIFT;
			tsens13_point = (calib_data[2] &
				TSENS13_OFFSET_PLUTO_MASK) >>
				TSENS13_OFFSET_PLUTO_SHIFT;
			tsens14_point = (calib_data[2] &
				TSENS14_OFFSET_PLUTO_MASK) >>
				TSENS14_OFFSET_PLUTO_SHIFT;
			tsens15_point = (calib_data[2] &
				TSENS15_OFFSET_PLUTO_MASK) >>
				TSENS15_OFFSET_PLUTO_SHIFT;
			calib_tsens_point_data[0] = tsens0_point;
			calib_tsens_point_data[1] = tsens1_point;
			calib_tsens_point_data[2] = tsens2_point;
			calib_tsens_point_data[3] = tsens3_point;
			calib_tsens_point_data[4] = tsens4_point;
			calib_tsens_point_data[5] = tsens5_point;
			calib_tsens_point_data[6] = tsens6_point;
			calib_tsens_point_data[7] = tsens7_point;
			calib_tsens_point_data[8] = tsens8_point;
			calib_tsens_point_data[9] = tsens9_point;
			calib_tsens_point_data[10] = tsens10_point;
			calib_tsens_point_data[11] = tsens11_point;
			calib_tsens_point_data[12] = tsens12_point;
			calib_tsens_point_data[13] = tsens13_point;
			calib_tsens_point_data[14] = tsens14_point;
			calib_tsens_point_data[15] = tsens15_point;
		} else {
calibration_less_mode:
			pr_debug("TSENS is calibrationless mode\n");
			calib_tsens_point_data[0] = 532;
			calib_tsens_point_data[1] = 532;
			calib_tsens_point_data[2] = 532;
			calib_tsens_point_data[3] = 532;
			calib_tsens_point_data[4] = 532;
			calib_tsens_point_data[5] = 532;
			calib_tsens_point_data[6] = 532;
			calib_tsens_point_data[7] = 532;
			calib_tsens_point_data[8] = 532;
			calib_tsens_point_data[9] = 532;
			calib_tsens_point_data[10] = 532;
			calib_tsens_point_data[11] = 532;
			calib_tsens_point_data[12] = 532;
			calib_tsens_point_data[13] = 532;
			calib_tsens_point_data[14] = 532;
			calib_tsens_point_data[15] = 532;
		}
	}

	for (i = 0; i < tmdev->tsens_num_sensor; i++) {
		int32_t num = 0, den = 0, adc_code_of_tempx = 0;
		tmdev->sensor[i].calib_data_point2 = tsens_base1_data;
		tmdev->sensor[i].calib_data_point1 = tsens_base0_data;
		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 (calib_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;
		}
		adc_code_of_tempx =
				tsens_base0_data + calib_tsens_point_data[i];
		pr_debug("offset_adc_code_of_tempx:0x%x\n",
						adc_code_of_tempx);
		tmdev->sensor[i].offset = (adc_code_of_tempx *
			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);
		INIT_WORK(&tmdev->sensor[i].work, notify_uspace_tsens_fn);
		tmdev->prev_reading_avail = false;
	}

	return 0;
}

static int tsens_calib_8x10_sensors(void)
{
	int i, tsens_base0_data = 0, tsens0_point1 = 0, tsens1_point1 = 0;
@@ -2216,6 +2548,8 @@ static int tsens_calib_sensors(void)
		rc = tsens_calib_8916_sensors();
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_8936)
		rc = tsens_calib_8936_sensors();
	else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_PLUTO)
		rc = tsens_calib_pluto_sensors();
	else {
		pr_err("TSENS Calib fuse not found\n");
		rc = -ENODEV;
@@ -2246,6 +2580,9 @@ static struct of_device_id tsens_match[] = {
	{	.compatible = "qcom,msm8936-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_8936,
	},
	{	.compatible = "qcom,msmplutonium-tsens",
		.data = (void *)TSENS_CALIB_FUSE_MAP_PLUTO,
	},
	{}
};