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

Commit a944f15c authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "thermal: tsens: Add support for plutonium"

parents ecba9013 7df95891
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,
	},
	{}
};